Q2 decision: unify the workflow-only ``workflow_agent_runtime_sessions`` into
an owner-agnostic ``agent_runtime_sessions`` table serving both owners. Feature
is unreleased, so the old table is dropped (no data migration).
* ``AgentRuntimeSession`` model (table ``agent_runtime_sessions``) with an
``owner_type`` discriminator (workflow_run | conversation): workflow columns
(workflow_id/run_id/node_id/binding_id/agent_config_snapshot_id/
composition_layer_specs) and ``conversation_id`` are mutually-exclusive,
enforced by two partial unique indexes. Back-compat aliases
``WorkflowAgentRuntimeSession`` / ``WorkflowAgentRuntimeSessionStatus`` keep
the shipped lifecycle path (PR #36724) unchanged; the workflow store now sets
``owner_type=workflow_run``.
* New ``AgentAppRuntimeSessionStore`` (conversation-keyed) for the Agent App
side of the same table: one conversation = one Agent session for multi-turn.
* Migration 121e7346074d (drop old + create unified) — applies and
downgrade/upgrade round-trips clean on Postgres.
Tests: 6 new conversation-store ORM round-trip tests; 154 existing workflow
lifecycle + agent_backend tests still green against the unified table.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>