One Core, Four Surfaces: Profiles, SDKs, and Extensions

DeepSeek Harness uses profiles to make one Agent and Session architecture serve different kinds of users. This chapter compares the Web, headless, SDK, and ACP surfaces by interaction model, lifecycle, persistence, and trust boundary, then applies the same criteria to browser extensions and child agents. The practical question is not which surface has the longest feature list; it is which composition matches the work that must be owned and the boundary that must be enforced.

A profile is an ordered composition of bundles and patches. It selects plugins over an empty root, and later layers can replace a complete row by id. That makes the profile a runtime decision: it determines whether the process owns a browser server, a one-shot result, a JSON-RPC connection, or a standard automation session. The Agent loop and Session log can remain common while the surrounding lifecycle changes.

Profiles change the surrounding lifecycle

The shared base composition supplies model access, tools, session persistence, credentials, permissions, and other core capabilities. The Web overlay adds a host server, browser connection, client-module graph, UI slots, and session controllers. The headless overlay adds a runner that creates one fresh Agent, waits for its owned interval to settle, prints the final answer, and exits. The SDK overlay adds a JSON-RPC server whose stdout is reserved for protocol frames. The ACP overlay adds a standard automation server with persistent sessions and semantic updates.

These are not four independent applications that happen to call a model. They are four ways of owning the same Agent and Session relationships. The Web surface keeps a process alive for interactive sessions. Headless owns one task and maps its final turn outcome to a process exit. SDK accepts prompts and publishes open-ended session and status notifications; a message id acknowledges inbox admission rather than identifying a future assistant answer. ACP owns a more structured prompt interval and can close a session independently while preserving it for later resume.

The profile system also preserves a deliberate exception. sdk-minimal is a complete standalone tree that provides a small coding-agent runtime rather than layering over the shared base. It keeps a persistent shell and JSONL sessions but omits many base services, including the full tool roster, settings, managed credentials, Web tools, telemetry, compaction, and subagents. The choice is explicit: a smaller composition is easier to carry for a narrow SDK use case, but it gives up shared product features and uses a more permissive shell policy.

Patch precedence makes customization powerful and easy to misunderstand. Bundles apply in their listed order, followed by the profile patch, the Harness-home patch, and an invocation overlay. A matching patch replaces the whole configuration for a row rather than deep-merging it. An operator who changes a model or permission row must restate the settings they intend to keep. This is a composition contract, not a promise of compatibility across developer-preview releases.

Reload policy follows lifecycle ownership. The Web profile can apply user patch changes live because it is designed around an ongoing interactive process. Headless, SDK, ACP, and the minimal SDK profile apply patches at startup. Replacing a model server, protocol bridge, or Agent dependency while a one-shot or stdio application owns active work would make the lifetime ambiguous, so these surfaces prefer a stable tree until restart.