"support" after a restart resumes the same conversation. send() resolves when the runtime accepts the turn, not when the reply finishes — watch thread.on("status") / thread.on("event") before treating the thread as idle. Call ade.dispose() when the host shuts down.
Check the machine
doctor() reports sdkVersion (this package) and the runtime binary version separately — they ship on different cadences.
providers.status() returns a map of provider id to { installed, binaryPath, version, authenticated, installCommand, loginCommand, source, … }. Read source first. "probed" means the runtime resolved the binary and read the credential files, so those fields are measurements; "derived" means the runtime is older than the probe RPC and everything comes from the model catalog, so a UI should say “not detected” rather than “not installed”. providers.refresh() bypasses the runtime’s 60-second probe cache — that is the “I just installed it” button.
Provider credentials live in the provider’s own config (~/.claude, ~/.codex, ~/.cursor, …), not under home.
Permissions
"always-allow" maps to each provider’s full-auto create args — bypassPermissions on Claude, danger-full-access on Codex.
"default" leaves each provider’s own handling in place, and that is not one behavior: on Claude, ADE installs no gate at all and the Agent SDK decides non-interactively; on Codex, an approval request parks the turn until something answers it.
For anything in between, pass a policy instead of a preset:
mcpServers. Name them in the policy to use them.
Read Permissions and approvals before shipping a policy or either preset.
React UI
Inject your tools
Next
Threads
Steer, interrupt, switch models, export.
Runtime
Embedded profile, watchdog, pidfile reclaim.
