Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 98 additions & 7 deletions admin/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1026,27 +1026,118 @@ workflows:
config:
status: 200
body_from: "steps.get-versions.rows"
# Deploy and Stop delegate to V1APIHandler which manages RuntimeManager
# Deploy: update workflow status to 'active'
- method: POST
path: "/api/v1/admin/workflows/{id}/deploy"
handler: admin-commands
middlewares: [admin-cors, admin-auth-middleware]
pipeline:
steps:
- name: deploy-workflow
type: step.delegate
- name: parse-request
type: step.request_parse
config:
service: admin-v1-mgmt
path_params: [id]
- name: check-exists
type: step.db_query
config:
database: admin-db
query: "SELECT id FROM workflows WHERE id = ?"
params: ["{{index .steps \"parse-request\" \"path_params\" \"id\"}}"]
mode: single
- name: check-found
type: step.conditional
config:
field: "steps.check-exists.found"
routes:
"false": not-found
default: set-now
- name: set-now
type: step.set
config:
values:
now: "{{ now }}"
- name: activate
type: step.db_exec
config:
database: admin-db
query: "UPDATE workflows SET status='active', updated_at=? WHERE id=?"
params:
- "{{index .steps \"set-now\" \"now\"}}"
- "{{index .steps \"parse-request\" \"path_params\" \"id\"}}"
- name: get-workflow
type: step.db_query
config:
database: admin-db
query: "SELECT id, project_id, name, slug, description, config_yaml, version, status, is_system, workspace_dir, created_by, updated_by, created_at, updated_at FROM workflows WHERE id = ?"
params: ["{{index .steps \"parse-request\" \"path_params\" \"id\"}}"]
mode: single
- name: respond
type: step.json_response
Comment on lines +1073 to +1075
Copy link

Copilot AI Feb 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The deploy pipeline always responds 200 with steps.get-workflow.row even when the workflow ID doesn't exist. step.db_query in mode: single returns found: false and an empty row, so this endpoint will return {} with 200 instead of a 404 (unlike the GET/PUT/DELETE workflow routes above).

Add a conditional step on steps.get-workflow.found and a not-found json_response (404) route, or otherwise fail the pipeline when no row is found.

Suggested change
mode: single
- name: respond
type: step.json_response
mode: single
- name: not-found
type: step.json_response
condition: "{{ not .steps.get-workflow.found }}"
config:
status: 404
body:
error: "workflow not found"
- name: respond
type: step.json_response
condition: "{{ .steps.get-workflow.found }}"

Copilot uses AI. Check for mistakes.
config:
status: 200
body_from: "steps.get-workflow.row"
- name: not-found
type: step.json_response
config:
status: 404
body:
error: "workflow not found"
# Stop: update workflow status to 'stopped'
- method: POST
path: "/api/v1/admin/workflows/{id}/stop"
handler: admin-commands
middlewares: [admin-cors, admin-auth-middleware]
pipeline:
steps:
- name: stop-workflow
type: step.delegate
- name: parse-request
type: step.request_parse
config:
service: admin-v1-mgmt
path_params: [id]
- name: check-exists
type: step.db_query
config:
database: admin-db
query: "SELECT id FROM workflows WHERE id = ?"
params: ["{{index .steps \"parse-request\" \"path_params\" \"id\"}}"]
mode: single
- name: check-found
type: step.conditional
config:
field: "steps.check-exists.found"
routes:
"false": not-found
default: set-now
- name: set-now
type: step.set
config:
values:
now: "{{ now }}"
- name: deactivate
type: step.db_exec
config:
database: admin-db
query: "UPDATE workflows SET status='stopped', updated_at=? WHERE id=?"
params:
- "{{index .steps \"set-now\" \"now\"}}"
- "{{index .steps \"parse-request\" \"path_params\" \"id\"}}"
- name: get-workflow
type: step.db_query
config:
database: admin-db
query: "SELECT id, project_id, name, slug, description, config_yaml, version, status, is_system, workspace_dir, created_by, updated_by, created_at, updated_at FROM workflows WHERE id = ?"
params: ["{{index .steps \"parse-request\" \"path_params\" \"id\"}}"]
mode: single
- name: respond
type: step.json_response
config:
status: 200
body_from: "steps.get-workflow.row"
Comment on lines +1130 to +1134
Copy link

Copilot AI Feb 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The stop pipeline responds 200 with steps.get-workflow.row even when the workflow isn't found. Because step.db_query (mode: single) returns found: false + empty row, this endpoint will return {} with 200 rather than a 404.

Add a conditional step on steps.get-workflow.found (or check affected_rows from the UPDATE) and return a 404 json_response when the workflow does not exist.

Suggested change
- name: respond
type: step.json_response
config:
status: 200
body_from: "steps.get-workflow.row"
- name: respond-if-found
type: step.condition
config:
condition: "{{index .steps \"get-workflow\" \"found\"}}"
true_steps:
- name: respond
type: step.json_response
config:
status: 200
body_from: "steps.get-workflow.row"
false_steps:
- name: respond-not-found
type: step.json_response
config:
status: 404
body:
error: "workflow not found"

Copilot uses AI. Check for mistakes.
- name: not-found
type: step.json_response
config:
status: 404
body:
error: "workflow not found"
# Load workflow from a server-local filesystem path
- method: POST
path: "/api/v1/admin/workflows/load-from-path"
Expand Down
Loading