dsh-a2a

Troubleshooting

English · 中文

Work in this order; each step narrows the layer:

  1. Plugin mounted? /a2a status returns a snapshot.
  2. Instance exists and is enabled? /a2a inbound list / outbound list.
  3. Card reachable? curl <cardUrl>.
  4. Protocol reachable? SendMessage with a tiny prompt.
  5. Task state? /a2a tasks, /a2a task get <id>.
  6. Host logs and session logs? DSH logs and $DSH_HOME/sessions.
  7. Version and compatibility? see §7.

1. (no reply) or an empty artifact

A completed task whose artifact is (no reply) means the inbound session executor finished without an assistant message. In 0.3.6 this was a known bug: the executor sent the agent a message with source: { kind: 'plugin', plugin: 'a2a' }. The JSONL v4 session codec refuses kind: 'plugin'; the write failed in the session handle’s background flush, the agent loop contained the error, and the task settled COMPLETED with no reply. Fixed in 0.3.7 by using the producer-owned { kind: 'a2a' }.

If you still see an empty reply on 0.3.7 or newer:

  1. Confirm the installed version:
    node -p "require('/path/to/profile/node_modules/@hanphone/dsh-a2a/package.json').version"
    

    It must be 0.3.7 or newer. Reinstall and restart dsh web if not.

  2. Check the task state and status message:
    /a2a task get <taskId>
    

    TASK_STATE_FAILED carries an error message; COMPLETED with an empty artifact points back at the model/session layer.

  3. In the panel, open Connections and tasks → Inbound sessions, find the contextId, and check whether the session is running or idle.
  4. Check the model provider for the preset: an unauthenticated or misconfigured provider can produce an empty assistant message. Verify the same preset in a normal DSH session.
  5. Look for a2a warnings in the DSH host log and in $DSH_HOME/sessions/... for the a2a-<contextId> session.

If the task is CANCELED, the caller or the panel canceled it; start a new task on the same contextId to reopen the session.

2. Inbound request returns 401

The instance has a bearer token and the request does not match it.

3. AgentCard returns 404 or connection refused

4. Outbound connection is failed

The panel shows lastError; the common causes are:

Symptom Check
HTTP 401 Remote requires a token; edit the connection and set it
HTTP 404 Wrong card URL; use the remote’s full per-instance card path
invalid agent card The URL returns HTML or a non-card JSON; verify content type and shape
no JSON-RPC interface The card has no supportedInterfaces entry with a JSON-RPC URL
timeout Raise the connection’s timeoutMs or check network reachability
TLS/DNS error Check the remote certificate/hostname and local network

After fixing, click Refresh (or call outbound.refresh). A failed record is kept so you can edit it; deleting and re-adding is not required.

5. Remote skill is missing or the model does not call the tool

6. Tool call returns a remote error

The remote agent’s task settled non-terminal or failed. Use the remote’s own GetTask/panel to inspect it, or check the tool error text:

7. incompatible-version or the plugin is not loaded

DSH 0.1.7+ evaluates the plugin’s @deepseek-ai/dsh and @deepseek-ai/dsh-* peer ranges before importing it. A refusal means the running harness is outside the declared ranges.

8. Two DSH processes fight over storage

The a2a domain is a single store rooted at DSH_HOME (JSON by default). Two processes sharing the same home write the same domain and can overwrite each other’s instances/tasks. Run one writer per DSH_HOME; use separate homes and ports for two-instance tests. This is exactly what the hermetic e2e does.

9. Streaming behaves oddly

10. Known limits

11. What to include in a bug report

Please attach:

The automated layers that guard these paths are described in Testing. If you are contributing a fix, add the failing assertion to the layer that can see it: mirror check for a type contract, real-persistence integration for a durable-session shape, or the e2e smoke for a released-artifact path.