Phase 003: remove the coding-agent and ekko-agent runtimes

Every chat session now runs through the Hermes bridge, so the three chat
chains become feature-equivalent instead of three partially-maintained
dispatch paths. Keeping the coding-agent and in-house agent runtimes alive
meant every bridge change had to be mirrored into two more runtimes that
had already drifted.

Historical rows are read, not migrated: sessions stored with the retired
source normalize to cli on load, workflow graphs naming the retired agents
keep loading and run on the bridge, and the visible-source check plus
SOURCE_LABELS still recognize the old value so those sessions stay listed.

The public surface follows the code: the OpenAPI generator and the MCP
chat-run tool schema drop the six retired entry fields so external callers
are not told about runtimes that no longer exist.

harness-check gains a RETIRED_RUNTIME scan so the residual check is a
mechanical gate instead of a manual grep, with the two surviving read-side
compat sites recorded with reasons.

Refs: docs/phases/phase_003.md
This commit is contained in:
2026-10-16 13:27:50 +08:00
parent c93e1fe1bd
commit 8c1ddf415f
123 changed files with 567 additions and 23599 deletions
+6 -546
View File
@@ -156,10 +156,6 @@
"name": "Devices",
"description": "Device pairing and LAN peer operations"
},
{
"name": "Coding Agents",
"description": "Coding agent installation, config, and runs"
},
{
"name": "API Docs",
"description": "OpenAPI route catalog"
@@ -871,17 +867,18 @@
"type": "string",
"enum": [
"cli",
"coding_agent",
"global_agent"
"global_agent",
"workflow"
],
"description": "Run backend source. Use cli for Hermes bridge runs, coding_agent for Claude Code/Codex, or global_agent for global-agent sessions. Omit source for normal Hermes chat runs; do not use the legacy api_server source."
"description": "Run backend source. Use cli for Hermes bridge runs or global_agent for global-agent sessions. Omit source for normal Hermes chat runs; do not use the legacy api_server source."
},
"session_source": {
"type": "string",
"enum": [
"global_agent"
"global_agent",
"workflow"
],
"description": "Marks a coding-agent or bridge session as launched from the global agent."
"description": "Marks the session as launched from the global agent or from a workflow run."
},
"instructions": {
"type": "string",
@@ -896,47 +893,6 @@
"type": "string",
"description": "Optional per-run reasoning effort override."
},
"coding_agent_id": {
"type": "string",
"enum": [
"claude-code",
"codex"
],
"description": "Coding agent id when source is coding_agent."
},
"agent_id": {
"type": "string",
"enum": [
"claude-code",
"codex"
],
"description": "Alias for coding_agent_id."
},
"mode": {
"type": "string",
"enum": [
"scoped",
"global"
],
"description": "Coding-agent launch mode."
},
"baseUrl": {
"type": "string",
"description": "Optional provider base URL for coding-agent runs."
},
"apiKey": {
"type": "string",
"description": "Optional provider API key for coding-agent runs."
},
"apiMode": {
"type": "string",
"enum": [
"chat_completions",
"codex_responses",
"anthropic_messages"
],
"description": "Optional provider wire API mode for coding-agent runs."
},
"timeout_ms": {
"type": "integer",
"minimum": 1,
@@ -1013,502 +969,6 @@
}
}
},
"/api/coding-agents": {
"get": {
"tags": [
"Coding Agents"
],
"summary": "Get coding-agents",
"description": "GET /api/coding-agents",
"operationId": "status",
"security": [
{
"BearerAuth": []
}
],
"responses": {
"200": {
"description": "Success"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"404": {
"description": "Not found"
}
}
}
},
"/api/coding-agents/runs/{sessionId}": {
"delete": {
"tags": [
"Coding Agents"
],
"summary": "Delete :sessionId",
"description": "DELETE /api/coding-agents/runs/:sessionId",
"operationId": "stopRun",
"security": [
{
"BearerAuth": []
}
],
"responses": {
"200": {
"description": "Success"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
}
},
"parameters": [
{
"name": "sessionId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]
}
},
"/api/coding-agents/runs/{sessionId}/input": {
"post": {
"tags": [
"Coding Agents"
],
"summary": "Create input",
"description": "POST /api/coding-agents/runs/:sessionId/input",
"operationId": "sendRunInput",
"security": [
{
"BearerAuth": []
}
],
"responses": {
"200": {
"description": "Success"
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
}
},
"parameters": [
{
"name": "sessionId",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"input": {
"type": "string"
}
}
}
}
}
}
}
},
"/api/coding-agents/{id}": {
"delete": {
"tags": [
"Coding Agents"
],
"summary": "Delete :id",
"description": "DELETE /api/coding-agents/:id",
"operationId": "remove",
"security": [
{
"BearerAuth": []
}
],
"responses": {
"200": {
"description": "Success"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
}
},
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]
}
},
"/api/coding-agents/{id}/config-files/{key}": {
"get": {
"tags": [
"Coding Agents"
],
"summary": "Get :key",
"description": "GET /api/coding-agents/:id/config-files/:key",
"operationId": "readConfigFile",
"security": [
{
"BearerAuth": []
}
],
"responses": {
"200": {
"description": "Success"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
},
"404": {
"description": "Not found"
}
},
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "key",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]
},
"put": {
"tags": [
"Coding Agents"
],
"summary": "Update :key",
"description": "PUT /api/coding-agents/:id/config-files/:key",
"operationId": "writeConfigFile",
"security": [
{
"BearerAuth": []
}
],
"responses": {
"200": {
"description": "Success"
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
}
},
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "key",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"content": {
"type": "string"
}
}
}
}
}
}
}
},
"/api/coding-agents/{id}/install": {
"post": {
"tags": [
"Coding Agents"
],
"summary": "Create install",
"description": "POST /api/coding-agents/:id/install",
"operationId": "install",
"security": [
{
"BearerAuth": []
}
],
"responses": {
"200": {
"description": "Success"
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
}
},
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
]
}
},
"/api/coding-agents/{id}/launch/native": {
"post": {
"tags": [
"Coding Agents"
],
"summary": "Create native",
"description": "POST /api/coding-agents/:id/launch/native",
"operationId": "nativeLaunch",
"security": [
{
"BearerAuth": []
}
],
"responses": {
"200": {
"description": "Success"
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
}
},
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"apiKey": {
"type": "string"
},
"apiMode": {
"type": "object",
"additionalProperties": true
},
"baseUrl": {
"type": "string"
},
"mode": {
"type": "object",
"additionalProperties": true
},
"model": {
"type": "string"
},
"profile": {
"type": "string"
},
"provider": {
"type": "string"
}
}
}
}
}
}
}
},
"/api/coding-agents/{id}/launch/prepare": {
"post": {
"tags": [
"Coding Agents"
],
"summary": "Create prepare",
"description": "POST /api/coding-agents/:id/launch/prepare",
"operationId": "prepareLaunch",
"security": [
{
"BearerAuth": []
}
],
"responses": {
"200": {
"description": "Success"
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
}
},
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"apiKey": {
"type": "string"
},
"apiMode": {
"type": "object",
"additionalProperties": true
},
"baseUrl": {
"type": "string"
},
"mode": {
"type": "object",
"additionalProperties": true
},
"model": {
"type": "string"
},
"profile": {
"type": "string"
},
"provider": {
"type": "string"
}
}
}
}
}
}
}
},
"/api/coding-agents/{id}/runs": {
"post": {
"tags": [
"Coding Agents"
],
"summary": "Create runs",
"description": "POST /api/coding-agents/:id/runs",
"operationId": "startRun",
"security": [
{
"BearerAuth": []
}
],
"responses": {
"200": {
"description": "Success"
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"401": {
"$ref": "#/components/responses/Unauthorized"
}
},
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "string"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"apiKey": {
"type": "string"
},
"apiMode": {
"type": "object",
"additionalProperties": true
},
"baseUrl": {
"type": "string"
},
"mode": {
"type": "object",
"additionalProperties": true
},
"model": {
"type": "string"
},
"profile": {
"type": "string"
},
"provider": {
"type": "string"
},
"sessionId": {
"type": "string"
}
}
}
}
}
}
}
},
"/api/cron-history": {
"get": {
"tags": [