English · 中文
This page is the day-to-day reference: where the controls are, what each field
does, how instances behave across restarts, and how to configure storage and
security. It applies to 0.4.0 on DeepSeek Harness 0.2.1-rc.2.
There are three equivalent ways to drive the plugin:
| Surface | Use it for |
|---|---|
| Settings → A2A connections | Primary UI: create/edit/enable/disable/delete, inspect peers, sessions, and tasks |
/a2a command |
Text backup inside a DSH chat session |
Loopback /a2a/api |
Scripts, tests, and integrations; see HTTP API |
All three call the same facade, so they cannot disagree about state. The panel refreshes every 3 seconds.
Each card shows the name, endpoint path, preset badge, authentication state, derived skill chips, and the live AgentCard URL. Actions:
| Action | Effect |
|---|---|
| Enable / Disable | Registers or unregisters the card and endpoint routes; the record and session pool stay |
| Edit | Changes name/description/version/preset/token; rebuilds the card/skills and swaps the live instance |
| Delete | Disposes the live instance and removes the persisted record |
| Clear auth | Removes the stored bearer token and rebuilds the instance anonymously |
The create/edit form has name, version, preset, bearer token, and description. Skills are shown after creation; you do not type them. The preset picker lists only real roster presets and preselects the deployment default.
Adding is a two-phase flow:
Each connected card shows a state dot, the imported skill count, the tool count, and the last error when failed. Actions: Enable/Disable, Refresh (re-read the card and re-register tools), Edit (name/preset/timeout/token), Delete.
The token is stored separately through the credentials service; editing with an
empty token field keeps the existing one. Clear auth is available in the
inbound form. Outbound has no clear button: send an empty token through
outbound.setAuth; leaving the edit form’s token field empty keeps the
existing token.
Three tables:
contextId: instance, preset, running or
idle, task/active counts, streaming, first/last seen, Cancel active, and
Close.Semantics:
contextId opens a fresh handle./a2a command referenceThe command is available in a DSH chat session. Its output is JSON for the list and status verbs.
| Command | Purpose |
|---|---|
/a2a status |
Whole-plugin snapshot |
/a2a presets |
Agent-preset roster |
/a2a inbound list |
Inbound instances |
/a2a inbound create <name> [preset] [description] |
Create an inbound instance |
/a2a inbound remove <id> |
Remove it |
/a2a inbound enable\|disable <id> |
Toggle its routes |
/a2a outbound list |
Outbound instances |
/a2a outbound create <agentCardUrl> [name] [preset] |
Create an outbound connection |
/a2a outbound remove <id> |
Remove it |
/a2a outbound enable\|disable <id> |
Toggle it |
/a2a outbound refresh <id> |
Re-read the remote card |
/a2a tasks |
Task list |
/a2a task get <taskId> |
One task |
/a2a task cancel <taskId> |
Cancel a task |
/a2a sessions |
Per-context session views |
/a2a session cancel <contextId> |
Cancel the context’s active tasks |
/a2a session close <contextId> |
Release the context’s live session |
/a2a peers |
Inbound peer registry |
/a2a help |
Usage text |
Arguments are whitespace-separated. The inbound description is the remaining words after the optional preset; use the panel or the HTTP API when you need richer fields.
The plugin configuration is intentionally minimal. Instances are not
configured in cordis.patch.yml; they live in the a2a domain and are managed
by the panel.
- id: a2a
config:
baseUrl: http://127.0.0.1:3080 # optional; derived from webServer when omitted
subagentProvider: in-process # default
defaultTimeoutMs: 60000 # default outbound timeout
inboundTimeoutMs: 600000 # per inbound task; 0 disables
requestsPerMinute: 120 # per inbound source; 0 disables
maxConcurrentTasks: 32 # per inbound instance; 0 disables
maxBodyBytes: 1048576 # inbound HTTP body cap
outboundRefreshMs: 300000 # AgentCard auto-refresh; 0 disables
| Field | Default | Meaning |
|---|---|---|
baseUrl |
web server port, then DSH_A2A_PORT, then 3000 |
Advertised base URL for every inbound AgentCard |
subagentProvider |
in-process |
Provider name for the subagent executor seam |
defaultTimeoutMs |
60000 |
Default per-call timeout for outbound connections |
inboundTimeoutMs |
600000 |
Per-task inbound execution budget; timeout settles the task FAILED |
requestsPerMinute |
120 |
Sliding-window request cap per inbound source; over-limit gets HTTP 429 |
maxConcurrentTasks |
32 |
Concurrent task cap per inbound instance; over-quota tasks fail readably |
maxBodyBytes |
1048576 |
Maximum inbound A2A request body |
outboundRefreshMs |
300000 |
Automatic AgentCard refresh interval for enabled outbound connections |
The inbound session working directory is $DSH_HOME/a2a-sessions (created on
startup). DSH_HOME defaults to ~/.dsh.
Only storageDomain is required. Everything else is probed; a missing service
idles the affected capability instead of failing the whole plugin.
| Service | Used by | Effect when absent |
|---|---|---|
storageDomain |
both halves | Required; the plugin does not mount |
webServer |
inbound routes, dashboard API | Inbound endpoints/card and the panel API are idle |
agents |
inbound session executor | Inbound tasks run the refuse executor |
attachments |
inbound image/file parts | Raw attachments degrade to placeholders |
agentPresets |
preset selection, skill derivation | Preset defaults and derived skills degrade to chat |
skills |
skill derivation | Card falls back to chat |
credentials |
token storage/resolution | GUI token writes fail; externally exported env vars still work |
subagents |
subagent executor | The subagent executor is not wired |
tools |
outbound tool registration | Outbound connections cannot register tools |
commands |
/a2a |
The chat command is not registered |
The base web profile mounts all of these. A custom composition should include
storageDomain, webServer, agents, agentPresets, skills, tools, and
commands for the full surface.
The a2a domain defaults to the profile’s JSON backend. Tables and their
contents are listed in Concepts.
To route only the a2a domain to SQLite:
- id: storage-domain
config:
backend: json
routes:
a2a: sqlite
- insert:
- id: storage-sqlite
name: '@deepseek-ai/dsh-storage-sqlite'
config:
path: /absolute/path/to/a2a.sqlite
Operational notes:
DSH_HOME. Two DSH processes sharing a home write the same
JSON domain; do not run two instances against one storage root.version field. Back up the JSON/SQLite file before upgrades.$DSH_HOME/sessions/... by the normal DSH session persistence; the plugin’s
working directory is $DSH_HOME/a2a-sessions./a2a/api remotely callable.a2a domain or the AgentCard.Upgrade:
dsh plugin --profile web add @hanphone/dsh-a2a@latest
Restart dsh web after the install. Instances and tasks live in the domain and
survive the upgrade; live sessions do not.
Uninstall:
dsh plugin --profile web remove @hanphone/dsh-a2a
Removing the plugin leaves the a2a domain data in place. Delete the domain
rows (or the storage file) only if you intend to discard instance definitions
and task history.
The plugin declares peer ranges for the DSH versions it supports. DSH 0.1.7+ runs a peer preflight and refuses a plugin whose ranges do not cover the running version. Upgrade the plugin and the harness together when the preflight complains; do not widen ranges without running the compatibility procedure.
See Harness compatibility for the exact ranges, the verification procedure, and the release record.