diff --git a/packages/eas-cli/graphql.schema.json b/packages/eas-cli/graphql.schema.json index 238d14cb15..15377d93f5 100644 --- a/packages/eas-cli/graphql.schema.json +++ b/packages/eas-cli/graphql.schema.json @@ -12316,6 +12316,112 @@ "isDeprecated": false, "deprecationReason": null }, + { + "name": "workflowDeviceTestCaseHistory", + "description": null, + "args": [ + { + "name": "filters", + "description": null, + "type": { + "kind": "INPUT_OBJECT", + "name": "WorkflowDeviceTestCaseHistoryFiltersInput", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "path", + "description": null, + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "timespan", + "description": null, + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "WorkflowDeviceTestCaseInsightsTimespanInput", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseHistory", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "workflowDeviceTestCaseInsights", + "description": null, + "args": [ + { + "name": "filters", + "description": null, + "type": { + "kind": "INPUT_OBJECT", + "name": "WorkflowDeviceTestCaseInsightsFiltersInput", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "timespan", + "description": null, + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "WorkflowDeviceTestCaseInsightsTimespanInput", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseInsights", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "workflowRunGitBranchesPaginated", "description": null, @@ -52970,9 +53076,13 @@ "description": "Max run time in seconds for this job run.", "args": [], "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } }, "isDeprecated": false, "deprecationReason": null @@ -81579,11 +81689,11 @@ }, { "kind": "OBJECT", - "name": "WorkflowDeviceTestCaseResult", - "description": "A device test case result from a Maestro test execution.", + "name": "WorkflowDeviceTestCaseErrorPattern", + "description": "Grouping key from the [shard N] prefix-stripped error_message. `count` is\ncomputed with uniqExact(test_case_result_id) so RMT pre-merge duplicates do\nnot inflate it. Scope: scans ALL status='failed' rows (NOT just\nis_final_attempt=1) so failures from runs that ultimately passed on retry\nstill surface.", "fields": [ { - "name": "createdAt", + "name": "count", "description": null, "args": [], "type": { @@ -81591,7 +81701,7 @@ "name": null, "ofType": { "kind": "SCALAR", - "name": "DateTime", + "name": "Int", "ofType": null } }, @@ -81599,31 +81709,7 @@ "deprecationReason": null }, { - "name": "duration", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "errorMessage", - "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "id", + "name": "lastSeenAt", "description": null, "args": [], "type": { @@ -81631,7 +81717,7 @@ "name": null, "ofType": { "kind": "SCALAR", - "name": "ID", + "name": "DateTime", "ofType": null } }, @@ -81639,7 +81725,7 @@ "deprecationReason": null }, { - "name": "name", + "name": "patternKey", "description": null, "args": [], "type": { @@ -81655,7 +81741,7 @@ "deprecationReason": null }, { - "name": "path", + "name": "sampleMessage", "description": null, "args": [], "type": { @@ -81669,41 +81755,98 @@ }, "isDeprecated": false, "deprecationReason": null - }, + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseHistory", + "description": null, + "fields": [ { - "name": "properties", + "name": "errorPatterns", "description": null, - "args": [], - "type": { - "kind": "SCALAR", - "name": "JSONObject", - "ofType": null - }, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "retryCount", - "description": "0-indexed attempt number. 0 = first attempt, 1 = first retry, etc.", - "args": [], + "args": [ + { + "name": "first", + "description": null, + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseErrorPattern", + "ofType": null + } + } + } }, "isDeprecated": false, "deprecationReason": null }, { - "name": "status", + "name": "recentRuns", "description": null, - "args": [], + "args": [ + { + "name": "after", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], "type": { "kind": "NON_NULL", "name": null, "ofType": { - "kind": "ENUM", - "name": "WorkflowDeviceTestCaseStatus", + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseRecentRunConnection", "ofType": null } }, @@ -81711,19 +81854,40 @@ "deprecationReason": null }, { - "name": "tags", + "name": "timeSeries", "description": null, - "args": [], + "args": [ + { + "name": "granularity", + "description": null, + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "WorkflowDeviceTestCaseInsightsTimeSeriesGranularity", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], "type": { - "kind": "LIST", + "kind": "NON_NULL", "name": null, "ofType": { - "kind": "NON_NULL", + "kind": "LIST", "name": null, "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseInsightsBucket", + "ofType": null + } } } }, @@ -81731,15 +81895,15 @@ "deprecationReason": null }, { - "name": "updatedAt", + "name": "totals", "description": null, "args": [], "type": { "kind": "NON_NULL", "name": null, "ofType": { - "kind": "SCALAR", - "name": "DateTime", + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseInsightsTotals", "ofType": null } }, @@ -81754,44 +81918,24 @@ }, { "kind": "INPUT_OBJECT", - "name": "WorkflowDeviceTestCaseResultInput", + "name": "WorkflowDeviceTestCaseHistoryFiltersInput", "description": null, "fields": null, "inputFields": [ { - "name": "duration", - "description": "Execution time in milliseconds. Must be non-negative.", - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "errorMessage", - "description": "Error message if failed. Max 4096 characters.", - "type": { - "kind": "SCALAR", - "name": "String", - "ofType": null - }, - "defaultValue": null, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "name", - "description": "Test case name (e.g., \"login\", \"checkout\"). Max 255 characters.", + "name": "gitRefs", + "description": null, "type": { - "kind": "NON_NULL", + "kind": "LIST", "name": null, "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } } }, "defaultValue": null, @@ -81799,104 +81943,145 @@ "deprecationReason": null }, { - "name": "path", - "description": "Path to the test file (e.g., \"flows/login.yaml\"). Max 1024 characters.\nUsed as natural key for deduplication.", + "name": "workflowIds", + "description": null, "type": { - "kind": "NON_NULL", + "kind": "LIST", "name": null, "ofType": { - "kind": "SCALAR", - "name": "String", - "ofType": null + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } } }, "defaultValue": null, "isDeprecated": false, "deprecationReason": null - }, - { - "name": "properties", - "description": "Custom properties from test configuration. Stored as key-value pairs.", - "type": { - "kind": "SCALAR", - "name": "JSONObject", - "ofType": null - }, - "defaultValue": null, - "isDeprecated": false, - "deprecationReason": null - }, - { - "name": "retryCount", - "description": "0-indexed attempt number for this test case. 0 = first attempt, 1 = first retry, etc.", - "type": { - "kind": "SCALAR", - "name": "Int", - "ofType": null - }, - "defaultValue": null, - "isDeprecated": false, - "deprecationReason": null - }, + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseInsights", + "description": null, + "fields": [ { - "name": "status", - "description": "Execution result.", + "name": "facets", + "description": null, + "args": [], "type": { "kind": "NON_NULL", "name": null, "ofType": { - "kind": "ENUM", - "name": "WorkflowDeviceTestCaseStatus", + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseInsightsFacets", "ofType": null } }, - "defaultValue": null, "isDeprecated": false, "deprecationReason": null }, { - "name": "tags", - "description": "Tags defined in the test config. Each tag max 255 characters.", - "type": { - "kind": "LIST", - "name": null, - "ofType": { - "kind": "NON_NULL", - "name": null, - "ofType": { + "name": "tests", + "description": null, + "args": [ + { + "name": "after", + "description": null, + "type": { "kind": "SCALAR", "name": "String", "ofType": null - } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "first", + "description": null, + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "search", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sortDirection", + "description": null, + "type": { + "kind": "ENUM", + "name": "WorkflowDeviceTestCaseSortDirection", + "ofType": null + }, + "defaultValue": "DESC", + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "sortField", + "description": null, + "type": { + "kind": "ENUM", + "name": "WorkflowDeviceTestCaseStatSortField", + "ofType": null + }, + "defaultValue": "FAILS", + "isDeprecated": false, + "deprecationReason": null + } + ], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseStatConnection", + "ofType": null } }, - "defaultValue": null, "isDeprecated": false, "deprecationReason": null - } - ], - "interfaces": null, - "enumValues": null, - "possibleTypes": null - }, - { - "kind": "OBJECT", - "name": "WorkflowDeviceTestCaseResultMutation", - "description": null, - "fields": [ + }, { - "name": "createWorkflowDeviceTestCaseResults", - "description": "Create device test case results for a workflow job.\nResults are immutable - once created, subsequent calls are no-ops.", + "name": "timeSeries", + "description": null, "args": [ { - "name": "input", + "name": "granularity", "description": null, "type": { "kind": "NON_NULL", "name": null, "ofType": { - "kind": "INPUT_OBJECT", - "name": "CreateWorkflowDeviceTestCaseResultsInput", + "kind": "ENUM", + "name": "WorkflowDeviceTestCaseInsightsTimeSeriesGranularity", "ofType": null } }, @@ -81916,7 +82101,7 @@ "name": null, "ofType": { "kind": "OBJECT", - "name": "WorkflowDeviceTestCaseResult", + "name": "WorkflowDeviceTestCaseInsightsBucket", "ofType": null } } @@ -81924,6 +82109,22 @@ }, "isDeprecated": false, "deprecationReason": null + }, + { + "name": "totals", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseInsightsTotals", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null } ], "inputFields": null, @@ -81932,26 +82133,1592 @@ "possibleTypes": null }, { - "kind": "ENUM", - "name": "WorkflowDeviceTestCaseStatus", - "description": "Status of a device test case execution.", - "fields": null, - "inputFields": null, - "interfaces": null, - "enumValues": [ + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseInsightsBucket", + "description": "Mutually exclusive bucket counts (passedClean + flaky + failed = totalRuns for the bucket).\nBuckets are aligned to the UTC start of the requested granularity interval\n(minute / hour / day).", + "fields": [ { - "name": "FAILED", + "name": "bucketStartAt", "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + }, "isDeprecated": false, "deprecationReason": null }, { - "name": "PASSED", + "name": "failed", "description": null, - "isDeprecated": false, - "deprecationReason": null - } - ], + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "flaky", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "passedClean", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseInsightsFacets", + "description": null, + "fields": [ + { + "name": "gitRefs", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tags", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "workflows", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseWorkflowFacet", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "WorkflowDeviceTestCaseInsightsFiltersInput", + "description": null, + "fields": null, + "inputFields": [ + { + "name": "gitRefs", + "description": null, + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "statuses", + "description": null, + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "WorkflowDeviceTestCaseStatusFilter", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tags", + "description": null, + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "workflowIds", + "description": null, + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseInsightsMetric", + "description": "A count metric returned for the current window AND the equivalent prior window\n(start − duration → start). The frontend uses (current, previous) to compute\ntrend deltas. Trend ratios are NOT pre-computed server-side — see\nWorkflowsInsightsMetric for the equivalent convention.\n\nFloat (not Int) to match WorkflowsInsightsMetric and avoid the GraphQL Int32\nceiling: 90-day uniqExact counts on a high-volume project can plausibly\nexceed 2.1B. Values are integer-valued; the frontend reads them as JS numbers.", + "fields": [ + { + "name": "currentValue", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "previousValue", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseInsightsNullableMetric", + "description": "Same shape as WorkflowDeviceTestCaseInsightsMetric but nullable on both sides —\nused for metrics like avgDurationMs / p90DurationMs where \"no data in the\nwindow\" is meaningful and must not collapse to 0.", + "fields": [ + { + "name": "currentValue", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "previousValue", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Float", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "ENUM", + "name": "WorkflowDeviceTestCaseInsightsTimeSeriesGranularity", + "description": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": [ + { + "name": "DAY", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "HOUR", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "MINUTE", + "description": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "WorkflowDeviceTestCaseInsightsTimespanInput", + "description": null, + "fields": null, + "inputFields": [ + { + "name": "end", + "description": null, + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "start", + "description": null, + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseInsightsTotals", + "description": "Raw counts only (paired with previous-window values). Pass rate, flake rate,\nand trends are computed in the frontend from the (currentValue, previousValue)\npair on each metric.\n\ntotalRuns = passedCleanCount + flakyCount + failedCount (over is_final_attempt=1 rows).\ndistinctFlakyTestCount cannot be derived in the frontend from per-test rows\nbecause pagination means the frontend doesn't see all test paths.", + "fields": [ + { + "name": "avgDurationMs", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseInsightsNullableMetric", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "distinctFlakyTestCount", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseInsightsMetric", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "failedCount", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseInsightsMetric", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "flakyCount", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseInsightsMetric", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "p90DurationMs", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseInsightsNullableMetric", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "passedCleanCount", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseInsightsMetric", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "totalRuns", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseInsightsMetric", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseRecentRun", + "description": "One row per execution (is_final_attempt=1). The is_flaky boolean drives the\nFLAKY pill — no per-attempt timeline is exposed in v1.", + "fields": [ + { + "name": "commitSha", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "createdAt", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "durationMs", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "gitRef", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "id", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "isFlaky", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "status", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "WorkflowDeviceTestCaseStatus", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "workflowRunId", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "workflowRunName", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseRecentRunConnection", + "description": null, + "fields": [ + { + "name": "edges", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseRecentRunEdge", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pageInfo", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PageInfo", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "totalCount", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseRecentRunEdge", + "description": null, + "fields": [ + { + "name": "cursor", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "node", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseRecentRun", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseResult", + "description": "A device test case result from a Maestro test execution.", + "fields": [ + { + "name": "createdAt", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "duration", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "errorMessage", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "id", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "name", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "path", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "properties", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "JSONObject", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "retryCount", + "description": "0-indexed attempt number. 0 = first attempt, 1 = first retry, etc.", + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "status", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "WorkflowDeviceTestCaseStatus", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tags", + "description": null, + "args": [], + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "updatedAt", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", + "name": "WorkflowDeviceTestCaseResultInput", + "description": null, + "fields": null, + "inputFields": [ + { + "name": "duration", + "description": "Execution time in milliseconds. Must be non-negative.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "errorMessage", + "description": "Error message if failed. Max 4096 characters.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "name", + "description": "Test case name (e.g., \"login\", \"checkout\"). Max 255 characters.", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "path", + "description": "Path to the test file (e.g., \"flows/login.yaml\"). Max 1024 characters.\nUsed as natural key for deduplication.", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "properties", + "description": "Custom properties from test configuration. Stored as key-value pairs.", + "type": { + "kind": "SCALAR", + "name": "JSONObject", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "retryCount", + "description": "0-indexed attempt number for this test case. 0 = first attempt, 1 = first retry, etc.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "status", + "description": "Execution result.", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "WorkflowDeviceTestCaseStatus", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "tags", + "description": "Tags defined in the test config. Each tag max 255 characters.", + "type": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseResultMutation", + "description": null, + "fields": [ + { + "name": "createWorkflowDeviceTestCaseResults", + "description": "Create device test case results for a workflow job.\nResults are immutable - once created, subsequent calls are no-ops.", + "args": [ + { + "name": "input", + "description": null, + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "CreateWorkflowDeviceTestCaseResultsInput", + "ofType": null + } + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseResult", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "ENUM", + "name": "WorkflowDeviceTestCaseSortDirection", + "description": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": [ + { + "name": "ASC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "DESC", + "description": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseStat", + "description": null, + "fields": [ + { + "name": "avgDurationMs", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "failedCount", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "flakyCount", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "lastRunAt", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "DateTime", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "lastRunIsFlaky", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "lastRunStatus", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "ENUM", + "name": "WorkflowDeviceTestCaseStatus", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "name", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "p90DurationMs", + "description": null, + "args": [], + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "passedCleanCount", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "path", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "totalRuns", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseStatConnection", + "description": null, + "fields": [ + { + "name": "edges", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseStatEdge", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "pageInfo", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "PageInfo", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "totalCount", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseStatEdge", + "description": null, + "fields": [ + { + "name": "cursor", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "node", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseStat", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "ENUM", + "name": "WorkflowDeviceTestCaseStatSortField", + "description": null, + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": [ + { + "name": "FAILS", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FLAKES", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FLAKE_RATE", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "LAST_RUN", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "P90_DURATION", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "PASS_RATE", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "RUNS", + "description": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "possibleTypes": null + }, + { + "kind": "ENUM", + "name": "WorkflowDeviceTestCaseStatus", + "description": "Status of a device test case execution.", + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": [ + { + "name": "FAILED", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "PASSED", + "description": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "possibleTypes": null + }, + { + "kind": "ENUM", + "name": "WorkflowDeviceTestCaseStatusFilter", + "description": "Mutually exclusive — matches the chart bucket semantics (passedClean / flaky / failed).\nPASSED_CLEAN = is_final_attempt=1 AND status=passed AND is_flaky=0\nFLAKY = is_final_attempt=1 AND is_flaky=1 (still a pass, just with retries)\nFAILED = is_final_attempt=1 AND status=failed", + "fields": null, + "inputFields": null, + "interfaces": null, + "enumValues": [ + { + "name": "FAILED", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "FLAKY", + "description": null, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "PASSED_CLEAN", + "description": null, + "isDeprecated": false, + "deprecationReason": null + } + ], + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "WorkflowDeviceTestCaseWorkflowFacet", + "description": null, + "fields": [ + { + "name": "id", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "name", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [], + "enumValues": null, "possibleTypes": null }, { diff --git a/packages/eas-cli/src/commands/simulator/start.ts b/packages/eas-cli/src/commands/simulator/start.ts index d7a435b1ee..e2277ee289 100644 --- a/packages/eas-cli/src/commands/simulator/start.ts +++ b/packages/eas-cli/src/commands/simulator/start.ts @@ -50,6 +50,11 @@ export default class SimulatorStart extends EasCommand { description: 'Version of the package backing the device run session (e.g. "0.1.3-alpha.3"). Defaults to "latest" when omitted.', }), + 'max-duration-minutes': Flags.integer({ + description: + 'Maximum duration of the device run session in minutes before it is automatically stopped. Only customizable on paid plans. Defaults to a value derived from the job run priority when omitted.', + min: 0, + }), ...EasNonInteractiveAndJsonFlags, }; @@ -84,6 +89,7 @@ export default class SimulatorStart extends EasCommand { platform, type: DEVICE_RUN_SESSION_TYPE_BY_FLAG_VALUE[flags.type], packageVersion: flags['package-version'], + maxRunTimeMinutes: flags['max-duration-minutes'], }); deviceRunSessionId = session.id; const jobRunId = nullthrows(session.turtleJobRun?.id, 'Expected device run session to start'); diff --git a/packages/eas-cli/src/graphql/generated.ts b/packages/eas-cli/src/graphql/generated.ts index 216d85cf14..f867865e3a 100644 --- a/packages/eas-cli/src/graphql/generated.ts +++ b/packages/eas-cli/src/graphql/generated.ts @@ -1607,6 +1607,8 @@ export type App = Project & { workerDeploymentsCrashes?: Maybe; workerDeploymentsRequest: WorkerDeploymentRequestEdge; workerDeploymentsRequests?: Maybe; + workflowDeviceTestCaseHistory: WorkflowDeviceTestCaseHistory; + workflowDeviceTestCaseInsights: WorkflowDeviceTestCaseInsights; workflowRunGitBranchesPaginated: AppWorkflowRunGitBranchesConnection; workflowRunsPaginated: AppWorkflowRunsConnection; workflows: Array; @@ -1921,6 +1923,21 @@ export type AppWorkerDeploymentsRequestsArgs = { }; +/** Represents an Exponent App (or Experience in legacy terms) */ +export type AppWorkflowDeviceTestCaseHistoryArgs = { + filters?: InputMaybe; + path: Scalars['String']['input']; + timespan: WorkflowDeviceTestCaseInsightsTimespanInput; +}; + + +/** Represents an Exponent App (or Experience in legacy terms) */ +export type AppWorkflowDeviceTestCaseInsightsArgs = { + filters?: InputMaybe; + timespan: WorkflowDeviceTestCaseInsightsTimespanInput; +}; + + /** Represents an Exponent App (or Experience in legacy terms) */ export type AppWorkflowRunGitBranchesPaginatedArgs = { after?: InputMaybe; @@ -7476,7 +7493,7 @@ export type JobRun = { isWaived: Scalars['Boolean']['output']; logFileUrls: Array; /** Max run time in seconds for this job run. */ - maxRunTimeSeconds?: Maybe; + maxRunTimeSeconds: Scalars['Int']['output']; name: Scalars['String']['output']; priority: JobRunPriority; /** String describing the worker profile used to run this job run. */ @@ -11367,6 +11384,187 @@ export enum WorkflowArtifactStorageType { R2 = 'R2' } +/** + * Grouping key from the [shard N] prefix-stripped error_message. `count` is + * computed with uniqExact(test_case_result_id) so RMT pre-merge duplicates do + * not inflate it. Scope: scans ALL status='failed' rows (NOT just + * is_final_attempt=1) so failures from runs that ultimately passed on retry + * still surface. + */ +export type WorkflowDeviceTestCaseErrorPattern = { + __typename?: 'WorkflowDeviceTestCaseErrorPattern'; + count: Scalars['Int']['output']; + lastSeenAt: Scalars['DateTime']['output']; + patternKey: Scalars['String']['output']; + sampleMessage: Scalars['String']['output']; +}; + +export type WorkflowDeviceTestCaseHistory = { + __typename?: 'WorkflowDeviceTestCaseHistory'; + errorPatterns: Array; + recentRuns: WorkflowDeviceTestCaseRecentRunConnection; + timeSeries: Array; + totals: WorkflowDeviceTestCaseInsightsTotals; +}; + + +export type WorkflowDeviceTestCaseHistoryErrorPatternsArgs = { + first: Scalars['Int']['input']; +}; + + +export type WorkflowDeviceTestCaseHistoryRecentRunsArgs = { + after?: InputMaybe; + first: Scalars['Int']['input']; +}; + + +export type WorkflowDeviceTestCaseHistoryTimeSeriesArgs = { + granularity: WorkflowDeviceTestCaseInsightsTimeSeriesGranularity; +}; + +export type WorkflowDeviceTestCaseHistoryFiltersInput = { + gitRefs?: InputMaybe>; + workflowIds?: InputMaybe>; +}; + +export type WorkflowDeviceTestCaseInsights = { + __typename?: 'WorkflowDeviceTestCaseInsights'; + facets: WorkflowDeviceTestCaseInsightsFacets; + tests: WorkflowDeviceTestCaseStatConnection; + timeSeries: Array; + totals: WorkflowDeviceTestCaseInsightsTotals; +}; + + +export type WorkflowDeviceTestCaseInsightsTestsArgs = { + after?: InputMaybe; + first: Scalars['Int']['input']; + search?: InputMaybe; + sortDirection?: InputMaybe; + sortField?: InputMaybe; +}; + + +export type WorkflowDeviceTestCaseInsightsTimeSeriesArgs = { + granularity: WorkflowDeviceTestCaseInsightsTimeSeriesGranularity; +}; + +/** + * Mutually exclusive bucket counts (passedClean + flaky + failed = totalRuns for the bucket). + * Buckets are aligned to the UTC start of the requested granularity interval + * (minute / hour / day). + */ +export type WorkflowDeviceTestCaseInsightsBucket = { + __typename?: 'WorkflowDeviceTestCaseInsightsBucket'; + bucketStartAt: Scalars['DateTime']['output']; + failed: Scalars['Int']['output']; + flaky: Scalars['Int']['output']; + passedClean: Scalars['Int']['output']; +}; + +export type WorkflowDeviceTestCaseInsightsFacets = { + __typename?: 'WorkflowDeviceTestCaseInsightsFacets'; + gitRefs: Array; + tags: Array; + workflows: Array; +}; + +export type WorkflowDeviceTestCaseInsightsFiltersInput = { + gitRefs?: InputMaybe>; + statuses?: InputMaybe>; + tags?: InputMaybe>; + workflowIds?: InputMaybe>; +}; + +/** + * A count metric returned for the current window AND the equivalent prior window + * (start − duration → start). The frontend uses (current, previous) to compute + * trend deltas. Trend ratios are NOT pre-computed server-side — see + * WorkflowsInsightsMetric for the equivalent convention. + * + * Float (not Int) to match WorkflowsInsightsMetric and avoid the GraphQL Int32 + * ceiling: 90-day uniqExact counts on a high-volume project can plausibly + * exceed 2.1B. Values are integer-valued; the frontend reads them as JS numbers. + */ +export type WorkflowDeviceTestCaseInsightsMetric = { + __typename?: 'WorkflowDeviceTestCaseInsightsMetric'; + currentValue: Scalars['Float']['output']; + previousValue: Scalars['Float']['output']; +}; + +/** + * Same shape as WorkflowDeviceTestCaseInsightsMetric but nullable on both sides — + * used for metrics like avgDurationMs / p90DurationMs where "no data in the + * window" is meaningful and must not collapse to 0. + */ +export type WorkflowDeviceTestCaseInsightsNullableMetric = { + __typename?: 'WorkflowDeviceTestCaseInsightsNullableMetric'; + currentValue?: Maybe; + previousValue?: Maybe; +}; + +export enum WorkflowDeviceTestCaseInsightsTimeSeriesGranularity { + Day = 'DAY', + Hour = 'HOUR', + Minute = 'MINUTE' +} + +export type WorkflowDeviceTestCaseInsightsTimespanInput = { + end: Scalars['DateTime']['input']; + start: Scalars['DateTime']['input']; +}; + +/** + * Raw counts only (paired with previous-window values). Pass rate, flake rate, + * and trends are computed in the frontend from the (currentValue, previousValue) + * pair on each metric. + * + * totalRuns = passedCleanCount + flakyCount + failedCount (over is_final_attempt=1 rows). + * distinctFlakyTestCount cannot be derived in the frontend from per-test rows + * because pagination means the frontend doesn't see all test paths. + */ +export type WorkflowDeviceTestCaseInsightsTotals = { + __typename?: 'WorkflowDeviceTestCaseInsightsTotals'; + avgDurationMs: WorkflowDeviceTestCaseInsightsNullableMetric; + distinctFlakyTestCount: WorkflowDeviceTestCaseInsightsMetric; + failedCount: WorkflowDeviceTestCaseInsightsMetric; + flakyCount: WorkflowDeviceTestCaseInsightsMetric; + p90DurationMs: WorkflowDeviceTestCaseInsightsNullableMetric; + passedCleanCount: WorkflowDeviceTestCaseInsightsMetric; + totalRuns: WorkflowDeviceTestCaseInsightsMetric; +}; + +/** + * One row per execution (is_final_attempt=1). The is_flaky boolean drives the + * FLAKY pill — no per-attempt timeline is exposed in v1. + */ +export type WorkflowDeviceTestCaseRecentRun = { + __typename?: 'WorkflowDeviceTestCaseRecentRun'; + commitSha?: Maybe; + createdAt: Scalars['DateTime']['output']; + durationMs?: Maybe; + gitRef?: Maybe; + id: Scalars['ID']['output']; + isFlaky: Scalars['Boolean']['output']; + status: WorkflowDeviceTestCaseStatus; + workflowRunId: Scalars['ID']['output']; + workflowRunName: Scalars['String']['output']; +}; + +export type WorkflowDeviceTestCaseRecentRunConnection = { + __typename?: 'WorkflowDeviceTestCaseRecentRunConnection'; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars['Int']['output']; +}; + +export type WorkflowDeviceTestCaseRecentRunEdge = { + __typename?: 'WorkflowDeviceTestCaseRecentRunEdge'; + cursor: Scalars['String']['output']; + node: WorkflowDeviceTestCaseRecentRun; +}; + /** A device test case result from a Maestro test execution. */ export type WorkflowDeviceTestCaseResult = { __typename?: 'WorkflowDeviceTestCaseResult'; @@ -11420,12 +11618,73 @@ export type WorkflowDeviceTestCaseResultMutationCreateWorkflowDeviceTestCaseResu input: CreateWorkflowDeviceTestCaseResultsInput; }; +export enum WorkflowDeviceTestCaseSortDirection { + Asc = 'ASC', + Desc = 'DESC' +} + +export type WorkflowDeviceTestCaseStat = { + __typename?: 'WorkflowDeviceTestCaseStat'; + avgDurationMs?: Maybe; + failedCount: Scalars['Int']['output']; + flakyCount: Scalars['Int']['output']; + lastRunAt: Scalars['DateTime']['output']; + lastRunIsFlaky: Scalars['Boolean']['output']; + lastRunStatus: WorkflowDeviceTestCaseStatus; + name: Scalars['String']['output']; + p90DurationMs?: Maybe; + passedCleanCount: Scalars['Int']['output']; + path: Scalars['String']['output']; + totalRuns: Scalars['Int']['output']; +}; + +export type WorkflowDeviceTestCaseStatConnection = { + __typename?: 'WorkflowDeviceTestCaseStatConnection'; + edges: Array; + pageInfo: PageInfo; + totalCount: Scalars['Int']['output']; +}; + +export type WorkflowDeviceTestCaseStatEdge = { + __typename?: 'WorkflowDeviceTestCaseStatEdge'; + cursor: Scalars['String']['output']; + node: WorkflowDeviceTestCaseStat; +}; + +export enum WorkflowDeviceTestCaseStatSortField { + Fails = 'FAILS', + Flakes = 'FLAKES', + FlakeRate = 'FLAKE_RATE', + LastRun = 'LAST_RUN', + P90Duration = 'P90_DURATION', + PassRate = 'PASS_RATE', + Runs = 'RUNS' +} + /** Status of a device test case execution. */ export enum WorkflowDeviceTestCaseStatus { Failed = 'FAILED', Passed = 'PASSED' } +/** + * Mutually exclusive — matches the chart bucket semantics (passedClean / flaky / failed). + * PASSED_CLEAN = is_final_attempt=1 AND status=passed AND is_flaky=0 + * FLAKY = is_final_attempt=1 AND is_flaky=1 (still a pass, just with retries) + * FAILED = is_final_attempt=1 AND status=failed + */ +export enum WorkflowDeviceTestCaseStatusFilter { + Failed = 'FAILED', + Flaky = 'FLAKY', + PassedClean = 'PASSED_CLEAN' +} + +export type WorkflowDeviceTestCaseWorkflowFacet = { + __typename?: 'WorkflowDeviceTestCaseWorkflowFacet'; + id: Scalars['ID']['output']; + name: Scalars['String']['output']; +}; + export type WorkflowJob = { __typename?: 'WorkflowJob'; allDeviceTestCaseResults: Array;