koala73/worldmonitor · error · SafeWebMcpError

Dashboard unavailable

Error message

Dashboard unavailable: ${boundedText(error.message, 160)} Reason: ${error.reason}.

What it means

SafeWebMcpError thrown by the WebMCP tool wrapper when a dashboard dependency failed to initialize — the underlying DashboardBindingError's message (bounded to 160 chars) and reason are embedded. It signals the dashboard subsystem backing the tool is unavailable (e.g. bootstrap failure), not that the tool's arguments were wrong.

Solutions

  1. Check the embedded reason to identify which dashboard subsystem failed
  2. Reload the dashboard so the binding can re-initialize
  3. Retry after the underlying bootstrap/initialization issue is resolved
Defensive patterns

Strategy: fallback

When it happens

Trigger: Thrown at src/services/webmcp.ts:290 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of koala73/worldmonitor@e586b8b4b8 (2026-08-27). Data as JSON: /api/errors/0cc7a70afd1d1d15. Report an issue: GitHub.

Appendix: source

Thrown at src/services/webmcp.ts:785

  successMetadata?: (
    args: Record<string, unknown>,
    result: unknown,
  ) => Record<string, unknown>;
}

function withInvocationLogging(
  name: WebMcpSpaToolName,
  fn: (
    input: Record<string, unknown>,
    extra?: { signal?: AbortSignal },
  ) => Promise<unknown> | unknown,
  trackEvent: WebMcpAnalytics,
  hooks: WebMcpInvocationHooks = {},
): DashboardWebMcpTool['execute'] {
  return async (args, extra?: WebMcpToolExecutionContext) => {
    const signal = isAbortSignal(extra?.signal) ? extra.signal : undefined;
    const execution = signal ? { signal } : undefined;
    markLcpDebug('wm:webmcp:tool-start', {
      tool: name,
      targetCancellationSupported: Boolean(signal),
    });
    try {
      throwIfWebMcpAborted(signal);
      const preflightResult = await hooks.preflight?.(args, execution);
      throwIfWebMcpAborted(signal);
      let result: unknown;
      if (preflightResult !== undefined) {
        result = preflightResult;
      } else if (CANCELLATION_REQUIRED_WEBMCP_TOOLS.has(name) && !signal) {
        // This tool declared that a phantom completion would be unsafe, and
        // the host cannot deliver the target-side signal. Return a structured
        // denial because some hosts erase the name and message of errors
        // raised by the page callback.
        result = unsupportedCancellationResult();
      } else {
        result = await fn(args, execution);

View on GitHub (pinned to e586b8b4b8)