[SKY-7600] BE (#5312)

This commit is contained in:
Aaron Perez 2026-03-31 22:47:14 -05:00 committed by GitHub
parent c7b8bc0fd2
commit 43c1a75263
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 52 additions and 26 deletions

View file

@ -426,7 +426,7 @@ export type WorkflowRunApiResponse = {
finished_at: string | null; // ISO 8601
modified_at: string;
proxy_location: ProxyLocation | null;
script_run: boolean | null;
script_run: { ai_fallback_triggered: boolean } | null;
status: Status;
title?: string;
trigger_type?: TriggerType | null;

View file

@ -23,9 +23,11 @@ function useRunsQuery({
statusFilters,
triggerTypeFilters,
search,
...queryOptions
}: Props) {
const credentialGetter = useCredentialGetter();
return useQuery<Array<Task | WorkflowRunApiResponse>>({
...queryOptions,
queryKey: [
"runs",
{ statusFilters, triggerTypeFilters },

View file

@ -279,7 +279,7 @@ function RunHistory() {
const workflowTitle = (
<div className="flex items-center gap-2">
<span className="truncate">{run.workflow_title ?? ""}</span>
{run.script_run === true && (
{run.script_run != null && (
<Tip content="Ran with code">
<LightningBoltIcon className="text-[gold]" />
</Tip>

View file

@ -212,7 +212,7 @@ function WorkflowPage() {
) : (
workflowRuns?.map((workflowRun) => {
const workflowRunId =
workflowRun.script_run === true ? (
workflowRun.script_run != null ? (
<div className="flex items-center gap-2">
<Tip content="Ran with code">
<LightningBoltIcon className="text-[gold]" />

View file

@ -298,6 +298,7 @@ class WorkflowRunsMixin:
page: int = 1,
page_size: int = 10,
status: list[WorkflowRunStatus] | None = None,
trigger_type: list[WorkflowRunTriggerType] | None = None,
include_debugger_runs: bool = False,
search_key: str | None = None,
) -> list[WorkflowRun | Task]:
@ -357,6 +358,10 @@ class WorkflowRunsMixin:
if status:
workflow_run_query = workflow_run_query.filter(WorkflowRunModel.status.in_(status))
if trigger_type:
workflow_run_query = workflow_run_query.filter(
WorkflowRunModel.trigger_type.in_([t.value for t in trigger_type])
)
workflow_run_query = workflow_run_query.order_by(WorkflowRunModel.created_at.desc()).limit(limit)
workflow_run_query_result = (await session.execute(workflow_run_query)).all()
workflow_runs = [
@ -364,16 +369,20 @@ class WorkflowRunsMixin:
for run, title in workflow_run_query_result
]
task_query = (
select(TaskModel)
.filter(TaskModel.organization_id == organization_id)
.filter(TaskModel.workflow_run_id.is_(None))
)
if status:
task_query = task_query.filter(TaskModel.status.in_(status))
task_query = task_query.order_by(TaskModel.created_at.desc()).limit(limit)
task_query_result = (await session.scalars(task_query)).all()
tasks = [convert_to_task(task, debug_enabled=self.debug_enabled) for task in task_query_result]
# Tasks don't have trigger_type — skip them when filtering by trigger type
if trigger_type:
tasks: list[Task] = []
else:
task_query = (
select(TaskModel)
.filter(TaskModel.organization_id == organization_id)
.filter(TaskModel.workflow_run_id.is_(None))
)
if status:
task_query = task_query.filter(TaskModel.status.in_(status))
task_query = task_query.order_by(TaskModel.created_at.desc()).limit(limit)
task_query_result = (await session.scalars(task_query)).all()
tasks = [convert_to_task(task, debug_enabled=self.debug_enabled) for task in task_query_result]
runs = workflow_runs + tasks

View file

@ -307,6 +307,7 @@ class WorkflowRunsRepository(BaseRepository):
page: int = 1,
page_size: int = 10,
status: list[WorkflowRunStatus] | None = None,
trigger_type: list[WorkflowRunTriggerType] | None = None,
include_debugger_runs: bool = False,
search_key: str | None = None,
) -> list[WorkflowRun | Task]:
@ -366,6 +367,10 @@ class WorkflowRunsRepository(BaseRepository):
if status:
workflow_run_query = workflow_run_query.filter(WorkflowRunModel.status.in_(status))
if trigger_type:
workflow_run_query = workflow_run_query.filter(
WorkflowRunModel.trigger_type.in_([t.value for t in trigger_type])
)
workflow_run_query = workflow_run_query.order_by(WorkflowRunModel.created_at.desc()).limit(limit)
workflow_run_query_result = (await session.execute(workflow_run_query)).all()
workflow_runs = [
@ -373,16 +378,20 @@ class WorkflowRunsRepository(BaseRepository):
for run, title in workflow_run_query_result
]
task_query = (
select(TaskModel)
.filter(TaskModel.organization_id == organization_id)
.filter(TaskModel.workflow_run_id.is_(None))
)
if status:
task_query = task_query.filter(TaskModel.status.in_(status))
task_query = task_query.order_by(TaskModel.created_at.desc()).limit(limit)
task_query_result = (await session.scalars(task_query)).all()
tasks = [convert_to_task(task, debug_enabled=self.debug_enabled) for task in task_query_result]
# Tasks don't have trigger_type — skip them when filtering by trigger type
if trigger_type:
tasks: list[Task] = []
else:
task_query = (
select(TaskModel)
.filter(TaskModel.organization_id == organization_id)
.filter(TaskModel.workflow_run_id.is_(None))
)
if status:
task_query = task_query.filter(TaskModel.status.in_(status))
task_query = task_query.order_by(TaskModel.created_at.desc()).limit(limit)
task_query_result = (await session.scalars(task_query)).all()
tasks = [convert_to_task(task, debug_enabled=self.debug_enabled) for task in task_query_result]
runs = workflow_runs + tasks

View file

@ -39,7 +39,7 @@ from skyvern.forge.sdk.core import skyvern_context
from skyvern.forge.sdk.core.curl_converter import curl_to_http_request_block_params
from skyvern.forge.sdk.core.permissions.permission_checker_factory import PermissionCheckerFactory
from skyvern.forge.sdk.core.security import generate_skyvern_signature
from skyvern.forge.sdk.db.enums import OrganizationAuthTokenType
from skyvern.forge.sdk.db.enums import OrganizationAuthTokenType, WorkflowRunTriggerType
from skyvern.forge.sdk.executor.factory import AsyncExecutorFactory
from skyvern.forge.sdk.models import Step
from skyvern.forge.sdk.routes.code_samples import (
@ -2120,6 +2120,7 @@ async def get_runs(
page: int = Query(1, ge=1),
page_size: int = Query(10, ge=1),
status: Annotated[list[WorkflowRunStatus] | None, Query()] = None,
trigger_type: Annotated[list[WorkflowRunTriggerType] | None, Query()] = None,
search_key: str | None = Query(
None,
description=(
@ -2138,7 +2139,12 @@ async def get_runs(
return []
runs = await app.DATABASE.get_all_runs(
current_org.organization_id, page=page, page_size=page_size, status=status, search_key=search_key
current_org.organization_id,
page=page,
page_size=page_size,
status=status,
trigger_type=trigger_type,
search_key=search_key,
)
return ORJSONResponse([run.model_dump() for run in runs])

View file

@ -117,7 +117,7 @@ def _load_task_runs_sync_activity_module(monkeypatch: pytest.MonkeyPatch):
monkeypatch.setitem(sys.modules, "temporalio", temporalio_module)
monkeypatch.setitem(sys.modules, "structlog", structlog_module)
module_path = _repo_root() / "workers" / "cron_worker" / "task_runs_sync_activity.py"
module_path = _SOURCE_FILE
spec = importlib.util.spec_from_file_location("test_task_runs_sync_activity_module", module_path)
module = importlib.util.module_from_spec(spec)
assert spec is not None and spec.loader is not None