First slice of the Agent App type (新 Agent 作为独立 App 类型,替代
chatbot/agent-legacy/completion). Design:
https://km.dify.langgenius.ai/wiki/spaces/DT/pages/460161070/Agent+App+Type
* New ``AppMode.AGENT = "agent"`` (distinct from legacy ``agent-chat`` ReAct
app). Runtime model/prompt/tools live in the bound Agent Soul, so the
default template seeds no model_config.
* Create flow: creating an Agent App also creates a roster Agent bound 1:1 via
``Agent.app_id`` (decision Q1), inside the same transaction so app + backing
agent persist atomically. ``AgentRosterService.create_backing_agent_for_app``
builds the agent + a v1 (empty) Agent Soul snapshot without committing; the
user configures model/prompt/tools afterward in the Composer.
* ``App.bound_agent_id`` resolves the backing roster Agent from the app id (so
the console can open the Composer in roster-detail mode); surfaced on the app
detail response. Returns None for non-agent apps (short-circuits, no DB hit).
* ``CreateAppParams`` / ``AppListParams`` accept "agent"; list filter handles it.
Scope: S1 only (foundation). Runtime/preview, web/service API, access &
sharing, logs and feature flags land in S2–S7 per the design.
Tests: roster backing-agent build/link/get + enum/template/params/bound_agent_id
short-circuit. 46 passing in app + agent service suites; ruff + pyrefly clean.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>