| import { type AcpRuntimeErrorCode, AcpRuntimeError, toAcpRuntimeError } from "./errors.js"; |
|
|
| function resolveAcpRuntimeErrorNextStep(error: AcpRuntimeError): string | undefined { |
| if (error.code === "ACP_BACKEND_MISSING" || error.code === "ACP_BACKEND_UNAVAILABLE") { |
| return "Run `/acp doctor`, install/enable the backend plugin, then retry."; |
| } |
| if (error.code === "ACP_DISPATCH_DISABLED") { |
| return "Enable `acp.dispatch.enabled=true` to allow thread-message ACP turns."; |
| } |
| if (error.code === "ACP_SESSION_INIT_FAILED") { |
| return "If this session is stale, recreate it with `/acp spawn` and rebind the thread."; |
| } |
| if (error.code === "ACP_INVALID_RUNTIME_OPTION") { |
| return "Use `/acp status` to inspect options and pass valid values."; |
| } |
| if (error.code === "ACP_BACKEND_UNSUPPORTED_CONTROL") { |
| return "This backend does not support that control; use a supported command."; |
| } |
| if (error.code === "ACP_TURN_FAILED") { |
| return "Retry, or use `/acp cancel` and send the message again."; |
| } |
| return undefined; |
| } |
|
|
| export function formatAcpRuntimeErrorText(error: AcpRuntimeError): string { |
| const next = resolveAcpRuntimeErrorNextStep(error); |
| if (!next) { |
| return `ACP error (${error.code}): ${error.message}`; |
| } |
| return `ACP error (${error.code}): ${error.message}\nnext: ${next}`; |
| } |
|
|
| export function toAcpRuntimeErrorText(params: { |
| error: unknown; |
| fallbackCode: AcpRuntimeErrorCode; |
| fallbackMessage: string; |
| }): string { |
| return formatAcpRuntimeErrorText( |
| toAcpRuntimeError({ |
| error: params.error, |
| fallbackCode: params.fallbackCode, |
| fallbackMessage: params.fallbackMessage, |
| }), |
| ); |
| } |
|
|