diff --git a/.gitignore b/.gitignore
index 4770ff8..18c750c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,7 +2,6 @@
 .DS_Store
 *~
 *.pyc
-packages
 .packages
 .pub
 app/build
diff --git a/analyze/analyze.dart b/analyze/analyze.dart
index 7dd6c9c..bdb9c5f 100644
--- a/analyze/analyze.dart
+++ b/analyze/analyze.dart
@@ -54,6 +54,9 @@
       .where((File file) => path.extension(file.path) != '.ico')
       .where((File file) => path.extension(file.path) != '.jar')
       .where((File file) => path.extension(file.path) != '.swp')
+      .where((File file) => !path.basename(file.path).endsWith('pbserver.dart'))
+      .where((File file) => !path.basename(file.path).endsWith('pb.dart'))
+      .where((File file) => !path.basename(file.path).endsWith('pbenum.dart'))
       .toList();
   final List<String> problems = <String>[];
   for (final File file in files) {
diff --git a/packages/buildbucket-dart/.gitignore b/packages/buildbucket-dart/.gitignore
new file mode 100644
index 0000000..db563d5
--- /dev/null
+++ b/packages/buildbucket-dart/.gitignore
@@ -0,0 +1,13 @@
+# Files and directories created by pub.
+.dart_tool/
+.packages
+
+# Conventional directory for build outputs.
+build/
+
+# Omit committing pubspec.lock for library packages; see
+# https://dart.dev/guides/libraries/private-files#pubspeclock.
+pubspec.lock
+
+# Directory used to checkout proto deps to process them.
+buildbucket_tmp
diff --git a/packages/buildbucket-dart/CHANGELOG.md b/packages/buildbucket-dart/CHANGELOG.md
new file mode 100644
index 0000000..f7f1d52
--- /dev/null
+++ b/packages/buildbucket-dart/CHANGELOG.md
@@ -0,0 +1,3 @@
+# 1.0.0
+
+- Initial version generating dart code for Buildbucket protos.
diff --git a/packages/buildbucket-dart/LICENSE b/packages/buildbucket-dart/LICENSE
new file mode 100644
index 0000000..fef1981
--- /dev/null
+++ b/packages/buildbucket-dart/LICENSE
@@ -0,0 +1,27 @@
+// Copyright 2016 The Flutter Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//    * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//    * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//    * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/packages/buildbucket-dart/README.md b/packages/buildbucket-dart/README.md
new file mode 100644
index 0000000..ccabf32
--- /dev/null
+++ b/packages/buildbucket-dart/README.md
@@ -0,0 +1,19 @@
+# Dart Buildbucket
+
+Dart LUCI buildbucket protobufs.
+
+## Details
+
+These protobufs are used to communicate with LUCI Buildbucket services from Dart Language.
+
+## Regenerating the protos
+
+* Run `dart pub global activate protoc_plugin`.
+* From `packages/buildbucket-proto-dart` run `bash tool/regenerate.sh`.
+
+That will checkout protobuf, buildbucket and googleapis repositories. It will also compile the protos
+and generate their correspondent Dart classes.
+
+## Feedback
+
+File an issue in flutter/flutter with the word 'buildbucket-dart' clearly in the title and cc @godofredoc.
diff --git a/packages/buildbucket-dart/analysis_options.yaml b/packages/buildbucket-dart/analysis_options.yaml
new file mode 100644
index 0000000..eddf03f
--- /dev/null
+++ b/packages/buildbucket-dart/analysis_options.yaml
@@ -0,0 +1,30 @@
+# This file configures the static analysis results for your project (errors,
+# warnings, and lints).
+#
+# This enables the 'recommended' set of lints from `package:lints`.
+# This set helps identify many issues that may lead to problems when running
+# or consuming Dart code, and enforces writing Dart using a single, idiomatic
+# style and format.
+#
+# If you want a smaller set of lints you can change this to specify
+# 'package:lints/core.yaml'. These are just the most critical lints
+# (the recommended set includes the core lints).
+# The core lints are also what is used by pub.dev for scoring packages.
+
+include: package:lints/recommended.yaml
+
+# Uncomment the following section to specify additional rules.
+
+# linter:
+#   rules:
+#     - camel_case_types
+
+analyzer:
+   exclude:
+     - lib/src/generated/**
+
+# For more information about the core and recommended set of lints, see
+# https://dart.dev/go/core-lints
+
+# For additional information about configuring this file, see
+# https://dart.dev/guides/language/analysis-options
diff --git a/packages/buildbucket-dart/example/buildbucket_pb_example.dart b/packages/buildbucket-dart/example/buildbucket_pb_example.dart
new file mode 100644
index 0000000..61cdb50
--- /dev/null
+++ b/packages/buildbucket-dart/example/buildbucket_pb_example.dart
@@ -0,0 +1,17 @@
+// Copyright 2022 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'dart:convert';
+
+import 'package:buildbucket_proto/buildbucket_pb.dart';
+
+void main() {
+  // Create a BuildBucket build from a json string.
+  Build build = Build();
+  final String json = '{"builder": {"project": "flutter", "bucket": "try", "builder": "buildabc"}}';
+  Map<String, dynamic> jsonObject = jsonDecode(json);
+  build.mergeFromProto3Json(jsonObject);
+  // Enconding the Build instance to a json object.
+  print(build.toProto3Json());
+}
diff --git a/packages/buildbucket-dart/lib/buildbucket_pb.dart b/packages/buildbucket-dart/lib/buildbucket_pb.dart
new file mode 100644
index 0000000..39a2d43
--- /dev/null
+++ b/packages/buildbucket-dart/lib/buildbucket_pb.dart
@@ -0,0 +1,7 @@
+// Copyright 2022 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+library buildbucket_pb;
+
+export 'src/generated/go.chromium.org/luci/buildbucket/proto/build.pb.dart' show Build;
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/build.pb.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/build.pb.dart
new file mode 100644
index 0000000..ff67ff1
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/build.pb.dart
@@ -0,0 +1,3245 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/buildbucket/proto/build.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'builder_common.pb.dart' as $0;
+import '../../../../google/protobuf/timestamp.pb.dart' as $1;
+import 'step.pb.dart' as $2;
+import 'common.pb.dart' as $3;
+import '../../../../google/protobuf/duration.pb.dart' as $4;
+import '../../../../google/protobuf/struct.pb.dart' as $5;
+import 'task.pb.dart' as $6;
+
+import 'common.pbenum.dart' as $3;
+import 'build.pbenum.dart';
+
+export 'build.pbenum.dart';
+
+class Build_Input extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Build.Input',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOM<$5.Struct>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'properties',
+        subBuilder: $5.Struct.create)
+    ..aOM<$3.GitilesCommit>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gitilesCommit',
+        subBuilder: $3.GitilesCommit.create)
+    ..pc<$3.GerritChange>(
+        3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gerritChanges', $pb.PbFieldType.PM,
+        subBuilder: $3.GerritChange.create)
+    ..aOB(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'experimental')
+    ..pPS(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'experiments')
+    ..hasRequiredFields = false;
+
+  Build_Input._() : super();
+  factory Build_Input({
+    $5.Struct? properties,
+    $3.GitilesCommit? gitilesCommit,
+    $core.Iterable<$3.GerritChange>? gerritChanges,
+    $core.bool? experimental,
+    $core.Iterable<$core.String>? experiments,
+  }) {
+    final _result = create();
+    if (properties != null) {
+      _result.properties = properties;
+    }
+    if (gitilesCommit != null) {
+      _result.gitilesCommit = gitilesCommit;
+    }
+    if (gerritChanges != null) {
+      _result.gerritChanges.addAll(gerritChanges);
+    }
+    if (experimental != null) {
+      _result.experimental = experimental;
+    }
+    if (experiments != null) {
+      _result.experiments.addAll(experiments);
+    }
+    return _result;
+  }
+  factory Build_Input.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory Build_Input.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  Build_Input clone() => Build_Input()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  Build_Input copyWith(void Function(Build_Input) updates) =>
+      super.copyWith((message) => updates(message as Build_Input)) as Build_Input; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Build_Input create() => Build_Input._();
+  Build_Input createEmptyInstance() => create();
+  static $pb.PbList<Build_Input> createRepeated() => $pb.PbList<Build_Input>();
+  @$core.pragma('dart2js:noInline')
+  static Build_Input getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Build_Input>(create);
+  static Build_Input? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $5.Struct get properties => $_getN(0);
+  @$pb.TagNumber(1)
+  set properties($5.Struct v) {
+    setField(1, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasProperties() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearProperties() => clearField(1);
+  @$pb.TagNumber(1)
+  $5.Struct ensureProperties() => $_ensure(0);
+
+  @$pb.TagNumber(2)
+  $3.GitilesCommit get gitilesCommit => $_getN(1);
+  @$pb.TagNumber(2)
+  set gitilesCommit($3.GitilesCommit v) {
+    setField(2, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasGitilesCommit() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearGitilesCommit() => clearField(2);
+  @$pb.TagNumber(2)
+  $3.GitilesCommit ensureGitilesCommit() => $_ensure(1);
+
+  @$pb.TagNumber(3)
+  $core.List<$3.GerritChange> get gerritChanges => $_getList(2);
+
+  @$pb.TagNumber(5)
+  $core.bool get experimental => $_getBF(3);
+  @$pb.TagNumber(5)
+  set experimental($core.bool v) {
+    $_setBool(3, v);
+  }
+
+  @$pb.TagNumber(5)
+  $core.bool hasExperimental() => $_has(3);
+  @$pb.TagNumber(5)
+  void clearExperimental() => clearField(5);
+
+  @$pb.TagNumber(6)
+  $core.List<$core.String> get experiments => $_getList(4);
+}
+
+class Build_Output extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Build.Output',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOM<$5.Struct>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'properties',
+        subBuilder: $5.Struct.create)
+    ..aOM<$3.GitilesCommit>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gitilesCommit',
+        subBuilder: $3.GitilesCommit.create)
+    ..pc<$3.Log>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'logs', $pb.PbFieldType.PM,
+        subBuilder: $3.Log.create)
+    ..hasRequiredFields = false;
+
+  Build_Output._() : super();
+  factory Build_Output({
+    $5.Struct? properties,
+    $3.GitilesCommit? gitilesCommit,
+    $core.Iterable<$3.Log>? logs,
+  }) {
+    final _result = create();
+    if (properties != null) {
+      _result.properties = properties;
+    }
+    if (gitilesCommit != null) {
+      _result.gitilesCommit = gitilesCommit;
+    }
+    if (logs != null) {
+      _result.logs.addAll(logs);
+    }
+    return _result;
+  }
+  factory Build_Output.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory Build_Output.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  Build_Output clone() => Build_Output()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  Build_Output copyWith(void Function(Build_Output) updates) =>
+      super.copyWith((message) => updates(message as Build_Output)) as Build_Output; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Build_Output create() => Build_Output._();
+  Build_Output createEmptyInstance() => create();
+  static $pb.PbList<Build_Output> createRepeated() => $pb.PbList<Build_Output>();
+  @$core.pragma('dart2js:noInline')
+  static Build_Output getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Build_Output>(create);
+  static Build_Output? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $5.Struct get properties => $_getN(0);
+  @$pb.TagNumber(1)
+  set properties($5.Struct v) {
+    setField(1, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasProperties() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearProperties() => clearField(1);
+  @$pb.TagNumber(1)
+  $5.Struct ensureProperties() => $_ensure(0);
+
+  @$pb.TagNumber(3)
+  $3.GitilesCommit get gitilesCommit => $_getN(1);
+  @$pb.TagNumber(3)
+  set gitilesCommit($3.GitilesCommit v) {
+    setField(3, v);
+  }
+
+  @$pb.TagNumber(3)
+  $core.bool hasGitilesCommit() => $_has(1);
+  @$pb.TagNumber(3)
+  void clearGitilesCommit() => clearField(3);
+  @$pb.TagNumber(3)
+  $3.GitilesCommit ensureGitilesCommit() => $_ensure(1);
+
+  @$pb.TagNumber(5)
+  $core.List<$3.Log> get logs => $_getList(2);
+}
+
+class Build extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Build',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aInt64(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id')
+    ..aOM<$0.BuilderID>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'builder',
+        subBuilder: $0.BuilderID.create)
+    ..a<$core.int>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'number', $pb.PbFieldType.O3)
+    ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'createdBy')
+    ..aOM<$1.Timestamp>(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'createTime',
+        subBuilder: $1.Timestamp.create)
+    ..aOM<$1.Timestamp>(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'startTime',
+        subBuilder: $1.Timestamp.create)
+    ..aOM<$1.Timestamp>(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'endTime',
+        subBuilder: $1.Timestamp.create)
+    ..aOM<$1.Timestamp>(9, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'updateTime',
+        subBuilder: $1.Timestamp.create)
+    ..e<$3.Status>(
+        12, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'status', $pb.PbFieldType.OE,
+        defaultOrMaker: $3.Status.STATUS_UNSPECIFIED, valueOf: $3.Status.valueOf, enumValues: $3.Status.values)
+    ..aOM<Build_Input>(15, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'input',
+        subBuilder: Build_Input.create)
+    ..aOM<Build_Output>(16, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'output',
+        subBuilder: Build_Output.create)
+    ..pc<$2.Step>(17, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'steps', $pb.PbFieldType.PM,
+        subBuilder: $2.Step.create)
+    ..aOM<BuildInfra>(18, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'infra',
+        subBuilder: BuildInfra.create)
+    ..pc<$3.StringPair>(
+        19, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'tags', $pb.PbFieldType.PM,
+        subBuilder: $3.StringPair.create)
+    ..aOS(20, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'summaryMarkdown')
+    ..e<$3.Trinary>(
+        21, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'critical', $pb.PbFieldType.OE,
+        defaultOrMaker: $3.Trinary.UNSET, valueOf: $3.Trinary.valueOf, enumValues: $3.Trinary.values)
+    ..aOM<$3.StatusDetails>(22, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'statusDetails',
+        subBuilder: $3.StatusDetails.create)
+    ..aOS(23, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'canceledBy')
+    ..aOM<$3.Executable>(24, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'exe',
+        subBuilder: $3.Executable.create)
+    ..aOB(25, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'canary')
+    ..aOM<$4.Duration>(26, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'schedulingTimeout',
+        subBuilder: $4.Duration.create)
+    ..aOM<$4.Duration>(27, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'executionTimeout',
+        subBuilder: $4.Duration.create)
+    ..aOB(28, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'waitForCapacity')
+    ..aOM<$4.Duration>(29, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gracePeriod',
+        subBuilder: $4.Duration.create)
+    ..aOB(30, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'canOutliveParent')
+    ..p<$fixnum.Int64>(
+        31, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'ancestorIds', $pb.PbFieldType.K6)
+    ..aOM<$1.Timestamp>(32, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'cancelTime',
+        subBuilder: $1.Timestamp.create)
+    ..hasRequiredFields = false;
+
+  Build._() : super();
+  factory Build({
+    $fixnum.Int64? id,
+    $0.BuilderID? builder,
+    $core.int? number,
+    $core.String? createdBy,
+    $1.Timestamp? createTime,
+    $1.Timestamp? startTime,
+    $1.Timestamp? endTime,
+    $1.Timestamp? updateTime,
+    $3.Status? status,
+    Build_Input? input,
+    Build_Output? output,
+    $core.Iterable<$2.Step>? steps,
+    BuildInfra? infra,
+    $core.Iterable<$3.StringPair>? tags,
+    $core.String? summaryMarkdown,
+    $3.Trinary? critical,
+    $3.StatusDetails? statusDetails,
+    $core.String? canceledBy,
+    $3.Executable? exe,
+    $core.bool? canary,
+    $4.Duration? schedulingTimeout,
+    $4.Duration? executionTimeout,
+    $core.bool? waitForCapacity,
+    $4.Duration? gracePeriod,
+    $core.bool? canOutliveParent,
+    $core.Iterable<$fixnum.Int64>? ancestorIds,
+    $1.Timestamp? cancelTime,
+  }) {
+    final _result = create();
+    if (id != null) {
+      _result.id = id;
+    }
+    if (builder != null) {
+      _result.builder = builder;
+    }
+    if (number != null) {
+      _result.number = number;
+    }
+    if (createdBy != null) {
+      _result.createdBy = createdBy;
+    }
+    if (createTime != null) {
+      _result.createTime = createTime;
+    }
+    if (startTime != null) {
+      _result.startTime = startTime;
+    }
+    if (endTime != null) {
+      _result.endTime = endTime;
+    }
+    if (updateTime != null) {
+      _result.updateTime = updateTime;
+    }
+    if (status != null) {
+      _result.status = status;
+    }
+    if (input != null) {
+      _result.input = input;
+    }
+    if (output != null) {
+      _result.output = output;
+    }
+    if (steps != null) {
+      _result.steps.addAll(steps);
+    }
+    if (infra != null) {
+      _result.infra = infra;
+    }
+    if (tags != null) {
+      _result.tags.addAll(tags);
+    }
+    if (summaryMarkdown != null) {
+      _result.summaryMarkdown = summaryMarkdown;
+    }
+    if (critical != null) {
+      _result.critical = critical;
+    }
+    if (statusDetails != null) {
+      _result.statusDetails = statusDetails;
+    }
+    if (canceledBy != null) {
+      _result.canceledBy = canceledBy;
+    }
+    if (exe != null) {
+      _result.exe = exe;
+    }
+    if (canary != null) {
+      _result.canary = canary;
+    }
+    if (schedulingTimeout != null) {
+      _result.schedulingTimeout = schedulingTimeout;
+    }
+    if (executionTimeout != null) {
+      _result.executionTimeout = executionTimeout;
+    }
+    if (waitForCapacity != null) {
+      _result.waitForCapacity = waitForCapacity;
+    }
+    if (gracePeriod != null) {
+      _result.gracePeriod = gracePeriod;
+    }
+    if (canOutliveParent != null) {
+      _result.canOutliveParent = canOutliveParent;
+    }
+    if (ancestorIds != null) {
+      _result.ancestorIds.addAll(ancestorIds);
+    }
+    if (cancelTime != null) {
+      _result.cancelTime = cancelTime;
+    }
+    return _result;
+  }
+  factory Build.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory Build.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  Build clone() => Build()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  Build copyWith(void Function(Build) updates) =>
+      super.copyWith((message) => updates(message as Build)) as Build; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Build create() => Build._();
+  Build createEmptyInstance() => create();
+  static $pb.PbList<Build> createRepeated() => $pb.PbList<Build>();
+  @$core.pragma('dart2js:noInline')
+  static Build getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Build>(create);
+  static Build? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $fixnum.Int64 get id => $_getI64(0);
+  @$pb.TagNumber(1)
+  set id($fixnum.Int64 v) {
+    $_setInt64(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasId() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearId() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $0.BuilderID get builder => $_getN(1);
+  @$pb.TagNumber(2)
+  set builder($0.BuilderID v) {
+    setField(2, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasBuilder() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearBuilder() => clearField(2);
+  @$pb.TagNumber(2)
+  $0.BuilderID ensureBuilder() => $_ensure(1);
+
+  @$pb.TagNumber(3)
+  $core.int get number => $_getIZ(2);
+  @$pb.TagNumber(3)
+  set number($core.int v) {
+    $_setSignedInt32(2, v);
+  }
+
+  @$pb.TagNumber(3)
+  $core.bool hasNumber() => $_has(2);
+  @$pb.TagNumber(3)
+  void clearNumber() => clearField(3);
+
+  @$pb.TagNumber(4)
+  $core.String get createdBy => $_getSZ(3);
+  @$pb.TagNumber(4)
+  set createdBy($core.String v) {
+    $_setString(3, v);
+  }
+
+  @$pb.TagNumber(4)
+  $core.bool hasCreatedBy() => $_has(3);
+  @$pb.TagNumber(4)
+  void clearCreatedBy() => clearField(4);
+
+  @$pb.TagNumber(6)
+  $1.Timestamp get createTime => $_getN(4);
+  @$pb.TagNumber(6)
+  set createTime($1.Timestamp v) {
+    setField(6, v);
+  }
+
+  @$pb.TagNumber(6)
+  $core.bool hasCreateTime() => $_has(4);
+  @$pb.TagNumber(6)
+  void clearCreateTime() => clearField(6);
+  @$pb.TagNumber(6)
+  $1.Timestamp ensureCreateTime() => $_ensure(4);
+
+  @$pb.TagNumber(7)
+  $1.Timestamp get startTime => $_getN(5);
+  @$pb.TagNumber(7)
+  set startTime($1.Timestamp v) {
+    setField(7, v);
+  }
+
+  @$pb.TagNumber(7)
+  $core.bool hasStartTime() => $_has(5);
+  @$pb.TagNumber(7)
+  void clearStartTime() => clearField(7);
+  @$pb.TagNumber(7)
+  $1.Timestamp ensureStartTime() => $_ensure(5);
+
+  @$pb.TagNumber(8)
+  $1.Timestamp get endTime => $_getN(6);
+  @$pb.TagNumber(8)
+  set endTime($1.Timestamp v) {
+    setField(8, v);
+  }
+
+  @$pb.TagNumber(8)
+  $core.bool hasEndTime() => $_has(6);
+  @$pb.TagNumber(8)
+  void clearEndTime() => clearField(8);
+  @$pb.TagNumber(8)
+  $1.Timestamp ensureEndTime() => $_ensure(6);
+
+  @$pb.TagNumber(9)
+  $1.Timestamp get updateTime => $_getN(7);
+  @$pb.TagNumber(9)
+  set updateTime($1.Timestamp v) {
+    setField(9, v);
+  }
+
+  @$pb.TagNumber(9)
+  $core.bool hasUpdateTime() => $_has(7);
+  @$pb.TagNumber(9)
+  void clearUpdateTime() => clearField(9);
+  @$pb.TagNumber(9)
+  $1.Timestamp ensureUpdateTime() => $_ensure(7);
+
+  @$pb.TagNumber(12)
+  $3.Status get status => $_getN(8);
+  @$pb.TagNumber(12)
+  set status($3.Status v) {
+    setField(12, v);
+  }
+
+  @$pb.TagNumber(12)
+  $core.bool hasStatus() => $_has(8);
+  @$pb.TagNumber(12)
+  void clearStatus() => clearField(12);
+
+  @$pb.TagNumber(15)
+  Build_Input get input => $_getN(9);
+  @$pb.TagNumber(15)
+  set input(Build_Input v) {
+    setField(15, v);
+  }
+
+  @$pb.TagNumber(15)
+  $core.bool hasInput() => $_has(9);
+  @$pb.TagNumber(15)
+  void clearInput() => clearField(15);
+  @$pb.TagNumber(15)
+  Build_Input ensureInput() => $_ensure(9);
+
+  @$pb.TagNumber(16)
+  Build_Output get output => $_getN(10);
+  @$pb.TagNumber(16)
+  set output(Build_Output v) {
+    setField(16, v);
+  }
+
+  @$pb.TagNumber(16)
+  $core.bool hasOutput() => $_has(10);
+  @$pb.TagNumber(16)
+  void clearOutput() => clearField(16);
+  @$pb.TagNumber(16)
+  Build_Output ensureOutput() => $_ensure(10);
+
+  @$pb.TagNumber(17)
+  $core.List<$2.Step> get steps => $_getList(11);
+
+  @$pb.TagNumber(18)
+  BuildInfra get infra => $_getN(12);
+  @$pb.TagNumber(18)
+  set infra(BuildInfra v) {
+    setField(18, v);
+  }
+
+  @$pb.TagNumber(18)
+  $core.bool hasInfra() => $_has(12);
+  @$pb.TagNumber(18)
+  void clearInfra() => clearField(18);
+  @$pb.TagNumber(18)
+  BuildInfra ensureInfra() => $_ensure(12);
+
+  @$pb.TagNumber(19)
+  $core.List<$3.StringPair> get tags => $_getList(13);
+
+  @$pb.TagNumber(20)
+  $core.String get summaryMarkdown => $_getSZ(14);
+  @$pb.TagNumber(20)
+  set summaryMarkdown($core.String v) {
+    $_setString(14, v);
+  }
+
+  @$pb.TagNumber(20)
+  $core.bool hasSummaryMarkdown() => $_has(14);
+  @$pb.TagNumber(20)
+  void clearSummaryMarkdown() => clearField(20);
+
+  @$pb.TagNumber(21)
+  $3.Trinary get critical => $_getN(15);
+  @$pb.TagNumber(21)
+  set critical($3.Trinary v) {
+    setField(21, v);
+  }
+
+  @$pb.TagNumber(21)
+  $core.bool hasCritical() => $_has(15);
+  @$pb.TagNumber(21)
+  void clearCritical() => clearField(21);
+
+  @$pb.TagNumber(22)
+  $3.StatusDetails get statusDetails => $_getN(16);
+  @$pb.TagNumber(22)
+  set statusDetails($3.StatusDetails v) {
+    setField(22, v);
+  }
+
+  @$pb.TagNumber(22)
+  $core.bool hasStatusDetails() => $_has(16);
+  @$pb.TagNumber(22)
+  void clearStatusDetails() => clearField(22);
+  @$pb.TagNumber(22)
+  $3.StatusDetails ensureStatusDetails() => $_ensure(16);
+
+  @$pb.TagNumber(23)
+  $core.String get canceledBy => $_getSZ(17);
+  @$pb.TagNumber(23)
+  set canceledBy($core.String v) {
+    $_setString(17, v);
+  }
+
+  @$pb.TagNumber(23)
+  $core.bool hasCanceledBy() => $_has(17);
+  @$pb.TagNumber(23)
+  void clearCanceledBy() => clearField(23);
+
+  @$pb.TagNumber(24)
+  $3.Executable get exe => $_getN(18);
+  @$pb.TagNumber(24)
+  set exe($3.Executable v) {
+    setField(24, v);
+  }
+
+  @$pb.TagNumber(24)
+  $core.bool hasExe() => $_has(18);
+  @$pb.TagNumber(24)
+  void clearExe() => clearField(24);
+  @$pb.TagNumber(24)
+  $3.Executable ensureExe() => $_ensure(18);
+
+  @$pb.TagNumber(25)
+  $core.bool get canary => $_getBF(19);
+  @$pb.TagNumber(25)
+  set canary($core.bool v) {
+    $_setBool(19, v);
+  }
+
+  @$pb.TagNumber(25)
+  $core.bool hasCanary() => $_has(19);
+  @$pb.TagNumber(25)
+  void clearCanary() => clearField(25);
+
+  @$pb.TagNumber(26)
+  $4.Duration get schedulingTimeout => $_getN(20);
+  @$pb.TagNumber(26)
+  set schedulingTimeout($4.Duration v) {
+    setField(26, v);
+  }
+
+  @$pb.TagNumber(26)
+  $core.bool hasSchedulingTimeout() => $_has(20);
+  @$pb.TagNumber(26)
+  void clearSchedulingTimeout() => clearField(26);
+  @$pb.TagNumber(26)
+  $4.Duration ensureSchedulingTimeout() => $_ensure(20);
+
+  @$pb.TagNumber(27)
+  $4.Duration get executionTimeout => $_getN(21);
+  @$pb.TagNumber(27)
+  set executionTimeout($4.Duration v) {
+    setField(27, v);
+  }
+
+  @$pb.TagNumber(27)
+  $core.bool hasExecutionTimeout() => $_has(21);
+  @$pb.TagNumber(27)
+  void clearExecutionTimeout() => clearField(27);
+  @$pb.TagNumber(27)
+  $4.Duration ensureExecutionTimeout() => $_ensure(21);
+
+  @$pb.TagNumber(28)
+  $core.bool get waitForCapacity => $_getBF(22);
+  @$pb.TagNumber(28)
+  set waitForCapacity($core.bool v) {
+    $_setBool(22, v);
+  }
+
+  @$pb.TagNumber(28)
+  $core.bool hasWaitForCapacity() => $_has(22);
+  @$pb.TagNumber(28)
+  void clearWaitForCapacity() => clearField(28);
+
+  @$pb.TagNumber(29)
+  $4.Duration get gracePeriod => $_getN(23);
+  @$pb.TagNumber(29)
+  set gracePeriod($4.Duration v) {
+    setField(29, v);
+  }
+
+  @$pb.TagNumber(29)
+  $core.bool hasGracePeriod() => $_has(23);
+  @$pb.TagNumber(29)
+  void clearGracePeriod() => clearField(29);
+  @$pb.TagNumber(29)
+  $4.Duration ensureGracePeriod() => $_ensure(23);
+
+  @$pb.TagNumber(30)
+  $core.bool get canOutliveParent => $_getBF(24);
+  @$pb.TagNumber(30)
+  set canOutliveParent($core.bool v) {
+    $_setBool(24, v);
+  }
+
+  @$pb.TagNumber(30)
+  $core.bool hasCanOutliveParent() => $_has(24);
+  @$pb.TagNumber(30)
+  void clearCanOutliveParent() => clearField(30);
+
+  @$pb.TagNumber(31)
+  $core.List<$fixnum.Int64> get ancestorIds => $_getList(25);
+
+  @$pb.TagNumber(32)
+  $1.Timestamp get cancelTime => $_getN(26);
+  @$pb.TagNumber(32)
+  set cancelTime($1.Timestamp v) {
+    setField(32, v);
+  }
+
+  @$pb.TagNumber(32)
+  $core.bool hasCancelTime() => $_has(26);
+  @$pb.TagNumber(32)
+  void clearCancelTime() => clearField(32);
+  @$pb.TagNumber(32)
+  $1.Timestamp ensureCancelTime() => $_ensure(26);
+}
+
+class InputDataRef_CAS_Digest extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'InputDataRef.CAS.Digest',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'hash')
+    ..aInt64(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'sizeBytes')
+    ..hasRequiredFields = false;
+
+  InputDataRef_CAS_Digest._() : super();
+  factory InputDataRef_CAS_Digest({
+    $core.String? hash,
+    $fixnum.Int64? sizeBytes,
+  }) {
+    final _result = create();
+    if (hash != null) {
+      _result.hash = hash;
+    }
+    if (sizeBytes != null) {
+      _result.sizeBytes = sizeBytes;
+    }
+    return _result;
+  }
+  factory InputDataRef_CAS_Digest.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory InputDataRef_CAS_Digest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  InputDataRef_CAS_Digest clone() => InputDataRef_CAS_Digest()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  InputDataRef_CAS_Digest copyWith(void Function(InputDataRef_CAS_Digest) updates) =>
+      super.copyWith((message) => updates(message as InputDataRef_CAS_Digest))
+          as InputDataRef_CAS_Digest; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static InputDataRef_CAS_Digest create() => InputDataRef_CAS_Digest._();
+  InputDataRef_CAS_Digest createEmptyInstance() => create();
+  static $pb.PbList<InputDataRef_CAS_Digest> createRepeated() => $pb.PbList<InputDataRef_CAS_Digest>();
+  @$core.pragma('dart2js:noInline')
+  static InputDataRef_CAS_Digest getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<InputDataRef_CAS_Digest>(create);
+  static InputDataRef_CAS_Digest? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get hash => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set hash($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasHash() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearHash() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $fixnum.Int64 get sizeBytes => $_getI64(1);
+  @$pb.TagNumber(2)
+  set sizeBytes($fixnum.Int64 v) {
+    $_setInt64(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasSizeBytes() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearSizeBytes() => clearField(2);
+}
+
+class InputDataRef_CAS extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'InputDataRef.CAS',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'casInstance')
+    ..aOM<InputDataRef_CAS_Digest>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'digest',
+        subBuilder: InputDataRef_CAS_Digest.create)
+    ..hasRequiredFields = false;
+
+  InputDataRef_CAS._() : super();
+  factory InputDataRef_CAS({
+    $core.String? casInstance,
+    InputDataRef_CAS_Digest? digest,
+  }) {
+    final _result = create();
+    if (casInstance != null) {
+      _result.casInstance = casInstance;
+    }
+    if (digest != null) {
+      _result.digest = digest;
+    }
+    return _result;
+  }
+  factory InputDataRef_CAS.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory InputDataRef_CAS.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  InputDataRef_CAS clone() => InputDataRef_CAS()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  InputDataRef_CAS copyWith(void Function(InputDataRef_CAS) updates) =>
+      super.copyWith((message) => updates(message as InputDataRef_CAS))
+          as InputDataRef_CAS; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static InputDataRef_CAS create() => InputDataRef_CAS._();
+  InputDataRef_CAS createEmptyInstance() => create();
+  static $pb.PbList<InputDataRef_CAS> createRepeated() => $pb.PbList<InputDataRef_CAS>();
+  @$core.pragma('dart2js:noInline')
+  static InputDataRef_CAS getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<InputDataRef_CAS>(create);
+  static InputDataRef_CAS? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get casInstance => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set casInstance($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasCasInstance() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearCasInstance() => clearField(1);
+
+  @$pb.TagNumber(2)
+  InputDataRef_CAS_Digest get digest => $_getN(1);
+  @$pb.TagNumber(2)
+  set digest(InputDataRef_CAS_Digest v) {
+    setField(2, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasDigest() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearDigest() => clearField(2);
+  @$pb.TagNumber(2)
+  InputDataRef_CAS_Digest ensureDigest() => $_ensure(1);
+}
+
+class InputDataRef_CIPD_PkgSpec extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'InputDataRef.CIPD.PkgSpec',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'package')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'version')
+    ..hasRequiredFields = false;
+
+  InputDataRef_CIPD_PkgSpec._() : super();
+  factory InputDataRef_CIPD_PkgSpec({
+    $core.String? package,
+    $core.String? version,
+  }) {
+    final _result = create();
+    if (package != null) {
+      _result.package = package;
+    }
+    if (version != null) {
+      _result.version = version;
+    }
+    return _result;
+  }
+  factory InputDataRef_CIPD_PkgSpec.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory InputDataRef_CIPD_PkgSpec.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  InputDataRef_CIPD_PkgSpec clone() => InputDataRef_CIPD_PkgSpec()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  InputDataRef_CIPD_PkgSpec copyWith(void Function(InputDataRef_CIPD_PkgSpec) updates) =>
+      super.copyWith((message) => updates(message as InputDataRef_CIPD_PkgSpec))
+          as InputDataRef_CIPD_PkgSpec; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static InputDataRef_CIPD_PkgSpec create() => InputDataRef_CIPD_PkgSpec._();
+  InputDataRef_CIPD_PkgSpec createEmptyInstance() => create();
+  static $pb.PbList<InputDataRef_CIPD_PkgSpec> createRepeated() => $pb.PbList<InputDataRef_CIPD_PkgSpec>();
+  @$core.pragma('dart2js:noInline')
+  static InputDataRef_CIPD_PkgSpec getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<InputDataRef_CIPD_PkgSpec>(create);
+  static InputDataRef_CIPD_PkgSpec? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get package => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set package($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasPackage() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearPackage() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.String get version => $_getSZ(1);
+  @$pb.TagNumber(2)
+  set version($core.String v) {
+    $_setString(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasVersion() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearVersion() => clearField(2);
+}
+
+class InputDataRef_CIPD extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'InputDataRef.CIPD',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'server')
+    ..pc<InputDataRef_CIPD_PkgSpec>(
+        2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'specs', $pb.PbFieldType.PM,
+        subBuilder: InputDataRef_CIPD_PkgSpec.create)
+    ..hasRequiredFields = false;
+
+  InputDataRef_CIPD._() : super();
+  factory InputDataRef_CIPD({
+    $core.String? server,
+    $core.Iterable<InputDataRef_CIPD_PkgSpec>? specs,
+  }) {
+    final _result = create();
+    if (server != null) {
+      _result.server = server;
+    }
+    if (specs != null) {
+      _result.specs.addAll(specs);
+    }
+    return _result;
+  }
+  factory InputDataRef_CIPD.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory InputDataRef_CIPD.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  InputDataRef_CIPD clone() => InputDataRef_CIPD()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  InputDataRef_CIPD copyWith(void Function(InputDataRef_CIPD) updates) =>
+      super.copyWith((message) => updates(message as InputDataRef_CIPD))
+          as InputDataRef_CIPD; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static InputDataRef_CIPD create() => InputDataRef_CIPD._();
+  InputDataRef_CIPD createEmptyInstance() => create();
+  static $pb.PbList<InputDataRef_CIPD> createRepeated() => $pb.PbList<InputDataRef_CIPD>();
+  @$core.pragma('dart2js:noInline')
+  static InputDataRef_CIPD getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<InputDataRef_CIPD>(create);
+  static InputDataRef_CIPD? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get server => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set server($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasServer() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearServer() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.List<InputDataRef_CIPD_PkgSpec> get specs => $_getList(1);
+}
+
+enum InputDataRef_DataType { cas, cipd, notSet }
+
+class InputDataRef extends $pb.GeneratedMessage {
+  static const $core.Map<$core.int, InputDataRef_DataType> _InputDataRef_DataTypeByTag = {
+    1: InputDataRef_DataType.cas,
+    2: InputDataRef_DataType.cipd,
+    0: InputDataRef_DataType.notSet
+  };
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'InputDataRef',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..oo(0, [1, 2])
+    ..aOM<InputDataRef_CAS>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'cas',
+        subBuilder: InputDataRef_CAS.create)
+    ..aOM<InputDataRef_CIPD>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'cipd',
+        subBuilder: InputDataRef_CIPD.create)
+    ..pPS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'onPath')
+    ..hasRequiredFields = false;
+
+  InputDataRef._() : super();
+  factory InputDataRef({
+    InputDataRef_CAS? cas,
+    InputDataRef_CIPD? cipd,
+    $core.Iterable<$core.String>? onPath,
+  }) {
+    final _result = create();
+    if (cas != null) {
+      _result.cas = cas;
+    }
+    if (cipd != null) {
+      _result.cipd = cipd;
+    }
+    if (onPath != null) {
+      _result.onPath.addAll(onPath);
+    }
+    return _result;
+  }
+  factory InputDataRef.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory InputDataRef.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  InputDataRef clone() => InputDataRef()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  InputDataRef copyWith(void Function(InputDataRef) updates) =>
+      super.copyWith((message) => updates(message as InputDataRef)) as InputDataRef; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static InputDataRef create() => InputDataRef._();
+  InputDataRef createEmptyInstance() => create();
+  static $pb.PbList<InputDataRef> createRepeated() => $pb.PbList<InputDataRef>();
+  @$core.pragma('dart2js:noInline')
+  static InputDataRef getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<InputDataRef>(create);
+  static InputDataRef? _defaultInstance;
+
+  InputDataRef_DataType whichDataType() => _InputDataRef_DataTypeByTag[$_whichOneof(0)]!;
+  void clearDataType() => clearField($_whichOneof(0));
+
+  @$pb.TagNumber(1)
+  InputDataRef_CAS get cas => $_getN(0);
+  @$pb.TagNumber(1)
+  set cas(InputDataRef_CAS v) {
+    setField(1, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasCas() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearCas() => clearField(1);
+  @$pb.TagNumber(1)
+  InputDataRef_CAS ensureCas() => $_ensure(0);
+
+  @$pb.TagNumber(2)
+  InputDataRef_CIPD get cipd => $_getN(1);
+  @$pb.TagNumber(2)
+  set cipd(InputDataRef_CIPD v) {
+    setField(2, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasCipd() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearCipd() => clearField(2);
+  @$pb.TagNumber(2)
+  InputDataRef_CIPD ensureCipd() => $_ensure(1);
+
+  @$pb.TagNumber(3)
+  $core.List<$core.String> get onPath => $_getList(2);
+}
+
+class ResolvedDataRef_Timing extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ResolvedDataRef.Timing',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOM<$4.Duration>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fetchDuration',
+        subBuilder: $4.Duration.create)
+    ..aOM<$4.Duration>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'installDuration',
+        subBuilder: $4.Duration.create)
+    ..hasRequiredFields = false;
+
+  ResolvedDataRef_Timing._() : super();
+  factory ResolvedDataRef_Timing({
+    $4.Duration? fetchDuration,
+    $4.Duration? installDuration,
+  }) {
+    final _result = create();
+    if (fetchDuration != null) {
+      _result.fetchDuration = fetchDuration;
+    }
+    if (installDuration != null) {
+      _result.installDuration = installDuration;
+    }
+    return _result;
+  }
+  factory ResolvedDataRef_Timing.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory ResolvedDataRef_Timing.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  ResolvedDataRef_Timing clone() => ResolvedDataRef_Timing()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  ResolvedDataRef_Timing copyWith(void Function(ResolvedDataRef_Timing) updates) =>
+      super.copyWith((message) => updates(message as ResolvedDataRef_Timing))
+          as ResolvedDataRef_Timing; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static ResolvedDataRef_Timing create() => ResolvedDataRef_Timing._();
+  ResolvedDataRef_Timing createEmptyInstance() => create();
+  static $pb.PbList<ResolvedDataRef_Timing> createRepeated() => $pb.PbList<ResolvedDataRef_Timing>();
+  @$core.pragma('dart2js:noInline')
+  static ResolvedDataRef_Timing getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ResolvedDataRef_Timing>(create);
+  static ResolvedDataRef_Timing? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $4.Duration get fetchDuration => $_getN(0);
+  @$pb.TagNumber(1)
+  set fetchDuration($4.Duration v) {
+    setField(1, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasFetchDuration() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearFetchDuration() => clearField(1);
+  @$pb.TagNumber(1)
+  $4.Duration ensureFetchDuration() => $_ensure(0);
+
+  @$pb.TagNumber(2)
+  $4.Duration get installDuration => $_getN(1);
+  @$pb.TagNumber(2)
+  set installDuration($4.Duration v) {
+    setField(2, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasInstallDuration() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearInstallDuration() => clearField(2);
+  @$pb.TagNumber(2)
+  $4.Duration ensureInstallDuration() => $_ensure(1);
+}
+
+class ResolvedDataRef_CAS extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ResolvedDataRef.CAS',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOM<ResolvedDataRef_Timing>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'timing',
+        subBuilder: ResolvedDataRef_Timing.create)
+    ..hasRequiredFields = false;
+
+  ResolvedDataRef_CAS._() : super();
+  factory ResolvedDataRef_CAS({
+    ResolvedDataRef_Timing? timing,
+  }) {
+    final _result = create();
+    if (timing != null) {
+      _result.timing = timing;
+    }
+    return _result;
+  }
+  factory ResolvedDataRef_CAS.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory ResolvedDataRef_CAS.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  ResolvedDataRef_CAS clone() => ResolvedDataRef_CAS()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  ResolvedDataRef_CAS copyWith(void Function(ResolvedDataRef_CAS) updates) =>
+      super.copyWith((message) => updates(message as ResolvedDataRef_CAS))
+          as ResolvedDataRef_CAS; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static ResolvedDataRef_CAS create() => ResolvedDataRef_CAS._();
+  ResolvedDataRef_CAS createEmptyInstance() => create();
+  static $pb.PbList<ResolvedDataRef_CAS> createRepeated() => $pb.PbList<ResolvedDataRef_CAS>();
+  @$core.pragma('dart2js:noInline')
+  static ResolvedDataRef_CAS getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ResolvedDataRef_CAS>(create);
+  static ResolvedDataRef_CAS? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  ResolvedDataRef_Timing get timing => $_getN(0);
+  @$pb.TagNumber(1)
+  set timing(ResolvedDataRef_Timing v) {
+    setField(1, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasTiming() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearTiming() => clearField(1);
+  @$pb.TagNumber(1)
+  ResolvedDataRef_Timing ensureTiming() => $_ensure(0);
+}
+
+class ResolvedDataRef_CIPD_PkgSpec extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ResolvedDataRef.CIPD.PkgSpec',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOB(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'skipped')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'package')
+    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'version')
+    ..e<$3.Trinary>(
+        4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'wasCached', $pb.PbFieldType.OE,
+        defaultOrMaker: $3.Trinary.UNSET, valueOf: $3.Trinary.valueOf, enumValues: $3.Trinary.values)
+    ..aOM<ResolvedDataRef_Timing>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'timing',
+        subBuilder: ResolvedDataRef_Timing.create)
+    ..hasRequiredFields = false;
+
+  ResolvedDataRef_CIPD_PkgSpec._() : super();
+  factory ResolvedDataRef_CIPD_PkgSpec({
+    $core.bool? skipped,
+    $core.String? package,
+    $core.String? version,
+    $3.Trinary? wasCached,
+    ResolvedDataRef_Timing? timing,
+  }) {
+    final _result = create();
+    if (skipped != null) {
+      _result.skipped = skipped;
+    }
+    if (package != null) {
+      _result.package = package;
+    }
+    if (version != null) {
+      _result.version = version;
+    }
+    if (wasCached != null) {
+      _result.wasCached = wasCached;
+    }
+    if (timing != null) {
+      _result.timing = timing;
+    }
+    return _result;
+  }
+  factory ResolvedDataRef_CIPD_PkgSpec.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory ResolvedDataRef_CIPD_PkgSpec.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  ResolvedDataRef_CIPD_PkgSpec clone() => ResolvedDataRef_CIPD_PkgSpec()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  ResolvedDataRef_CIPD_PkgSpec copyWith(void Function(ResolvedDataRef_CIPD_PkgSpec) updates) =>
+      super.copyWith((message) => updates(message as ResolvedDataRef_CIPD_PkgSpec))
+          as ResolvedDataRef_CIPD_PkgSpec; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static ResolvedDataRef_CIPD_PkgSpec create() => ResolvedDataRef_CIPD_PkgSpec._();
+  ResolvedDataRef_CIPD_PkgSpec createEmptyInstance() => create();
+  static $pb.PbList<ResolvedDataRef_CIPD_PkgSpec> createRepeated() => $pb.PbList<ResolvedDataRef_CIPD_PkgSpec>();
+  @$core.pragma('dart2js:noInline')
+  static ResolvedDataRef_CIPD_PkgSpec getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ResolvedDataRef_CIPD_PkgSpec>(create);
+  static ResolvedDataRef_CIPD_PkgSpec? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.bool get skipped => $_getBF(0);
+  @$pb.TagNumber(1)
+  set skipped($core.bool v) {
+    $_setBool(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasSkipped() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearSkipped() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.String get package => $_getSZ(1);
+  @$pb.TagNumber(2)
+  set package($core.String v) {
+    $_setString(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasPackage() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearPackage() => clearField(2);
+
+  @$pb.TagNumber(3)
+  $core.String get version => $_getSZ(2);
+  @$pb.TagNumber(3)
+  set version($core.String v) {
+    $_setString(2, v);
+  }
+
+  @$pb.TagNumber(3)
+  $core.bool hasVersion() => $_has(2);
+  @$pb.TagNumber(3)
+  void clearVersion() => clearField(3);
+
+  @$pb.TagNumber(4)
+  $3.Trinary get wasCached => $_getN(3);
+  @$pb.TagNumber(4)
+  set wasCached($3.Trinary v) {
+    setField(4, v);
+  }
+
+  @$pb.TagNumber(4)
+  $core.bool hasWasCached() => $_has(3);
+  @$pb.TagNumber(4)
+  void clearWasCached() => clearField(4);
+
+  @$pb.TagNumber(5)
+  ResolvedDataRef_Timing get timing => $_getN(4);
+  @$pb.TagNumber(5)
+  set timing(ResolvedDataRef_Timing v) {
+    setField(5, v);
+  }
+
+  @$pb.TagNumber(5)
+  $core.bool hasTiming() => $_has(4);
+  @$pb.TagNumber(5)
+  void clearTiming() => clearField(5);
+  @$pb.TagNumber(5)
+  ResolvedDataRef_Timing ensureTiming() => $_ensure(4);
+}
+
+class ResolvedDataRef_CIPD extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ResolvedDataRef.CIPD',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..pc<ResolvedDataRef_CIPD_PkgSpec>(
+        2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'specs', $pb.PbFieldType.PM,
+        subBuilder: ResolvedDataRef_CIPD_PkgSpec.create)
+    ..hasRequiredFields = false;
+
+  ResolvedDataRef_CIPD._() : super();
+  factory ResolvedDataRef_CIPD({
+    $core.Iterable<ResolvedDataRef_CIPD_PkgSpec>? specs,
+  }) {
+    final _result = create();
+    if (specs != null) {
+      _result.specs.addAll(specs);
+    }
+    return _result;
+  }
+  factory ResolvedDataRef_CIPD.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory ResolvedDataRef_CIPD.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  ResolvedDataRef_CIPD clone() => ResolvedDataRef_CIPD()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  ResolvedDataRef_CIPD copyWith(void Function(ResolvedDataRef_CIPD) updates) =>
+      super.copyWith((message) => updates(message as ResolvedDataRef_CIPD))
+          as ResolvedDataRef_CIPD; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static ResolvedDataRef_CIPD create() => ResolvedDataRef_CIPD._();
+  ResolvedDataRef_CIPD createEmptyInstance() => create();
+  static $pb.PbList<ResolvedDataRef_CIPD> createRepeated() => $pb.PbList<ResolvedDataRef_CIPD>();
+  @$core.pragma('dart2js:noInline')
+  static ResolvedDataRef_CIPD getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ResolvedDataRef_CIPD>(create);
+  static ResolvedDataRef_CIPD? _defaultInstance;
+
+  @$pb.TagNumber(2)
+  $core.List<ResolvedDataRef_CIPD_PkgSpec> get specs => $_getList(0);
+}
+
+enum ResolvedDataRef_DataType { cas, cipd, notSet }
+
+class ResolvedDataRef extends $pb.GeneratedMessage {
+  static const $core.Map<$core.int, ResolvedDataRef_DataType> _ResolvedDataRef_DataTypeByTag = {
+    1: ResolvedDataRef_DataType.cas,
+    2: ResolvedDataRef_DataType.cipd,
+    0: ResolvedDataRef_DataType.notSet
+  };
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ResolvedDataRef',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..oo(0, [1, 2])
+    ..aOM<ResolvedDataRef_CAS>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'cas',
+        subBuilder: ResolvedDataRef_CAS.create)
+    ..aOM<ResolvedDataRef_CIPD>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'cipd',
+        subBuilder: ResolvedDataRef_CIPD.create)
+    ..hasRequiredFields = false;
+
+  ResolvedDataRef._() : super();
+  factory ResolvedDataRef({
+    ResolvedDataRef_CAS? cas,
+    ResolvedDataRef_CIPD? cipd,
+  }) {
+    final _result = create();
+    if (cas != null) {
+      _result.cas = cas;
+    }
+    if (cipd != null) {
+      _result.cipd = cipd;
+    }
+    return _result;
+  }
+  factory ResolvedDataRef.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory ResolvedDataRef.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  ResolvedDataRef clone() => ResolvedDataRef()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  ResolvedDataRef copyWith(void Function(ResolvedDataRef) updates) =>
+      super.copyWith((message) => updates(message as ResolvedDataRef))
+          as ResolvedDataRef; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static ResolvedDataRef create() => ResolvedDataRef._();
+  ResolvedDataRef createEmptyInstance() => create();
+  static $pb.PbList<ResolvedDataRef> createRepeated() => $pb.PbList<ResolvedDataRef>();
+  @$core.pragma('dart2js:noInline')
+  static ResolvedDataRef getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ResolvedDataRef>(create);
+  static ResolvedDataRef? _defaultInstance;
+
+  ResolvedDataRef_DataType whichDataType() => _ResolvedDataRef_DataTypeByTag[$_whichOneof(0)]!;
+  void clearDataType() => clearField($_whichOneof(0));
+
+  @$pb.TagNumber(1)
+  ResolvedDataRef_CAS get cas => $_getN(0);
+  @$pb.TagNumber(1)
+  set cas(ResolvedDataRef_CAS v) {
+    setField(1, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasCas() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearCas() => clearField(1);
+  @$pb.TagNumber(1)
+  ResolvedDataRef_CAS ensureCas() => $_ensure(0);
+
+  @$pb.TagNumber(2)
+  ResolvedDataRef_CIPD get cipd => $_getN(1);
+  @$pb.TagNumber(2)
+  set cipd(ResolvedDataRef_CIPD v) {
+    setField(2, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasCipd() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearCipd() => clearField(2);
+  @$pb.TagNumber(2)
+  ResolvedDataRef_CIPD ensureCipd() => $_ensure(1);
+}
+
+class BuildInfra_Buildbucket_Agent_Source_CIPD extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BuildInfra.Buildbucket.Agent.Source.CIPD',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'package')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'version')
+    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'server')
+    ..m<$core.String, $core.String>(
+        4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'resolvedInstances',
+        entryClassName: 'BuildInfra.Buildbucket.Agent.Source.CIPD.ResolvedInstancesEntry',
+        keyFieldType: $pb.PbFieldType.OS,
+        valueFieldType: $pb.PbFieldType.OS,
+        packageName: const $pb.PackageName('buildbucket.v2'))
+    ..hasRequiredFields = false;
+
+  BuildInfra_Buildbucket_Agent_Source_CIPD._() : super();
+  factory BuildInfra_Buildbucket_Agent_Source_CIPD({
+    $core.String? package,
+    $core.String? version,
+    $core.String? server,
+    $core.Map<$core.String, $core.String>? resolvedInstances,
+  }) {
+    final _result = create();
+    if (package != null) {
+      _result.package = package;
+    }
+    if (version != null) {
+      _result.version = version;
+    }
+    if (server != null) {
+      _result.server = server;
+    }
+    if (resolvedInstances != null) {
+      _result.resolvedInstances.addAll(resolvedInstances);
+    }
+    return _result;
+  }
+  factory BuildInfra_Buildbucket_Agent_Source_CIPD.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BuildInfra_Buildbucket_Agent_Source_CIPD.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BuildInfra_Buildbucket_Agent_Source_CIPD clone() =>
+      BuildInfra_Buildbucket_Agent_Source_CIPD()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BuildInfra_Buildbucket_Agent_Source_CIPD copyWith(void Function(BuildInfra_Buildbucket_Agent_Source_CIPD) updates) =>
+      super.copyWith((message) => updates(message as BuildInfra_Buildbucket_Agent_Source_CIPD))
+          as BuildInfra_Buildbucket_Agent_Source_CIPD; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_Buildbucket_Agent_Source_CIPD create() => BuildInfra_Buildbucket_Agent_Source_CIPD._();
+  BuildInfra_Buildbucket_Agent_Source_CIPD createEmptyInstance() => create();
+  static $pb.PbList<BuildInfra_Buildbucket_Agent_Source_CIPD> createRepeated() =>
+      $pb.PbList<BuildInfra_Buildbucket_Agent_Source_CIPD>();
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_Buildbucket_Agent_Source_CIPD getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BuildInfra_Buildbucket_Agent_Source_CIPD>(create);
+  static BuildInfra_Buildbucket_Agent_Source_CIPD? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get package => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set package($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasPackage() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearPackage() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.String get version => $_getSZ(1);
+  @$pb.TagNumber(2)
+  set version($core.String v) {
+    $_setString(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasVersion() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearVersion() => clearField(2);
+
+  @$pb.TagNumber(3)
+  $core.String get server => $_getSZ(2);
+  @$pb.TagNumber(3)
+  set server($core.String v) {
+    $_setString(2, v);
+  }
+
+  @$pb.TagNumber(3)
+  $core.bool hasServer() => $_has(2);
+  @$pb.TagNumber(3)
+  void clearServer() => clearField(3);
+
+  @$pb.TagNumber(4)
+  $core.Map<$core.String, $core.String> get resolvedInstances => $_getMap(3);
+}
+
+enum BuildInfra_Buildbucket_Agent_Source_DataType { cipd, notSet }
+
+class BuildInfra_Buildbucket_Agent_Source extends $pb.GeneratedMessage {
+  static const $core.Map<$core.int, BuildInfra_Buildbucket_Agent_Source_DataType>
+      _BuildInfra_Buildbucket_Agent_Source_DataTypeByTag = {
+    1: BuildInfra_Buildbucket_Agent_Source_DataType.cipd,
+    0: BuildInfra_Buildbucket_Agent_Source_DataType.notSet
+  };
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BuildInfra.Buildbucket.Agent.Source',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..oo(0, [1])
+    ..aOM<BuildInfra_Buildbucket_Agent_Source_CIPD>(
+        1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'cipd',
+        subBuilder: BuildInfra_Buildbucket_Agent_Source_CIPD.create)
+    ..hasRequiredFields = false;
+
+  BuildInfra_Buildbucket_Agent_Source._() : super();
+  factory BuildInfra_Buildbucket_Agent_Source({
+    BuildInfra_Buildbucket_Agent_Source_CIPD? cipd,
+  }) {
+    final _result = create();
+    if (cipd != null) {
+      _result.cipd = cipd;
+    }
+    return _result;
+  }
+  factory BuildInfra_Buildbucket_Agent_Source.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BuildInfra_Buildbucket_Agent_Source.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BuildInfra_Buildbucket_Agent_Source clone() => BuildInfra_Buildbucket_Agent_Source()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BuildInfra_Buildbucket_Agent_Source copyWith(void Function(BuildInfra_Buildbucket_Agent_Source) updates) =>
+      super.copyWith((message) => updates(message as BuildInfra_Buildbucket_Agent_Source))
+          as BuildInfra_Buildbucket_Agent_Source; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_Buildbucket_Agent_Source create() => BuildInfra_Buildbucket_Agent_Source._();
+  BuildInfra_Buildbucket_Agent_Source createEmptyInstance() => create();
+  static $pb.PbList<BuildInfra_Buildbucket_Agent_Source> createRepeated() =>
+      $pb.PbList<BuildInfra_Buildbucket_Agent_Source>();
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_Buildbucket_Agent_Source getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BuildInfra_Buildbucket_Agent_Source>(create);
+  static BuildInfra_Buildbucket_Agent_Source? _defaultInstance;
+
+  BuildInfra_Buildbucket_Agent_Source_DataType whichDataType() =>
+      _BuildInfra_Buildbucket_Agent_Source_DataTypeByTag[$_whichOneof(0)]!;
+  void clearDataType() => clearField($_whichOneof(0));
+
+  @$pb.TagNumber(1)
+  BuildInfra_Buildbucket_Agent_Source_CIPD get cipd => $_getN(0);
+  @$pb.TagNumber(1)
+  set cipd(BuildInfra_Buildbucket_Agent_Source_CIPD v) {
+    setField(1, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasCipd() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearCipd() => clearField(1);
+  @$pb.TagNumber(1)
+  BuildInfra_Buildbucket_Agent_Source_CIPD ensureCipd() => $_ensure(0);
+}
+
+class BuildInfra_Buildbucket_Agent_Input extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BuildInfra.Buildbucket.Agent.Input',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..m<$core.String, InputDataRef>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'data',
+        entryClassName: 'BuildInfra.Buildbucket.Agent.Input.DataEntry',
+        keyFieldType: $pb.PbFieldType.OS,
+        valueFieldType: $pb.PbFieldType.OM,
+        valueCreator: InputDataRef.create,
+        packageName: const $pb.PackageName('buildbucket.v2'))
+    ..hasRequiredFields = false;
+
+  BuildInfra_Buildbucket_Agent_Input._() : super();
+  factory BuildInfra_Buildbucket_Agent_Input({
+    $core.Map<$core.String, InputDataRef>? data,
+  }) {
+    final _result = create();
+    if (data != null) {
+      _result.data.addAll(data);
+    }
+    return _result;
+  }
+  factory BuildInfra_Buildbucket_Agent_Input.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BuildInfra_Buildbucket_Agent_Input.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BuildInfra_Buildbucket_Agent_Input clone() => BuildInfra_Buildbucket_Agent_Input()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BuildInfra_Buildbucket_Agent_Input copyWith(void Function(BuildInfra_Buildbucket_Agent_Input) updates) =>
+      super.copyWith((message) => updates(message as BuildInfra_Buildbucket_Agent_Input))
+          as BuildInfra_Buildbucket_Agent_Input; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_Buildbucket_Agent_Input create() => BuildInfra_Buildbucket_Agent_Input._();
+  BuildInfra_Buildbucket_Agent_Input createEmptyInstance() => create();
+  static $pb.PbList<BuildInfra_Buildbucket_Agent_Input> createRepeated() =>
+      $pb.PbList<BuildInfra_Buildbucket_Agent_Input>();
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_Buildbucket_Agent_Input getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BuildInfra_Buildbucket_Agent_Input>(create);
+  static BuildInfra_Buildbucket_Agent_Input? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.Map<$core.String, InputDataRef> get data => $_getMap(0);
+}
+
+class BuildInfra_Buildbucket_Agent_Output extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BuildInfra.Buildbucket.Agent.Output',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..m<$core.String, ResolvedDataRef>(
+        1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'resolvedData',
+        entryClassName: 'BuildInfra.Buildbucket.Agent.Output.ResolvedDataEntry',
+        keyFieldType: $pb.PbFieldType.OS,
+        valueFieldType: $pb.PbFieldType.OM,
+        valueCreator: ResolvedDataRef.create,
+        packageName: const $pb.PackageName('buildbucket.v2'))
+    ..e<$3.Status>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'status', $pb.PbFieldType.OE,
+        defaultOrMaker: $3.Status.STATUS_UNSPECIFIED, valueOf: $3.Status.valueOf, enumValues: $3.Status.values)
+    ..aOM<$3.StatusDetails>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'statusDetails',
+        subBuilder: $3.StatusDetails.create)
+    ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'summaryHtml')
+    ..aOS(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'agentPlatform')
+    ..aOM<$4.Duration>(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'totalDuration',
+        subBuilder: $4.Duration.create)
+    ..hasRequiredFields = false;
+
+  BuildInfra_Buildbucket_Agent_Output._() : super();
+  factory BuildInfra_Buildbucket_Agent_Output({
+    $core.Map<$core.String, ResolvedDataRef>? resolvedData,
+    $3.Status? status,
+    $3.StatusDetails? statusDetails,
+    $core.String? summaryHtml,
+    $core.String? agentPlatform,
+    $4.Duration? totalDuration,
+  }) {
+    final _result = create();
+    if (resolvedData != null) {
+      _result.resolvedData.addAll(resolvedData);
+    }
+    if (status != null) {
+      _result.status = status;
+    }
+    if (statusDetails != null) {
+      _result.statusDetails = statusDetails;
+    }
+    if (summaryHtml != null) {
+      _result.summaryHtml = summaryHtml;
+    }
+    if (agentPlatform != null) {
+      _result.agentPlatform = agentPlatform;
+    }
+    if (totalDuration != null) {
+      _result.totalDuration = totalDuration;
+    }
+    return _result;
+  }
+  factory BuildInfra_Buildbucket_Agent_Output.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BuildInfra_Buildbucket_Agent_Output.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BuildInfra_Buildbucket_Agent_Output clone() => BuildInfra_Buildbucket_Agent_Output()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BuildInfra_Buildbucket_Agent_Output copyWith(void Function(BuildInfra_Buildbucket_Agent_Output) updates) =>
+      super.copyWith((message) => updates(message as BuildInfra_Buildbucket_Agent_Output))
+          as BuildInfra_Buildbucket_Agent_Output; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_Buildbucket_Agent_Output create() => BuildInfra_Buildbucket_Agent_Output._();
+  BuildInfra_Buildbucket_Agent_Output createEmptyInstance() => create();
+  static $pb.PbList<BuildInfra_Buildbucket_Agent_Output> createRepeated() =>
+      $pb.PbList<BuildInfra_Buildbucket_Agent_Output>();
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_Buildbucket_Agent_Output getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BuildInfra_Buildbucket_Agent_Output>(create);
+  static BuildInfra_Buildbucket_Agent_Output? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.Map<$core.String, ResolvedDataRef> get resolvedData => $_getMap(0);
+
+  @$pb.TagNumber(2)
+  $3.Status get status => $_getN(1);
+  @$pb.TagNumber(2)
+  set status($3.Status v) {
+    setField(2, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasStatus() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearStatus() => clearField(2);
+
+  @$pb.TagNumber(3)
+  $3.StatusDetails get statusDetails => $_getN(2);
+  @$pb.TagNumber(3)
+  set statusDetails($3.StatusDetails v) {
+    setField(3, v);
+  }
+
+  @$pb.TagNumber(3)
+  $core.bool hasStatusDetails() => $_has(2);
+  @$pb.TagNumber(3)
+  void clearStatusDetails() => clearField(3);
+  @$pb.TagNumber(3)
+  $3.StatusDetails ensureStatusDetails() => $_ensure(2);
+
+  @$pb.TagNumber(4)
+  $core.String get summaryHtml => $_getSZ(3);
+  @$pb.TagNumber(4)
+  set summaryHtml($core.String v) {
+    $_setString(3, v);
+  }
+
+  @$pb.TagNumber(4)
+  $core.bool hasSummaryHtml() => $_has(3);
+  @$pb.TagNumber(4)
+  void clearSummaryHtml() => clearField(4);
+
+  @$pb.TagNumber(5)
+  $core.String get agentPlatform => $_getSZ(4);
+  @$pb.TagNumber(5)
+  set agentPlatform($core.String v) {
+    $_setString(4, v);
+  }
+
+  @$pb.TagNumber(5)
+  $core.bool hasAgentPlatform() => $_has(4);
+  @$pb.TagNumber(5)
+  void clearAgentPlatform() => clearField(5);
+
+  @$pb.TagNumber(6)
+  $4.Duration get totalDuration => $_getN(5);
+  @$pb.TagNumber(6)
+  set totalDuration($4.Duration v) {
+    setField(6, v);
+  }
+
+  @$pb.TagNumber(6)
+  $core.bool hasTotalDuration() => $_has(5);
+  @$pb.TagNumber(6)
+  void clearTotalDuration() => clearField(6);
+  @$pb.TagNumber(6)
+  $4.Duration ensureTotalDuration() => $_ensure(5);
+}
+
+class BuildInfra_Buildbucket_Agent extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BuildInfra.Buildbucket.Agent',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOM<BuildInfra_Buildbucket_Agent_Input>(
+        1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'input',
+        subBuilder: BuildInfra_Buildbucket_Agent_Input.create)
+    ..aOM<BuildInfra_Buildbucket_Agent_Output>(
+        2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'output',
+        subBuilder: BuildInfra_Buildbucket_Agent_Output.create)
+    ..aOM<BuildInfra_Buildbucket_Agent_Source>(
+        3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'source',
+        subBuilder: BuildInfra_Buildbucket_Agent_Source.create)
+    ..m<$core.String, BuildInfra_Buildbucket_Agent_Purpose>(
+        4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'purposes',
+        entryClassName: 'BuildInfra.Buildbucket.Agent.PurposesEntry',
+        keyFieldType: $pb.PbFieldType.OS,
+        valueFieldType: $pb.PbFieldType.OE,
+        valueOf: BuildInfra_Buildbucket_Agent_Purpose.valueOf,
+        enumValues: BuildInfra_Buildbucket_Agent_Purpose.values,
+        defaultEnumValue: BuildInfra_Buildbucket_Agent_Purpose.PURPOSE_UNSPECIFIED,
+        packageName: const $pb.PackageName('buildbucket.v2'))
+    ..hasRequiredFields = false;
+
+  BuildInfra_Buildbucket_Agent._() : super();
+  factory BuildInfra_Buildbucket_Agent({
+    BuildInfra_Buildbucket_Agent_Input? input,
+    BuildInfra_Buildbucket_Agent_Output? output,
+    BuildInfra_Buildbucket_Agent_Source? source,
+    $core.Map<$core.String, BuildInfra_Buildbucket_Agent_Purpose>? purposes,
+  }) {
+    final _result = create();
+    if (input != null) {
+      _result.input = input;
+    }
+    if (output != null) {
+      _result.output = output;
+    }
+    if (source != null) {
+      _result.source = source;
+    }
+    if (purposes != null) {
+      _result.purposes.addAll(purposes);
+    }
+    return _result;
+  }
+  factory BuildInfra_Buildbucket_Agent.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BuildInfra_Buildbucket_Agent.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BuildInfra_Buildbucket_Agent clone() => BuildInfra_Buildbucket_Agent()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BuildInfra_Buildbucket_Agent copyWith(void Function(BuildInfra_Buildbucket_Agent) updates) =>
+      super.copyWith((message) => updates(message as BuildInfra_Buildbucket_Agent))
+          as BuildInfra_Buildbucket_Agent; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_Buildbucket_Agent create() => BuildInfra_Buildbucket_Agent._();
+  BuildInfra_Buildbucket_Agent createEmptyInstance() => create();
+  static $pb.PbList<BuildInfra_Buildbucket_Agent> createRepeated() => $pb.PbList<BuildInfra_Buildbucket_Agent>();
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_Buildbucket_Agent getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BuildInfra_Buildbucket_Agent>(create);
+  static BuildInfra_Buildbucket_Agent? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  BuildInfra_Buildbucket_Agent_Input get input => $_getN(0);
+  @$pb.TagNumber(1)
+  set input(BuildInfra_Buildbucket_Agent_Input v) {
+    setField(1, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasInput() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearInput() => clearField(1);
+  @$pb.TagNumber(1)
+  BuildInfra_Buildbucket_Agent_Input ensureInput() => $_ensure(0);
+
+  @$pb.TagNumber(2)
+  BuildInfra_Buildbucket_Agent_Output get output => $_getN(1);
+  @$pb.TagNumber(2)
+  set output(BuildInfra_Buildbucket_Agent_Output v) {
+    setField(2, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasOutput() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearOutput() => clearField(2);
+  @$pb.TagNumber(2)
+  BuildInfra_Buildbucket_Agent_Output ensureOutput() => $_ensure(1);
+
+  @$pb.TagNumber(3)
+  BuildInfra_Buildbucket_Agent_Source get source => $_getN(2);
+  @$pb.TagNumber(3)
+  set source(BuildInfra_Buildbucket_Agent_Source v) {
+    setField(3, v);
+  }
+
+  @$pb.TagNumber(3)
+  $core.bool hasSource() => $_has(2);
+  @$pb.TagNumber(3)
+  void clearSource() => clearField(3);
+  @$pb.TagNumber(3)
+  BuildInfra_Buildbucket_Agent_Source ensureSource() => $_ensure(2);
+
+  @$pb.TagNumber(4)
+  $core.Map<$core.String, BuildInfra_Buildbucket_Agent_Purpose> get purposes => $_getMap(3);
+}
+
+class BuildInfra_Buildbucket extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BuildInfra.Buildbucket',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'serviceConfigRevision')
+    ..aOM<$5.Struct>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'requestedProperties',
+        subBuilder: $5.Struct.create)
+    ..pc<$3.RequestedDimension>(6,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'requestedDimensions', $pb.PbFieldType.PM,
+        subBuilder: $3.RequestedDimension.create)
+    ..aOS(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'hostname')
+    ..m<$core.String, BuildInfra_Buildbucket_ExperimentReason>(
+        8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'experimentReasons',
+        entryClassName: 'BuildInfra.Buildbucket.ExperimentReasonsEntry',
+        keyFieldType: $pb.PbFieldType.OS,
+        valueFieldType: $pb.PbFieldType.OE,
+        valueOf: BuildInfra_Buildbucket_ExperimentReason.valueOf,
+        enumValues: BuildInfra_Buildbucket_ExperimentReason.values,
+        defaultEnumValue: BuildInfra_Buildbucket_ExperimentReason.EXPERIMENT_REASON_UNSET,
+        packageName: const $pb.PackageName('buildbucket.v2'))
+    ..m<$core.String, ResolvedDataRef>(
+        9, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'agentExecutable',
+        entryClassName: 'BuildInfra.Buildbucket.AgentExecutableEntry',
+        keyFieldType: $pb.PbFieldType.OS,
+        valueFieldType: $pb.PbFieldType.OM,
+        valueCreator: ResolvedDataRef.create,
+        packageName: const $pb.PackageName('buildbucket.v2'))
+    ..aOM<BuildInfra_Buildbucket_Agent>(
+        10, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'agent',
+        subBuilder: BuildInfra_Buildbucket_Agent.create)
+    ..pPS(11, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'knownPublicGerritHosts')
+    ..hasRequiredFields = false;
+
+  BuildInfra_Buildbucket._() : super();
+  factory BuildInfra_Buildbucket({
+    $core.String? serviceConfigRevision,
+    $5.Struct? requestedProperties,
+    $core.Iterable<$3.RequestedDimension>? requestedDimensions,
+    $core.String? hostname,
+    $core.Map<$core.String, BuildInfra_Buildbucket_ExperimentReason>? experimentReasons,
+    @$core.Deprecated('This field is deprecated.') $core.Map<$core.String, ResolvedDataRef>? agentExecutable,
+    BuildInfra_Buildbucket_Agent? agent,
+    $core.Iterable<$core.String>? knownPublicGerritHosts,
+  }) {
+    final _result = create();
+    if (serviceConfigRevision != null) {
+      _result.serviceConfigRevision = serviceConfigRevision;
+    }
+    if (requestedProperties != null) {
+      _result.requestedProperties = requestedProperties;
+    }
+    if (requestedDimensions != null) {
+      _result.requestedDimensions.addAll(requestedDimensions);
+    }
+    if (hostname != null) {
+      _result.hostname = hostname;
+    }
+    if (experimentReasons != null) {
+      _result.experimentReasons.addAll(experimentReasons);
+    }
+    if (agentExecutable != null) {
+      // ignore: deprecated_member_use_from_same_package
+      _result.agentExecutable.addAll(agentExecutable);
+    }
+    if (agent != null) {
+      _result.agent = agent;
+    }
+    if (knownPublicGerritHosts != null) {
+      _result.knownPublicGerritHosts.addAll(knownPublicGerritHosts);
+    }
+    return _result;
+  }
+  factory BuildInfra_Buildbucket.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BuildInfra_Buildbucket.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BuildInfra_Buildbucket clone() => BuildInfra_Buildbucket()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BuildInfra_Buildbucket copyWith(void Function(BuildInfra_Buildbucket) updates) =>
+      super.copyWith((message) => updates(message as BuildInfra_Buildbucket))
+          as BuildInfra_Buildbucket; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_Buildbucket create() => BuildInfra_Buildbucket._();
+  BuildInfra_Buildbucket createEmptyInstance() => create();
+  static $pb.PbList<BuildInfra_Buildbucket> createRepeated() => $pb.PbList<BuildInfra_Buildbucket>();
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_Buildbucket getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BuildInfra_Buildbucket>(create);
+  static BuildInfra_Buildbucket? _defaultInstance;
+
+  @$pb.TagNumber(2)
+  $core.String get serviceConfigRevision => $_getSZ(0);
+  @$pb.TagNumber(2)
+  set serviceConfigRevision($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasServiceConfigRevision() => $_has(0);
+  @$pb.TagNumber(2)
+  void clearServiceConfigRevision() => clearField(2);
+
+  @$pb.TagNumber(5)
+  $5.Struct get requestedProperties => $_getN(1);
+  @$pb.TagNumber(5)
+  set requestedProperties($5.Struct v) {
+    setField(5, v);
+  }
+
+  @$pb.TagNumber(5)
+  $core.bool hasRequestedProperties() => $_has(1);
+  @$pb.TagNumber(5)
+  void clearRequestedProperties() => clearField(5);
+  @$pb.TagNumber(5)
+  $5.Struct ensureRequestedProperties() => $_ensure(1);
+
+  @$pb.TagNumber(6)
+  $core.List<$3.RequestedDimension> get requestedDimensions => $_getList(2);
+
+  @$pb.TagNumber(7)
+  $core.String get hostname => $_getSZ(3);
+  @$pb.TagNumber(7)
+  set hostname($core.String v) {
+    $_setString(3, v);
+  }
+
+  @$pb.TagNumber(7)
+  $core.bool hasHostname() => $_has(3);
+  @$pb.TagNumber(7)
+  void clearHostname() => clearField(7);
+
+  @$pb.TagNumber(8)
+  $core.Map<$core.String, BuildInfra_Buildbucket_ExperimentReason> get experimentReasons => $_getMap(4);
+
+  @$core.Deprecated('This field is deprecated.')
+  @$pb.TagNumber(9)
+  $core.Map<$core.String, ResolvedDataRef> get agentExecutable => $_getMap(5);
+
+  @$pb.TagNumber(10)
+  BuildInfra_Buildbucket_Agent get agent => $_getN(6);
+  @$pb.TagNumber(10)
+  set agent(BuildInfra_Buildbucket_Agent v) {
+    setField(10, v);
+  }
+
+  @$pb.TagNumber(10)
+  $core.bool hasAgent() => $_has(6);
+  @$pb.TagNumber(10)
+  void clearAgent() => clearField(10);
+  @$pb.TagNumber(10)
+  BuildInfra_Buildbucket_Agent ensureAgent() => $_ensure(6);
+
+  @$pb.TagNumber(11)
+  $core.List<$core.String> get knownPublicGerritHosts => $_getList(7);
+}
+
+class BuildInfra_Swarming_CacheEntry extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BuildInfra.Swarming.CacheEntry',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'path')
+    ..aOM<$4.Duration>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'waitForWarmCache',
+        subBuilder: $4.Duration.create)
+    ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'envVar')
+    ..hasRequiredFields = false;
+
+  BuildInfra_Swarming_CacheEntry._() : super();
+  factory BuildInfra_Swarming_CacheEntry({
+    $core.String? name,
+    $core.String? path,
+    $4.Duration? waitForWarmCache,
+    $core.String? envVar,
+  }) {
+    final _result = create();
+    if (name != null) {
+      _result.name = name;
+    }
+    if (path != null) {
+      _result.path = path;
+    }
+    if (waitForWarmCache != null) {
+      _result.waitForWarmCache = waitForWarmCache;
+    }
+    if (envVar != null) {
+      _result.envVar = envVar;
+    }
+    return _result;
+  }
+  factory BuildInfra_Swarming_CacheEntry.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BuildInfra_Swarming_CacheEntry.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BuildInfra_Swarming_CacheEntry clone() => BuildInfra_Swarming_CacheEntry()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BuildInfra_Swarming_CacheEntry copyWith(void Function(BuildInfra_Swarming_CacheEntry) updates) =>
+      super.copyWith((message) => updates(message as BuildInfra_Swarming_CacheEntry))
+          as BuildInfra_Swarming_CacheEntry; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_Swarming_CacheEntry create() => BuildInfra_Swarming_CacheEntry._();
+  BuildInfra_Swarming_CacheEntry createEmptyInstance() => create();
+  static $pb.PbList<BuildInfra_Swarming_CacheEntry> createRepeated() => $pb.PbList<BuildInfra_Swarming_CacheEntry>();
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_Swarming_CacheEntry getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BuildInfra_Swarming_CacheEntry>(create);
+  static BuildInfra_Swarming_CacheEntry? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get name => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set name($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasName() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearName() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.String get path => $_getSZ(1);
+  @$pb.TagNumber(2)
+  set path($core.String v) {
+    $_setString(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasPath() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearPath() => clearField(2);
+
+  @$pb.TagNumber(3)
+  $4.Duration get waitForWarmCache => $_getN(2);
+  @$pb.TagNumber(3)
+  set waitForWarmCache($4.Duration v) {
+    setField(3, v);
+  }
+
+  @$pb.TagNumber(3)
+  $core.bool hasWaitForWarmCache() => $_has(2);
+  @$pb.TagNumber(3)
+  void clearWaitForWarmCache() => clearField(3);
+  @$pb.TagNumber(3)
+  $4.Duration ensureWaitForWarmCache() => $_ensure(2);
+
+  @$pb.TagNumber(4)
+  $core.String get envVar => $_getSZ(3);
+  @$pb.TagNumber(4)
+  set envVar($core.String v) {
+    $_setString(3, v);
+  }
+
+  @$pb.TagNumber(4)
+  $core.bool hasEnvVar() => $_has(3);
+  @$pb.TagNumber(4)
+  void clearEnvVar() => clearField(4);
+}
+
+class BuildInfra_Swarming extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BuildInfra.Swarming',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'hostname')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'taskId')
+    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'taskServiceAccount')
+    ..a<$core.int>(
+        4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'priority', $pb.PbFieldType.O3)
+    ..pc<$3.RequestedDimension>(
+        5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'taskDimensions', $pb.PbFieldType.PM,
+        subBuilder: $3.RequestedDimension.create)
+    ..pc<$3.StringPair>(
+        6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'botDimensions', $pb.PbFieldType.PM,
+        subBuilder: $3.StringPair.create)
+    ..pc<BuildInfra_Swarming_CacheEntry>(
+        7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'caches', $pb.PbFieldType.PM,
+        subBuilder: BuildInfra_Swarming_CacheEntry.create)
+    ..aOS(9, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'parentRunId')
+    ..hasRequiredFields = false;
+
+  BuildInfra_Swarming._() : super();
+  factory BuildInfra_Swarming({
+    $core.String? hostname,
+    $core.String? taskId,
+    $core.String? taskServiceAccount,
+    $core.int? priority,
+    $core.Iterable<$3.RequestedDimension>? taskDimensions,
+    $core.Iterable<$3.StringPair>? botDimensions,
+    $core.Iterable<BuildInfra_Swarming_CacheEntry>? caches,
+    $core.String? parentRunId,
+  }) {
+    final _result = create();
+    if (hostname != null) {
+      _result.hostname = hostname;
+    }
+    if (taskId != null) {
+      _result.taskId = taskId;
+    }
+    if (taskServiceAccount != null) {
+      _result.taskServiceAccount = taskServiceAccount;
+    }
+    if (priority != null) {
+      _result.priority = priority;
+    }
+    if (taskDimensions != null) {
+      _result.taskDimensions.addAll(taskDimensions);
+    }
+    if (botDimensions != null) {
+      _result.botDimensions.addAll(botDimensions);
+    }
+    if (caches != null) {
+      _result.caches.addAll(caches);
+    }
+    if (parentRunId != null) {
+      _result.parentRunId = parentRunId;
+    }
+    return _result;
+  }
+  factory BuildInfra_Swarming.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BuildInfra_Swarming.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BuildInfra_Swarming clone() => BuildInfra_Swarming()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BuildInfra_Swarming copyWith(void Function(BuildInfra_Swarming) updates) =>
+      super.copyWith((message) => updates(message as BuildInfra_Swarming))
+          as BuildInfra_Swarming; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_Swarming create() => BuildInfra_Swarming._();
+  BuildInfra_Swarming createEmptyInstance() => create();
+  static $pb.PbList<BuildInfra_Swarming> createRepeated() => $pb.PbList<BuildInfra_Swarming>();
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_Swarming getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BuildInfra_Swarming>(create);
+  static BuildInfra_Swarming? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get hostname => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set hostname($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasHostname() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearHostname() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.String get taskId => $_getSZ(1);
+  @$pb.TagNumber(2)
+  set taskId($core.String v) {
+    $_setString(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasTaskId() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearTaskId() => clearField(2);
+
+  @$pb.TagNumber(3)
+  $core.String get taskServiceAccount => $_getSZ(2);
+  @$pb.TagNumber(3)
+  set taskServiceAccount($core.String v) {
+    $_setString(2, v);
+  }
+
+  @$pb.TagNumber(3)
+  $core.bool hasTaskServiceAccount() => $_has(2);
+  @$pb.TagNumber(3)
+  void clearTaskServiceAccount() => clearField(3);
+
+  @$pb.TagNumber(4)
+  $core.int get priority => $_getIZ(3);
+  @$pb.TagNumber(4)
+  set priority($core.int v) {
+    $_setSignedInt32(3, v);
+  }
+
+  @$pb.TagNumber(4)
+  $core.bool hasPriority() => $_has(3);
+  @$pb.TagNumber(4)
+  void clearPriority() => clearField(4);
+
+  @$pb.TagNumber(5)
+  $core.List<$3.RequestedDimension> get taskDimensions => $_getList(4);
+
+  @$pb.TagNumber(6)
+  $core.List<$3.StringPair> get botDimensions => $_getList(5);
+
+  @$pb.TagNumber(7)
+  $core.List<BuildInfra_Swarming_CacheEntry> get caches => $_getList(6);
+
+  @$pb.TagNumber(9)
+  $core.String get parentRunId => $_getSZ(7);
+  @$pb.TagNumber(9)
+  set parentRunId($core.String v) {
+    $_setString(7, v);
+  }
+
+  @$pb.TagNumber(9)
+  $core.bool hasParentRunId() => $_has(7);
+  @$pb.TagNumber(9)
+  void clearParentRunId() => clearField(9);
+}
+
+class BuildInfra_LogDog extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BuildInfra.LogDog',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'hostname')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'project')
+    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'prefix')
+    ..hasRequiredFields = false;
+
+  BuildInfra_LogDog._() : super();
+  factory BuildInfra_LogDog({
+    $core.String? hostname,
+    $core.String? project,
+    $core.String? prefix,
+  }) {
+    final _result = create();
+    if (hostname != null) {
+      _result.hostname = hostname;
+    }
+    if (project != null) {
+      _result.project = project;
+    }
+    if (prefix != null) {
+      _result.prefix = prefix;
+    }
+    return _result;
+  }
+  factory BuildInfra_LogDog.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BuildInfra_LogDog.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BuildInfra_LogDog clone() => BuildInfra_LogDog()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BuildInfra_LogDog copyWith(void Function(BuildInfra_LogDog) updates) =>
+      super.copyWith((message) => updates(message as BuildInfra_LogDog))
+          as BuildInfra_LogDog; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_LogDog create() => BuildInfra_LogDog._();
+  BuildInfra_LogDog createEmptyInstance() => create();
+  static $pb.PbList<BuildInfra_LogDog> createRepeated() => $pb.PbList<BuildInfra_LogDog>();
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_LogDog getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BuildInfra_LogDog>(create);
+  static BuildInfra_LogDog? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get hostname => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set hostname($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasHostname() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearHostname() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.String get project => $_getSZ(1);
+  @$pb.TagNumber(2)
+  set project($core.String v) {
+    $_setString(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasProject() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearProject() => clearField(2);
+
+  @$pb.TagNumber(3)
+  $core.String get prefix => $_getSZ(2);
+  @$pb.TagNumber(3)
+  set prefix($core.String v) {
+    $_setString(2, v);
+  }
+
+  @$pb.TagNumber(3)
+  $core.bool hasPrefix() => $_has(2);
+  @$pb.TagNumber(3)
+  void clearPrefix() => clearField(3);
+}
+
+class BuildInfra_Recipe extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BuildInfra.Recipe',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'cipdPackage')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name')
+    ..hasRequiredFields = false;
+
+  BuildInfra_Recipe._() : super();
+  factory BuildInfra_Recipe({
+    $core.String? cipdPackage,
+    $core.String? name,
+  }) {
+    final _result = create();
+    if (cipdPackage != null) {
+      _result.cipdPackage = cipdPackage;
+    }
+    if (name != null) {
+      _result.name = name;
+    }
+    return _result;
+  }
+  factory BuildInfra_Recipe.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BuildInfra_Recipe.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BuildInfra_Recipe clone() => BuildInfra_Recipe()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BuildInfra_Recipe copyWith(void Function(BuildInfra_Recipe) updates) =>
+      super.copyWith((message) => updates(message as BuildInfra_Recipe))
+          as BuildInfra_Recipe; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_Recipe create() => BuildInfra_Recipe._();
+  BuildInfra_Recipe createEmptyInstance() => create();
+  static $pb.PbList<BuildInfra_Recipe> createRepeated() => $pb.PbList<BuildInfra_Recipe>();
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_Recipe getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BuildInfra_Recipe>(create);
+  static BuildInfra_Recipe? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get cipdPackage => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set cipdPackage($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasCipdPackage() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearCipdPackage() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.String get name => $_getSZ(1);
+  @$pb.TagNumber(2)
+  set name($core.String v) {
+    $_setString(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasName() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearName() => clearField(2);
+}
+
+class BuildInfra_ResultDB extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BuildInfra.ResultDB',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'hostname')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'invocation')
+    ..hasRequiredFields = false;
+
+  BuildInfra_ResultDB._() : super();
+  factory BuildInfra_ResultDB({
+    $core.String? hostname,
+    $core.String? invocation,
+  }) {
+    final _result = create();
+    if (hostname != null) {
+      _result.hostname = hostname;
+    }
+    if (invocation != null) {
+      _result.invocation = invocation;
+    }
+    return _result;
+  }
+  factory BuildInfra_ResultDB.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BuildInfra_ResultDB.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BuildInfra_ResultDB clone() => BuildInfra_ResultDB()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BuildInfra_ResultDB copyWith(void Function(BuildInfra_ResultDB) updates) =>
+      super.copyWith((message) => updates(message as BuildInfra_ResultDB))
+          as BuildInfra_ResultDB; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_ResultDB create() => BuildInfra_ResultDB._();
+  BuildInfra_ResultDB createEmptyInstance() => create();
+  static $pb.PbList<BuildInfra_ResultDB> createRepeated() => $pb.PbList<BuildInfra_ResultDB>();
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_ResultDB getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BuildInfra_ResultDB>(create);
+  static BuildInfra_ResultDB? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get hostname => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set hostname($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasHostname() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearHostname() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.String get invocation => $_getSZ(1);
+  @$pb.TagNumber(2)
+  set invocation($core.String v) {
+    $_setString(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasInvocation() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearInvocation() => clearField(2);
+}
+
+class BuildInfra_BBAgent_Input_CIPDPackage extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BuildInfra.BBAgent.Input.CIPDPackage',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'version')
+    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'server')
+    ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'path')
+    ..hasRequiredFields = false;
+
+  BuildInfra_BBAgent_Input_CIPDPackage._() : super();
+  factory BuildInfra_BBAgent_Input_CIPDPackage({
+    $core.String? name,
+    $core.String? version,
+    $core.String? server,
+    $core.String? path,
+  }) {
+    final _result = create();
+    if (name != null) {
+      _result.name = name;
+    }
+    if (version != null) {
+      _result.version = version;
+    }
+    if (server != null) {
+      _result.server = server;
+    }
+    if (path != null) {
+      _result.path = path;
+    }
+    return _result;
+  }
+  factory BuildInfra_BBAgent_Input_CIPDPackage.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BuildInfra_BBAgent_Input_CIPDPackage.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BuildInfra_BBAgent_Input_CIPDPackage clone() => BuildInfra_BBAgent_Input_CIPDPackage()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BuildInfra_BBAgent_Input_CIPDPackage copyWith(void Function(BuildInfra_BBAgent_Input_CIPDPackage) updates) =>
+      super.copyWith((message) => updates(message as BuildInfra_BBAgent_Input_CIPDPackage))
+          as BuildInfra_BBAgent_Input_CIPDPackage; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_BBAgent_Input_CIPDPackage create() => BuildInfra_BBAgent_Input_CIPDPackage._();
+  BuildInfra_BBAgent_Input_CIPDPackage createEmptyInstance() => create();
+  static $pb.PbList<BuildInfra_BBAgent_Input_CIPDPackage> createRepeated() =>
+      $pb.PbList<BuildInfra_BBAgent_Input_CIPDPackage>();
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_BBAgent_Input_CIPDPackage getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BuildInfra_BBAgent_Input_CIPDPackage>(create);
+  static BuildInfra_BBAgent_Input_CIPDPackage? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get name => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set name($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasName() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearName() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.String get version => $_getSZ(1);
+  @$pb.TagNumber(2)
+  set version($core.String v) {
+    $_setString(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasVersion() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearVersion() => clearField(2);
+
+  @$pb.TagNumber(3)
+  $core.String get server => $_getSZ(2);
+  @$pb.TagNumber(3)
+  set server($core.String v) {
+    $_setString(2, v);
+  }
+
+  @$pb.TagNumber(3)
+  $core.bool hasServer() => $_has(2);
+  @$pb.TagNumber(3)
+  void clearServer() => clearField(3);
+
+  @$pb.TagNumber(4)
+  $core.String get path => $_getSZ(3);
+  @$pb.TagNumber(4)
+  set path($core.String v) {
+    $_setString(3, v);
+  }
+
+  @$pb.TagNumber(4)
+  $core.bool hasPath() => $_has(3);
+  @$pb.TagNumber(4)
+  void clearPath() => clearField(4);
+}
+
+class BuildInfra_BBAgent_Input extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BuildInfra.BBAgent.Input',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..pc<BuildInfra_BBAgent_Input_CIPDPackage>(
+        1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'cipdPackages', $pb.PbFieldType.PM,
+        subBuilder: BuildInfra_BBAgent_Input_CIPDPackage.create)
+    ..hasRequiredFields = false;
+
+  BuildInfra_BBAgent_Input._() : super();
+  factory BuildInfra_BBAgent_Input({
+    $core.Iterable<BuildInfra_BBAgent_Input_CIPDPackage>? cipdPackages,
+  }) {
+    final _result = create();
+    if (cipdPackages != null) {
+      _result.cipdPackages.addAll(cipdPackages);
+    }
+    return _result;
+  }
+  factory BuildInfra_BBAgent_Input.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BuildInfra_BBAgent_Input.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BuildInfra_BBAgent_Input clone() => BuildInfra_BBAgent_Input()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BuildInfra_BBAgent_Input copyWith(void Function(BuildInfra_BBAgent_Input) updates) =>
+      super.copyWith((message) => updates(message as BuildInfra_BBAgent_Input))
+          as BuildInfra_BBAgent_Input; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_BBAgent_Input create() => BuildInfra_BBAgent_Input._();
+  BuildInfra_BBAgent_Input createEmptyInstance() => create();
+  static $pb.PbList<BuildInfra_BBAgent_Input> createRepeated() => $pb.PbList<BuildInfra_BBAgent_Input>();
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_BBAgent_Input getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BuildInfra_BBAgent_Input>(create);
+  static BuildInfra_BBAgent_Input? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.List<BuildInfra_BBAgent_Input_CIPDPackage> get cipdPackages => $_getList(0);
+}
+
+class BuildInfra_BBAgent extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BuildInfra.BBAgent',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'payloadPath')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'cacheDir')
+    ..pPS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'knownPublicGerritHosts')
+    ..aOM<BuildInfra_BBAgent_Input>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'input',
+        subBuilder: BuildInfra_BBAgent_Input.create)
+    ..hasRequiredFields = false;
+
+  BuildInfra_BBAgent._() : super();
+  factory BuildInfra_BBAgent({
+    $core.String? payloadPath,
+    $core.String? cacheDir,
+    @$core.Deprecated('This field is deprecated.') $core.Iterable<$core.String>? knownPublicGerritHosts,
+    @$core.Deprecated('This field is deprecated.') BuildInfra_BBAgent_Input? input,
+  }) {
+    final _result = create();
+    if (payloadPath != null) {
+      _result.payloadPath = payloadPath;
+    }
+    if (cacheDir != null) {
+      _result.cacheDir = cacheDir;
+    }
+    if (knownPublicGerritHosts != null) {
+      // ignore: deprecated_member_use_from_same_package
+      _result.knownPublicGerritHosts.addAll(knownPublicGerritHosts);
+    }
+    if (input != null) {
+      // ignore: deprecated_member_use_from_same_package
+      _result.input = input;
+    }
+    return _result;
+  }
+  factory BuildInfra_BBAgent.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BuildInfra_BBAgent.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BuildInfra_BBAgent clone() => BuildInfra_BBAgent()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BuildInfra_BBAgent copyWith(void Function(BuildInfra_BBAgent) updates) =>
+      super.copyWith((message) => updates(message as BuildInfra_BBAgent))
+          as BuildInfra_BBAgent; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_BBAgent create() => BuildInfra_BBAgent._();
+  BuildInfra_BBAgent createEmptyInstance() => create();
+  static $pb.PbList<BuildInfra_BBAgent> createRepeated() => $pb.PbList<BuildInfra_BBAgent>();
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_BBAgent getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BuildInfra_BBAgent>(create);
+  static BuildInfra_BBAgent? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get payloadPath => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set payloadPath($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasPayloadPath() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearPayloadPath() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.String get cacheDir => $_getSZ(1);
+  @$pb.TagNumber(2)
+  set cacheDir($core.String v) {
+    $_setString(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasCacheDir() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearCacheDir() => clearField(2);
+
+  @$core.Deprecated('This field is deprecated.')
+  @$pb.TagNumber(3)
+  $core.List<$core.String> get knownPublicGerritHosts => $_getList(2);
+
+  @$core.Deprecated('This field is deprecated.')
+  @$pb.TagNumber(4)
+  BuildInfra_BBAgent_Input get input => $_getN(3);
+  @$core.Deprecated('This field is deprecated.')
+  @$pb.TagNumber(4)
+  set input(BuildInfra_BBAgent_Input v) {
+    setField(4, v);
+  }
+
+  @$core.Deprecated('This field is deprecated.')
+  @$pb.TagNumber(4)
+  $core.bool hasInput() => $_has(3);
+  @$core.Deprecated('This field is deprecated.')
+  @$pb.TagNumber(4)
+  void clearInput() => clearField(4);
+  @$core.Deprecated('This field is deprecated.')
+  @$pb.TagNumber(4)
+  BuildInfra_BBAgent_Input ensureInput() => $_ensure(3);
+}
+
+class BuildInfra_Backend extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BuildInfra.Backend',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOM<$5.Struct>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'config',
+        subBuilder: $5.Struct.create)
+    ..aOM<$6.Task>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'task',
+        subBuilder: $6.Task.create)
+    ..hasRequiredFields = false;
+
+  BuildInfra_Backend._() : super();
+  factory BuildInfra_Backend({
+    $5.Struct? config,
+    $6.Task? task,
+  }) {
+    final _result = create();
+    if (config != null) {
+      _result.config = config;
+    }
+    if (task != null) {
+      _result.task = task;
+    }
+    return _result;
+  }
+  factory BuildInfra_Backend.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BuildInfra_Backend.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BuildInfra_Backend clone() => BuildInfra_Backend()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BuildInfra_Backend copyWith(void Function(BuildInfra_Backend) updates) =>
+      super.copyWith((message) => updates(message as BuildInfra_Backend))
+          as BuildInfra_Backend; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_Backend create() => BuildInfra_Backend._();
+  BuildInfra_Backend createEmptyInstance() => create();
+  static $pb.PbList<BuildInfra_Backend> createRepeated() => $pb.PbList<BuildInfra_Backend>();
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra_Backend getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BuildInfra_Backend>(create);
+  static BuildInfra_Backend? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $5.Struct get config => $_getN(0);
+  @$pb.TagNumber(1)
+  set config($5.Struct v) {
+    setField(1, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasConfig() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearConfig() => clearField(1);
+  @$pb.TagNumber(1)
+  $5.Struct ensureConfig() => $_ensure(0);
+
+  @$pb.TagNumber(2)
+  $6.Task get task => $_getN(1);
+  @$pb.TagNumber(2)
+  set task($6.Task v) {
+    setField(2, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasTask() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearTask() => clearField(2);
+  @$pb.TagNumber(2)
+  $6.Task ensureTask() => $_ensure(1);
+}
+
+class BuildInfra extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BuildInfra',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOM<BuildInfra_Buildbucket>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'buildbucket',
+        subBuilder: BuildInfra_Buildbucket.create)
+    ..aOM<BuildInfra_Swarming>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'swarming',
+        subBuilder: BuildInfra_Swarming.create)
+    ..aOM<BuildInfra_LogDog>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'logdog',
+        subBuilder: BuildInfra_LogDog.create)
+    ..aOM<BuildInfra_Recipe>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'recipe',
+        subBuilder: BuildInfra_Recipe.create)
+    ..aOM<BuildInfra_ResultDB>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'resultdb',
+        subBuilder: BuildInfra_ResultDB.create)
+    ..aOM<BuildInfra_BBAgent>(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'bbagent',
+        subBuilder: BuildInfra_BBAgent.create)
+    ..aOM<BuildInfra_Backend>(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'backend',
+        subBuilder: BuildInfra_Backend.create)
+    ..hasRequiredFields = false;
+
+  BuildInfra._() : super();
+  factory BuildInfra({
+    BuildInfra_Buildbucket? buildbucket,
+    BuildInfra_Swarming? swarming,
+    BuildInfra_LogDog? logdog,
+    BuildInfra_Recipe? recipe,
+    BuildInfra_ResultDB? resultdb,
+    BuildInfra_BBAgent? bbagent,
+    BuildInfra_Backend? backend,
+  }) {
+    final _result = create();
+    if (buildbucket != null) {
+      _result.buildbucket = buildbucket;
+    }
+    if (swarming != null) {
+      _result.swarming = swarming;
+    }
+    if (logdog != null) {
+      _result.logdog = logdog;
+    }
+    if (recipe != null) {
+      _result.recipe = recipe;
+    }
+    if (resultdb != null) {
+      _result.resultdb = resultdb;
+    }
+    if (bbagent != null) {
+      _result.bbagent = bbagent;
+    }
+    if (backend != null) {
+      _result.backend = backend;
+    }
+    return _result;
+  }
+  factory BuildInfra.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BuildInfra.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BuildInfra clone() => BuildInfra()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BuildInfra copyWith(void Function(BuildInfra) updates) =>
+      super.copyWith((message) => updates(message as BuildInfra)) as BuildInfra; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra create() => BuildInfra._();
+  BuildInfra createEmptyInstance() => create();
+  static $pb.PbList<BuildInfra> createRepeated() => $pb.PbList<BuildInfra>();
+  @$core.pragma('dart2js:noInline')
+  static BuildInfra getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BuildInfra>(create);
+  static BuildInfra? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  BuildInfra_Buildbucket get buildbucket => $_getN(0);
+  @$pb.TagNumber(1)
+  set buildbucket(BuildInfra_Buildbucket v) {
+    setField(1, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasBuildbucket() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearBuildbucket() => clearField(1);
+  @$pb.TagNumber(1)
+  BuildInfra_Buildbucket ensureBuildbucket() => $_ensure(0);
+
+  @$pb.TagNumber(2)
+  BuildInfra_Swarming get swarming => $_getN(1);
+  @$pb.TagNumber(2)
+  set swarming(BuildInfra_Swarming v) {
+    setField(2, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasSwarming() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearSwarming() => clearField(2);
+  @$pb.TagNumber(2)
+  BuildInfra_Swarming ensureSwarming() => $_ensure(1);
+
+  @$pb.TagNumber(3)
+  BuildInfra_LogDog get logdog => $_getN(2);
+  @$pb.TagNumber(3)
+  set logdog(BuildInfra_LogDog v) {
+    setField(3, v);
+  }
+
+  @$pb.TagNumber(3)
+  $core.bool hasLogdog() => $_has(2);
+  @$pb.TagNumber(3)
+  void clearLogdog() => clearField(3);
+  @$pb.TagNumber(3)
+  BuildInfra_LogDog ensureLogdog() => $_ensure(2);
+
+  @$pb.TagNumber(4)
+  BuildInfra_Recipe get recipe => $_getN(3);
+  @$pb.TagNumber(4)
+  set recipe(BuildInfra_Recipe v) {
+    setField(4, v);
+  }
+
+  @$pb.TagNumber(4)
+  $core.bool hasRecipe() => $_has(3);
+  @$pb.TagNumber(4)
+  void clearRecipe() => clearField(4);
+  @$pb.TagNumber(4)
+  BuildInfra_Recipe ensureRecipe() => $_ensure(3);
+
+  @$pb.TagNumber(5)
+  BuildInfra_ResultDB get resultdb => $_getN(4);
+  @$pb.TagNumber(5)
+  set resultdb(BuildInfra_ResultDB v) {
+    setField(5, v);
+  }
+
+  @$pb.TagNumber(5)
+  $core.bool hasResultdb() => $_has(4);
+  @$pb.TagNumber(5)
+  void clearResultdb() => clearField(5);
+  @$pb.TagNumber(5)
+  BuildInfra_ResultDB ensureResultdb() => $_ensure(4);
+
+  @$pb.TagNumber(6)
+  BuildInfra_BBAgent get bbagent => $_getN(5);
+  @$pb.TagNumber(6)
+  set bbagent(BuildInfra_BBAgent v) {
+    setField(6, v);
+  }
+
+  @$pb.TagNumber(6)
+  $core.bool hasBbagent() => $_has(5);
+  @$pb.TagNumber(6)
+  void clearBbagent() => clearField(6);
+  @$pb.TagNumber(6)
+  BuildInfra_BBAgent ensureBbagent() => $_ensure(5);
+
+  @$pb.TagNumber(7)
+  BuildInfra_Backend get backend => $_getN(6);
+  @$pb.TagNumber(7)
+  set backend(BuildInfra_Backend v) {
+    setField(7, v);
+  }
+
+  @$pb.TagNumber(7)
+  $core.bool hasBackend() => $_has(6);
+  @$pb.TagNumber(7)
+  void clearBackend() => clearField(7);
+  @$pb.TagNumber(7)
+  BuildInfra_Backend ensureBackend() => $_ensure(6);
+}
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/build.pbenum.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/build.pbenum.dart
new file mode 100644
index 0000000..38bc676
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/build.pbenum.dart
@@ -0,0 +1,67 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/buildbucket/proto/build.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+// ignore_for_file: UNDEFINED_SHOWN_NAME
+import 'dart:core' as $core;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+class BuildInfra_Buildbucket_ExperimentReason extends $pb.ProtobufEnum {
+  static const BuildInfra_Buildbucket_ExperimentReason EXPERIMENT_REASON_UNSET =
+      BuildInfra_Buildbucket_ExperimentReason._(
+          0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'EXPERIMENT_REASON_UNSET');
+  static const BuildInfra_Buildbucket_ExperimentReason EXPERIMENT_REASON_GLOBAL_DEFAULT =
+      BuildInfra_Buildbucket_ExperimentReason._(
+          1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'EXPERIMENT_REASON_GLOBAL_DEFAULT');
+  static const BuildInfra_Buildbucket_ExperimentReason EXPERIMENT_REASON_BUILDER_CONFIG =
+      BuildInfra_Buildbucket_ExperimentReason._(
+          2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'EXPERIMENT_REASON_BUILDER_CONFIG');
+  static const BuildInfra_Buildbucket_ExperimentReason EXPERIMENT_REASON_GLOBAL_MINIMUM =
+      BuildInfra_Buildbucket_ExperimentReason._(
+          3, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'EXPERIMENT_REASON_GLOBAL_MINIMUM');
+  static const BuildInfra_Buildbucket_ExperimentReason EXPERIMENT_REASON_REQUESTED =
+      BuildInfra_Buildbucket_ExperimentReason._(
+          4, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'EXPERIMENT_REASON_REQUESTED');
+  static const BuildInfra_Buildbucket_ExperimentReason EXPERIMENT_REASON_GLOBAL_INACTIVE =
+      BuildInfra_Buildbucket_ExperimentReason._(
+          5, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'EXPERIMENT_REASON_GLOBAL_INACTIVE');
+
+  static const $core.List<BuildInfra_Buildbucket_ExperimentReason> values = <BuildInfra_Buildbucket_ExperimentReason>[
+    EXPERIMENT_REASON_UNSET,
+    EXPERIMENT_REASON_GLOBAL_DEFAULT,
+    EXPERIMENT_REASON_BUILDER_CONFIG,
+    EXPERIMENT_REASON_GLOBAL_MINIMUM,
+    EXPERIMENT_REASON_REQUESTED,
+    EXPERIMENT_REASON_GLOBAL_INACTIVE,
+  ];
+
+  static final $core.Map<$core.int, BuildInfra_Buildbucket_ExperimentReason> _byValue =
+      $pb.ProtobufEnum.initByValue(values);
+  static BuildInfra_Buildbucket_ExperimentReason? valueOf($core.int value) => _byValue[value];
+
+  const BuildInfra_Buildbucket_ExperimentReason._($core.int v, $core.String n) : super(v, n);
+}
+
+class BuildInfra_Buildbucket_Agent_Purpose extends $pb.ProtobufEnum {
+  static const BuildInfra_Buildbucket_Agent_Purpose PURPOSE_UNSPECIFIED = BuildInfra_Buildbucket_Agent_Purpose._(
+      0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'PURPOSE_UNSPECIFIED');
+  static const BuildInfra_Buildbucket_Agent_Purpose PURPOSE_EXE_PAYLOAD = BuildInfra_Buildbucket_Agent_Purpose._(
+      1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'PURPOSE_EXE_PAYLOAD');
+  static const BuildInfra_Buildbucket_Agent_Purpose PURPOSE_BBAGENT_UTILITY = BuildInfra_Buildbucket_Agent_Purpose._(
+      2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'PURPOSE_BBAGENT_UTILITY');
+
+  static const $core.List<BuildInfra_Buildbucket_Agent_Purpose> values = <BuildInfra_Buildbucket_Agent_Purpose>[
+    PURPOSE_UNSPECIFIED,
+    PURPOSE_EXE_PAYLOAD,
+    PURPOSE_BBAGENT_UTILITY,
+  ];
+
+  static final $core.Map<$core.int, BuildInfra_Buildbucket_Agent_Purpose> _byValue =
+      $pb.ProtobufEnum.initByValue(values);
+  static BuildInfra_Buildbucket_Agent_Purpose? valueOf($core.int value) => _byValue[value];
+
+  const BuildInfra_Buildbucket_Agent_Purpose._($core.int v, $core.String n) : super(v, n);
+}
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/build.pbjson.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/build.pbjson.dart
new file mode 100644
index 0000000..29ac448
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/build.pbjson.dart
@@ -0,0 +1,743 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/buildbucket/proto/build.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+import 'dart:core' as $core;
+import 'dart:convert' as $convert;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use buildDescriptor instead')
+const Build$json = const {
+  '1': 'Build',
+  '2': const [
+    const {'1': 'id', '3': 1, '4': 1, '5': 3, '8': const {}, '10': 'id'},
+    const {'1': 'builder', '3': 2, '4': 1, '5': 11, '6': '.buildbucket.v2.BuilderID', '8': const {}, '10': 'builder'},
+    const {'1': 'number', '3': 3, '4': 1, '5': 5, '8': const {}, '10': 'number'},
+    const {'1': 'created_by', '3': 4, '4': 1, '5': 9, '8': const {}, '10': 'createdBy'},
+    const {'1': 'canceled_by', '3': 23, '4': 1, '5': 9, '8': const {}, '10': 'canceledBy'},
+    const {
+      '1': 'create_time',
+      '3': 6,
+      '4': 1,
+      '5': 11,
+      '6': '.google.protobuf.Timestamp',
+      '8': const {},
+      '10': 'createTime'
+    },
+    const {
+      '1': 'start_time',
+      '3': 7,
+      '4': 1,
+      '5': 11,
+      '6': '.google.protobuf.Timestamp',
+      '8': const {},
+      '10': 'startTime'
+    },
+    const {'1': 'end_time', '3': 8, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '8': const {}, '10': 'endTime'},
+    const {
+      '1': 'update_time',
+      '3': 9,
+      '4': 1,
+      '5': 11,
+      '6': '.google.protobuf.Timestamp',
+      '8': const {},
+      '10': 'updateTime'
+    },
+    const {
+      '1': 'cancel_time',
+      '3': 32,
+      '4': 1,
+      '5': 11,
+      '6': '.google.protobuf.Timestamp',
+      '8': const {},
+      '10': 'cancelTime'
+    },
+    const {'1': 'status', '3': 12, '4': 1, '5': 14, '6': '.buildbucket.v2.Status', '8': const {}, '10': 'status'},
+    const {'1': 'summary_markdown', '3': 20, '4': 1, '5': 9, '8': const {}, '10': 'summaryMarkdown'},
+    const {'1': 'critical', '3': 21, '4': 1, '5': 14, '6': '.buildbucket.v2.Trinary', '8': const {}, '10': 'critical'},
+    const {
+      '1': 'status_details',
+      '3': 22,
+      '4': 1,
+      '5': 11,
+      '6': '.buildbucket.v2.StatusDetails',
+      '8': const {},
+      '10': 'statusDetails'
+    },
+    const {'1': 'input', '3': 15, '4': 1, '5': 11, '6': '.buildbucket.v2.Build.Input', '8': const {}, '10': 'input'},
+    const {'1': 'output', '3': 16, '4': 1, '5': 11, '6': '.buildbucket.v2.Build.Output', '8': const {}, '10': 'output'},
+    const {'1': 'steps', '3': 17, '4': 3, '5': 11, '6': '.buildbucket.v2.Step', '8': const {}, '10': 'steps'},
+    const {'1': 'infra', '3': 18, '4': 1, '5': 11, '6': '.buildbucket.v2.BuildInfra', '8': const {}, '10': 'infra'},
+    const {'1': 'tags', '3': 19, '4': 3, '5': 11, '6': '.buildbucket.v2.StringPair', '10': 'tags'},
+    const {'1': 'exe', '3': 24, '4': 1, '5': 11, '6': '.buildbucket.v2.Executable', '8': const {}, '10': 'exe'},
+    const {'1': 'canary', '3': 25, '4': 1, '5': 8, '10': 'canary'},
+    const {
+      '1': 'scheduling_timeout',
+      '3': 26,
+      '4': 1,
+      '5': 11,
+      '6': '.google.protobuf.Duration',
+      '10': 'schedulingTimeout'
+    },
+    const {
+      '1': 'execution_timeout',
+      '3': 27,
+      '4': 1,
+      '5': 11,
+      '6': '.google.protobuf.Duration',
+      '10': 'executionTimeout'
+    },
+    const {'1': 'grace_period', '3': 29, '4': 1, '5': 11, '6': '.google.protobuf.Duration', '10': 'gracePeriod'},
+    const {'1': 'wait_for_capacity', '3': 28, '4': 1, '5': 8, '10': 'waitForCapacity'},
+    const {'1': 'can_outlive_parent', '3': 30, '4': 1, '5': 8, '8': const {}, '10': 'canOutliveParent'},
+    const {'1': 'ancestor_ids', '3': 31, '4': 3, '5': 3, '8': const {}, '10': 'ancestorIds'},
+  ],
+  '3': const [Build_Input$json, Build_Output$json],
+  '9': const [
+    const {'1': 5, '2': 6},
+    const {'1': 13, '2': 14},
+    const {'1': 14, '2': 15},
+  ],
+};
+
+@$core.Deprecated('Use buildDescriptor instead')
+const Build_Input$json = const {
+  '1': 'Input',
+  '2': const [
+    const {'1': 'properties', '3': 1, '4': 1, '5': 11, '6': '.google.protobuf.Struct', '10': 'properties'},
+    const {
+      '1': 'gitiles_commit',
+      '3': 2,
+      '4': 1,
+      '5': 11,
+      '6': '.buildbucket.v2.GitilesCommit',
+      '8': const {},
+      '10': 'gitilesCommit'
+    },
+    const {
+      '1': 'gerrit_changes',
+      '3': 3,
+      '4': 3,
+      '5': 11,
+      '6': '.buildbucket.v2.GerritChange',
+      '8': const {},
+      '10': 'gerritChanges'
+    },
+    const {'1': 'experimental', '3': 5, '4': 1, '5': 8, '10': 'experimental'},
+    const {'1': 'experiments', '3': 6, '4': 3, '5': 9, '10': 'experiments'},
+  ],
+};
+
+@$core.Deprecated('Use buildDescriptor instead')
+const Build_Output$json = const {
+  '1': 'Output',
+  '2': const [
+    const {'1': 'properties', '3': 1, '4': 1, '5': 11, '6': '.google.protobuf.Struct', '10': 'properties'},
+    const {'1': 'gitiles_commit', '3': 3, '4': 1, '5': 11, '6': '.buildbucket.v2.GitilesCommit', '10': 'gitilesCommit'},
+    const {'1': 'logs', '3': 5, '4': 3, '5': 11, '6': '.buildbucket.v2.Log', '10': 'logs'},
+  ],
+  '9': const [
+    const {'1': 2, '2': 3},
+    const {'1': 4, '2': 5},
+  ],
+};
+
+/// Descriptor for `Build`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List buildDescriptor = $convert.base64Decode(
+    'CgVCdWlsZBIYCgJpZBgBIAEoA0II4EEDuM68AwNSAmlkEkAKB2J1aWxkZXIYAiABKAsyGS5idWlsZGJ1Y2tldC52Mi5CdWlsZGVySURCC4rDGgIIArjOvAMCUgdidWlsZGVyEiAKBm51bWJlchgDIAEoBUII4EEDuM68AwJSBm51bWJlchIiCgpjcmVhdGVkX2J5GAQgASgJQgPgQQNSCWNyZWF0ZWRCeRIkCgtjYW5jZWxlZF9ieRgXIAEoCUID4EEDUgpjYW5jZWxlZEJ5EkUKC2NyZWF0ZV90aW1lGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEII4EEDuM68AwJSCmNyZWF0ZVRpbWUSQwoKc3RhcnRfdGltZRgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCCOBBA7jOvAMCUglzdGFydFRpbWUSPwoIZW5kX3RpbWUYCCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgjgQQO4zrwDAlIHZW5kVGltZRJFCgt1cGRhdGVfdGltZRgJIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCCOBBA7jOvAMCUgp1cGRhdGVUaW1lEkUKC2NhbmNlbF90aW1lGCAgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEII4EEDuM68AwJSCmNhbmNlbFRpbWUSOwoGc3RhdHVzGAwgASgOMhYuYnVpbGRidWNrZXQudjIuU3RhdHVzQguKwxoCCAO4zrwDA1IGc3RhdHVzEjEKEHN1bW1hcnlfbWFya2Rvd24YFCABKAlCBorDGgIIA1IPc3VtbWFyeU1hcmtkb3duEjoKCGNyaXRpY2FsGBUgASgOMhcuYnVpbGRidWNrZXQudjIuVHJpbmFyeUIFuM68AwJSCGNyaXRpY2FsElEKDnN0YXR1c19kZXRhaWxzGBYgASgLMh0uYnVpbGRidWNrZXQudjIuU3RhdHVzRGV0YWlsc0ILisMaAggDuM68AwNSDXN0YXR1c0RldGFpbHMSOQoFaW5wdXQYDyABKAsyGy5idWlsZGJ1Y2tldC52Mi5CdWlsZC5JbnB1dEIGisMaAggCUgVpbnB1dBI8CgZvdXRwdXQYECABKAsyHC5idWlsZGJ1Y2tldC52Mi5CdWlsZC5PdXRwdXRCBorDGgIIA1IGb3V0cHV0EjIKBXN0ZXBzGBEgAygLMhQuYnVpbGRidWNrZXQudjIuU3RlcEIGisMaAggDUgVzdGVwcxI4CgVpbmZyYRgSIAEoCzIaLmJ1aWxkYnVja2V0LnYyLkJ1aWxkSW5mcmFCBorDGgIIAlIFaW5mcmESLgoEdGFncxgTIAMoCzIaLmJ1aWxkYnVja2V0LnYyLlN0cmluZ1BhaXJSBHRhZ3MSNAoDZXhlGBggASgLMhouYnVpbGRidWNrZXQudjIuRXhlY3V0YWJsZUIGisMaAggCUgNleGUSFgoGY2FuYXJ5GBkgASgIUgZjYW5hcnkSSAoSc2NoZWR1bGluZ190aW1lb3V0GBogASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uUhFzY2hlZHVsaW5nVGltZW91dBJGChFleGVjdXRpb25fdGltZW91dBgbIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvblIQZXhlY3V0aW9uVGltZW91dBI8CgxncmFjZV9wZXJpb2QYHSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25SC2dyYWNlUGVyaW9kEioKEXdhaXRfZm9yX2NhcGFjaXR5GBwgASgIUg93YWl0Rm9yQ2FwYWNpdHkSMwoSY2FuX291dGxpdmVfcGFyZW50GB4gASgIQgW4zrwDA1IQY2FuT3V0bGl2ZVBhcmVudBIrCgxhbmNlc3Rvcl9pZHMYHyADKANCCOBBA7jOvAMDUgthbmNlc3RvcklkcxqfAgoFSW5wdXQSNwoKcHJvcGVydGllcxgBIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3RSCnByb3BlcnRpZXMSSwoOZ2l0aWxlc19jb21taXQYAiABKAsyHS5idWlsZGJ1Y2tldC52Mi5HaXRpbGVzQ29tbWl0QgW4zrwDAlINZ2l0aWxlc0NvbW1pdBJKCg5nZXJyaXRfY2hhbmdlcxgDIAMoCzIcLmJ1aWxkYnVja2V0LnYyLkdlcnJpdENoYW5nZUIFuM68AwJSDWdlcnJpdENoYW5nZXMSIgoMZXhwZXJpbWVudGFsGAUgASgIUgxleHBlcmltZW50YWwSIAoLZXhwZXJpbWVudHMYBiADKAlSC2V4cGVyaW1lbnRzGrwBCgZPdXRwdXQSNwoKcHJvcGVydGllcxgBIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3RSCnByb3BlcnRpZXMSRAoOZ2l0aWxlc19jb21taXQYAyABKAsyHS5idWlsZGJ1Y2tldC52Mi5HaXRpbGVzQ29tbWl0Ug1naXRpbGVzQ29tbWl0EicKBGxvZ3MYBSADKAsyEy5idWlsZGJ1Y2tldC52Mi5Mb2dSBGxvZ3NKBAgCEANKBAgEEAVKBAgFEAZKBAgNEA5KBAgOEA8=');
+@$core.Deprecated('Use inputDataRefDescriptor instead')
+const InputDataRef$json = const {
+  '1': 'InputDataRef',
+  '2': const [
+    const {'1': 'cas', '3': 1, '4': 1, '5': 11, '6': '.buildbucket.v2.InputDataRef.CAS', '9': 0, '10': 'cas'},
+    const {'1': 'cipd', '3': 2, '4': 1, '5': 11, '6': '.buildbucket.v2.InputDataRef.CIPD', '9': 0, '10': 'cipd'},
+    const {'1': 'on_path', '3': 3, '4': 3, '5': 9, '10': 'onPath'},
+  ],
+  '3': const [InputDataRef_CAS$json, InputDataRef_CIPD$json],
+  '8': const [
+    const {'1': 'data_type'},
+  ],
+  '9': const [
+    const {'1': 4, '2': 5},
+  ],
+};
+
+@$core.Deprecated('Use inputDataRefDescriptor instead')
+const InputDataRef_CAS$json = const {
+  '1': 'CAS',
+  '2': const [
+    const {'1': 'cas_instance', '3': 1, '4': 1, '5': 9, '10': 'casInstance'},
+    const {'1': 'digest', '3': 2, '4': 1, '5': 11, '6': '.buildbucket.v2.InputDataRef.CAS.Digest', '10': 'digest'},
+  ],
+  '3': const [InputDataRef_CAS_Digest$json],
+};
+
+@$core.Deprecated('Use inputDataRefDescriptor instead')
+const InputDataRef_CAS_Digest$json = const {
+  '1': 'Digest',
+  '2': const [
+    const {'1': 'hash', '3': 1, '4': 1, '5': 9, '10': 'hash'},
+    const {'1': 'size_bytes', '3': 2, '4': 1, '5': 3, '10': 'sizeBytes'},
+  ],
+};
+
+@$core.Deprecated('Use inputDataRefDescriptor instead')
+const InputDataRef_CIPD$json = const {
+  '1': 'CIPD',
+  '2': const [
+    const {'1': 'server', '3': 1, '4': 1, '5': 9, '10': 'server'},
+    const {'1': 'specs', '3': 2, '4': 3, '5': 11, '6': '.buildbucket.v2.InputDataRef.CIPD.PkgSpec', '10': 'specs'},
+  ],
+  '3': const [InputDataRef_CIPD_PkgSpec$json],
+};
+
+@$core.Deprecated('Use inputDataRefDescriptor instead')
+const InputDataRef_CIPD_PkgSpec$json = const {
+  '1': 'PkgSpec',
+  '2': const [
+    const {'1': 'package', '3': 1, '4': 1, '5': 9, '10': 'package'},
+    const {'1': 'version', '3': 2, '4': 1, '5': 9, '10': 'version'},
+  ],
+};
+
+/// Descriptor for `InputDataRef`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List inputDataRefDescriptor = $convert.base64Decode(
+    'CgxJbnB1dERhdGFSZWYSNAoDY2FzGAEgASgLMiAuYnVpbGRidWNrZXQudjIuSW5wdXREYXRhUmVmLkNBU0gAUgNjYXMSNwoEY2lwZBgCIAEoCzIhLmJ1aWxkYnVja2V0LnYyLklucHV0RGF0YVJlZi5DSVBESABSBGNpcGQSFwoHb25fcGF0aBgDIAMoCVIGb25QYXRoGqYBCgNDQVMSIQoMY2FzX2luc3RhbmNlGAEgASgJUgtjYXNJbnN0YW5jZRI/CgZkaWdlc3QYAiABKAsyJy5idWlsZGJ1Y2tldC52Mi5JbnB1dERhdGFSZWYuQ0FTLkRpZ2VzdFIGZGlnZXN0GjsKBkRpZ2VzdBISCgRoYXNoGAEgASgJUgRoYXNoEh0KCnNpemVfYnl0ZXMYAiABKANSCXNpemVCeXRlcxqeAQoEQ0lQRBIWCgZzZXJ2ZXIYASABKAlSBnNlcnZlchI/CgVzcGVjcxgCIAMoCzIpLmJ1aWxkYnVja2V0LnYyLklucHV0RGF0YVJlZi5DSVBELlBrZ1NwZWNSBXNwZWNzGj0KB1BrZ1NwZWMSGAoHcGFja2FnZRgBIAEoCVIHcGFja2FnZRIYCgd2ZXJzaW9uGAIgASgJUgd2ZXJzaW9uQgsKCWRhdGFfdHlwZUoECAQQBQ==');
+@$core.Deprecated('Use resolvedDataRefDescriptor instead')
+const ResolvedDataRef$json = const {
+  '1': 'ResolvedDataRef',
+  '2': const [
+    const {'1': 'cas', '3': 1, '4': 1, '5': 11, '6': '.buildbucket.v2.ResolvedDataRef.CAS', '9': 0, '10': 'cas'},
+    const {'1': 'cipd', '3': 2, '4': 1, '5': 11, '6': '.buildbucket.v2.ResolvedDataRef.CIPD', '9': 0, '10': 'cipd'},
+  ],
+  '3': const [ResolvedDataRef_Timing$json, ResolvedDataRef_CAS$json, ResolvedDataRef_CIPD$json],
+  '8': const [
+    const {'1': 'data_type'},
+  ],
+};
+
+@$core.Deprecated('Use resolvedDataRefDescriptor instead')
+const ResolvedDataRef_Timing$json = const {
+  '1': 'Timing',
+  '2': const [
+    const {'1': 'fetch_duration', '3': 1, '4': 1, '5': 11, '6': '.google.protobuf.Duration', '10': 'fetchDuration'},
+    const {'1': 'install_duration', '3': 2, '4': 1, '5': 11, '6': '.google.protobuf.Duration', '10': 'installDuration'},
+  ],
+};
+
+@$core.Deprecated('Use resolvedDataRefDescriptor instead')
+const ResolvedDataRef_CAS$json = const {
+  '1': 'CAS',
+  '2': const [
+    const {'1': 'timing', '3': 1, '4': 1, '5': 11, '6': '.buildbucket.v2.ResolvedDataRef.Timing', '10': 'timing'},
+  ],
+};
+
+@$core.Deprecated('Use resolvedDataRefDescriptor instead')
+const ResolvedDataRef_CIPD$json = const {
+  '1': 'CIPD',
+  '2': const [
+    const {'1': 'specs', '3': 2, '4': 3, '5': 11, '6': '.buildbucket.v2.ResolvedDataRef.CIPD.PkgSpec', '10': 'specs'},
+  ],
+  '3': const [ResolvedDataRef_CIPD_PkgSpec$json],
+};
+
+@$core.Deprecated('Use resolvedDataRefDescriptor instead')
+const ResolvedDataRef_CIPD_PkgSpec$json = const {
+  '1': 'PkgSpec',
+  '2': const [
+    const {'1': 'skipped', '3': 1, '4': 1, '5': 8, '10': 'skipped'},
+    const {'1': 'package', '3': 2, '4': 1, '5': 9, '10': 'package'},
+    const {'1': 'version', '3': 3, '4': 1, '5': 9, '10': 'version'},
+    const {'1': 'was_cached', '3': 4, '4': 1, '5': 14, '6': '.buildbucket.v2.Trinary', '10': 'wasCached'},
+    const {'1': 'timing', '3': 5, '4': 1, '5': 11, '6': '.buildbucket.v2.ResolvedDataRef.Timing', '10': 'timing'},
+  ],
+};
+
+/// Descriptor for `ResolvedDataRef`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List resolvedDataRefDescriptor = $convert.base64Decode(
+    'Cg9SZXNvbHZlZERhdGFSZWYSNwoDY2FzGAEgASgLMiMuYnVpbGRidWNrZXQudjIuUmVzb2x2ZWREYXRhUmVmLkNBU0gAUgNjYXMSOgoEY2lwZBgCIAEoCzIkLmJ1aWxkYnVja2V0LnYyLlJlc29sdmVkRGF0YVJlZi5DSVBESABSBGNpcGQakAEKBlRpbWluZxJACg5mZXRjaF9kdXJhdGlvbhgBIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvblINZmV0Y2hEdXJhdGlvbhJEChBpbnN0YWxsX2R1cmF0aW9uGAIgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uUg9pbnN0YWxsRHVyYXRpb24aRQoDQ0FTEj4KBnRpbWluZxgBIAEoCzImLmJ1aWxkYnVja2V0LnYyLlJlc29sdmVkRGF0YVJlZi5UaW1pbmdSBnRpbWluZxqcAgoEQ0lQRBJCCgVzcGVjcxgCIAMoCzIsLmJ1aWxkYnVja2V0LnYyLlJlc29sdmVkRGF0YVJlZi5DSVBELlBrZ1NwZWNSBXNwZWNzGs8BCgdQa2dTcGVjEhgKB3NraXBwZWQYASABKAhSB3NraXBwZWQSGAoHcGFja2FnZRgCIAEoCVIHcGFja2FnZRIYCgd2ZXJzaW9uGAMgASgJUgd2ZXJzaW9uEjYKCndhc19jYWNoZWQYBCABKA4yFy5idWlsZGJ1Y2tldC52Mi5UcmluYXJ5Ugl3YXNDYWNoZWQSPgoGdGltaW5nGAUgASgLMiYuYnVpbGRidWNrZXQudjIuUmVzb2x2ZWREYXRhUmVmLlRpbWluZ1IGdGltaW5nQgsKCWRhdGFfdHlwZQ==');
+@$core.Deprecated('Use buildInfraDescriptor instead')
+const BuildInfra$json = const {
+  '1': 'BuildInfra',
+  '2': const [
+    const {
+      '1': 'buildbucket',
+      '3': 1,
+      '4': 1,
+      '5': 11,
+      '6': '.buildbucket.v2.BuildInfra.Buildbucket',
+      '8': const {},
+      '10': 'buildbucket'
+    },
+    const {
+      '1': 'swarming',
+      '3': 2,
+      '4': 1,
+      '5': 11,
+      '6': '.buildbucket.v2.BuildInfra.Swarming',
+      '8': const {},
+      '10': 'swarming'
+    },
+    const {
+      '1': 'logdog',
+      '3': 3,
+      '4': 1,
+      '5': 11,
+      '6': '.buildbucket.v2.BuildInfra.LogDog',
+      '8': const {},
+      '10': 'logdog'
+    },
+    const {'1': 'recipe', '3': 4, '4': 1, '5': 11, '6': '.buildbucket.v2.BuildInfra.Recipe', '10': 'recipe'},
+    const {
+      '1': 'resultdb',
+      '3': 5,
+      '4': 1,
+      '5': 11,
+      '6': '.buildbucket.v2.BuildInfra.ResultDB',
+      '8': const {},
+      '10': 'resultdb'
+    },
+    const {'1': 'bbagent', '3': 6, '4': 1, '5': 11, '6': '.buildbucket.v2.BuildInfra.BBAgent', '10': 'bbagent'},
+    const {'1': 'backend', '3': 7, '4': 1, '5': 11, '6': '.buildbucket.v2.BuildInfra.Backend', '10': 'backend'},
+  ],
+  '3': const [
+    BuildInfra_Buildbucket$json,
+    BuildInfra_Swarming$json,
+    BuildInfra_LogDog$json,
+    BuildInfra_Recipe$json,
+    BuildInfra_ResultDB$json,
+    BuildInfra_BBAgent$json,
+    BuildInfra_Backend$json
+  ],
+};
+
+@$core.Deprecated('Use buildInfraDescriptor instead')
+const BuildInfra_Buildbucket$json = const {
+  '1': 'Buildbucket',
+  '2': const [
+    const {'1': 'service_config_revision', '3': 2, '4': 1, '5': 9, '10': 'serviceConfigRevision'},
+    const {
+      '1': 'requested_properties',
+      '3': 5,
+      '4': 1,
+      '5': 11,
+      '6': '.google.protobuf.Struct',
+      '10': 'requestedProperties'
+    },
+    const {
+      '1': 'requested_dimensions',
+      '3': 6,
+      '4': 3,
+      '5': 11,
+      '6': '.buildbucket.v2.RequestedDimension',
+      '10': 'requestedDimensions'
+    },
+    const {'1': 'hostname', '3': 7, '4': 1, '5': 9, '10': 'hostname'},
+    const {
+      '1': 'experiment_reasons',
+      '3': 8,
+      '4': 3,
+      '5': 11,
+      '6': '.buildbucket.v2.BuildInfra.Buildbucket.ExperimentReasonsEntry',
+      '10': 'experimentReasons'
+    },
+    const {
+      '1': 'agent_executable',
+      '3': 9,
+      '4': 3,
+      '5': 11,
+      '6': '.buildbucket.v2.BuildInfra.Buildbucket.AgentExecutableEntry',
+      '8': const {'3': true},
+      '10': 'agentExecutable',
+    },
+    const {
+      '1': 'agent',
+      '3': 10,
+      '4': 1,
+      '5': 11,
+      '6': '.buildbucket.v2.BuildInfra.Buildbucket.Agent',
+      '8': const {},
+      '10': 'agent'
+    },
+    const {'1': 'known_public_gerrit_hosts', '3': 11, '4': 3, '5': 9, '10': 'knownPublicGerritHosts'},
+  ],
+  '3': const [
+    BuildInfra_Buildbucket_Agent$json,
+    BuildInfra_Buildbucket_ExperimentReasonsEntry$json,
+    BuildInfra_Buildbucket_AgentExecutableEntry$json
+  ],
+  '4': const [BuildInfra_Buildbucket_ExperimentReason$json],
+  '9': const [
+    const {'1': 4, '2': 5},
+  ],
+};
+
+@$core.Deprecated('Use buildInfraDescriptor instead')
+const BuildInfra_Buildbucket_Agent$json = const {
+  '1': 'Agent',
+  '2': const [
+    const {
+      '1': 'input',
+      '3': 1,
+      '4': 1,
+      '5': 11,
+      '6': '.buildbucket.v2.BuildInfra.Buildbucket.Agent.Input',
+      '8': const {},
+      '10': 'input'
+    },
+    const {
+      '1': 'output',
+      '3': 2,
+      '4': 1,
+      '5': 11,
+      '6': '.buildbucket.v2.BuildInfra.Buildbucket.Agent.Output',
+      '8': const {},
+      '10': 'output'
+    },
+    const {
+      '1': 'source',
+      '3': 3,
+      '4': 1,
+      '5': 11,
+      '6': '.buildbucket.v2.BuildInfra.Buildbucket.Agent.Source',
+      '8': const {},
+      '10': 'source'
+    },
+    const {
+      '1': 'purposes',
+      '3': 4,
+      '4': 3,
+      '5': 11,
+      '6': '.buildbucket.v2.BuildInfra.Buildbucket.Agent.PurposesEntry',
+      '10': 'purposes'
+    },
+  ],
+  '3': const [
+    BuildInfra_Buildbucket_Agent_Source$json,
+    BuildInfra_Buildbucket_Agent_Input$json,
+    BuildInfra_Buildbucket_Agent_Output$json,
+    BuildInfra_Buildbucket_Agent_PurposesEntry$json
+  ],
+  '4': const [BuildInfra_Buildbucket_Agent_Purpose$json],
+};
+
+@$core.Deprecated('Use buildInfraDescriptor instead')
+const BuildInfra_Buildbucket_Agent_Source$json = const {
+  '1': 'Source',
+  '2': const [
+    const {
+      '1': 'cipd',
+      '3': 1,
+      '4': 1,
+      '5': 11,
+      '6': '.buildbucket.v2.BuildInfra.Buildbucket.Agent.Source.CIPD',
+      '9': 0,
+      '10': 'cipd'
+    },
+  ],
+  '3': const [BuildInfra_Buildbucket_Agent_Source_CIPD$json],
+  '8': const [
+    const {'1': 'data_type'},
+  ],
+};
+
+@$core.Deprecated('Use buildInfraDescriptor instead')
+const BuildInfra_Buildbucket_Agent_Source_CIPD$json = const {
+  '1': 'CIPD',
+  '2': const [
+    const {'1': 'package', '3': 1, '4': 1, '5': 9, '10': 'package'},
+    const {'1': 'version', '3': 2, '4': 1, '5': 9, '10': 'version'},
+    const {'1': 'server', '3': 3, '4': 1, '5': 9, '10': 'server'},
+    const {
+      '1': 'resolved_instances',
+      '3': 4,
+      '4': 3,
+      '5': 11,
+      '6': '.buildbucket.v2.BuildInfra.Buildbucket.Agent.Source.CIPD.ResolvedInstancesEntry',
+      '8': const {},
+      '10': 'resolvedInstances'
+    },
+  ],
+  '3': const [BuildInfra_Buildbucket_Agent_Source_CIPD_ResolvedInstancesEntry$json],
+};
+
+@$core.Deprecated('Use buildInfraDescriptor instead')
+const BuildInfra_Buildbucket_Agent_Source_CIPD_ResolvedInstancesEntry$json = const {
+  '1': 'ResolvedInstancesEntry',
+  '2': const [
+    const {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
+    const {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},
+  ],
+  '7': const {'7': true},
+};
+
+@$core.Deprecated('Use buildInfraDescriptor instead')
+const BuildInfra_Buildbucket_Agent_Input$json = const {
+  '1': 'Input',
+  '2': const [
+    const {
+      '1': 'data',
+      '3': 1,
+      '4': 3,
+      '5': 11,
+      '6': '.buildbucket.v2.BuildInfra.Buildbucket.Agent.Input.DataEntry',
+      '10': 'data'
+    },
+  ],
+  '3': const [BuildInfra_Buildbucket_Agent_Input_DataEntry$json],
+};
+
+@$core.Deprecated('Use buildInfraDescriptor instead')
+const BuildInfra_Buildbucket_Agent_Input_DataEntry$json = const {
+  '1': 'DataEntry',
+  '2': const [
+    const {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
+    const {'1': 'value', '3': 2, '4': 1, '5': 11, '6': '.buildbucket.v2.InputDataRef', '10': 'value'},
+  ],
+  '7': const {'7': true},
+};
+
+@$core.Deprecated('Use buildInfraDescriptor instead')
+const BuildInfra_Buildbucket_Agent_Output$json = const {
+  '1': 'Output',
+  '2': const [
+    const {
+      '1': 'resolved_data',
+      '3': 1,
+      '4': 3,
+      '5': 11,
+      '6': '.buildbucket.v2.BuildInfra.Buildbucket.Agent.Output.ResolvedDataEntry',
+      '10': 'resolvedData'
+    },
+    const {'1': 'status', '3': 2, '4': 1, '5': 14, '6': '.buildbucket.v2.Status', '10': 'status'},
+    const {'1': 'status_details', '3': 3, '4': 1, '5': 11, '6': '.buildbucket.v2.StatusDetails', '10': 'statusDetails'},
+    const {'1': 'summary_html', '3': 4, '4': 1, '5': 9, '10': 'summaryHtml'},
+    const {'1': 'agent_platform', '3': 5, '4': 1, '5': 9, '10': 'agentPlatform'},
+    const {'1': 'total_duration', '3': 6, '4': 1, '5': 11, '6': '.google.protobuf.Duration', '10': 'totalDuration'},
+  ],
+  '3': const [BuildInfra_Buildbucket_Agent_Output_ResolvedDataEntry$json],
+};
+
+@$core.Deprecated('Use buildInfraDescriptor instead')
+const BuildInfra_Buildbucket_Agent_Output_ResolvedDataEntry$json = const {
+  '1': 'ResolvedDataEntry',
+  '2': const [
+    const {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
+    const {'1': 'value', '3': 2, '4': 1, '5': 11, '6': '.buildbucket.v2.ResolvedDataRef', '10': 'value'},
+  ],
+  '7': const {'7': true},
+};
+
+@$core.Deprecated('Use buildInfraDescriptor instead')
+const BuildInfra_Buildbucket_Agent_PurposesEntry$json = const {
+  '1': 'PurposesEntry',
+  '2': const [
+    const {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
+    const {
+      '1': 'value',
+      '3': 2,
+      '4': 1,
+      '5': 14,
+      '6': '.buildbucket.v2.BuildInfra.Buildbucket.Agent.Purpose',
+      '10': 'value'
+    },
+  ],
+  '7': const {'7': true},
+};
+
+@$core.Deprecated('Use buildInfraDescriptor instead')
+const BuildInfra_Buildbucket_Agent_Purpose$json = const {
+  '1': 'Purpose',
+  '2': const [
+    const {'1': 'PURPOSE_UNSPECIFIED', '2': 0},
+    const {'1': 'PURPOSE_EXE_PAYLOAD', '2': 1},
+    const {'1': 'PURPOSE_BBAGENT_UTILITY', '2': 2},
+  ],
+};
+
+@$core.Deprecated('Use buildInfraDescriptor instead')
+const BuildInfra_Buildbucket_ExperimentReasonsEntry$json = const {
+  '1': 'ExperimentReasonsEntry',
+  '2': const [
+    const {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
+    const {
+      '1': 'value',
+      '3': 2,
+      '4': 1,
+      '5': 14,
+      '6': '.buildbucket.v2.BuildInfra.Buildbucket.ExperimentReason',
+      '10': 'value'
+    },
+  ],
+  '7': const {'7': true},
+};
+
+@$core.Deprecated('Use buildInfraDescriptor instead')
+const BuildInfra_Buildbucket_AgentExecutableEntry$json = const {
+  '1': 'AgentExecutableEntry',
+  '2': const [
+    const {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
+    const {'1': 'value', '3': 2, '4': 1, '5': 11, '6': '.buildbucket.v2.ResolvedDataRef', '10': 'value'},
+  ],
+  '7': const {'7': true},
+};
+
+@$core.Deprecated('Use buildInfraDescriptor instead')
+const BuildInfra_Buildbucket_ExperimentReason$json = const {
+  '1': 'ExperimentReason',
+  '2': const [
+    const {'1': 'EXPERIMENT_REASON_UNSET', '2': 0},
+    const {'1': 'EXPERIMENT_REASON_GLOBAL_DEFAULT', '2': 1},
+    const {'1': 'EXPERIMENT_REASON_BUILDER_CONFIG', '2': 2},
+    const {'1': 'EXPERIMENT_REASON_GLOBAL_MINIMUM', '2': 3},
+    const {'1': 'EXPERIMENT_REASON_REQUESTED', '2': 4},
+    const {'1': 'EXPERIMENT_REASON_GLOBAL_INACTIVE', '2': 5},
+  ],
+};
+
+@$core.Deprecated('Use buildInfraDescriptor instead')
+const BuildInfra_Swarming$json = const {
+  '1': 'Swarming',
+  '2': const [
+    const {'1': 'hostname', '3': 1, '4': 1, '5': 9, '8': const {}, '10': 'hostname'},
+    const {'1': 'task_id', '3': 2, '4': 1, '5': 9, '8': const {}, '10': 'taskId'},
+    const {'1': 'parent_run_id', '3': 9, '4': 1, '5': 9, '10': 'parentRunId'},
+    const {'1': 'task_service_account', '3': 3, '4': 1, '5': 9, '10': 'taskServiceAccount'},
+    const {'1': 'priority', '3': 4, '4': 1, '5': 5, '10': 'priority'},
+    const {
+      '1': 'task_dimensions',
+      '3': 5,
+      '4': 3,
+      '5': 11,
+      '6': '.buildbucket.v2.RequestedDimension',
+      '10': 'taskDimensions'
+    },
+    const {'1': 'bot_dimensions', '3': 6, '4': 3, '5': 11, '6': '.buildbucket.v2.StringPair', '10': 'botDimensions'},
+    const {
+      '1': 'caches',
+      '3': 7,
+      '4': 3,
+      '5': 11,
+      '6': '.buildbucket.v2.BuildInfra.Swarming.CacheEntry',
+      '10': 'caches'
+    },
+  ],
+  '3': const [BuildInfra_Swarming_CacheEntry$json],
+};
+
+@$core.Deprecated('Use buildInfraDescriptor instead')
+const BuildInfra_Swarming_CacheEntry$json = const {
+  '1': 'CacheEntry',
+  '2': const [
+    const {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'},
+    const {'1': 'path', '3': 2, '4': 1, '5': 9, '10': 'path'},
+    const {
+      '1': 'wait_for_warm_cache',
+      '3': 3,
+      '4': 1,
+      '5': 11,
+      '6': '.google.protobuf.Duration',
+      '10': 'waitForWarmCache'
+    },
+    const {'1': 'env_var', '3': 4, '4': 1, '5': 9, '10': 'envVar'},
+  ],
+};
+
+@$core.Deprecated('Use buildInfraDescriptor instead')
+const BuildInfra_LogDog$json = const {
+  '1': 'LogDog',
+  '2': const [
+    const {'1': 'hostname', '3': 1, '4': 1, '5': 9, '8': const {}, '10': 'hostname'},
+    const {'1': 'project', '3': 2, '4': 1, '5': 9, '10': 'project'},
+    const {'1': 'prefix', '3': 3, '4': 1, '5': 9, '10': 'prefix'},
+  ],
+};
+
+@$core.Deprecated('Use buildInfraDescriptor instead')
+const BuildInfra_Recipe$json = const {
+  '1': 'Recipe',
+  '2': const [
+    const {'1': 'cipd_package', '3': 1, '4': 1, '5': 9, '10': 'cipdPackage'},
+    const {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},
+  ],
+};
+
+@$core.Deprecated('Use buildInfraDescriptor instead')
+const BuildInfra_ResultDB$json = const {
+  '1': 'ResultDB',
+  '2': const [
+    const {'1': 'hostname', '3': 1, '4': 1, '5': 9, '8': const {}, '10': 'hostname'},
+    const {'1': 'invocation', '3': 2, '4': 1, '5': 9, '8': const {}, '10': 'invocation'},
+  ],
+};
+
+@$core.Deprecated('Use buildInfraDescriptor instead')
+const BuildInfra_BBAgent$json = const {
+  '1': 'BBAgent',
+  '2': const [
+    const {'1': 'payload_path', '3': 1, '4': 1, '5': 9, '10': 'payloadPath'},
+    const {'1': 'cache_dir', '3': 2, '4': 1, '5': 9, '10': 'cacheDir'},
+    const {
+      '1': 'known_public_gerrit_hosts',
+      '3': 3,
+      '4': 3,
+      '5': 9,
+      '8': const {'3': true},
+      '10': 'knownPublicGerritHosts',
+    },
+    const {
+      '1': 'input',
+      '3': 4,
+      '4': 1,
+      '5': 11,
+      '6': '.buildbucket.v2.BuildInfra.BBAgent.Input',
+      '8': const {'3': true},
+      '10': 'input',
+    },
+  ],
+  '3': const [BuildInfra_BBAgent_Input$json],
+};
+
+@$core.Deprecated('Use buildInfraDescriptor instead')
+const BuildInfra_BBAgent_Input$json = const {
+  '1': 'Input',
+  '2': const [
+    const {
+      '1': 'cipd_packages',
+      '3': 1,
+      '4': 3,
+      '5': 11,
+      '6': '.buildbucket.v2.BuildInfra.BBAgent.Input.CIPDPackage',
+      '10': 'cipdPackages'
+    },
+  ],
+  '3': const [BuildInfra_BBAgent_Input_CIPDPackage$json],
+};
+
+@$core.Deprecated('Use buildInfraDescriptor instead')
+const BuildInfra_BBAgent_Input_CIPDPackage$json = const {
+  '1': 'CIPDPackage',
+  '2': const [
+    const {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'},
+    const {'1': 'version', '3': 2, '4': 1, '5': 9, '10': 'version'},
+    const {'1': 'server', '3': 3, '4': 1, '5': 9, '10': 'server'},
+    const {'1': 'path', '3': 4, '4': 1, '5': 9, '10': 'path'},
+  ],
+};
+
+@$core.Deprecated('Use buildInfraDescriptor instead')
+const BuildInfra_Backend$json = const {
+  '1': 'Backend',
+  '2': const [
+    const {'1': 'config', '3': 1, '4': 1, '5': 11, '6': '.google.protobuf.Struct', '10': 'config'},
+    const {'1': 'task', '3': 2, '4': 1, '5': 11, '6': '.buildbucket.v2.Task', '10': 'task'},
+  ],
+};
+
+/// Descriptor for `BuildInfra`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List buildInfraDescriptor = $convert.base64Decode(
+    'CgpCdWlsZEluZnJhElAKC2J1aWxkYnVja2V0GAEgASgLMiYuYnVpbGRidWNrZXQudjIuQnVpbGRJbmZyYS5CdWlsZGJ1Y2tldEIGisMaAggCUgtidWlsZGJ1Y2tldBJHCghzd2FybWluZxgCIAEoCzIjLmJ1aWxkYnVja2V0LnYyLkJ1aWxkSW5mcmEuU3dhcm1pbmdCBorDGgIIAlIIc3dhcm1pbmcSQQoGbG9nZG9nGAMgASgLMiEuYnVpbGRidWNrZXQudjIuQnVpbGRJbmZyYS5Mb2dEb2dCBorDGgIIAlIGbG9nZG9nEjkKBnJlY2lwZRgEIAEoCzIhLmJ1aWxkYnVja2V0LnYyLkJ1aWxkSW5mcmEuUmVjaXBlUgZyZWNpcGUSRgoIcmVzdWx0ZGIYBSABKAsyIy5idWlsZGJ1Y2tldC52Mi5CdWlsZEluZnJhLlJlc3VsdERCQgW4zrwDAlIIcmVzdWx0ZGISPAoHYmJhZ2VudBgGIAEoCzIiLmJ1aWxkYnVja2V0LnYyLkJ1aWxkSW5mcmEuQkJBZ2VudFIHYmJhZ2VudBI8CgdiYWNrZW5kGAcgASgLMiIuYnVpbGRidWNrZXQudjIuQnVpbGRJbmZyYS5CYWNrZW5kUgdiYWNrZW5kGv0UCgtCdWlsZGJ1Y2tldBI2ChdzZXJ2aWNlX2NvbmZpZ19yZXZpc2lvbhgCIAEoCVIVc2VydmljZUNvbmZpZ1JldmlzaW9uEkoKFHJlcXVlc3RlZF9wcm9wZXJ0aWVzGAUgASgLMhcuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdFITcmVxdWVzdGVkUHJvcGVydGllcxJVChRyZXF1ZXN0ZWRfZGltZW5zaW9ucxgGIAMoCzIiLmJ1aWxkYnVja2V0LnYyLlJlcXVlc3RlZERpbWVuc2lvblITcmVxdWVzdGVkRGltZW5zaW9ucxIaCghob3N0bmFtZRgHIAEoCVIIaG9zdG5hbWUSbAoSZXhwZXJpbWVudF9yZWFzb25zGAggAygLMj0uYnVpbGRidWNrZXQudjIuQnVpbGRJbmZyYS5CdWlsZGJ1Y2tldC5FeHBlcmltZW50UmVhc29uc0VudHJ5UhFleHBlcmltZW50UmVhc29ucxJqChBhZ2VudF9leGVjdXRhYmxlGAkgAygLMjsuYnVpbGRidWNrZXQudjIuQnVpbGRJbmZyYS5CdWlsZGJ1Y2tldC5BZ2VudEV4ZWN1dGFibGVFbnRyeUICGAFSD2FnZW50RXhlY3V0YWJsZRJKCgVhZ2VudBgKIAEoCzIsLmJ1aWxkYnVja2V0LnYyLkJ1aWxkSW5mcmEuQnVpbGRidWNrZXQuQWdlbnRCBorDGgIIAlIFYWdlbnQSOQoZa25vd25fcHVibGljX2dlcnJpdF9ob3N0cxgLIAMoCVIWa25vd25QdWJsaWNHZXJyaXRIb3N0cxq/DAoFQWdlbnQSUAoFaW5wdXQYASABKAsyMi5idWlsZGJ1Y2tldC52Mi5CdWlsZEluZnJhLkJ1aWxkYnVja2V0LkFnZW50LklucHV0QgaKwxoCCAJSBWlucHV0ElMKBm91dHB1dBgCIAEoCzIzLmJ1aWxkYnVja2V0LnYyLkJ1aWxkSW5mcmEuQnVpbGRidWNrZXQuQWdlbnQuT3V0cHV0QgaKwxoCCANSBm91dHB1dBJTCgZzb3VyY2UYAyABKAsyMy5idWlsZGJ1Y2tldC52Mi5CdWlsZEluZnJhLkJ1aWxkYnVja2V0LkFnZW50LlNvdXJjZUIGisMaAggCUgZzb3VyY2USVgoIcHVycG9zZXMYBCADKAsyOi5idWlsZGJ1Y2tldC52Mi5CdWlsZEluZnJhLkJ1aWxkYnVja2V0LkFnZW50LlB1cnBvc2VzRW50cnlSCHB1cnBvc2VzGoYDCgZTb3VyY2USTgoEY2lwZBgBIAEoCzI4LmJ1aWxkYnVja2V0LnYyLkJ1aWxkSW5mcmEuQnVpbGRidWNrZXQuQWdlbnQuU291cmNlLkNJUERIAFIEY2lwZBqeAgoEQ0lQRBIYCgdwYWNrYWdlGAEgASgJUgdwYWNrYWdlEhgKB3ZlcnNpb24YAiABKAlSB3ZlcnNpb24SFgoGc2VydmVyGAMgASgJUgZzZXJ2ZXISgwEKEnJlc29sdmVkX2luc3RhbmNlcxgEIAMoCzJPLmJ1aWxkYnVja2V0LnYyLkJ1aWxkSW5mcmEuQnVpbGRidWNrZXQuQWdlbnQuU291cmNlLkNJUEQuUmVzb2x2ZWRJbnN0YW5jZXNFbnRyeUID4EEDUhFyZXNvbHZlZEluc3RhbmNlcxpEChZSZXNvbHZlZEluc3RhbmNlc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAFCCwoJZGF0YV90eXBlGrABCgVJbnB1dBJQCgRkYXRhGAEgAygLMjwuYnVpbGRidWNrZXQudjIuQnVpbGRJbmZyYS5CdWlsZGJ1Y2tldC5BZ2VudC5JbnB1dC5EYXRhRW50cnlSBGRhdGEaVQoJRGF0YUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EjIKBXZhbHVlGAIgASgLMhwuYnVpbGRidWNrZXQudjIuSW5wdXREYXRhUmVmUgV2YWx1ZToCOAEa2AMKBk91dHB1dBJqCg1yZXNvbHZlZF9kYXRhGAEgAygLMkUuYnVpbGRidWNrZXQudjIuQnVpbGRJbmZyYS5CdWlsZGJ1Y2tldC5BZ2VudC5PdXRwdXQuUmVzb2x2ZWREYXRhRW50cnlSDHJlc29sdmVkRGF0YRIuCgZzdGF0dXMYAiABKA4yFi5idWlsZGJ1Y2tldC52Mi5TdGF0dXNSBnN0YXR1cxJECg5zdGF0dXNfZGV0YWlscxgDIAEoCzIdLmJ1aWxkYnVja2V0LnYyLlN0YXR1c0RldGFpbHNSDXN0YXR1c0RldGFpbHMSIQoMc3VtbWFyeV9odG1sGAQgASgJUgtzdW1tYXJ5SHRtbBIlCg5hZ2VudF9wbGF0Zm9ybRgFIAEoCVINYWdlbnRQbGF0Zm9ybRJACg50b3RhbF9kdXJhdGlvbhgGIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvblINdG90YWxEdXJhdGlvbhpgChFSZXNvbHZlZERhdGFFbnRyeRIQCgNrZXkYASABKAlSA2tleRI1CgV2YWx1ZRgCIAEoCzIfLmJ1aWxkYnVja2V0LnYyLlJlc29sdmVkRGF0YVJlZlIFdmFsdWU6AjgBGnEKDVB1cnBvc2VzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSSgoFdmFsdWUYAiABKA4yNC5idWlsZGJ1Y2tldC52Mi5CdWlsZEluZnJhLkJ1aWxkYnVja2V0LkFnZW50LlB1cnBvc2VSBXZhbHVlOgI4ASJYCgdQdXJwb3NlEhcKE1BVUlBPU0VfVU5TUEVDSUZJRUQQABIXChNQVVJQT1NFX0VYRV9QQVlMT0FEEAESGwoXUFVSUE9TRV9CQkFHRU5UX1VUSUxJVFkQAhp9ChZFeHBlcmltZW50UmVhc29uc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5Ek0KBXZhbHVlGAIgASgOMjcuYnVpbGRidWNrZXQudjIuQnVpbGRJbmZyYS5CdWlsZGJ1Y2tldC5FeHBlcmltZW50UmVhc29uUgV2YWx1ZToCOAEaYwoUQWdlbnRFeGVjdXRhYmxlRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSNQoFdmFsdWUYAiABKAsyHy5idWlsZGJ1Y2tldC52Mi5SZXNvbHZlZERhdGFSZWZSBXZhbHVlOgI4ASLpAQoQRXhwZXJpbWVudFJlYXNvbhIbChdFWFBFUklNRU5UX1JFQVNPTl9VTlNFVBAAEiQKIEVYUEVSSU1FTlRfUkVBU09OX0dMT0JBTF9ERUZBVUxUEAESJAogRVhQRVJJTUVOVF9SRUFTT05fQlVJTERFUl9DT05GSUcQAhIkCiBFWFBFUklNRU5UX1JFQVNPTl9HTE9CQUxfTUlOSU1VTRADEh8KG0VYUEVSSU1FTlRfUkVBU09OX1JFUVVFU1RFRBAEEiUKIUVYUEVSSU1FTlRfUkVBU09OX0dMT0JBTF9JTkFDVElWRRAFSgQIBBAFGrAECghTd2FybWluZxIiCghob3N0bmFtZRgBIAEoCUIGisMaAggCUghob3N0bmFtZRIcCgd0YXNrX2lkGAIgASgJQgPgQQNSBnRhc2tJZBIiCg1wYXJlbnRfcnVuX2lkGAkgASgJUgtwYXJlbnRSdW5JZBIwChR0YXNrX3NlcnZpY2VfYWNjb3VudBgDIAEoCVISdGFza1NlcnZpY2VBY2NvdW50EhoKCHByaW9yaXR5GAQgASgFUghwcmlvcml0eRJLCg90YXNrX2RpbWVuc2lvbnMYBSADKAsyIi5idWlsZGJ1Y2tldC52Mi5SZXF1ZXN0ZWREaW1lbnNpb25SDnRhc2tEaW1lbnNpb25zEkEKDmJvdF9kaW1lbnNpb25zGAYgAygLMhouYnVpbGRidWNrZXQudjIuU3RyaW5nUGFpclINYm90RGltZW5zaW9ucxJGCgZjYWNoZXMYByADKAsyLi5idWlsZGJ1Y2tldC52Mi5CdWlsZEluZnJhLlN3YXJtaW5nLkNhY2hlRW50cnlSBmNhY2hlcxqXAQoKQ2FjaGVFbnRyeRISCgRuYW1lGAEgASgJUgRuYW1lEhIKBHBhdGgYAiABKAlSBHBhdGgSSAoTd2FpdF9mb3Jfd2FybV9jYWNoZRgDIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvblIQd2FpdEZvcldhcm1DYWNoZRIXCgdlbnZfdmFyGAQgASgJUgZlbnZWYXIaXgoGTG9nRG9nEiIKCGhvc3RuYW1lGAEgASgJQgaKwxoCCAJSCGhvc3RuYW1lEhgKB3Byb2plY3QYAiABKAlSB3Byb2plY3QSFgoGcHJlZml4GAMgASgJUgZwcmVmaXgaPwoGUmVjaXBlEiEKDGNpcGRfcGFja2FnZRgBIAEoCVILY2lwZFBhY2thZ2USEgoEbmFtZRgCIAEoCVIEbmFtZRpTCghSZXN1bHREQhIiCghob3N0bmFtZRgBIAEoCUIGisMaAggCUghob3N0bmFtZRIjCgppbnZvY2F0aW9uGAIgASgJQgPgQQNSCmludm9jYXRpb24amgMKB0JCQWdlbnQSIQoMcGF5bG9hZF9wYXRoGAEgASgJUgtwYXlsb2FkUGF0aBIbCgljYWNoZV9kaXIYAiABKAlSCGNhY2hlRGlyEj0KGWtub3duX3B1YmxpY19nZXJyaXRfaG9zdHMYAyADKAlCAhgBUhZrbm93blB1YmxpY0dlcnJpdEhvc3RzEkIKBWlucHV0GAQgASgLMiguYnVpbGRidWNrZXQudjIuQnVpbGRJbmZyYS5CQkFnZW50LklucHV0QgIYAVIFaW5wdXQaywEKBUlucHV0ElkKDWNpcGRfcGFja2FnZXMYASADKAsyNC5idWlsZGJ1Y2tldC52Mi5CdWlsZEluZnJhLkJCQWdlbnQuSW5wdXQuQ0lQRFBhY2thZ2VSDGNpcGRQYWNrYWdlcxpnCgtDSVBEUGFja2FnZRISCgRuYW1lGAEgASgJUgRuYW1lEhgKB3ZlcnNpb24YAiABKAlSB3ZlcnNpb24SFgoGc2VydmVyGAMgASgJUgZzZXJ2ZXISEgoEcGF0aBgEIAEoCVIEcGF0aBpkCgdCYWNrZW5kEi8KBmNvbmZpZxgBIAEoCzIXLmdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3RSBmNvbmZpZxIoCgR0YXNrGAIgASgLMhQuYnVpbGRidWNrZXQudjIuVGFza1IEdGFzaw==');
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/build.pbserver.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/build.pbserver.dart
new file mode 100644
index 0000000..1d487d9
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/build.pbserver.dart
@@ -0,0 +1,8 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/buildbucket/proto/build.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+export 'build.pb.dart';
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/builder_common.pb.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/builder_common.pb.dart
new file mode 100644
index 0000000..95ba1af
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/builder_common.pb.dart
@@ -0,0 +1,177 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/buildbucket/proto/builder_common.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+import 'dart:core' as $core;
+
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'project_config.pb.dart' as $0;
+
+class BuilderID extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BuilderID',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'project')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'bucket')
+    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'builder')
+    ..hasRequiredFields = false;
+
+  BuilderID._() : super();
+  factory BuilderID({
+    $core.String? project,
+    $core.String? bucket,
+    $core.String? builder,
+  }) {
+    final _result = create();
+    if (project != null) {
+      _result.project = project;
+    }
+    if (bucket != null) {
+      _result.bucket = bucket;
+    }
+    if (builder != null) {
+      _result.builder = builder;
+    }
+    return _result;
+  }
+  factory BuilderID.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BuilderID.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BuilderID clone() => BuilderID()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BuilderID copyWith(void Function(BuilderID) updates) =>
+      super.copyWith((message) => updates(message as BuilderID)) as BuilderID; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BuilderID create() => BuilderID._();
+  BuilderID createEmptyInstance() => create();
+  static $pb.PbList<BuilderID> createRepeated() => $pb.PbList<BuilderID>();
+  @$core.pragma('dart2js:noInline')
+  static BuilderID getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BuilderID>(create);
+  static BuilderID? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get project => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set project($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasProject() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearProject() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.String get bucket => $_getSZ(1);
+  @$pb.TagNumber(2)
+  set bucket($core.String v) {
+    $_setString(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasBucket() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearBucket() => clearField(2);
+
+  @$pb.TagNumber(3)
+  $core.String get builder => $_getSZ(2);
+  @$pb.TagNumber(3)
+  set builder($core.String v) {
+    $_setString(2, v);
+  }
+
+  @$pb.TagNumber(3)
+  $core.bool hasBuilder() => $_has(2);
+  @$pb.TagNumber(3)
+  void clearBuilder() => clearField(3);
+}
+
+class BuilderItem extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BuilderItem',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOM<BuilderID>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id',
+        subBuilder: BuilderID.create)
+    ..aOM<$0.BuilderConfig>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'config',
+        subBuilder: $0.BuilderConfig.create)
+    ..hasRequiredFields = false;
+
+  BuilderItem._() : super();
+  factory BuilderItem({
+    BuilderID? id,
+    $0.BuilderConfig? config,
+  }) {
+    final _result = create();
+    if (id != null) {
+      _result.id = id;
+    }
+    if (config != null) {
+      _result.config = config;
+    }
+    return _result;
+  }
+  factory BuilderItem.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BuilderItem.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BuilderItem clone() => BuilderItem()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BuilderItem copyWith(void Function(BuilderItem) updates) =>
+      super.copyWith((message) => updates(message as BuilderItem)) as BuilderItem; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BuilderItem create() => BuilderItem._();
+  BuilderItem createEmptyInstance() => create();
+  static $pb.PbList<BuilderItem> createRepeated() => $pb.PbList<BuilderItem>();
+  @$core.pragma('dart2js:noInline')
+  static BuilderItem getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BuilderItem>(create);
+  static BuilderItem? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  BuilderID get id => $_getN(0);
+  @$pb.TagNumber(1)
+  set id(BuilderID v) {
+    setField(1, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasId() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearId() => clearField(1);
+  @$pb.TagNumber(1)
+  BuilderID ensureId() => $_ensure(0);
+
+  @$pb.TagNumber(2)
+  $0.BuilderConfig get config => $_getN(1);
+  @$pb.TagNumber(2)
+  set config($0.BuilderConfig v) {
+    setField(2, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasConfig() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearConfig() => clearField(2);
+  @$pb.TagNumber(2)
+  $0.BuilderConfig ensureConfig() => $_ensure(1);
+}
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/builder_common.pbenum.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/builder_common.pbenum.dart
new file mode 100644
index 0000000..112621b
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/builder_common.pbenum.dart
@@ -0,0 +1,6 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/buildbucket/proto/builder_common.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/builder_common.pbjson.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/builder_common.pbjson.dart
new file mode 100644
index 0000000..46f5716
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/builder_common.pbjson.dart
@@ -0,0 +1,36 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/buildbucket/proto/builder_common.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+import 'dart:core' as $core;
+import 'dart:convert' as $convert;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use builderIDDescriptor instead')
+const BuilderID$json = const {
+  '1': 'BuilderID',
+  '2': const [
+    const {'1': 'project', '3': 1, '4': 1, '5': 9, '10': 'project'},
+    const {'1': 'bucket', '3': 2, '4': 1, '5': 9, '10': 'bucket'},
+    const {'1': 'builder', '3': 3, '4': 1, '5': 9, '10': 'builder'},
+  ],
+};
+
+/// Descriptor for `BuilderID`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List builderIDDescriptor = $convert.base64Decode(
+    'CglCdWlsZGVySUQSGAoHcHJvamVjdBgBIAEoCVIHcHJvamVjdBIWCgZidWNrZXQYAiABKAlSBmJ1Y2tldBIYCgdidWlsZGVyGAMgASgJUgdidWlsZGVy');
+@$core.Deprecated('Use builderItemDescriptor instead')
+const BuilderItem$json = const {
+  '1': 'BuilderItem',
+  '2': const [
+    const {'1': 'id', '3': 1, '4': 1, '5': 11, '6': '.buildbucket.v2.BuilderID', '10': 'id'},
+    const {'1': 'config', '3': 2, '4': 1, '5': 11, '6': '.buildbucket.BuilderConfig', '10': 'config'},
+  ],
+};
+
+/// Descriptor for `BuilderItem`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List builderItemDescriptor = $convert.base64Decode(
+    'CgtCdWlsZGVySXRlbRIpCgJpZBgBIAEoCzIZLmJ1aWxkYnVja2V0LnYyLkJ1aWxkZXJJRFICaWQSMgoGY29uZmlnGAIgASgLMhouYnVpbGRidWNrZXQuQnVpbGRlckNvbmZpZ1IGY29uZmln');
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/builder_common.pbserver.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/builder_common.pbserver.dart
new file mode 100644
index 0000000..1993023
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/builder_common.pbserver.dart
@@ -0,0 +1,8 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/buildbucket/proto/builder_common.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+export 'builder_common.pb.dart';
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/common.pb.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/common.pb.dart
new file mode 100644
index 0000000..3fc14dc
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/common.pb.dart
@@ -0,0 +1,813 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/buildbucket/proto/common.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import '../../../../google/protobuf/timestamp.pb.dart' as $0;
+import '../../../../google/protobuf/duration.pb.dart' as $1;
+
+export 'common.pbenum.dart';
+
+class Executable extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Executable',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'cipdPackage')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'cipdVersion')
+    ..pPS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'cmd')
+    ..pPS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'wrapper')
+    ..hasRequiredFields = false;
+
+  Executable._() : super();
+  factory Executable({
+    $core.String? cipdPackage,
+    $core.String? cipdVersion,
+    $core.Iterable<$core.String>? cmd,
+    $core.Iterable<$core.String>? wrapper,
+  }) {
+    final _result = create();
+    if (cipdPackage != null) {
+      _result.cipdPackage = cipdPackage;
+    }
+    if (cipdVersion != null) {
+      _result.cipdVersion = cipdVersion;
+    }
+    if (cmd != null) {
+      _result.cmd.addAll(cmd);
+    }
+    if (wrapper != null) {
+      _result.wrapper.addAll(wrapper);
+    }
+    return _result;
+  }
+  factory Executable.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory Executable.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  Executable clone() => Executable()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  Executable copyWith(void Function(Executable) updates) =>
+      super.copyWith((message) => updates(message as Executable)) as Executable; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Executable create() => Executable._();
+  Executable createEmptyInstance() => create();
+  static $pb.PbList<Executable> createRepeated() => $pb.PbList<Executable>();
+  @$core.pragma('dart2js:noInline')
+  static Executable getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Executable>(create);
+  static Executable? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get cipdPackage => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set cipdPackage($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasCipdPackage() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearCipdPackage() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.String get cipdVersion => $_getSZ(1);
+  @$pb.TagNumber(2)
+  set cipdVersion($core.String v) {
+    $_setString(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasCipdVersion() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearCipdVersion() => clearField(2);
+
+  @$pb.TagNumber(3)
+  $core.List<$core.String> get cmd => $_getList(2);
+
+  @$pb.TagNumber(4)
+  $core.List<$core.String> get wrapper => $_getList(3);
+}
+
+class StatusDetails_ResourceExhaustion extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'StatusDetails.ResourceExhaustion',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..hasRequiredFields = false;
+
+  StatusDetails_ResourceExhaustion._() : super();
+  factory StatusDetails_ResourceExhaustion() => create();
+  factory StatusDetails_ResourceExhaustion.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory StatusDetails_ResourceExhaustion.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  StatusDetails_ResourceExhaustion clone() => StatusDetails_ResourceExhaustion()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  StatusDetails_ResourceExhaustion copyWith(void Function(StatusDetails_ResourceExhaustion) updates) =>
+      super.copyWith((message) => updates(message as StatusDetails_ResourceExhaustion))
+          as StatusDetails_ResourceExhaustion; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static StatusDetails_ResourceExhaustion create() => StatusDetails_ResourceExhaustion._();
+  StatusDetails_ResourceExhaustion createEmptyInstance() => create();
+  static $pb.PbList<StatusDetails_ResourceExhaustion> createRepeated() =>
+      $pb.PbList<StatusDetails_ResourceExhaustion>();
+  @$core.pragma('dart2js:noInline')
+  static StatusDetails_ResourceExhaustion getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<StatusDetails_ResourceExhaustion>(create);
+  static StatusDetails_ResourceExhaustion? _defaultInstance;
+}
+
+class StatusDetails_Timeout extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'StatusDetails.Timeout',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..hasRequiredFields = false;
+
+  StatusDetails_Timeout._() : super();
+  factory StatusDetails_Timeout() => create();
+  factory StatusDetails_Timeout.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory StatusDetails_Timeout.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  StatusDetails_Timeout clone() => StatusDetails_Timeout()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  StatusDetails_Timeout copyWith(void Function(StatusDetails_Timeout) updates) =>
+      super.copyWith((message) => updates(message as StatusDetails_Timeout))
+          as StatusDetails_Timeout; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static StatusDetails_Timeout create() => StatusDetails_Timeout._();
+  StatusDetails_Timeout createEmptyInstance() => create();
+  static $pb.PbList<StatusDetails_Timeout> createRepeated() => $pb.PbList<StatusDetails_Timeout>();
+  @$core.pragma('dart2js:noInline')
+  static StatusDetails_Timeout getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<StatusDetails_Timeout>(create);
+  static StatusDetails_Timeout? _defaultInstance;
+}
+
+class StatusDetails extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'StatusDetails',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOM<StatusDetails_ResourceExhaustion>(
+        3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'resourceExhaustion',
+        subBuilder: StatusDetails_ResourceExhaustion.create)
+    ..aOM<StatusDetails_Timeout>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'timeout',
+        subBuilder: StatusDetails_Timeout.create)
+    ..hasRequiredFields = false;
+
+  StatusDetails._() : super();
+  factory StatusDetails({
+    StatusDetails_ResourceExhaustion? resourceExhaustion,
+    StatusDetails_Timeout? timeout,
+  }) {
+    final _result = create();
+    if (resourceExhaustion != null) {
+      _result.resourceExhaustion = resourceExhaustion;
+    }
+    if (timeout != null) {
+      _result.timeout = timeout;
+    }
+    return _result;
+  }
+  factory StatusDetails.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory StatusDetails.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  StatusDetails clone() => StatusDetails()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  StatusDetails copyWith(void Function(StatusDetails) updates) =>
+      super.copyWith((message) => updates(message as StatusDetails)) as StatusDetails; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static StatusDetails create() => StatusDetails._();
+  StatusDetails createEmptyInstance() => create();
+  static $pb.PbList<StatusDetails> createRepeated() => $pb.PbList<StatusDetails>();
+  @$core.pragma('dart2js:noInline')
+  static StatusDetails getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<StatusDetails>(create);
+  static StatusDetails? _defaultInstance;
+
+  @$pb.TagNumber(3)
+  StatusDetails_ResourceExhaustion get resourceExhaustion => $_getN(0);
+  @$pb.TagNumber(3)
+  set resourceExhaustion(StatusDetails_ResourceExhaustion v) {
+    setField(3, v);
+  }
+
+  @$pb.TagNumber(3)
+  $core.bool hasResourceExhaustion() => $_has(0);
+  @$pb.TagNumber(3)
+  void clearResourceExhaustion() => clearField(3);
+  @$pb.TagNumber(3)
+  StatusDetails_ResourceExhaustion ensureResourceExhaustion() => $_ensure(0);
+
+  @$pb.TagNumber(4)
+  StatusDetails_Timeout get timeout => $_getN(1);
+  @$pb.TagNumber(4)
+  set timeout(StatusDetails_Timeout v) {
+    setField(4, v);
+  }
+
+  @$pb.TagNumber(4)
+  $core.bool hasTimeout() => $_has(1);
+  @$pb.TagNumber(4)
+  void clearTimeout() => clearField(4);
+  @$pb.TagNumber(4)
+  StatusDetails_Timeout ensureTimeout() => $_ensure(1);
+}
+
+class Log extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Log',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'viewUrl')
+    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'url')
+    ..hasRequiredFields = false;
+
+  Log._() : super();
+  factory Log({
+    $core.String? name,
+    $core.String? viewUrl,
+    $core.String? url,
+  }) {
+    final _result = create();
+    if (name != null) {
+      _result.name = name;
+    }
+    if (viewUrl != null) {
+      _result.viewUrl = viewUrl;
+    }
+    if (url != null) {
+      _result.url = url;
+    }
+    return _result;
+  }
+  factory Log.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory Log.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  Log clone() => Log()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  Log copyWith(void Function(Log) updates) =>
+      super.copyWith((message) => updates(message as Log)) as Log; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Log create() => Log._();
+  Log createEmptyInstance() => create();
+  static $pb.PbList<Log> createRepeated() => $pb.PbList<Log>();
+  @$core.pragma('dart2js:noInline')
+  static Log getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Log>(create);
+  static Log? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get name => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set name($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasName() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearName() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.String get viewUrl => $_getSZ(1);
+  @$pb.TagNumber(2)
+  set viewUrl($core.String v) {
+    $_setString(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasViewUrl() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearViewUrl() => clearField(2);
+
+  @$pb.TagNumber(3)
+  $core.String get url => $_getSZ(2);
+  @$pb.TagNumber(3)
+  set url($core.String v) {
+    $_setString(2, v);
+  }
+
+  @$pb.TagNumber(3)
+  $core.bool hasUrl() => $_has(2);
+  @$pb.TagNumber(3)
+  void clearUrl() => clearField(3);
+}
+
+class GerritChange extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'GerritChange',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'host')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'project')
+    ..aInt64(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'change')
+    ..aInt64(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'patchset')
+    ..hasRequiredFields = false;
+
+  GerritChange._() : super();
+  factory GerritChange({
+    $core.String? host,
+    $core.String? project,
+    $fixnum.Int64? change,
+    $fixnum.Int64? patchset,
+  }) {
+    final _result = create();
+    if (host != null) {
+      _result.host = host;
+    }
+    if (project != null) {
+      _result.project = project;
+    }
+    if (change != null) {
+      _result.change = change;
+    }
+    if (patchset != null) {
+      _result.patchset = patchset;
+    }
+    return _result;
+  }
+  factory GerritChange.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory GerritChange.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  GerritChange clone() => GerritChange()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  GerritChange copyWith(void Function(GerritChange) updates) =>
+      super.copyWith((message) => updates(message as GerritChange)) as GerritChange; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static GerritChange create() => GerritChange._();
+  GerritChange createEmptyInstance() => create();
+  static $pb.PbList<GerritChange> createRepeated() => $pb.PbList<GerritChange>();
+  @$core.pragma('dart2js:noInline')
+  static GerritChange getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<GerritChange>(create);
+  static GerritChange? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get host => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set host($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasHost() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearHost() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.String get project => $_getSZ(1);
+  @$pb.TagNumber(2)
+  set project($core.String v) {
+    $_setString(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasProject() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearProject() => clearField(2);
+
+  @$pb.TagNumber(3)
+  $fixnum.Int64 get change => $_getI64(2);
+  @$pb.TagNumber(3)
+  set change($fixnum.Int64 v) {
+    $_setInt64(2, v);
+  }
+
+  @$pb.TagNumber(3)
+  $core.bool hasChange() => $_has(2);
+  @$pb.TagNumber(3)
+  void clearChange() => clearField(3);
+
+  @$pb.TagNumber(4)
+  $fixnum.Int64 get patchset => $_getI64(3);
+  @$pb.TagNumber(4)
+  set patchset($fixnum.Int64 v) {
+    $_setInt64(3, v);
+  }
+
+  @$pb.TagNumber(4)
+  $core.bool hasPatchset() => $_has(3);
+  @$pb.TagNumber(4)
+  void clearPatchset() => clearField(4);
+}
+
+class GitilesCommit extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'GitilesCommit',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'host')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'project')
+    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id')
+    ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'ref')
+    ..a<$core.int>(
+        5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'position', $pb.PbFieldType.OU3)
+    ..hasRequiredFields = false;
+
+  GitilesCommit._() : super();
+  factory GitilesCommit({
+    $core.String? host,
+    $core.String? project,
+    $core.String? id,
+    $core.String? ref,
+    $core.int? position,
+  }) {
+    final _result = create();
+    if (host != null) {
+      _result.host = host;
+    }
+    if (project != null) {
+      _result.project = project;
+    }
+    if (id != null) {
+      _result.id = id;
+    }
+    if (ref != null) {
+      _result.ref = ref;
+    }
+    if (position != null) {
+      _result.position = position;
+    }
+    return _result;
+  }
+  factory GitilesCommit.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory GitilesCommit.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  GitilesCommit clone() => GitilesCommit()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  GitilesCommit copyWith(void Function(GitilesCommit) updates) =>
+      super.copyWith((message) => updates(message as GitilesCommit)) as GitilesCommit; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static GitilesCommit create() => GitilesCommit._();
+  GitilesCommit createEmptyInstance() => create();
+  static $pb.PbList<GitilesCommit> createRepeated() => $pb.PbList<GitilesCommit>();
+  @$core.pragma('dart2js:noInline')
+  static GitilesCommit getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<GitilesCommit>(create);
+  static GitilesCommit? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get host => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set host($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasHost() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearHost() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.String get project => $_getSZ(1);
+  @$pb.TagNumber(2)
+  set project($core.String v) {
+    $_setString(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasProject() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearProject() => clearField(2);
+
+  @$pb.TagNumber(3)
+  $core.String get id => $_getSZ(2);
+  @$pb.TagNumber(3)
+  set id($core.String v) {
+    $_setString(2, v);
+  }
+
+  @$pb.TagNumber(3)
+  $core.bool hasId() => $_has(2);
+  @$pb.TagNumber(3)
+  void clearId() => clearField(3);
+
+  @$pb.TagNumber(4)
+  $core.String get ref => $_getSZ(3);
+  @$pb.TagNumber(4)
+  set ref($core.String v) {
+    $_setString(3, v);
+  }
+
+  @$pb.TagNumber(4)
+  $core.bool hasRef() => $_has(3);
+  @$pb.TagNumber(4)
+  void clearRef() => clearField(4);
+
+  @$pb.TagNumber(5)
+  $core.int get position => $_getIZ(4);
+  @$pb.TagNumber(5)
+  set position($core.int v) {
+    $_setUnsignedInt32(4, v);
+  }
+
+  @$pb.TagNumber(5)
+  $core.bool hasPosition() => $_has(4);
+  @$pb.TagNumber(5)
+  void clearPosition() => clearField(5);
+}
+
+class StringPair extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'StringPair',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'key')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'value')
+    ..hasRequiredFields = false;
+
+  StringPair._() : super();
+  factory StringPair({
+    $core.String? key,
+    $core.String? value,
+  }) {
+    final _result = create();
+    if (key != null) {
+      _result.key = key;
+    }
+    if (value != null) {
+      _result.value = value;
+    }
+    return _result;
+  }
+  factory StringPair.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory StringPair.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  StringPair clone() => StringPair()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  StringPair copyWith(void Function(StringPair) updates) =>
+      super.copyWith((message) => updates(message as StringPair)) as StringPair; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static StringPair create() => StringPair._();
+  StringPair createEmptyInstance() => create();
+  static $pb.PbList<StringPair> createRepeated() => $pb.PbList<StringPair>();
+  @$core.pragma('dart2js:noInline')
+  static StringPair getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<StringPair>(create);
+  static StringPair? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get key => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set key($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasKey() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearKey() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.String get value => $_getSZ(1);
+  @$pb.TagNumber(2)
+  set value($core.String v) {
+    $_setString(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasValue() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearValue() => clearField(2);
+}
+
+class TimeRange extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'TimeRange',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOM<$0.Timestamp>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'startTime',
+        subBuilder: $0.Timestamp.create)
+    ..aOM<$0.Timestamp>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'endTime',
+        subBuilder: $0.Timestamp.create)
+    ..hasRequiredFields = false;
+
+  TimeRange._() : super();
+  factory TimeRange({
+    $0.Timestamp? startTime,
+    $0.Timestamp? endTime,
+  }) {
+    final _result = create();
+    if (startTime != null) {
+      _result.startTime = startTime;
+    }
+    if (endTime != null) {
+      _result.endTime = endTime;
+    }
+    return _result;
+  }
+  factory TimeRange.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory TimeRange.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  TimeRange clone() => TimeRange()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  TimeRange copyWith(void Function(TimeRange) updates) =>
+      super.copyWith((message) => updates(message as TimeRange)) as TimeRange; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static TimeRange create() => TimeRange._();
+  TimeRange createEmptyInstance() => create();
+  static $pb.PbList<TimeRange> createRepeated() => $pb.PbList<TimeRange>();
+  @$core.pragma('dart2js:noInline')
+  static TimeRange getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TimeRange>(create);
+  static TimeRange? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $0.Timestamp get startTime => $_getN(0);
+  @$pb.TagNumber(1)
+  set startTime($0.Timestamp v) {
+    setField(1, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasStartTime() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearStartTime() => clearField(1);
+  @$pb.TagNumber(1)
+  $0.Timestamp ensureStartTime() => $_ensure(0);
+
+  @$pb.TagNumber(2)
+  $0.Timestamp get endTime => $_getN(1);
+  @$pb.TagNumber(2)
+  set endTime($0.Timestamp v) {
+    setField(2, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasEndTime() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearEndTime() => clearField(2);
+  @$pb.TagNumber(2)
+  $0.Timestamp ensureEndTime() => $_ensure(1);
+}
+
+class RequestedDimension extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'RequestedDimension',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'key')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'value')
+    ..aOM<$1.Duration>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'expiration',
+        subBuilder: $1.Duration.create)
+    ..hasRequiredFields = false;
+
+  RequestedDimension._() : super();
+  factory RequestedDimension({
+    $core.String? key,
+    $core.String? value,
+    $1.Duration? expiration,
+  }) {
+    final _result = create();
+    if (key != null) {
+      _result.key = key;
+    }
+    if (value != null) {
+      _result.value = value;
+    }
+    if (expiration != null) {
+      _result.expiration = expiration;
+    }
+    return _result;
+  }
+  factory RequestedDimension.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory RequestedDimension.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  RequestedDimension clone() => RequestedDimension()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  RequestedDimension copyWith(void Function(RequestedDimension) updates) =>
+      super.copyWith((message) => updates(message as RequestedDimension))
+          as RequestedDimension; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static RequestedDimension create() => RequestedDimension._();
+  RequestedDimension createEmptyInstance() => create();
+  static $pb.PbList<RequestedDimension> createRepeated() => $pb.PbList<RequestedDimension>();
+  @$core.pragma('dart2js:noInline')
+  static RequestedDimension getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<RequestedDimension>(create);
+  static RequestedDimension? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get key => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set key($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasKey() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearKey() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.String get value => $_getSZ(1);
+  @$pb.TagNumber(2)
+  set value($core.String v) {
+    $_setString(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasValue() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearValue() => clearField(2);
+
+  @$pb.TagNumber(3)
+  $1.Duration get expiration => $_getN(2);
+  @$pb.TagNumber(3)
+  set expiration($1.Duration v) {
+    setField(3, v);
+  }
+
+  @$pb.TagNumber(3)
+  $core.bool hasExpiration() => $_has(2);
+  @$pb.TagNumber(3)
+  void clearExpiration() => clearField(3);
+  @$pb.TagNumber(3)
+  $1.Duration ensureExpiration() => $_ensure(2);
+}
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/common.pbenum.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/common.pbenum.dart
new file mode 100644
index 0000000..714c2aa
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/common.pbenum.dart
@@ -0,0 +1,80 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/buildbucket/proto/common.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+// ignore_for_file: UNDEFINED_SHOWN_NAME
+import 'dart:core' as $core;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+class Status extends $pb.ProtobufEnum {
+  static const Status STATUS_UNSPECIFIED =
+      Status._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'STATUS_UNSPECIFIED');
+  static const Status SCHEDULED =
+      Status._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'SCHEDULED');
+  static const Status STARTED =
+      Status._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'STARTED');
+  static const Status ENDED_MASK =
+      Status._(4, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ENDED_MASK');
+  static const Status SUCCESS =
+      Status._(12, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'SUCCESS');
+  static const Status FAILURE =
+      Status._(20, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'FAILURE');
+  static const Status INFRA_FAILURE =
+      Status._(36, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'INFRA_FAILURE');
+  static const Status CANCELED =
+      Status._(68, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'CANCELED');
+
+  static const $core.List<Status> values = <Status>[
+    STATUS_UNSPECIFIED,
+    SCHEDULED,
+    STARTED,
+    ENDED_MASK,
+    SUCCESS,
+    FAILURE,
+    INFRA_FAILURE,
+    CANCELED,
+  ];
+
+  static final $core.Map<$core.int, Status> _byValue = $pb.ProtobufEnum.initByValue(values);
+  static Status? valueOf($core.int value) => _byValue[value];
+
+  const Status._($core.int v, $core.String n) : super(v, n);
+}
+
+class Trinary extends $pb.ProtobufEnum {
+  static const Trinary UNSET =
+      Trinary._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UNSET');
+  static const Trinary YES = Trinary._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'YES');
+  static const Trinary NO = Trinary._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'NO');
+
+  static const $core.List<Trinary> values = <Trinary>[
+    UNSET,
+    YES,
+    NO,
+  ];
+
+  static final $core.Map<$core.int, Trinary> _byValue = $pb.ProtobufEnum.initByValue(values);
+  static Trinary? valueOf($core.int value) => _byValue[value];
+
+  const Trinary._($core.int v, $core.String n) : super(v, n);
+}
+
+class Compression extends $pb.ProtobufEnum {
+  static const Compression ZLIB =
+      Compression._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ZLIB');
+  static const Compression ZSTD =
+      Compression._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ZSTD');
+
+  static const $core.List<Compression> values = <Compression>[
+    ZLIB,
+    ZSTD,
+  ];
+
+  static final $core.Map<$core.int, Compression> _byValue = $pb.ProtobufEnum.initByValue(values);
+  static Compression? valueOf($core.int value) => _byValue[value];
+
+  const Compression._($core.int v, $core.String n) : super(v, n);
+}
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/common.pbjson.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/common.pbjson.dart
new file mode 100644
index 0000000..4f25f55
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/common.pbjson.dart
@@ -0,0 +1,181 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/buildbucket/proto/common.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+import 'dart:core' as $core;
+import 'dart:convert' as $convert;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use statusDescriptor instead')
+const Status$json = const {
+  '1': 'Status',
+  '2': const [
+    const {'1': 'STATUS_UNSPECIFIED', '2': 0},
+    const {'1': 'SCHEDULED', '2': 1},
+    const {'1': 'STARTED', '2': 2},
+    const {'1': 'ENDED_MASK', '2': 4},
+    const {'1': 'SUCCESS', '2': 12},
+    const {'1': 'FAILURE', '2': 20},
+    const {'1': 'INFRA_FAILURE', '2': 36},
+    const {'1': 'CANCELED', '2': 68},
+  ],
+};
+
+/// Descriptor for `Status`. Decode as a `google.protobuf.EnumDescriptorProto`.
+final $typed_data.Uint8List statusDescriptor = $convert.base64Decode(
+    'CgZTdGF0dXMSFgoSU1RBVFVTX1VOU1BFQ0lGSUVEEAASDQoJU0NIRURVTEVEEAESCwoHU1RBUlRFRBACEg4KCkVOREVEX01BU0sQBBILCgdTVUNDRVNTEAwSCwoHRkFJTFVSRRAUEhEKDUlORlJBX0ZBSUxVUkUQJBIMCghDQU5DRUxFRBBE');
+@$core.Deprecated('Use trinaryDescriptor instead')
+const Trinary$json = const {
+  '1': 'Trinary',
+  '2': const [
+    const {'1': 'UNSET', '2': 0},
+    const {'1': 'YES', '2': 1},
+    const {'1': 'NO', '2': 2},
+  ],
+};
+
+/// Descriptor for `Trinary`. Decode as a `google.protobuf.EnumDescriptorProto`.
+final $typed_data.Uint8List trinaryDescriptor =
+    $convert.base64Decode('CgdUcmluYXJ5EgkKBVVOU0VUEAASBwoDWUVTEAESBgoCTk8QAg==');
+@$core.Deprecated('Use compressionDescriptor instead')
+const Compression$json = const {
+  '1': 'Compression',
+  '2': const [
+    const {'1': 'ZLIB', '2': 0},
+    const {'1': 'ZSTD', '2': 1},
+  ],
+};
+
+/// Descriptor for `Compression`. Decode as a `google.protobuf.EnumDescriptorProto`.
+final $typed_data.Uint8List compressionDescriptor =
+    $convert.base64Decode('CgtDb21wcmVzc2lvbhIICgRaTElCEAASCAoEWlNURBAB');
+@$core.Deprecated('Use executableDescriptor instead')
+const Executable$json = const {
+  '1': 'Executable',
+  '2': const [
+    const {'1': 'cipd_package', '3': 1, '4': 1, '5': 9, '10': 'cipdPackage'},
+    const {'1': 'cipd_version', '3': 2, '4': 1, '5': 9, '10': 'cipdVersion'},
+    const {'1': 'cmd', '3': 3, '4': 3, '5': 9, '10': 'cmd'},
+    const {'1': 'wrapper', '3': 4, '4': 3, '5': 9, '10': 'wrapper'},
+  ],
+};
+
+/// Descriptor for `Executable`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List executableDescriptor = $convert.base64Decode(
+    'CgpFeGVjdXRhYmxlEiEKDGNpcGRfcGFja2FnZRgBIAEoCVILY2lwZFBhY2thZ2USIQoMY2lwZF92ZXJzaW9uGAIgASgJUgtjaXBkVmVyc2lvbhIQCgNjbWQYAyADKAlSA2NtZBIYCgd3cmFwcGVyGAQgAygJUgd3cmFwcGVy');
+@$core.Deprecated('Use statusDetailsDescriptor instead')
+const StatusDetails$json = const {
+  '1': 'StatusDetails',
+  '2': const [
+    const {
+      '1': 'resource_exhaustion',
+      '3': 3,
+      '4': 1,
+      '5': 11,
+      '6': '.buildbucket.v2.StatusDetails.ResourceExhaustion',
+      '10': 'resourceExhaustion'
+    },
+    const {'1': 'timeout', '3': 4, '4': 1, '5': 11, '6': '.buildbucket.v2.StatusDetails.Timeout', '10': 'timeout'},
+  ],
+  '3': const [StatusDetails_ResourceExhaustion$json, StatusDetails_Timeout$json],
+  '9': const [
+    const {'1': 1, '2': 2},
+    const {'1': 2, '2': 3},
+  ],
+};
+
+@$core.Deprecated('Use statusDetailsDescriptor instead')
+const StatusDetails_ResourceExhaustion$json = const {
+  '1': 'ResourceExhaustion',
+};
+
+@$core.Deprecated('Use statusDetailsDescriptor instead')
+const StatusDetails_Timeout$json = const {
+  '1': 'Timeout',
+};
+
+/// Descriptor for `StatusDetails`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List statusDetailsDescriptor = $convert.base64Decode(
+    'Cg1TdGF0dXNEZXRhaWxzEmEKE3Jlc291cmNlX2V4aGF1c3Rpb24YAyABKAsyMC5idWlsZGJ1Y2tldC52Mi5TdGF0dXNEZXRhaWxzLlJlc291cmNlRXhoYXVzdGlvblIScmVzb3VyY2VFeGhhdXN0aW9uEj8KB3RpbWVvdXQYBCABKAsyJS5idWlsZGJ1Y2tldC52Mi5TdGF0dXNEZXRhaWxzLlRpbWVvdXRSB3RpbWVvdXQaFAoSUmVzb3VyY2VFeGhhdXN0aW9uGgkKB1RpbWVvdXRKBAgBEAJKBAgCEAM=');
+@$core.Deprecated('Use logDescriptor instead')
+const Log$json = const {
+  '1': 'Log',
+  '2': const [
+    const {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'},
+    const {'1': 'view_url', '3': 2, '4': 1, '5': 9, '10': 'viewUrl'},
+    const {'1': 'url', '3': 3, '4': 1, '5': 9, '10': 'url'},
+  ],
+};
+
+/// Descriptor for `Log`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List logDescriptor = $convert
+    .base64Decode('CgNMb2cSEgoEbmFtZRgBIAEoCVIEbmFtZRIZCgh2aWV3X3VybBgCIAEoCVIHdmlld1VybBIQCgN1cmwYAyABKAlSA3VybA==');
+@$core.Deprecated('Use gerritChangeDescriptor instead')
+const GerritChange$json = const {
+  '1': 'GerritChange',
+  '2': const [
+    const {'1': 'host', '3': 1, '4': 1, '5': 9, '10': 'host'},
+    const {'1': 'project', '3': 2, '4': 1, '5': 9, '10': 'project'},
+    const {'1': 'change', '3': 3, '4': 1, '5': 3, '10': 'change'},
+    const {'1': 'patchset', '3': 4, '4': 1, '5': 3, '10': 'patchset'},
+  ],
+};
+
+/// Descriptor for `GerritChange`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List gerritChangeDescriptor = $convert.base64Decode(
+    'CgxHZXJyaXRDaGFuZ2USEgoEaG9zdBgBIAEoCVIEaG9zdBIYCgdwcm9qZWN0GAIgASgJUgdwcm9qZWN0EhYKBmNoYW5nZRgDIAEoA1IGY2hhbmdlEhoKCHBhdGNoc2V0GAQgASgDUghwYXRjaHNldA==');
+@$core.Deprecated('Use gitilesCommitDescriptor instead')
+const GitilesCommit$json = const {
+  '1': 'GitilesCommit',
+  '2': const [
+    const {'1': 'host', '3': 1, '4': 1, '5': 9, '10': 'host'},
+    const {'1': 'project', '3': 2, '4': 1, '5': 9, '10': 'project'},
+    const {'1': 'id', '3': 3, '4': 1, '5': 9, '10': 'id'},
+    const {'1': 'ref', '3': 4, '4': 1, '5': 9, '10': 'ref'},
+    const {'1': 'position', '3': 5, '4': 1, '5': 13, '10': 'position'},
+  ],
+};
+
+/// Descriptor for `GitilesCommit`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List gitilesCommitDescriptor = $convert.base64Decode(
+    'Cg1HaXRpbGVzQ29tbWl0EhIKBGhvc3QYASABKAlSBGhvc3QSGAoHcHJvamVjdBgCIAEoCVIHcHJvamVjdBIOCgJpZBgDIAEoCVICaWQSEAoDcmVmGAQgASgJUgNyZWYSGgoIcG9zaXRpb24YBSABKA1SCHBvc2l0aW9u');
+@$core.Deprecated('Use stringPairDescriptor instead')
+const StringPair$json = const {
+  '1': 'StringPair',
+  '2': const [
+    const {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
+    const {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},
+  ],
+};
+
+/// Descriptor for `StringPair`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List stringPairDescriptor =
+    $convert.base64Decode('CgpTdHJpbmdQYWlyEhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZQ==');
+@$core.Deprecated('Use timeRangeDescriptor instead')
+const TimeRange$json = const {
+  '1': 'TimeRange',
+  '2': const [
+    const {'1': 'start_time', '3': 1, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '10': 'startTime'},
+    const {'1': 'end_time', '3': 2, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '10': 'endTime'},
+  ],
+};
+
+/// Descriptor for `TimeRange`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List timeRangeDescriptor = $convert.base64Decode(
+    'CglUaW1lUmFuZ2USOQoKc3RhcnRfdGltZRgBIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSCXN0YXJ0VGltZRI1CghlbmRfdGltZRgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSB2VuZFRpbWU=');
+@$core.Deprecated('Use requestedDimensionDescriptor instead')
+const RequestedDimension$json = const {
+  '1': 'RequestedDimension',
+  '2': const [
+    const {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
+    const {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},
+    const {'1': 'expiration', '3': 3, '4': 1, '5': 11, '6': '.google.protobuf.Duration', '10': 'expiration'},
+  ],
+};
+
+/// Descriptor for `RequestedDimension`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List requestedDimensionDescriptor = $convert.base64Decode(
+    'ChJSZXF1ZXN0ZWREaW1lbnNpb24SEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlEjkKCmV4cGlyYXRpb24YAyABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25SCmV4cGlyYXRpb24=');
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/common.pbserver.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/common.pbserver.dart
new file mode 100644
index 0000000..fb4c205
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/common.pbserver.dart
@@ -0,0 +1,8 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/buildbucket/proto/common.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+export 'common.pb.dart';
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/project_config.pb.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/project_config.pb.dart
new file mode 100644
index 0000000..d3eb346
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/project_config.pb.dart
@@ -0,0 +1,1415 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/buildbucket/proto/project_config.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+import 'dart:core' as $core;
+
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import '../../../../google/protobuf/wrappers.pb.dart' as $0;
+import 'common.pb.dart' as $1;
+import '../../../../google/protobuf/duration.pb.dart' as $2;
+import '../../resultdb/proto/v1/invocation.pb.dart' as $3;
+
+import 'project_config.pbenum.dart';
+import 'common.pbenum.dart' as $1;
+
+export 'project_config.pbenum.dart';
+
+class Acl extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Acl',
+      package:
+          const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket'),
+      createEmptyInstance: create)
+    ..e<Acl_Role>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'role', $pb.PbFieldType.OE,
+        defaultOrMaker: Acl_Role.READER, valueOf: Acl_Role.valueOf, enumValues: Acl_Role.values)
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'group')
+    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'identity')
+    ..hasRequiredFields = false;
+
+  Acl._() : super();
+  factory Acl({
+    @$core.Deprecated('This field is deprecated.') Acl_Role? role,
+    @$core.Deprecated('This field is deprecated.') $core.String? group,
+    @$core.Deprecated('This field is deprecated.') $core.String? identity,
+  }) {
+    final _result = create();
+    if (role != null) {
+      // ignore: deprecated_member_use_from_same_package
+      _result.role = role;
+    }
+    if (group != null) {
+      // ignore: deprecated_member_use_from_same_package
+      _result.group = group;
+    }
+    if (identity != null) {
+      // ignore: deprecated_member_use_from_same_package
+      _result.identity = identity;
+    }
+    return _result;
+  }
+  factory Acl.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory Acl.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  Acl clone() => Acl()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  Acl copyWith(void Function(Acl) updates) =>
+      super.copyWith((message) => updates(message as Acl)) as Acl; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Acl create() => Acl._();
+  Acl createEmptyInstance() => create();
+  static $pb.PbList<Acl> createRepeated() => $pb.PbList<Acl>();
+  @$core.pragma('dart2js:noInline')
+  static Acl getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Acl>(create);
+  static Acl? _defaultInstance;
+
+  @$core.Deprecated('This field is deprecated.')
+  @$pb.TagNumber(1)
+  Acl_Role get role => $_getN(0);
+  @$core.Deprecated('This field is deprecated.')
+  @$pb.TagNumber(1)
+  set role(Acl_Role v) {
+    setField(1, v);
+  }
+
+  @$core.Deprecated('This field is deprecated.')
+  @$pb.TagNumber(1)
+  $core.bool hasRole() => $_has(0);
+  @$core.Deprecated('This field is deprecated.')
+  @$pb.TagNumber(1)
+  void clearRole() => clearField(1);
+
+  @$core.Deprecated('This field is deprecated.')
+  @$pb.TagNumber(2)
+  $core.String get group => $_getSZ(1);
+  @$core.Deprecated('This field is deprecated.')
+  @$pb.TagNumber(2)
+  set group($core.String v) {
+    $_setString(1, v);
+  }
+
+  @$core.Deprecated('This field is deprecated.')
+  @$pb.TagNumber(2)
+  $core.bool hasGroup() => $_has(1);
+  @$core.Deprecated('This field is deprecated.')
+  @$pb.TagNumber(2)
+  void clearGroup() => clearField(2);
+
+  @$core.Deprecated('This field is deprecated.')
+  @$pb.TagNumber(3)
+  $core.String get identity => $_getSZ(2);
+  @$core.Deprecated('This field is deprecated.')
+  @$pb.TagNumber(3)
+  set identity($core.String v) {
+    $_setString(2, v);
+  }
+
+  @$core.Deprecated('This field is deprecated.')
+  @$pb.TagNumber(3)
+  $core.bool hasIdentity() => $_has(2);
+  @$core.Deprecated('This field is deprecated.')
+  @$pb.TagNumber(3)
+  void clearIdentity() => clearField(3);
+}
+
+class BuilderConfig_CacheEntry extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BuilderConfig.CacheEntry',
+      package:
+          const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'path')
+    ..a<$core.int>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'waitForWarmCacheSecs',
+        $pb.PbFieldType.O3)
+    ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'envVar')
+    ..hasRequiredFields = false;
+
+  BuilderConfig_CacheEntry._() : super();
+  factory BuilderConfig_CacheEntry({
+    $core.String? name,
+    $core.String? path,
+    $core.int? waitForWarmCacheSecs,
+    $core.String? envVar,
+  }) {
+    final _result = create();
+    if (name != null) {
+      _result.name = name;
+    }
+    if (path != null) {
+      _result.path = path;
+    }
+    if (waitForWarmCacheSecs != null) {
+      _result.waitForWarmCacheSecs = waitForWarmCacheSecs;
+    }
+    if (envVar != null) {
+      _result.envVar = envVar;
+    }
+    return _result;
+  }
+  factory BuilderConfig_CacheEntry.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BuilderConfig_CacheEntry.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BuilderConfig_CacheEntry clone() => BuilderConfig_CacheEntry()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BuilderConfig_CacheEntry copyWith(void Function(BuilderConfig_CacheEntry) updates) =>
+      super.copyWith((message) => updates(message as BuilderConfig_CacheEntry))
+          as BuilderConfig_CacheEntry; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BuilderConfig_CacheEntry create() => BuilderConfig_CacheEntry._();
+  BuilderConfig_CacheEntry createEmptyInstance() => create();
+  static $pb.PbList<BuilderConfig_CacheEntry> createRepeated() => $pb.PbList<BuilderConfig_CacheEntry>();
+  @$core.pragma('dart2js:noInline')
+  static BuilderConfig_CacheEntry getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BuilderConfig_CacheEntry>(create);
+  static BuilderConfig_CacheEntry? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get name => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set name($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasName() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearName() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.String get path => $_getSZ(1);
+  @$pb.TagNumber(2)
+  set path($core.String v) {
+    $_setString(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasPath() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearPath() => clearField(2);
+
+  @$pb.TagNumber(3)
+  $core.int get waitForWarmCacheSecs => $_getIZ(2);
+  @$pb.TagNumber(3)
+  set waitForWarmCacheSecs($core.int v) {
+    $_setSignedInt32(2, v);
+  }
+
+  @$pb.TagNumber(3)
+  $core.bool hasWaitForWarmCacheSecs() => $_has(2);
+  @$pb.TagNumber(3)
+  void clearWaitForWarmCacheSecs() => clearField(3);
+
+  @$pb.TagNumber(4)
+  $core.String get envVar => $_getSZ(3);
+  @$pb.TagNumber(4)
+  set envVar($core.String v) {
+    $_setString(3, v);
+  }
+
+  @$pb.TagNumber(4)
+  $core.bool hasEnvVar() => $_has(3);
+  @$pb.TagNumber(4)
+  void clearEnvVar() => clearField(4);
+}
+
+class BuilderConfig_Recipe extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BuilderConfig.Recipe',
+      package:
+          const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket'),
+      createEmptyInstance: create)
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name')
+    ..pPS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'properties')
+    ..pPS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'propertiesJ')
+    ..aOS(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'cipdVersion')
+    ..aOS(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'cipdPackage')
+    ..hasRequiredFields = false;
+
+  BuilderConfig_Recipe._() : super();
+  factory BuilderConfig_Recipe({
+    $core.String? name,
+    $core.Iterable<$core.String>? properties,
+    $core.Iterable<$core.String>? propertiesJ,
+    $core.String? cipdVersion,
+    $core.String? cipdPackage,
+  }) {
+    final _result = create();
+    if (name != null) {
+      _result.name = name;
+    }
+    if (properties != null) {
+      _result.properties.addAll(properties);
+    }
+    if (propertiesJ != null) {
+      _result.propertiesJ.addAll(propertiesJ);
+    }
+    if (cipdVersion != null) {
+      _result.cipdVersion = cipdVersion;
+    }
+    if (cipdPackage != null) {
+      _result.cipdPackage = cipdPackage;
+    }
+    return _result;
+  }
+  factory BuilderConfig_Recipe.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BuilderConfig_Recipe.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BuilderConfig_Recipe clone() => BuilderConfig_Recipe()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BuilderConfig_Recipe copyWith(void Function(BuilderConfig_Recipe) updates) =>
+      super.copyWith((message) => updates(message as BuilderConfig_Recipe))
+          as BuilderConfig_Recipe; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BuilderConfig_Recipe create() => BuilderConfig_Recipe._();
+  BuilderConfig_Recipe createEmptyInstance() => create();
+  static $pb.PbList<BuilderConfig_Recipe> createRepeated() => $pb.PbList<BuilderConfig_Recipe>();
+  @$core.pragma('dart2js:noInline')
+  static BuilderConfig_Recipe getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BuilderConfig_Recipe>(create);
+  static BuilderConfig_Recipe? _defaultInstance;
+
+  @$pb.TagNumber(2)
+  $core.String get name => $_getSZ(0);
+  @$pb.TagNumber(2)
+  set name($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasName() => $_has(0);
+  @$pb.TagNumber(2)
+  void clearName() => clearField(2);
+
+  @$pb.TagNumber(3)
+  $core.List<$core.String> get properties => $_getList(1);
+
+  @$pb.TagNumber(4)
+  $core.List<$core.String> get propertiesJ => $_getList(2);
+
+  @$pb.TagNumber(5)
+  $core.String get cipdVersion => $_getSZ(3);
+  @$pb.TagNumber(5)
+  set cipdVersion($core.String v) {
+    $_setString(3, v);
+  }
+
+  @$pb.TagNumber(5)
+  $core.bool hasCipdVersion() => $_has(3);
+  @$pb.TagNumber(5)
+  void clearCipdVersion() => clearField(5);
+
+  @$pb.TagNumber(6)
+  $core.String get cipdPackage => $_getSZ(4);
+  @$pb.TagNumber(6)
+  set cipdPackage($core.String v) {
+    $_setString(4, v);
+  }
+
+  @$pb.TagNumber(6)
+  $core.bool hasCipdPackage() => $_has(4);
+  @$pb.TagNumber(6)
+  void clearCipdPackage() => clearField(6);
+}
+
+class BuilderConfig_ResultDB extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BuilderConfig.ResultDB',
+      package:
+          const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket'),
+      createEmptyInstance: create)
+    ..aOB(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'enable')
+    ..pc<$3.BigQueryExport>(
+        2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'bqExports', $pb.PbFieldType.PM,
+        subBuilder: $3.BigQueryExport.create)
+    ..aOM<$3.HistoryOptions>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'historyOptions',
+        subBuilder: $3.HistoryOptions.create)
+    ..hasRequiredFields = false;
+
+  BuilderConfig_ResultDB._() : super();
+  factory BuilderConfig_ResultDB({
+    $core.bool? enable,
+    $core.Iterable<$3.BigQueryExport>? bqExports,
+    $3.HistoryOptions? historyOptions,
+  }) {
+    final _result = create();
+    if (enable != null) {
+      _result.enable = enable;
+    }
+    if (bqExports != null) {
+      _result.bqExports.addAll(bqExports);
+    }
+    if (historyOptions != null) {
+      _result.historyOptions = historyOptions;
+    }
+    return _result;
+  }
+  factory BuilderConfig_ResultDB.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BuilderConfig_ResultDB.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BuilderConfig_ResultDB clone() => BuilderConfig_ResultDB()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BuilderConfig_ResultDB copyWith(void Function(BuilderConfig_ResultDB) updates) =>
+      super.copyWith((message) => updates(message as BuilderConfig_ResultDB))
+          as BuilderConfig_ResultDB; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BuilderConfig_ResultDB create() => BuilderConfig_ResultDB._();
+  BuilderConfig_ResultDB createEmptyInstance() => create();
+  static $pb.PbList<BuilderConfig_ResultDB> createRepeated() => $pb.PbList<BuilderConfig_ResultDB>();
+  @$core.pragma('dart2js:noInline')
+  static BuilderConfig_ResultDB getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BuilderConfig_ResultDB>(create);
+  static BuilderConfig_ResultDB? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.bool get enable => $_getBF(0);
+  @$pb.TagNumber(1)
+  set enable($core.bool v) {
+    $_setBool(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasEnable() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearEnable() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.List<$3.BigQueryExport> get bqExports => $_getList(1);
+
+  @$pb.TagNumber(3)
+  $3.HistoryOptions get historyOptions => $_getN(2);
+  @$pb.TagNumber(3)
+  set historyOptions($3.HistoryOptions v) {
+    setField(3, v);
+  }
+
+  @$pb.TagNumber(3)
+  $core.bool hasHistoryOptions() => $_has(2);
+  @$pb.TagNumber(3)
+  void clearHistoryOptions() => clearField(3);
+  @$pb.TagNumber(3)
+  $3.HistoryOptions ensureHistoryOptions() => $_ensure(2);
+}
+
+class BuilderConfig_Backend extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BuilderConfig.Backend',
+      package:
+          const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'target')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'configJson')
+    ..hasRequiredFields = false;
+
+  BuilderConfig_Backend._() : super();
+  factory BuilderConfig_Backend({
+    $core.String? target,
+    $core.String? configJson,
+  }) {
+    final _result = create();
+    if (target != null) {
+      _result.target = target;
+    }
+    if (configJson != null) {
+      _result.configJson = configJson;
+    }
+    return _result;
+  }
+  factory BuilderConfig_Backend.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BuilderConfig_Backend.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BuilderConfig_Backend clone() => BuilderConfig_Backend()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BuilderConfig_Backend copyWith(void Function(BuilderConfig_Backend) updates) =>
+      super.copyWith((message) => updates(message as BuilderConfig_Backend))
+          as BuilderConfig_Backend; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BuilderConfig_Backend create() => BuilderConfig_Backend._();
+  BuilderConfig_Backend createEmptyInstance() => create();
+  static $pb.PbList<BuilderConfig_Backend> createRepeated() => $pb.PbList<BuilderConfig_Backend>();
+  @$core.pragma('dart2js:noInline')
+  static BuilderConfig_Backend getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BuilderConfig_Backend>(create);
+  static BuilderConfig_Backend? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get target => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set target($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasTarget() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearTarget() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.String get configJson => $_getSZ(1);
+  @$pb.TagNumber(2)
+  set configJson($core.String v) {
+    $_setString(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasConfigJson() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearConfigJson() => clearField(2);
+}
+
+class BuilderConfig extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BuilderConfig',
+      package:
+          const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name')
+    ..pPS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'swarmingTags')
+    ..pPS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'dimensions')
+    ..aOM<BuilderConfig_Recipe>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'recipe',
+        subBuilder: BuilderConfig_Recipe.create)
+    ..a<$core.int>(
+        5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'priority', $pb.PbFieldType.OU3)
+    ..aOS(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'category')
+    ..a<$core.int>(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'executionTimeoutSecs',
+        $pb.PbFieldType.OU3)
+    ..pc<BuilderConfig_CacheEntry>(
+        9, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'caches', $pb.PbFieldType.PM,
+        subBuilder: BuilderConfig_CacheEntry.create)
+    ..aOS(12, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'serviceAccount')
+    ..e<Toggle>(
+        16, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'buildNumbers', $pb.PbFieldType.OE,
+        defaultOrMaker: Toggle.UNSET, valueOf: Toggle.valueOf, enumValues: Toggle.values)
+    ..e<Toggle>(17, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'autoBuilderDimension',
+        $pb.PbFieldType.OE,
+        defaultOrMaker: Toggle.UNSET, valueOf: Toggle.valueOf, enumValues: Toggle.values)
+    ..e<Toggle>(
+        18, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'experimental', $pb.PbFieldType.OE,
+        defaultOrMaker: Toggle.UNSET, valueOf: Toggle.valueOf, enumValues: Toggle.values)
+    ..a<$core.int>(
+        20, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'expirationSecs', $pb.PbFieldType.OU3)
+    ..aOS(21, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'swarmingHost')
+    ..aOM<$0.UInt32Value>(
+        22, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'taskTemplateCanaryPercentage',
+        subBuilder: $0.UInt32Value.create)
+    ..aOM<$1.Executable>(23, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'exe',
+        subBuilder: $1.Executable.create)
+    ..aOS(24, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'properties')
+    ..e<$1.Trinary>(
+        25, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'critical', $pb.PbFieldType.OE,
+        defaultOrMaker: $1.Trinary.UNSET, valueOf: $1.Trinary.valueOf, enumValues: $1.Trinary.values)
+    ..aOM<BuilderConfig_ResultDB>(26, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'resultdb',
+        subBuilder: BuilderConfig_ResultDB.create)
+    ..m<$core.String, $core.int>(28, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'experiments',
+        entryClassName: 'BuilderConfig.ExperimentsEntry',
+        keyFieldType: $pb.PbFieldType.OS,
+        valueFieldType: $pb.PbFieldType.O3,
+        packageName: const $pb.PackageName('buildbucket'))
+    ..e<$1.Trinary>(
+        29, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'waitForCapacity', $pb.PbFieldType.OE,
+        defaultOrMaker: $1.Trinary.UNSET, valueOf: $1.Trinary.valueOf, enumValues: $1.Trinary.values)
+    ..aOS(30, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'descriptionHtml')
+    ..aOM<$2.Duration>(31, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gracePeriod',
+        subBuilder: $2.Duration.create)
+    ..aOM<BuilderConfig_Backend>(32, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'backend',
+        subBuilder: BuilderConfig_Backend.create)
+    ..aOM<BuilderConfig_Backend>(33, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'backendAlt',
+        subBuilder: BuilderConfig_Backend.create)
+    ..pPS(34, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'allowedPropertyOverrides')
+    ..hasRequiredFields = false;
+
+  BuilderConfig._() : super();
+  factory BuilderConfig({
+    $core.String? name,
+    $core.Iterable<$core.String>? swarmingTags,
+    $core.Iterable<$core.String>? dimensions,
+    BuilderConfig_Recipe? recipe,
+    $core.int? priority,
+    $core.String? category,
+    $core.int? executionTimeoutSecs,
+    $core.Iterable<BuilderConfig_CacheEntry>? caches,
+    $core.String? serviceAccount,
+    Toggle? buildNumbers,
+    Toggle? autoBuilderDimension,
+    Toggle? experimental,
+    $core.int? expirationSecs,
+    $core.String? swarmingHost,
+    $0.UInt32Value? taskTemplateCanaryPercentage,
+    $1.Executable? exe,
+    $core.String? properties,
+    $1.Trinary? critical,
+    BuilderConfig_ResultDB? resultdb,
+    $core.Map<$core.String, $core.int>? experiments,
+    $1.Trinary? waitForCapacity,
+    $core.String? descriptionHtml,
+    $2.Duration? gracePeriod,
+    BuilderConfig_Backend? backend,
+    BuilderConfig_Backend? backendAlt,
+    $core.Iterable<$core.String>? allowedPropertyOverrides,
+  }) {
+    final _result = create();
+    if (name != null) {
+      _result.name = name;
+    }
+    if (swarmingTags != null) {
+      _result.swarmingTags.addAll(swarmingTags);
+    }
+    if (dimensions != null) {
+      _result.dimensions.addAll(dimensions);
+    }
+    if (recipe != null) {
+      _result.recipe = recipe;
+    }
+    if (priority != null) {
+      _result.priority = priority;
+    }
+    if (category != null) {
+      _result.category = category;
+    }
+    if (executionTimeoutSecs != null) {
+      _result.executionTimeoutSecs = executionTimeoutSecs;
+    }
+    if (caches != null) {
+      _result.caches.addAll(caches);
+    }
+    if (serviceAccount != null) {
+      _result.serviceAccount = serviceAccount;
+    }
+    if (buildNumbers != null) {
+      _result.buildNumbers = buildNumbers;
+    }
+    if (autoBuilderDimension != null) {
+      _result.autoBuilderDimension = autoBuilderDimension;
+    }
+    if (experimental != null) {
+      _result.experimental = experimental;
+    }
+    if (expirationSecs != null) {
+      _result.expirationSecs = expirationSecs;
+    }
+    if (swarmingHost != null) {
+      _result.swarmingHost = swarmingHost;
+    }
+    if (taskTemplateCanaryPercentage != null) {
+      _result.taskTemplateCanaryPercentage = taskTemplateCanaryPercentage;
+    }
+    if (exe != null) {
+      _result.exe = exe;
+    }
+    if (properties != null) {
+      _result.properties = properties;
+    }
+    if (critical != null) {
+      _result.critical = critical;
+    }
+    if (resultdb != null) {
+      _result.resultdb = resultdb;
+    }
+    if (experiments != null) {
+      _result.experiments.addAll(experiments);
+    }
+    if (waitForCapacity != null) {
+      _result.waitForCapacity = waitForCapacity;
+    }
+    if (descriptionHtml != null) {
+      _result.descriptionHtml = descriptionHtml;
+    }
+    if (gracePeriod != null) {
+      _result.gracePeriod = gracePeriod;
+    }
+    if (backend != null) {
+      _result.backend = backend;
+    }
+    if (backendAlt != null) {
+      _result.backendAlt = backendAlt;
+    }
+    if (allowedPropertyOverrides != null) {
+      _result.allowedPropertyOverrides.addAll(allowedPropertyOverrides);
+    }
+    return _result;
+  }
+  factory BuilderConfig.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BuilderConfig.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BuilderConfig clone() => BuilderConfig()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BuilderConfig copyWith(void Function(BuilderConfig) updates) =>
+      super.copyWith((message) => updates(message as BuilderConfig)) as BuilderConfig; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BuilderConfig create() => BuilderConfig._();
+  BuilderConfig createEmptyInstance() => create();
+  static $pb.PbList<BuilderConfig> createRepeated() => $pb.PbList<BuilderConfig>();
+  @$core.pragma('dart2js:noInline')
+  static BuilderConfig getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BuilderConfig>(create);
+  static BuilderConfig? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get name => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set name($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasName() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearName() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.List<$core.String> get swarmingTags => $_getList(1);
+
+  @$pb.TagNumber(3)
+  $core.List<$core.String> get dimensions => $_getList(2);
+
+  @$pb.TagNumber(4)
+  BuilderConfig_Recipe get recipe => $_getN(3);
+  @$pb.TagNumber(4)
+  set recipe(BuilderConfig_Recipe v) {
+    setField(4, v);
+  }
+
+  @$pb.TagNumber(4)
+  $core.bool hasRecipe() => $_has(3);
+  @$pb.TagNumber(4)
+  void clearRecipe() => clearField(4);
+  @$pb.TagNumber(4)
+  BuilderConfig_Recipe ensureRecipe() => $_ensure(3);
+
+  @$pb.TagNumber(5)
+  $core.int get priority => $_getIZ(4);
+  @$pb.TagNumber(5)
+  set priority($core.int v) {
+    $_setUnsignedInt32(4, v);
+  }
+
+  @$pb.TagNumber(5)
+  $core.bool hasPriority() => $_has(4);
+  @$pb.TagNumber(5)
+  void clearPriority() => clearField(5);
+
+  @$pb.TagNumber(6)
+  $core.String get category => $_getSZ(5);
+  @$pb.TagNumber(6)
+  set category($core.String v) {
+    $_setString(5, v);
+  }
+
+  @$pb.TagNumber(6)
+  $core.bool hasCategory() => $_has(5);
+  @$pb.TagNumber(6)
+  void clearCategory() => clearField(6);
+
+  @$pb.TagNumber(7)
+  $core.int get executionTimeoutSecs => $_getIZ(6);
+  @$pb.TagNumber(7)
+  set executionTimeoutSecs($core.int v) {
+    $_setUnsignedInt32(6, v);
+  }
+
+  @$pb.TagNumber(7)
+  $core.bool hasExecutionTimeoutSecs() => $_has(6);
+  @$pb.TagNumber(7)
+  void clearExecutionTimeoutSecs() => clearField(7);
+
+  @$pb.TagNumber(9)
+  $core.List<BuilderConfig_CacheEntry> get caches => $_getList(7);
+
+  @$pb.TagNumber(12)
+  $core.String get serviceAccount => $_getSZ(8);
+  @$pb.TagNumber(12)
+  set serviceAccount($core.String v) {
+    $_setString(8, v);
+  }
+
+  @$pb.TagNumber(12)
+  $core.bool hasServiceAccount() => $_has(8);
+  @$pb.TagNumber(12)
+  void clearServiceAccount() => clearField(12);
+
+  @$pb.TagNumber(16)
+  Toggle get buildNumbers => $_getN(9);
+  @$pb.TagNumber(16)
+  set buildNumbers(Toggle v) {
+    setField(16, v);
+  }
+
+  @$pb.TagNumber(16)
+  $core.bool hasBuildNumbers() => $_has(9);
+  @$pb.TagNumber(16)
+  void clearBuildNumbers() => clearField(16);
+
+  @$pb.TagNumber(17)
+  Toggle get autoBuilderDimension => $_getN(10);
+  @$pb.TagNumber(17)
+  set autoBuilderDimension(Toggle v) {
+    setField(17, v);
+  }
+
+  @$pb.TagNumber(17)
+  $core.bool hasAutoBuilderDimension() => $_has(10);
+  @$pb.TagNumber(17)
+  void clearAutoBuilderDimension() => clearField(17);
+
+  @$pb.TagNumber(18)
+  Toggle get experimental => $_getN(11);
+  @$pb.TagNumber(18)
+  set experimental(Toggle v) {
+    setField(18, v);
+  }
+
+  @$pb.TagNumber(18)
+  $core.bool hasExperimental() => $_has(11);
+  @$pb.TagNumber(18)
+  void clearExperimental() => clearField(18);
+
+  @$pb.TagNumber(20)
+  $core.int get expirationSecs => $_getIZ(12);
+  @$pb.TagNumber(20)
+  set expirationSecs($core.int v) {
+    $_setUnsignedInt32(12, v);
+  }
+
+  @$pb.TagNumber(20)
+  $core.bool hasExpirationSecs() => $_has(12);
+  @$pb.TagNumber(20)
+  void clearExpirationSecs() => clearField(20);
+
+  @$pb.TagNumber(21)
+  $core.String get swarmingHost => $_getSZ(13);
+  @$pb.TagNumber(21)
+  set swarmingHost($core.String v) {
+    $_setString(13, v);
+  }
+
+  @$pb.TagNumber(21)
+  $core.bool hasSwarmingHost() => $_has(13);
+  @$pb.TagNumber(21)
+  void clearSwarmingHost() => clearField(21);
+
+  @$pb.TagNumber(22)
+  $0.UInt32Value get taskTemplateCanaryPercentage => $_getN(14);
+  @$pb.TagNumber(22)
+  set taskTemplateCanaryPercentage($0.UInt32Value v) {
+    setField(22, v);
+  }
+
+  @$pb.TagNumber(22)
+  $core.bool hasTaskTemplateCanaryPercentage() => $_has(14);
+  @$pb.TagNumber(22)
+  void clearTaskTemplateCanaryPercentage() => clearField(22);
+  @$pb.TagNumber(22)
+  $0.UInt32Value ensureTaskTemplateCanaryPercentage() => $_ensure(14);
+
+  @$pb.TagNumber(23)
+  $1.Executable get exe => $_getN(15);
+  @$pb.TagNumber(23)
+  set exe($1.Executable v) {
+    setField(23, v);
+  }
+
+  @$pb.TagNumber(23)
+  $core.bool hasExe() => $_has(15);
+  @$pb.TagNumber(23)
+  void clearExe() => clearField(23);
+  @$pb.TagNumber(23)
+  $1.Executable ensureExe() => $_ensure(15);
+
+  @$pb.TagNumber(24)
+  $core.String get properties => $_getSZ(16);
+  @$pb.TagNumber(24)
+  set properties($core.String v) {
+    $_setString(16, v);
+  }
+
+  @$pb.TagNumber(24)
+  $core.bool hasProperties() => $_has(16);
+  @$pb.TagNumber(24)
+  void clearProperties() => clearField(24);
+
+  @$pb.TagNumber(25)
+  $1.Trinary get critical => $_getN(17);
+  @$pb.TagNumber(25)
+  set critical($1.Trinary v) {
+    setField(25, v);
+  }
+
+  @$pb.TagNumber(25)
+  $core.bool hasCritical() => $_has(17);
+  @$pb.TagNumber(25)
+  void clearCritical() => clearField(25);
+
+  @$pb.TagNumber(26)
+  BuilderConfig_ResultDB get resultdb => $_getN(18);
+  @$pb.TagNumber(26)
+  set resultdb(BuilderConfig_ResultDB v) {
+    setField(26, v);
+  }
+
+  @$pb.TagNumber(26)
+  $core.bool hasResultdb() => $_has(18);
+  @$pb.TagNumber(26)
+  void clearResultdb() => clearField(26);
+  @$pb.TagNumber(26)
+  BuilderConfig_ResultDB ensureResultdb() => $_ensure(18);
+
+  @$pb.TagNumber(28)
+  $core.Map<$core.String, $core.int> get experiments => $_getMap(19);
+
+  @$pb.TagNumber(29)
+  $1.Trinary get waitForCapacity => $_getN(20);
+  @$pb.TagNumber(29)
+  set waitForCapacity($1.Trinary v) {
+    setField(29, v);
+  }
+
+  @$pb.TagNumber(29)
+  $core.bool hasWaitForCapacity() => $_has(20);
+  @$pb.TagNumber(29)
+  void clearWaitForCapacity() => clearField(29);
+
+  @$pb.TagNumber(30)
+  $core.String get descriptionHtml => $_getSZ(21);
+  @$pb.TagNumber(30)
+  set descriptionHtml($core.String v) {
+    $_setString(21, v);
+  }
+
+  @$pb.TagNumber(30)
+  $core.bool hasDescriptionHtml() => $_has(21);
+  @$pb.TagNumber(30)
+  void clearDescriptionHtml() => clearField(30);
+
+  @$pb.TagNumber(31)
+  $2.Duration get gracePeriod => $_getN(22);
+  @$pb.TagNumber(31)
+  set gracePeriod($2.Duration v) {
+    setField(31, v);
+  }
+
+  @$pb.TagNumber(31)
+  $core.bool hasGracePeriod() => $_has(22);
+  @$pb.TagNumber(31)
+  void clearGracePeriod() => clearField(31);
+  @$pb.TagNumber(31)
+  $2.Duration ensureGracePeriod() => $_ensure(22);
+
+  @$pb.TagNumber(32)
+  BuilderConfig_Backend get backend => $_getN(23);
+  @$pb.TagNumber(32)
+  set backend(BuilderConfig_Backend v) {
+    setField(32, v);
+  }
+
+  @$pb.TagNumber(32)
+  $core.bool hasBackend() => $_has(23);
+  @$pb.TagNumber(32)
+  void clearBackend() => clearField(32);
+  @$pb.TagNumber(32)
+  BuilderConfig_Backend ensureBackend() => $_ensure(23);
+
+  @$pb.TagNumber(33)
+  BuilderConfig_Backend get backendAlt => $_getN(24);
+  @$pb.TagNumber(33)
+  set backendAlt(BuilderConfig_Backend v) {
+    setField(33, v);
+  }
+
+  @$pb.TagNumber(33)
+  $core.bool hasBackendAlt() => $_has(24);
+  @$pb.TagNumber(33)
+  void clearBackendAlt() => clearField(33);
+  @$pb.TagNumber(33)
+  BuilderConfig_Backend ensureBackendAlt() => $_ensure(24);
+
+  @$pb.TagNumber(34)
+  $core.List<$core.String> get allowedPropertyOverrides => $_getList(25);
+}
+
+class Swarming extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Swarming',
+      package:
+          const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket'),
+      createEmptyInstance: create)
+    ..pc<BuilderConfig>(
+        4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'builders', $pb.PbFieldType.PM,
+        subBuilder: BuilderConfig.create)
+    ..aOM<$0.UInt32Value>(
+        5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'taskTemplateCanaryPercentage',
+        subBuilder: $0.UInt32Value.create)
+    ..hasRequiredFields = false;
+
+  Swarming._() : super();
+  factory Swarming({
+    $core.Iterable<BuilderConfig>? builders,
+    $0.UInt32Value? taskTemplateCanaryPercentage,
+  }) {
+    final _result = create();
+    if (builders != null) {
+      _result.builders.addAll(builders);
+    }
+    if (taskTemplateCanaryPercentage != null) {
+      _result.taskTemplateCanaryPercentage = taskTemplateCanaryPercentage;
+    }
+    return _result;
+  }
+  factory Swarming.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory Swarming.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  Swarming clone() => Swarming()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  Swarming copyWith(void Function(Swarming) updates) =>
+      super.copyWith((message) => updates(message as Swarming)) as Swarming; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Swarming create() => Swarming._();
+  Swarming createEmptyInstance() => create();
+  static $pb.PbList<Swarming> createRepeated() => $pb.PbList<Swarming>();
+  @$core.pragma('dart2js:noInline')
+  static Swarming getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Swarming>(create);
+  static Swarming? _defaultInstance;
+
+  @$pb.TagNumber(4)
+  $core.List<BuilderConfig> get builders => $_getList(0);
+
+  @$pb.TagNumber(5)
+  $0.UInt32Value get taskTemplateCanaryPercentage => $_getN(1);
+  @$pb.TagNumber(5)
+  set taskTemplateCanaryPercentage($0.UInt32Value v) {
+    setField(5, v);
+  }
+
+  @$pb.TagNumber(5)
+  $core.bool hasTaskTemplateCanaryPercentage() => $_has(1);
+  @$pb.TagNumber(5)
+  void clearTaskTemplateCanaryPercentage() => clearField(5);
+  @$pb.TagNumber(5)
+  $0.UInt32Value ensureTaskTemplateCanaryPercentage() => $_ensure(1);
+}
+
+class Bucket_Constraints extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Bucket.Constraints',
+      package:
+          const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket'),
+      createEmptyInstance: create)
+    ..pPS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'pools')
+    ..pPS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'serviceAccounts')
+    ..hasRequiredFields = false;
+
+  Bucket_Constraints._() : super();
+  factory Bucket_Constraints({
+    $core.Iterable<$core.String>? pools,
+    $core.Iterable<$core.String>? serviceAccounts,
+  }) {
+    final _result = create();
+    if (pools != null) {
+      _result.pools.addAll(pools);
+    }
+    if (serviceAccounts != null) {
+      _result.serviceAccounts.addAll(serviceAccounts);
+    }
+    return _result;
+  }
+  factory Bucket_Constraints.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory Bucket_Constraints.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  Bucket_Constraints clone() => Bucket_Constraints()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  Bucket_Constraints copyWith(void Function(Bucket_Constraints) updates) =>
+      super.copyWith((message) => updates(message as Bucket_Constraints))
+          as Bucket_Constraints; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Bucket_Constraints create() => Bucket_Constraints._();
+  Bucket_Constraints createEmptyInstance() => create();
+  static $pb.PbList<Bucket_Constraints> createRepeated() => $pb.PbList<Bucket_Constraints>();
+  @$core.pragma('dart2js:noInline')
+  static Bucket_Constraints getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Bucket_Constraints>(create);
+  static Bucket_Constraints? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.List<$core.String> get pools => $_getList(0);
+
+  @$pb.TagNumber(2)
+  $core.List<$core.String> get serviceAccounts => $_getList(1);
+}
+
+class Bucket_DynamicBuilderTemplate extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Bucket.DynamicBuilderTemplate',
+      package:
+          const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket'),
+      createEmptyInstance: create)
+    ..hasRequiredFields = false;
+
+  Bucket_DynamicBuilderTemplate._() : super();
+  factory Bucket_DynamicBuilderTemplate() => create();
+  factory Bucket_DynamicBuilderTemplate.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory Bucket_DynamicBuilderTemplate.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  Bucket_DynamicBuilderTemplate clone() => Bucket_DynamicBuilderTemplate()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  Bucket_DynamicBuilderTemplate copyWith(void Function(Bucket_DynamicBuilderTemplate) updates) =>
+      super.copyWith((message) => updates(message as Bucket_DynamicBuilderTemplate))
+          as Bucket_DynamicBuilderTemplate; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Bucket_DynamicBuilderTemplate create() => Bucket_DynamicBuilderTemplate._();
+  Bucket_DynamicBuilderTemplate createEmptyInstance() => create();
+  static $pb.PbList<Bucket_DynamicBuilderTemplate> createRepeated() => $pb.PbList<Bucket_DynamicBuilderTemplate>();
+  @$core.pragma('dart2js:noInline')
+  static Bucket_DynamicBuilderTemplate getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Bucket_DynamicBuilderTemplate>(create);
+  static Bucket_DynamicBuilderTemplate? _defaultInstance;
+}
+
+class Bucket extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Bucket',
+      package:
+          const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name')
+    ..pc<Acl>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'acls', $pb.PbFieldType.PM,
+        subBuilder: Acl.create)
+    ..aOM<Swarming>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'swarming',
+        subBuilder: Swarming.create)
+    ..aOS(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'shadow')
+    ..aOM<Bucket_Constraints>(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'constraints',
+        subBuilder: Bucket_Constraints.create)
+    ..aOM<Bucket_DynamicBuilderTemplate>(
+        7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'dynamicBuilderTemplate',
+        subBuilder: Bucket_DynamicBuilderTemplate.create)
+    ..hasRequiredFields = false;
+
+  Bucket._() : super();
+  factory Bucket({
+    $core.String? name,
+    @$core.Deprecated('This field is deprecated.') $core.Iterable<Acl>? acls,
+    Swarming? swarming,
+    $core.String? shadow,
+    Bucket_Constraints? constraints,
+    Bucket_DynamicBuilderTemplate? dynamicBuilderTemplate,
+  }) {
+    final _result = create();
+    if (name != null) {
+      _result.name = name;
+    }
+    if (acls != null) {
+      // ignore: deprecated_member_use_from_same_package
+      _result.acls.addAll(acls);
+    }
+    if (swarming != null) {
+      _result.swarming = swarming;
+    }
+    if (shadow != null) {
+      _result.shadow = shadow;
+    }
+    if (constraints != null) {
+      _result.constraints = constraints;
+    }
+    if (dynamicBuilderTemplate != null) {
+      _result.dynamicBuilderTemplate = dynamicBuilderTemplate;
+    }
+    return _result;
+  }
+  factory Bucket.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory Bucket.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  Bucket clone() => Bucket()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  Bucket copyWith(void Function(Bucket) updates) =>
+      super.copyWith((message) => updates(message as Bucket)) as Bucket; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Bucket create() => Bucket._();
+  Bucket createEmptyInstance() => create();
+  static $pb.PbList<Bucket> createRepeated() => $pb.PbList<Bucket>();
+  @$core.pragma('dart2js:noInline')
+  static Bucket getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Bucket>(create);
+  static Bucket? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get name => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set name($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasName() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearName() => clearField(1);
+
+  @$core.Deprecated('This field is deprecated.')
+  @$pb.TagNumber(2)
+  $core.List<Acl> get acls => $_getList(1);
+
+  @$pb.TagNumber(3)
+  Swarming get swarming => $_getN(2);
+  @$pb.TagNumber(3)
+  set swarming(Swarming v) {
+    setField(3, v);
+  }
+
+  @$pb.TagNumber(3)
+  $core.bool hasSwarming() => $_has(2);
+  @$pb.TagNumber(3)
+  void clearSwarming() => clearField(3);
+  @$pb.TagNumber(3)
+  Swarming ensureSwarming() => $_ensure(2);
+
+  @$pb.TagNumber(5)
+  $core.String get shadow => $_getSZ(3);
+  @$pb.TagNumber(5)
+  set shadow($core.String v) {
+    $_setString(3, v);
+  }
+
+  @$pb.TagNumber(5)
+  $core.bool hasShadow() => $_has(3);
+  @$pb.TagNumber(5)
+  void clearShadow() => clearField(5);
+
+  @$pb.TagNumber(6)
+  Bucket_Constraints get constraints => $_getN(4);
+  @$pb.TagNumber(6)
+  set constraints(Bucket_Constraints v) {
+    setField(6, v);
+  }
+
+  @$pb.TagNumber(6)
+  $core.bool hasConstraints() => $_has(4);
+  @$pb.TagNumber(6)
+  void clearConstraints() => clearField(6);
+  @$pb.TagNumber(6)
+  Bucket_Constraints ensureConstraints() => $_ensure(4);
+
+  @$pb.TagNumber(7)
+  Bucket_DynamicBuilderTemplate get dynamicBuilderTemplate => $_getN(5);
+  @$pb.TagNumber(7)
+  set dynamicBuilderTemplate(Bucket_DynamicBuilderTemplate v) {
+    setField(7, v);
+  }
+
+  @$pb.TagNumber(7)
+  $core.bool hasDynamicBuilderTemplate() => $_has(5);
+  @$pb.TagNumber(7)
+  void clearDynamicBuilderTemplate() => clearField(7);
+  @$pb.TagNumber(7)
+  Bucket_DynamicBuilderTemplate ensureDynamicBuilderTemplate() => $_ensure(5);
+}
+
+class BuildbucketCfg_topic extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BuildbucketCfg.topic',
+      package:
+          const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name')
+    ..e<$1.Compression>(
+        2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'compression', $pb.PbFieldType.OE,
+        defaultOrMaker: $1.Compression.ZLIB, valueOf: $1.Compression.valueOf, enumValues: $1.Compression.values)
+    ..hasRequiredFields = false;
+
+  BuildbucketCfg_topic._() : super();
+  factory BuildbucketCfg_topic({
+    $core.String? name,
+    $1.Compression? compression,
+  }) {
+    final _result = create();
+    if (name != null) {
+      _result.name = name;
+    }
+    if (compression != null) {
+      _result.compression = compression;
+    }
+    return _result;
+  }
+  factory BuildbucketCfg_topic.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BuildbucketCfg_topic.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BuildbucketCfg_topic clone() => BuildbucketCfg_topic()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BuildbucketCfg_topic copyWith(void Function(BuildbucketCfg_topic) updates) =>
+      super.copyWith((message) => updates(message as BuildbucketCfg_topic))
+          as BuildbucketCfg_topic; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BuildbucketCfg_topic create() => BuildbucketCfg_topic._();
+  BuildbucketCfg_topic createEmptyInstance() => create();
+  static $pb.PbList<BuildbucketCfg_topic> createRepeated() => $pb.PbList<BuildbucketCfg_topic>();
+  @$core.pragma('dart2js:noInline')
+  static BuildbucketCfg_topic getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BuildbucketCfg_topic>(create);
+  static BuildbucketCfg_topic? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get name => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set name($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasName() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearName() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $1.Compression get compression => $_getN(1);
+  @$pb.TagNumber(2)
+  set compression($1.Compression v) {
+    setField(2, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasCompression() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearCompression() => clearField(2);
+}
+
+class BuildbucketCfg extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BuildbucketCfg',
+      package:
+          const $pb.PackageName(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket'),
+      createEmptyInstance: create)
+    ..pc<Bucket>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'buckets', $pb.PbFieldType.PM,
+        subBuilder: Bucket.create)
+    ..pc<BuildbucketCfg_topic>(
+        4,
+        const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'buildsNotificationTopics',
+        $pb.PbFieldType.PM,
+        subBuilder: BuildbucketCfg_topic.create)
+    ..hasRequiredFields = false;
+
+  BuildbucketCfg._() : super();
+  factory BuildbucketCfg({
+    $core.Iterable<Bucket>? buckets,
+    $core.Iterable<BuildbucketCfg_topic>? buildsNotificationTopics,
+  }) {
+    final _result = create();
+    if (buckets != null) {
+      _result.buckets.addAll(buckets);
+    }
+    if (buildsNotificationTopics != null) {
+      _result.buildsNotificationTopics.addAll(buildsNotificationTopics);
+    }
+    return _result;
+  }
+  factory BuildbucketCfg.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BuildbucketCfg.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BuildbucketCfg clone() => BuildbucketCfg()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BuildbucketCfg copyWith(void Function(BuildbucketCfg) updates) =>
+      super.copyWith((message) => updates(message as BuildbucketCfg))
+          as BuildbucketCfg; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BuildbucketCfg create() => BuildbucketCfg._();
+  BuildbucketCfg createEmptyInstance() => create();
+  static $pb.PbList<BuildbucketCfg> createRepeated() => $pb.PbList<BuildbucketCfg>();
+  @$core.pragma('dart2js:noInline')
+  static BuildbucketCfg getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BuildbucketCfg>(create);
+  static BuildbucketCfg? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.List<Bucket> get buckets => $_getList(0);
+
+  @$pb.TagNumber(4)
+  $core.List<BuildbucketCfg_topic> get buildsNotificationTopics => $_getList(1);
+}
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/project_config.pbenum.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/project_config.pbenum.dart
new file mode 100644
index 0000000..3cd9a0a
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/project_config.pbenum.dart
@@ -0,0 +1,47 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/buildbucket/proto/project_config.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+// ignore_for_file: UNDEFINED_SHOWN_NAME
+import 'dart:core' as $core;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+class Toggle extends $pb.ProtobufEnum {
+  static const Toggle UNSET = Toggle._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'UNSET');
+  static const Toggle YES = Toggle._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'YES');
+  static const Toggle NO = Toggle._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'NO');
+
+  static const $core.List<Toggle> values = <Toggle>[
+    UNSET,
+    YES,
+    NO,
+  ];
+
+  static final $core.Map<$core.int, Toggle> _byValue = $pb.ProtobufEnum.initByValue(values);
+  static Toggle? valueOf($core.int value) => _byValue[value];
+
+  const Toggle._($core.int v, $core.String n) : super(v, n);
+}
+
+class Acl_Role extends $pb.ProtobufEnum {
+  static const Acl_Role READER =
+      Acl_Role._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'READER');
+  static const Acl_Role SCHEDULER =
+      Acl_Role._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'SCHEDULER');
+  static const Acl_Role WRITER =
+      Acl_Role._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'WRITER');
+
+  static const $core.List<Acl_Role> values = <Acl_Role>[
+    READER,
+    SCHEDULER,
+    WRITER,
+  ];
+
+  static final $core.Map<$core.int, Acl_Role> _byValue = $pb.ProtobufEnum.initByValue(values);
+  static Acl_Role? valueOf($core.int value) => _byValue[value];
+
+  const Acl_Role._($core.int v, $core.String n) : super(v, n);
+}
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/project_config.pbjson.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/project_config.pbjson.dart
new file mode 100644
index 0000000..c8510ce
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/project_config.pbjson.dart
@@ -0,0 +1,311 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/buildbucket/proto/project_config.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+import 'dart:core' as $core;
+import 'dart:convert' as $convert;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use toggleDescriptor instead')
+const Toggle$json = const {
+  '1': 'Toggle',
+  '2': const [
+    const {'1': 'UNSET', '2': 0},
+    const {'1': 'YES', '2': 1},
+    const {'1': 'NO', '2': 2},
+  ],
+};
+
+/// Descriptor for `Toggle`. Decode as a `google.protobuf.EnumDescriptorProto`.
+final $typed_data.Uint8List toggleDescriptor =
+    $convert.base64Decode('CgZUb2dnbGUSCQoFVU5TRVQQABIHCgNZRVMQARIGCgJOTxAC');
+@$core.Deprecated('Use aclDescriptor instead')
+const Acl$json = const {
+  '1': 'Acl',
+  '2': const [
+    const {
+      '1': 'role',
+      '3': 1,
+      '4': 1,
+      '5': 14,
+      '6': '.buildbucket.Acl.Role',
+      '8': const {'3': true},
+      '10': 'role',
+    },
+    const {
+      '1': 'group',
+      '3': 2,
+      '4': 1,
+      '5': 9,
+      '8': const {'3': true},
+      '10': 'group',
+    },
+    const {
+      '1': 'identity',
+      '3': 3,
+      '4': 1,
+      '5': 9,
+      '8': const {'3': true},
+      '10': 'identity',
+    },
+  ],
+  '4': const [Acl_Role$json],
+};
+
+@$core.Deprecated('Use aclDescriptor instead')
+const Acl_Role$json = const {
+  '1': 'Role',
+  '2': const [
+    const {'1': 'READER', '2': 0},
+    const {'1': 'SCHEDULER', '2': 1},
+    const {'1': 'WRITER', '2': 2},
+  ],
+};
+
+/// Descriptor for `Acl`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List aclDescriptor = $convert.base64Decode(
+    'CgNBY2wSLQoEcm9sZRgBIAEoDjIVLmJ1aWxkYnVja2V0LkFjbC5Sb2xlQgIYAVIEcm9sZRIYCgVncm91cBgCIAEoCUICGAFSBWdyb3VwEh4KCGlkZW50aXR5GAMgASgJQgIYAVIIaWRlbnRpdHkiLQoEUm9sZRIKCgZSRUFERVIQABINCglTQ0hFRFVMRVIQARIKCgZXUklURVIQAg==');
+@$core.Deprecated('Use builderConfigDescriptor instead')
+const BuilderConfig$json = const {
+  '1': 'BuilderConfig',
+  '2': const [
+    const {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'},
+    const {'1': 'backend', '3': 32, '4': 1, '5': 11, '6': '.buildbucket.BuilderConfig.Backend', '10': 'backend'},
+    const {'1': 'backend_alt', '3': 33, '4': 1, '5': 11, '6': '.buildbucket.BuilderConfig.Backend', '10': 'backendAlt'},
+    const {'1': 'swarming_host', '3': 21, '4': 1, '5': 9, '10': 'swarmingHost'},
+    const {'1': 'category', '3': 6, '4': 1, '5': 9, '10': 'category'},
+    const {'1': 'swarming_tags', '3': 2, '4': 3, '5': 9, '10': 'swarmingTags'},
+    const {'1': 'dimensions', '3': 3, '4': 3, '5': 9, '10': 'dimensions'},
+    const {'1': 'recipe', '3': 4, '4': 1, '5': 11, '6': '.buildbucket.BuilderConfig.Recipe', '10': 'recipe'},
+    const {'1': 'exe', '3': 23, '4': 1, '5': 11, '6': '.buildbucket.v2.Executable', '10': 'exe'},
+    const {'1': 'properties', '3': 24, '4': 1, '5': 9, '8': const {}, '10': 'properties'},
+    const {'1': 'allowed_property_overrides', '3': 34, '4': 3, '5': 9, '10': 'allowedPropertyOverrides'},
+    const {'1': 'priority', '3': 5, '4': 1, '5': 13, '10': 'priority'},
+    const {'1': 'execution_timeout_secs', '3': 7, '4': 1, '5': 13, '10': 'executionTimeoutSecs'},
+    const {'1': 'expiration_secs', '3': 20, '4': 1, '5': 13, '10': 'expirationSecs'},
+    const {'1': 'grace_period', '3': 31, '4': 1, '5': 11, '6': '.google.protobuf.Duration', '10': 'gracePeriod'},
+    const {'1': 'wait_for_capacity', '3': 29, '4': 1, '5': 14, '6': '.buildbucket.v2.Trinary', '10': 'waitForCapacity'},
+    const {'1': 'caches', '3': 9, '4': 3, '5': 11, '6': '.buildbucket.BuilderConfig.CacheEntry', '10': 'caches'},
+    const {'1': 'build_numbers', '3': 16, '4': 1, '5': 14, '6': '.buildbucket.Toggle', '10': 'buildNumbers'},
+    const {'1': 'service_account', '3': 12, '4': 1, '5': 9, '10': 'serviceAccount'},
+    const {
+      '1': 'auto_builder_dimension',
+      '3': 17,
+      '4': 1,
+      '5': 14,
+      '6': '.buildbucket.Toggle',
+      '10': 'autoBuilderDimension'
+    },
+    const {'1': 'experimental', '3': 18, '4': 1, '5': 14, '6': '.buildbucket.Toggle', '10': 'experimental'},
+    const {
+      '1': 'task_template_canary_percentage',
+      '3': 22,
+      '4': 1,
+      '5': 11,
+      '6': '.google.protobuf.UInt32Value',
+      '10': 'taskTemplateCanaryPercentage'
+    },
+    const {
+      '1': 'experiments',
+      '3': 28,
+      '4': 3,
+      '5': 11,
+      '6': '.buildbucket.BuilderConfig.ExperimentsEntry',
+      '10': 'experiments'
+    },
+    const {'1': 'critical', '3': 25, '4': 1, '5': 14, '6': '.buildbucket.v2.Trinary', '10': 'critical'},
+    const {'1': 'resultdb', '3': 26, '4': 1, '5': 11, '6': '.buildbucket.BuilderConfig.ResultDB', '10': 'resultdb'},
+    const {'1': 'description_html', '3': 30, '4': 1, '5': 9, '10': 'descriptionHtml'},
+  ],
+  '3': const [
+    BuilderConfig_CacheEntry$json,
+    BuilderConfig_Recipe$json,
+    BuilderConfig_ResultDB$json,
+    BuilderConfig_Backend$json,
+    BuilderConfig_ExperimentsEntry$json
+  ],
+  '9': const [
+    const {'1': 8, '2': 9},
+    const {'1': 11, '2': 12},
+    const {'1': 13, '2': 14},
+    const {'1': 15, '2': 16},
+    const {'1': 19, '2': 20},
+    const {'1': 27, '2': 28},
+    const {'1': 10, '2': 11},
+  ],
+};
+
+@$core.Deprecated('Use builderConfigDescriptor instead')
+const BuilderConfig_CacheEntry$json = const {
+  '1': 'CacheEntry',
+  '2': const [
+    const {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'},
+    const {'1': 'path', '3': 2, '4': 1, '5': 9, '10': 'path'},
+    const {'1': 'wait_for_warm_cache_secs', '3': 3, '4': 1, '5': 5, '10': 'waitForWarmCacheSecs'},
+    const {'1': 'env_var', '3': 4, '4': 1, '5': 9, '10': 'envVar'},
+  ],
+};
+
+@$core.Deprecated('Use builderConfigDescriptor instead')
+const BuilderConfig_Recipe$json = const {
+  '1': 'Recipe',
+  '2': const [
+    const {'1': 'name', '3': 2, '4': 1, '5': 9, '10': 'name'},
+    const {'1': 'cipd_package', '3': 6, '4': 1, '5': 9, '10': 'cipdPackage'},
+    const {'1': 'cipd_version', '3': 5, '4': 1, '5': 9, '10': 'cipdVersion'},
+    const {'1': 'properties', '3': 3, '4': 3, '5': 9, '10': 'properties'},
+    const {'1': 'properties_j', '3': 4, '4': 3, '5': 9, '10': 'propertiesJ'},
+  ],
+  '9': const [
+    const {'1': 1, '2': 2},
+  ],
+};
+
+@$core.Deprecated('Use builderConfigDescriptor instead')
+const BuilderConfig_ResultDB$json = const {
+  '1': 'ResultDB',
+  '2': const [
+    const {'1': 'enable', '3': 1, '4': 1, '5': 8, '10': 'enable'},
+    const {'1': 'bq_exports', '3': 2, '4': 3, '5': 11, '6': '.luci.resultdb.v1.BigQueryExport', '10': 'bqExports'},
+    const {
+      '1': 'history_options',
+      '3': 3,
+      '4': 1,
+      '5': 11,
+      '6': '.luci.resultdb.v1.HistoryOptions',
+      '10': 'historyOptions'
+    },
+  ],
+};
+
+@$core.Deprecated('Use builderConfigDescriptor instead')
+const BuilderConfig_Backend$json = const {
+  '1': 'Backend',
+  '2': const [
+    const {'1': 'target', '3': 1, '4': 1, '5': 9, '10': 'target'},
+    const {'1': 'config_json', '3': 2, '4': 1, '5': 9, '10': 'configJson'},
+  ],
+};
+
+@$core.Deprecated('Use builderConfigDescriptor instead')
+const BuilderConfig_ExperimentsEntry$json = const {
+  '1': 'ExperimentsEntry',
+  '2': const [
+    const {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
+    const {'1': 'value', '3': 2, '4': 1, '5': 5, '10': 'value'},
+  ],
+  '7': const {'7': true},
+};
+
+/// Descriptor for `BuilderConfig`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List builderConfigDescriptor = $convert.base64Decode(
+    'Cg1CdWlsZGVyQ29uZmlnEhIKBG5hbWUYASABKAlSBG5hbWUSPAoHYmFja2VuZBggIAEoCzIiLmJ1aWxkYnVja2V0LkJ1aWxkZXJDb25maWcuQmFja2VuZFIHYmFja2VuZBJDCgtiYWNrZW5kX2FsdBghIAEoCzIiLmJ1aWxkYnVja2V0LkJ1aWxkZXJDb25maWcuQmFja2VuZFIKYmFja2VuZEFsdBIjCg1zd2FybWluZ19ob3N0GBUgASgJUgxzd2FybWluZ0hvc3QSGgoIY2F0ZWdvcnkYBiABKAlSCGNhdGVnb3J5EiMKDXN3YXJtaW5nX3RhZ3MYAiADKAlSDHN3YXJtaW5nVGFncxIeCgpkaW1lbnNpb25zGAMgAygJUgpkaW1lbnNpb25zEjkKBnJlY2lwZRgEIAEoCzIhLmJ1aWxkYnVja2V0LkJ1aWxkZXJDb25maWcuUmVjaXBlUgZyZWNpcGUSLAoDZXhlGBcgASgLMhouYnVpbGRidWNrZXQudjIuRXhlY3V0YWJsZVIDZXhlEiQKCnByb3BlcnRpZXMYGCABKAlCBKj+IwFSCnByb3BlcnRpZXMSPAoaYWxsb3dlZF9wcm9wZXJ0eV9vdmVycmlkZXMYIiADKAlSGGFsbG93ZWRQcm9wZXJ0eU92ZXJyaWRlcxIaCghwcmlvcml0eRgFIAEoDVIIcHJpb3JpdHkSNAoWZXhlY3V0aW9uX3RpbWVvdXRfc2VjcxgHIAEoDVIUZXhlY3V0aW9uVGltZW91dFNlY3MSJwoPZXhwaXJhdGlvbl9zZWNzGBQgASgNUg5leHBpcmF0aW9uU2VjcxI8CgxncmFjZV9wZXJpb2QYHyABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25SC2dyYWNlUGVyaW9kEkMKEXdhaXRfZm9yX2NhcGFjaXR5GB0gASgOMhcuYnVpbGRidWNrZXQudjIuVHJpbmFyeVIPd2FpdEZvckNhcGFjaXR5Ej0KBmNhY2hlcxgJIAMoCzIlLmJ1aWxkYnVja2V0LkJ1aWxkZXJDb25maWcuQ2FjaGVFbnRyeVIGY2FjaGVzEjgKDWJ1aWxkX251bWJlcnMYECABKA4yEy5idWlsZGJ1Y2tldC5Ub2dnbGVSDGJ1aWxkTnVtYmVycxInCg9zZXJ2aWNlX2FjY291bnQYDCABKAlSDnNlcnZpY2VBY2NvdW50EkkKFmF1dG9fYnVpbGRlcl9kaW1lbnNpb24YESABKA4yEy5idWlsZGJ1Y2tldC5Ub2dnbGVSFGF1dG9CdWlsZGVyRGltZW5zaW9uEjcKDGV4cGVyaW1lbnRhbBgSIAEoDjITLmJ1aWxkYnVja2V0LlRvZ2dsZVIMZXhwZXJpbWVudGFsEmMKH3Rhc2tfdGVtcGxhdGVfY2FuYXJ5X3BlcmNlbnRhZ2UYFiABKAsyHC5nb29nbGUucHJvdG9idWYuVUludDMyVmFsdWVSHHRhc2tUZW1wbGF0ZUNhbmFyeVBlcmNlbnRhZ2USTQoLZXhwZXJpbWVudHMYHCADKAsyKy5idWlsZGJ1Y2tldC5CdWlsZGVyQ29uZmlnLkV4cGVyaW1lbnRzRW50cnlSC2V4cGVyaW1lbnRzEjMKCGNyaXRpY2FsGBkgASgOMhcuYnVpbGRidWNrZXQudjIuVHJpbmFyeVIIY3JpdGljYWwSPwoIcmVzdWx0ZGIYGiABKAsyIy5idWlsZGJ1Y2tldC5CdWlsZGVyQ29uZmlnLlJlc3VsdERCUghyZXN1bHRkYhIpChBkZXNjcmlwdGlvbl9odG1sGB4gASgJUg9kZXNjcmlwdGlvbkh0bWwahQEKCkNhY2hlRW50cnkSEgoEbmFtZRgBIAEoCVIEbmFtZRISCgRwYXRoGAIgASgJUgRwYXRoEjYKGHdhaXRfZm9yX3dhcm1fY2FjaGVfc2VjcxgDIAEoBVIUd2FpdEZvcldhcm1DYWNoZVNlY3MSFwoHZW52X3ZhchgEIAEoCVIGZW52VmFyGqsBCgZSZWNpcGUSEgoEbmFtZRgCIAEoCVIEbmFtZRIhCgxjaXBkX3BhY2thZ2UYBiABKAlSC2NpcGRQYWNrYWdlEiEKDGNpcGRfdmVyc2lvbhgFIAEoCVILY2lwZFZlcnNpb24SHgoKcHJvcGVydGllcxgDIAMoCVIKcHJvcGVydGllcxIhCgxwcm9wZXJ0aWVzX2oYBCADKAlSC3Byb3BlcnRpZXNKSgQIARACGq4BCghSZXN1bHREQhIWCgZlbmFibGUYASABKAhSBmVuYWJsZRI/CgpicV9leHBvcnRzGAIgAygLMiAubHVjaS5yZXN1bHRkYi52MS5CaWdRdWVyeUV4cG9ydFIJYnFFeHBvcnRzEkkKD2hpc3Rvcnlfb3B0aW9ucxgDIAEoCzIgLmx1Y2kucmVzdWx0ZGIudjEuSGlzdG9yeU9wdGlvbnNSDmhpc3RvcnlPcHRpb25zGkIKB0JhY2tlbmQSFgoGdGFyZ2V0GAEgASgJUgZ0YXJnZXQSHwoLY29uZmlnX2pzb24YAiABKAlSCmNvbmZpZ0pzb24aPgoQRXhwZXJpbWVudHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoBVIFdmFsdWU6AjgBSgQICBAJSgQICxAMSgQIDRAOSgQIDxAQSgQIExAUSgQIGxAcSgQIChAL');
+@$core.Deprecated('Use swarmingDescriptor instead')
+const Swarming$json = const {
+  '1': 'Swarming',
+  '2': const [
+    const {'1': 'builders', '3': 4, '4': 3, '5': 11, '6': '.buildbucket.BuilderConfig', '10': 'builders'},
+    const {
+      '1': 'task_template_canary_percentage',
+      '3': 5,
+      '4': 1,
+      '5': 11,
+      '6': '.google.protobuf.UInt32Value',
+      '10': 'taskTemplateCanaryPercentage'
+    },
+  ],
+  '9': const [
+    const {'1': 1, '2': 2},
+    const {'1': 2, '2': 3},
+    const {'1': 3, '2': 4},
+  ],
+};
+
+/// Descriptor for `Swarming`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List swarmingDescriptor = $convert.base64Decode(
+    'CghTd2FybWluZxI2CghidWlsZGVycxgEIAMoCzIaLmJ1aWxkYnVja2V0LkJ1aWxkZXJDb25maWdSCGJ1aWxkZXJzEmMKH3Rhc2tfdGVtcGxhdGVfY2FuYXJ5X3BlcmNlbnRhZ2UYBSABKAsyHC5nb29nbGUucHJvdG9idWYuVUludDMyVmFsdWVSHHRhc2tUZW1wbGF0ZUNhbmFyeVBlcmNlbnRhZ2VKBAgBEAJKBAgCEANKBAgDEAQ=');
+@$core.Deprecated('Use bucketDescriptor instead')
+const Bucket$json = const {
+  '1': 'Bucket',
+  '2': const [
+    const {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'},
+    const {
+      '1': 'acls',
+      '3': 2,
+      '4': 3,
+      '5': 11,
+      '6': '.buildbucket.Acl',
+      '8': const {'3': true},
+      '10': 'acls',
+    },
+    const {'1': 'swarming', '3': 3, '4': 1, '5': 11, '6': '.buildbucket.Swarming', '10': 'swarming'},
+    const {'1': 'shadow', '3': 5, '4': 1, '5': 9, '10': 'shadow'},
+    const {'1': 'constraints', '3': 6, '4': 1, '5': 11, '6': '.buildbucket.Bucket.Constraints', '10': 'constraints'},
+    const {
+      '1': 'dynamic_builder_template',
+      '3': 7,
+      '4': 1,
+      '5': 11,
+      '6': '.buildbucket.Bucket.DynamicBuilderTemplate',
+      '10': 'dynamicBuilderTemplate'
+    },
+  ],
+  '3': const [Bucket_Constraints$json, Bucket_DynamicBuilderTemplate$json],
+  '9': const [
+    const {'1': 4, '2': 5},
+  ],
+};
+
+@$core.Deprecated('Use bucketDescriptor instead')
+const Bucket_Constraints$json = const {
+  '1': 'Constraints',
+  '2': const [
+    const {'1': 'pools', '3': 1, '4': 3, '5': 9, '10': 'pools'},
+    const {'1': 'service_accounts', '3': 2, '4': 3, '5': 9, '10': 'serviceAccounts'},
+  ],
+};
+
+@$core.Deprecated('Use bucketDescriptor instead')
+const Bucket_DynamicBuilderTemplate$json = const {
+  '1': 'DynamicBuilderTemplate',
+};
+
+/// Descriptor for `Bucket`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List bucketDescriptor = $convert.base64Decode(
+    'CgZCdWNrZXQSEgoEbmFtZRgBIAEoCVIEbmFtZRIoCgRhY2xzGAIgAygLMhAuYnVpbGRidWNrZXQuQWNsQgIYAVIEYWNscxIxCghzd2FybWluZxgDIAEoCzIVLmJ1aWxkYnVja2V0LlN3YXJtaW5nUghzd2FybWluZxIWCgZzaGFkb3cYBSABKAlSBnNoYWRvdxJBCgtjb25zdHJhaW50cxgGIAEoCzIfLmJ1aWxkYnVja2V0LkJ1Y2tldC5Db25zdHJhaW50c1ILY29uc3RyYWludHMSZAoYZHluYW1pY19idWlsZGVyX3RlbXBsYXRlGAcgASgLMiouYnVpbGRidWNrZXQuQnVja2V0LkR5bmFtaWNCdWlsZGVyVGVtcGxhdGVSFmR5bmFtaWNCdWlsZGVyVGVtcGxhdGUaTgoLQ29uc3RyYWludHMSFAoFcG9vbHMYASADKAlSBXBvb2xzEikKEHNlcnZpY2VfYWNjb3VudHMYAiADKAlSD3NlcnZpY2VBY2NvdW50cxoYChZEeW5hbWljQnVpbGRlclRlbXBsYXRlSgQIBBAF');
+@$core.Deprecated('Use buildbucketCfgDescriptor instead')
+const BuildbucketCfg$json = const {
+  '1': 'BuildbucketCfg',
+  '2': const [
+    const {'1': 'buckets', '3': 1, '4': 3, '5': 11, '6': '.buildbucket.Bucket', '10': 'buckets'},
+    const {
+      '1': 'builds_notification_topics',
+      '3': 4,
+      '4': 3,
+      '5': 11,
+      '6': '.buildbucket.BuildbucketCfg.topic',
+      '10': 'buildsNotificationTopics'
+    },
+  ],
+  '3': const [BuildbucketCfg_topic$json],
+  '9': const [
+    const {'1': 2, '2': 3},
+    const {'1': 3, '2': 4},
+  ],
+};
+
+@$core.Deprecated('Use buildbucketCfgDescriptor instead')
+const BuildbucketCfg_topic$json = const {
+  '1': 'topic',
+  '2': const [
+    const {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'},
+    const {'1': 'compression', '3': 2, '4': 1, '5': 14, '6': '.buildbucket.v2.Compression', '10': 'compression'},
+  ],
+};
+
+/// Descriptor for `BuildbucketCfg`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List buildbucketCfgDescriptor = $convert.base64Decode(
+    'Cg5CdWlsZGJ1Y2tldENmZxItCgdidWNrZXRzGAEgAygLMhMuYnVpbGRidWNrZXQuQnVja2V0UgdidWNrZXRzEl8KGmJ1aWxkc19ub3RpZmljYXRpb25fdG9waWNzGAQgAygLMiEuYnVpbGRidWNrZXQuQnVpbGRidWNrZXRDZmcudG9waWNSGGJ1aWxkc05vdGlmaWNhdGlvblRvcGljcxpaCgV0b3BpYxISCgRuYW1lGAEgASgJUgRuYW1lEj0KC2NvbXByZXNzaW9uGAIgASgOMhsuYnVpbGRidWNrZXQudjIuQ29tcHJlc3Npb25SC2NvbXByZXNzaW9uSgQIAhADSgQIAxAE');
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/project_config.pbserver.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/project_config.pbserver.dart
new file mode 100644
index 0000000..b1b47d3
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/project_config.pbserver.dart
@@ -0,0 +1,8 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/buildbucket/proto/project_config.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+export 'project_config.pb.dart';
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/step.pb.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/step.pb.dart
new file mode 100644
index 0000000..dbbad57
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/step.pb.dart
@@ -0,0 +1,257 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/buildbucket/proto/step.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+import 'dart:core' as $core;
+
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import '../../../../google/protobuf/timestamp.pb.dart' as $0;
+import 'common.pb.dart' as $1;
+
+import 'common.pbenum.dart' as $1;
+
+class Step_MergeBuild extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Step.MergeBuild',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fromLogdogStream')
+    ..aOB(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'legacyGlobalNamespace')
+    ..hasRequiredFields = false;
+
+  Step_MergeBuild._() : super();
+  factory Step_MergeBuild({
+    $core.String? fromLogdogStream,
+    $core.bool? legacyGlobalNamespace,
+  }) {
+    final _result = create();
+    if (fromLogdogStream != null) {
+      _result.fromLogdogStream = fromLogdogStream;
+    }
+    if (legacyGlobalNamespace != null) {
+      _result.legacyGlobalNamespace = legacyGlobalNamespace;
+    }
+    return _result;
+  }
+  factory Step_MergeBuild.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory Step_MergeBuild.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  Step_MergeBuild clone() => Step_MergeBuild()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  Step_MergeBuild copyWith(void Function(Step_MergeBuild) updates) =>
+      super.copyWith((message) => updates(message as Step_MergeBuild))
+          as Step_MergeBuild; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Step_MergeBuild create() => Step_MergeBuild._();
+  Step_MergeBuild createEmptyInstance() => create();
+  static $pb.PbList<Step_MergeBuild> createRepeated() => $pb.PbList<Step_MergeBuild>();
+  @$core.pragma('dart2js:noInline')
+  static Step_MergeBuild getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Step_MergeBuild>(create);
+  static Step_MergeBuild? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get fromLogdogStream => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set fromLogdogStream($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasFromLogdogStream() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearFromLogdogStream() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.bool get legacyGlobalNamespace => $_getBF(1);
+  @$pb.TagNumber(2)
+  set legacyGlobalNamespace($core.bool v) {
+    $_setBool(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasLegacyGlobalNamespace() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearLegacyGlobalNamespace() => clearField(2);
+}
+
+class Step extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Step',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name')
+    ..aOM<$0.Timestamp>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'startTime',
+        subBuilder: $0.Timestamp.create)
+    ..aOM<$0.Timestamp>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'endTime',
+        subBuilder: $0.Timestamp.create)
+    ..e<$1.Status>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'status', $pb.PbFieldType.OE,
+        defaultOrMaker: $1.Status.STATUS_UNSPECIFIED, valueOf: $1.Status.valueOf, enumValues: $1.Status.values)
+    ..pc<$1.Log>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'logs', $pb.PbFieldType.PM,
+        subBuilder: $1.Log.create)
+    ..aOM<Step_MergeBuild>(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'mergeBuild',
+        subBuilder: Step_MergeBuild.create)
+    ..aOS(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'summaryMarkdown')
+    ..pc<$1.StringPair>(
+        8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'tags', $pb.PbFieldType.PM,
+        subBuilder: $1.StringPair.create)
+    ..hasRequiredFields = false;
+
+  Step._() : super();
+  factory Step({
+    $core.String? name,
+    $0.Timestamp? startTime,
+    $0.Timestamp? endTime,
+    $1.Status? status,
+    $core.Iterable<$1.Log>? logs,
+    Step_MergeBuild? mergeBuild,
+    $core.String? summaryMarkdown,
+    $core.Iterable<$1.StringPair>? tags,
+  }) {
+    final _result = create();
+    if (name != null) {
+      _result.name = name;
+    }
+    if (startTime != null) {
+      _result.startTime = startTime;
+    }
+    if (endTime != null) {
+      _result.endTime = endTime;
+    }
+    if (status != null) {
+      _result.status = status;
+    }
+    if (logs != null) {
+      _result.logs.addAll(logs);
+    }
+    if (mergeBuild != null) {
+      _result.mergeBuild = mergeBuild;
+    }
+    if (summaryMarkdown != null) {
+      _result.summaryMarkdown = summaryMarkdown;
+    }
+    if (tags != null) {
+      _result.tags.addAll(tags);
+    }
+    return _result;
+  }
+  factory Step.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory Step.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  Step clone() => Step()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  Step copyWith(void Function(Step) updates) =>
+      super.copyWith((message) => updates(message as Step)) as Step; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Step create() => Step._();
+  Step createEmptyInstance() => create();
+  static $pb.PbList<Step> createRepeated() => $pb.PbList<Step>();
+  @$core.pragma('dart2js:noInline')
+  static Step getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Step>(create);
+  static Step? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get name => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set name($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasName() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearName() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $0.Timestamp get startTime => $_getN(1);
+  @$pb.TagNumber(2)
+  set startTime($0.Timestamp v) {
+    setField(2, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasStartTime() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearStartTime() => clearField(2);
+  @$pb.TagNumber(2)
+  $0.Timestamp ensureStartTime() => $_ensure(1);
+
+  @$pb.TagNumber(3)
+  $0.Timestamp get endTime => $_getN(2);
+  @$pb.TagNumber(3)
+  set endTime($0.Timestamp v) {
+    setField(3, v);
+  }
+
+  @$pb.TagNumber(3)
+  $core.bool hasEndTime() => $_has(2);
+  @$pb.TagNumber(3)
+  void clearEndTime() => clearField(3);
+  @$pb.TagNumber(3)
+  $0.Timestamp ensureEndTime() => $_ensure(2);
+
+  @$pb.TagNumber(4)
+  $1.Status get status => $_getN(3);
+  @$pb.TagNumber(4)
+  set status($1.Status v) {
+    setField(4, v);
+  }
+
+  @$pb.TagNumber(4)
+  $core.bool hasStatus() => $_has(3);
+  @$pb.TagNumber(4)
+  void clearStatus() => clearField(4);
+
+  @$pb.TagNumber(5)
+  $core.List<$1.Log> get logs => $_getList(4);
+
+  @$pb.TagNumber(6)
+  Step_MergeBuild get mergeBuild => $_getN(5);
+  @$pb.TagNumber(6)
+  set mergeBuild(Step_MergeBuild v) {
+    setField(6, v);
+  }
+
+  @$pb.TagNumber(6)
+  $core.bool hasMergeBuild() => $_has(5);
+  @$pb.TagNumber(6)
+  void clearMergeBuild() => clearField(6);
+  @$pb.TagNumber(6)
+  Step_MergeBuild ensureMergeBuild() => $_ensure(5);
+
+  @$pb.TagNumber(7)
+  $core.String get summaryMarkdown => $_getSZ(6);
+  @$pb.TagNumber(7)
+  set summaryMarkdown($core.String v) {
+    $_setString(6, v);
+  }
+
+  @$pb.TagNumber(7)
+  $core.bool hasSummaryMarkdown() => $_has(6);
+  @$pb.TagNumber(7)
+  void clearSummaryMarkdown() => clearField(7);
+
+  @$pb.TagNumber(8)
+  $core.List<$1.StringPair> get tags => $_getList(7);
+}
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/step.pbenum.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/step.pbenum.dart
new file mode 100644
index 0000000..8b12a88
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/step.pbenum.dart
@@ -0,0 +1,6 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/buildbucket/proto/step.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/step.pbjson.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/step.pbjson.dart
new file mode 100644
index 0000000..490b7c3
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/step.pbjson.dart
@@ -0,0 +1,39 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/buildbucket/proto/step.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+import 'dart:core' as $core;
+import 'dart:convert' as $convert;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use stepDescriptor instead')
+const Step$json = const {
+  '1': 'Step',
+  '2': const [
+    const {'1': 'name', '3': 1, '4': 1, '5': 9, '10': 'name'},
+    const {'1': 'start_time', '3': 2, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '10': 'startTime'},
+    const {'1': 'end_time', '3': 3, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '10': 'endTime'},
+    const {'1': 'status', '3': 4, '4': 1, '5': 14, '6': '.buildbucket.v2.Status', '10': 'status'},
+    const {'1': 'logs', '3': 5, '4': 3, '5': 11, '6': '.buildbucket.v2.Log', '10': 'logs'},
+    const {'1': 'merge_build', '3': 6, '4': 1, '5': 11, '6': '.buildbucket.v2.Step.MergeBuild', '10': 'mergeBuild'},
+    const {'1': 'summary_markdown', '3': 7, '4': 1, '5': 9, '10': 'summaryMarkdown'},
+    const {'1': 'tags', '3': 8, '4': 3, '5': 11, '6': '.buildbucket.v2.StringPair', '10': 'tags'},
+  ],
+  '3': const [Step_MergeBuild$json],
+};
+
+@$core.Deprecated('Use stepDescriptor instead')
+const Step_MergeBuild$json = const {
+  '1': 'MergeBuild',
+  '2': const [
+    const {'1': 'from_logdog_stream', '3': 1, '4': 1, '5': 9, '10': 'fromLogdogStream'},
+    const {'1': 'legacy_global_namespace', '3': 2, '4': 1, '5': 8, '10': 'legacyGlobalNamespace'},
+  ],
+};
+
+/// Descriptor for `Step`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List stepDescriptor = $convert.base64Decode(
+    'CgRTdGVwEhIKBG5hbWUYASABKAlSBG5hbWUSOQoKc3RhcnRfdGltZRgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSCXN0YXJ0VGltZRI1CghlbmRfdGltZRgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBSB2VuZFRpbWUSLgoGc3RhdHVzGAQgASgOMhYuYnVpbGRidWNrZXQudjIuU3RhdHVzUgZzdGF0dXMSJwoEbG9ncxgFIAMoCzITLmJ1aWxkYnVja2V0LnYyLkxvZ1IEbG9ncxJACgttZXJnZV9idWlsZBgGIAEoCzIfLmJ1aWxkYnVja2V0LnYyLlN0ZXAuTWVyZ2VCdWlsZFIKbWVyZ2VCdWlsZBIpChBzdW1tYXJ5X21hcmtkb3duGAcgASgJUg9zdW1tYXJ5TWFya2Rvd24SLgoEdGFncxgIIAMoCzIaLmJ1aWxkYnVja2V0LnYyLlN0cmluZ1BhaXJSBHRhZ3MacgoKTWVyZ2VCdWlsZBIsChJmcm9tX2xvZ2RvZ19zdHJlYW0YASABKAlSEGZyb21Mb2dkb2dTdHJlYW0SNgoXbGVnYWN5X2dsb2JhbF9uYW1lc3BhY2UYAiABKAhSFWxlZ2FjeUdsb2JhbE5hbWVzcGFjZQ==');
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/step.pbserver.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/step.pbserver.dart
new file mode 100644
index 0000000..9f46e58
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/step.pbserver.dart
@@ -0,0 +1,8 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/buildbucket/proto/step.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+export 'step.pb.dart';
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/task.pb.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/task.pb.dart
new file mode 100644
index 0000000..c0d53ff
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/task.pb.dart
@@ -0,0 +1,235 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/buildbucket/proto/task.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+import 'dart:core' as $core;
+
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'common.pb.dart' as $0;
+import '../../../../google/protobuf/struct.pb.dart' as $1;
+
+import 'common.pbenum.dart' as $0;
+
+class Task extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Task',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOM<TaskID>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id',
+        subBuilder: TaskID.create)
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'link')
+    ..e<$0.Status>(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'status', $pb.PbFieldType.OE,
+        defaultOrMaker: $0.Status.STATUS_UNSPECIFIED, valueOf: $0.Status.valueOf, enumValues: $0.Status.values)
+    ..aOM<$0.StatusDetails>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'statusDetails',
+        subBuilder: $0.StatusDetails.create)
+    ..aOS(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'summaryHtml')
+    ..aOM<$1.Struct>(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'details',
+        subBuilder: $1.Struct.create)
+    ..hasRequiredFields = false;
+
+  Task._() : super();
+  factory Task({
+    TaskID? id,
+    $core.String? link,
+    $0.Status? status,
+    $0.StatusDetails? statusDetails,
+    $core.String? summaryHtml,
+    $1.Struct? details,
+  }) {
+    final _result = create();
+    if (id != null) {
+      _result.id = id;
+    }
+    if (link != null) {
+      _result.link = link;
+    }
+    if (status != null) {
+      _result.status = status;
+    }
+    if (statusDetails != null) {
+      _result.statusDetails = statusDetails;
+    }
+    if (summaryHtml != null) {
+      _result.summaryHtml = summaryHtml;
+    }
+    if (details != null) {
+      _result.details = details;
+    }
+    return _result;
+  }
+  factory Task.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory Task.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  Task clone() => Task()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  Task copyWith(void Function(Task) updates) =>
+      super.copyWith((message) => updates(message as Task)) as Task; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Task create() => Task._();
+  Task createEmptyInstance() => create();
+  static $pb.PbList<Task> createRepeated() => $pb.PbList<Task>();
+  @$core.pragma('dart2js:noInline')
+  static Task getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Task>(create);
+  static Task? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  TaskID get id => $_getN(0);
+  @$pb.TagNumber(1)
+  set id(TaskID v) {
+    setField(1, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasId() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearId() => clearField(1);
+  @$pb.TagNumber(1)
+  TaskID ensureId() => $_ensure(0);
+
+  @$pb.TagNumber(2)
+  $core.String get link => $_getSZ(1);
+  @$pb.TagNumber(2)
+  set link($core.String v) {
+    $_setString(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasLink() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearLink() => clearField(2);
+
+  @$pb.TagNumber(3)
+  $0.Status get status => $_getN(2);
+  @$pb.TagNumber(3)
+  set status($0.Status v) {
+    setField(3, v);
+  }
+
+  @$pb.TagNumber(3)
+  $core.bool hasStatus() => $_has(2);
+  @$pb.TagNumber(3)
+  void clearStatus() => clearField(3);
+
+  @$pb.TagNumber(4)
+  $0.StatusDetails get statusDetails => $_getN(3);
+  @$pb.TagNumber(4)
+  set statusDetails($0.StatusDetails v) {
+    setField(4, v);
+  }
+
+  @$pb.TagNumber(4)
+  $core.bool hasStatusDetails() => $_has(3);
+  @$pb.TagNumber(4)
+  void clearStatusDetails() => clearField(4);
+  @$pb.TagNumber(4)
+  $0.StatusDetails ensureStatusDetails() => $_ensure(3);
+
+  @$pb.TagNumber(5)
+  $core.String get summaryHtml => $_getSZ(4);
+  @$pb.TagNumber(5)
+  set summaryHtml($core.String v) {
+    $_setString(4, v);
+  }
+
+  @$pb.TagNumber(5)
+  $core.bool hasSummaryHtml() => $_has(4);
+  @$pb.TagNumber(5)
+  void clearSummaryHtml() => clearField(5);
+
+  @$pb.TagNumber(6)
+  $1.Struct get details => $_getN(5);
+  @$pb.TagNumber(6)
+  set details($1.Struct v) {
+    setField(6, v);
+  }
+
+  @$pb.TagNumber(6)
+  $core.bool hasDetails() => $_has(5);
+  @$pb.TagNumber(6)
+  void clearDetails() => clearField(6);
+  @$pb.TagNumber(6)
+  $1.Struct ensureDetails() => $_ensure(5);
+}
+
+class TaskID extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'TaskID',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'buildbucket.v2'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'target')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'id')
+    ..hasRequiredFields = false;
+
+  TaskID._() : super();
+  factory TaskID({
+    $core.String? target,
+    $core.String? id,
+  }) {
+    final _result = create();
+    if (target != null) {
+      _result.target = target;
+    }
+    if (id != null) {
+      _result.id = id;
+    }
+    return _result;
+  }
+  factory TaskID.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory TaskID.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  TaskID clone() => TaskID()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  TaskID copyWith(void Function(TaskID) updates) =>
+      super.copyWith((message) => updates(message as TaskID)) as TaskID; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static TaskID create() => TaskID._();
+  TaskID createEmptyInstance() => create();
+  static $pb.PbList<TaskID> createRepeated() => $pb.PbList<TaskID>();
+  @$core.pragma('dart2js:noInline')
+  static TaskID getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TaskID>(create);
+  static TaskID? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get target => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set target($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasTarget() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearTarget() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.String get id => $_getSZ(1);
+  @$pb.TagNumber(2)
+  set id($core.String v) {
+    $_setString(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasId() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearId() => clearField(2);
+}
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/task.pbenum.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/task.pbenum.dart
new file mode 100644
index 0000000..1e3c418
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/task.pbenum.dart
@@ -0,0 +1,6 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/buildbucket/proto/task.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/task.pbjson.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/task.pbjson.dart
new file mode 100644
index 0000000..ab25403
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/task.pbjson.dart
@@ -0,0 +1,39 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/buildbucket/proto/task.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+import 'dart:core' as $core;
+import 'dart:convert' as $convert;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use taskDescriptor instead')
+const Task$json = const {
+  '1': 'Task',
+  '2': const [
+    const {'1': 'id', '3': 1, '4': 1, '5': 11, '6': '.buildbucket.v2.TaskID', '10': 'id'},
+    const {'1': 'link', '3': 2, '4': 1, '5': 9, '10': 'link'},
+    const {'1': 'status', '3': 3, '4': 1, '5': 14, '6': '.buildbucket.v2.Status', '10': 'status'},
+    const {'1': 'status_details', '3': 4, '4': 1, '5': 11, '6': '.buildbucket.v2.StatusDetails', '10': 'statusDetails'},
+    const {'1': 'summary_html', '3': 5, '4': 1, '5': 9, '10': 'summaryHtml'},
+    const {'1': 'details', '3': 6, '4': 1, '5': 11, '6': '.google.protobuf.Struct', '10': 'details'},
+  ],
+};
+
+/// Descriptor for `Task`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List taskDescriptor = $convert.base64Decode(
+    'CgRUYXNrEiYKAmlkGAEgASgLMhYuYnVpbGRidWNrZXQudjIuVGFza0lEUgJpZBISCgRsaW5rGAIgASgJUgRsaW5rEi4KBnN0YXR1cxgDIAEoDjIWLmJ1aWxkYnVja2V0LnYyLlN0YXR1c1IGc3RhdHVzEkQKDnN0YXR1c19kZXRhaWxzGAQgASgLMh0uYnVpbGRidWNrZXQudjIuU3RhdHVzRGV0YWlsc1INc3RhdHVzRGV0YWlscxIhCgxzdW1tYXJ5X2h0bWwYBSABKAlSC3N1bW1hcnlIdG1sEjEKB2RldGFpbHMYBiABKAsyFy5nb29nbGUucHJvdG9idWYuU3RydWN0UgdkZXRhaWxz');
+@$core.Deprecated('Use taskIDDescriptor instead')
+const TaskID$json = const {
+  '1': 'TaskID',
+  '2': const [
+    const {'1': 'target', '3': 1, '4': 1, '5': 9, '10': 'target'},
+    const {'1': 'id', '3': 2, '4': 1, '5': 9, '10': 'id'},
+  ],
+};
+
+/// Descriptor for `TaskID`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List taskIDDescriptor =
+    $convert.base64Decode('CgZUYXNrSUQSFgoGdGFyZ2V0GAEgASgJUgZ0YXJnZXQSDgoCaWQYAiABKAlSAmlk');
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/task.pbserver.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/task.pbserver.dart
new file mode 100644
index 0000000..028d314
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/buildbucket/proto/task.pbserver.dart
@@ -0,0 +1,8 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/buildbucket/proto/task.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+export 'task.pb.dart';
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/common.pb.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/common.pb.dart
new file mode 100644
index 0000000..9845d14
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/common.pb.dart
@@ -0,0 +1,396 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/resultdb/proto/v1/common.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import '../../../../../google/protobuf/timestamp.pb.dart' as $0;
+
+class Variant extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Variant',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'luci.resultdb.v1'),
+      createEmptyInstance: create)
+    ..m<$core.String, $core.String>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'def',
+        entryClassName: 'Variant.DefEntry',
+        keyFieldType: $pb.PbFieldType.OS,
+        valueFieldType: $pb.PbFieldType.OS,
+        packageName: const $pb.PackageName('luci.resultdb.v1'))
+    ..hasRequiredFields = false;
+
+  Variant._() : super();
+  factory Variant({
+    $core.Map<$core.String, $core.String>? def,
+  }) {
+    final _result = create();
+    if (def != null) {
+      _result.def.addAll(def);
+    }
+    return _result;
+  }
+  factory Variant.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory Variant.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  Variant clone() => Variant()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  Variant copyWith(void Function(Variant) updates) =>
+      super.copyWith((message) => updates(message as Variant)) as Variant; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Variant create() => Variant._();
+  Variant createEmptyInstance() => create();
+  static $pb.PbList<Variant> createRepeated() => $pb.PbList<Variant>();
+  @$core.pragma('dart2js:noInline')
+  static Variant getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Variant>(create);
+  static Variant? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.Map<$core.String, $core.String> get def => $_getMap(0);
+}
+
+class StringPair extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'StringPair',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'luci.resultdb.v1'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'key')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'value')
+    ..hasRequiredFields = false;
+
+  StringPair._() : super();
+  factory StringPair({
+    $core.String? key,
+    $core.String? value,
+  }) {
+    final _result = create();
+    if (key != null) {
+      _result.key = key;
+    }
+    if (value != null) {
+      _result.value = value;
+    }
+    return _result;
+  }
+  factory StringPair.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory StringPair.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  StringPair clone() => StringPair()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  StringPair copyWith(void Function(StringPair) updates) =>
+      super.copyWith((message) => updates(message as StringPair)) as StringPair; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static StringPair create() => StringPair._();
+  StringPair createEmptyInstance() => create();
+  static $pb.PbList<StringPair> createRepeated() => $pb.PbList<StringPair>();
+  @$core.pragma('dart2js:noInline')
+  static StringPair getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<StringPair>(create);
+  static StringPair? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get key => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set key($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasKey() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearKey() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.String get value => $_getSZ(1);
+  @$pb.TagNumber(2)
+  set value($core.String v) {
+    $_setString(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasValue() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearValue() => clearField(2);
+}
+
+class CommitPosition extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CommitPosition',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'luci.resultdb.v1'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'host')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'project')
+    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'ref')
+    ..aInt64(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'position')
+    ..hasRequiredFields = false;
+
+  CommitPosition._() : super();
+  factory CommitPosition({
+    $core.String? host,
+    $core.String? project,
+    $core.String? ref,
+    $fixnum.Int64? position,
+  }) {
+    final _result = create();
+    if (host != null) {
+      _result.host = host;
+    }
+    if (project != null) {
+      _result.project = project;
+    }
+    if (ref != null) {
+      _result.ref = ref;
+    }
+    if (position != null) {
+      _result.position = position;
+    }
+    return _result;
+  }
+  factory CommitPosition.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory CommitPosition.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  CommitPosition clone() => CommitPosition()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  CommitPosition copyWith(void Function(CommitPosition) updates) =>
+      super.copyWith((message) => updates(message as CommitPosition))
+          as CommitPosition; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static CommitPosition create() => CommitPosition._();
+  CommitPosition createEmptyInstance() => create();
+  static $pb.PbList<CommitPosition> createRepeated() => $pb.PbList<CommitPosition>();
+  @$core.pragma('dart2js:noInline')
+  static CommitPosition getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CommitPosition>(create);
+  static CommitPosition? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get host => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set host($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasHost() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearHost() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.String get project => $_getSZ(1);
+  @$pb.TagNumber(2)
+  set project($core.String v) {
+    $_setString(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasProject() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearProject() => clearField(2);
+
+  @$pb.TagNumber(3)
+  $core.String get ref => $_getSZ(2);
+  @$pb.TagNumber(3)
+  set ref($core.String v) {
+    $_setString(2, v);
+  }
+
+  @$pb.TagNumber(3)
+  $core.bool hasRef() => $_has(2);
+  @$pb.TagNumber(3)
+  void clearRef() => clearField(3);
+
+  @$pb.TagNumber(4)
+  $fixnum.Int64 get position => $_getI64(3);
+  @$pb.TagNumber(4)
+  set position($fixnum.Int64 v) {
+    $_setInt64(3, v);
+  }
+
+  @$pb.TagNumber(4)
+  $core.bool hasPosition() => $_has(3);
+  @$pb.TagNumber(4)
+  void clearPosition() => clearField(4);
+}
+
+class CommitPositionRange extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'CommitPositionRange',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'luci.resultdb.v1'),
+      createEmptyInstance: create)
+    ..aOM<CommitPosition>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'earliest',
+        subBuilder: CommitPosition.create)
+    ..aOM<CommitPosition>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'latest',
+        subBuilder: CommitPosition.create)
+    ..hasRequiredFields = false;
+
+  CommitPositionRange._() : super();
+  factory CommitPositionRange({
+    CommitPosition? earliest,
+    CommitPosition? latest,
+  }) {
+    final _result = create();
+    if (earliest != null) {
+      _result.earliest = earliest;
+    }
+    if (latest != null) {
+      _result.latest = latest;
+    }
+    return _result;
+  }
+  factory CommitPositionRange.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory CommitPositionRange.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  CommitPositionRange clone() => CommitPositionRange()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  CommitPositionRange copyWith(void Function(CommitPositionRange) updates) =>
+      super.copyWith((message) => updates(message as CommitPositionRange))
+          as CommitPositionRange; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static CommitPositionRange create() => CommitPositionRange._();
+  CommitPositionRange createEmptyInstance() => create();
+  static $pb.PbList<CommitPositionRange> createRepeated() => $pb.PbList<CommitPositionRange>();
+  @$core.pragma('dart2js:noInline')
+  static CommitPositionRange getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<CommitPositionRange>(create);
+  static CommitPositionRange? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  CommitPosition get earliest => $_getN(0);
+  @$pb.TagNumber(1)
+  set earliest(CommitPosition v) {
+    setField(1, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasEarliest() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearEarliest() => clearField(1);
+  @$pb.TagNumber(1)
+  CommitPosition ensureEarliest() => $_ensure(0);
+
+  @$pb.TagNumber(2)
+  CommitPosition get latest => $_getN(1);
+  @$pb.TagNumber(2)
+  set latest(CommitPosition v) {
+    setField(2, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasLatest() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearLatest() => clearField(2);
+  @$pb.TagNumber(2)
+  CommitPosition ensureLatest() => $_ensure(1);
+}
+
+class TimeRange extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'TimeRange',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'luci.resultdb.v1'),
+      createEmptyInstance: create)
+    ..aOM<$0.Timestamp>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'earliest',
+        subBuilder: $0.Timestamp.create)
+    ..aOM<$0.Timestamp>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'latest',
+        subBuilder: $0.Timestamp.create)
+    ..hasRequiredFields = false;
+
+  TimeRange._() : super();
+  factory TimeRange({
+    $0.Timestamp? earliest,
+    $0.Timestamp? latest,
+  }) {
+    final _result = create();
+    if (earliest != null) {
+      _result.earliest = earliest;
+    }
+    if (latest != null) {
+      _result.latest = latest;
+    }
+    return _result;
+  }
+  factory TimeRange.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory TimeRange.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  TimeRange clone() => TimeRange()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  TimeRange copyWith(void Function(TimeRange) updates) =>
+      super.copyWith((message) => updates(message as TimeRange)) as TimeRange; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static TimeRange create() => TimeRange._();
+  TimeRange createEmptyInstance() => create();
+  static $pb.PbList<TimeRange> createRepeated() => $pb.PbList<TimeRange>();
+  @$core.pragma('dart2js:noInline')
+  static TimeRange getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TimeRange>(create);
+  static TimeRange? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $0.Timestamp get earliest => $_getN(0);
+  @$pb.TagNumber(1)
+  set earliest($0.Timestamp v) {
+    setField(1, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasEarliest() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearEarliest() => clearField(1);
+  @$pb.TagNumber(1)
+  $0.Timestamp ensureEarliest() => $_ensure(0);
+
+  @$pb.TagNumber(2)
+  $0.Timestamp get latest => $_getN(1);
+  @$pb.TagNumber(2)
+  set latest($0.Timestamp v) {
+    setField(2, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasLatest() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearLatest() => clearField(2);
+  @$pb.TagNumber(2)
+  $0.Timestamp ensureLatest() => $_ensure(1);
+}
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/common.pbenum.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/common.pbenum.dart
new file mode 100644
index 0000000..957d07d
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/common.pbenum.dart
@@ -0,0 +1,6 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/resultdb/proto/v1/common.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/common.pbjson.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/common.pbjson.dart
new file mode 100644
index 0000000..30b2e27
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/common.pbjson.dart
@@ -0,0 +1,83 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/resultdb/proto/v1/common.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+import 'dart:core' as $core;
+import 'dart:convert' as $convert;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use variantDescriptor instead')
+const Variant$json = const {
+  '1': 'Variant',
+  '2': const [
+    const {'1': 'def', '3': 1, '4': 3, '5': 11, '6': '.luci.resultdb.v1.Variant.DefEntry', '10': 'def'},
+  ],
+  '3': const [Variant_DefEntry$json],
+};
+
+@$core.Deprecated('Use variantDescriptor instead')
+const Variant_DefEntry$json = const {
+  '1': 'DefEntry',
+  '2': const [
+    const {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
+    const {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},
+  ],
+  '7': const {'7': true},
+};
+
+/// Descriptor for `Variant`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List variantDescriptor = $convert.base64Decode(
+    'CgdWYXJpYW50EjQKA2RlZhgBIAMoCzIiLmx1Y2kucmVzdWx0ZGIudjEuVmFyaWFudC5EZWZFbnRyeVIDZGVmGjYKCERlZkVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAE=');
+@$core.Deprecated('Use stringPairDescriptor instead')
+const StringPair$json = const {
+  '1': 'StringPair',
+  '2': const [
+    const {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
+    const {'1': 'value', '3': 2, '4': 1, '5': 9, '10': 'value'},
+  ],
+};
+
+/// Descriptor for `StringPair`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List stringPairDescriptor =
+    $convert.base64Decode('CgpTdHJpbmdQYWlyEhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZQ==');
+@$core.Deprecated('Use commitPositionDescriptor instead')
+const CommitPosition$json = const {
+  '1': 'CommitPosition',
+  '2': const [
+    const {'1': 'host', '3': 1, '4': 1, '5': 9, '10': 'host'},
+    const {'1': 'project', '3': 2, '4': 1, '5': 9, '10': 'project'},
+    const {'1': 'ref', '3': 3, '4': 1, '5': 9, '10': 'ref'},
+    const {'1': 'position', '3': 4, '4': 1, '5': 3, '10': 'position'},
+  ],
+};
+
+/// Descriptor for `CommitPosition`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List commitPositionDescriptor = $convert.base64Decode(
+    'Cg5Db21taXRQb3NpdGlvbhISCgRob3N0GAEgASgJUgRob3N0EhgKB3Byb2plY3QYAiABKAlSB3Byb2plY3QSEAoDcmVmGAMgASgJUgNyZWYSGgoIcG9zaXRpb24YBCABKANSCHBvc2l0aW9u');
+@$core.Deprecated('Use commitPositionRangeDescriptor instead')
+const CommitPositionRange$json = const {
+  '1': 'CommitPositionRange',
+  '2': const [
+    const {'1': 'earliest', '3': 1, '4': 1, '5': 11, '6': '.luci.resultdb.v1.CommitPosition', '10': 'earliest'},
+    const {'1': 'latest', '3': 2, '4': 1, '5': 11, '6': '.luci.resultdb.v1.CommitPosition', '10': 'latest'},
+  ],
+};
+
+/// Descriptor for `CommitPositionRange`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List commitPositionRangeDescriptor = $convert.base64Decode(
+    'ChNDb21taXRQb3NpdGlvblJhbmdlEjwKCGVhcmxpZXN0GAEgASgLMiAubHVjaS5yZXN1bHRkYi52MS5Db21taXRQb3NpdGlvblIIZWFybGllc3QSOAoGbGF0ZXN0GAIgASgLMiAubHVjaS5yZXN1bHRkYi52MS5Db21taXRQb3NpdGlvblIGbGF0ZXN0');
+@$core.Deprecated('Use timeRangeDescriptor instead')
+const TimeRange$json = const {
+  '1': 'TimeRange',
+  '2': const [
+    const {'1': 'earliest', '3': 1, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '10': 'earliest'},
+    const {'1': 'latest', '3': 2, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '10': 'latest'},
+  ],
+};
+
+/// Descriptor for `TimeRange`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List timeRangeDescriptor = $convert.base64Decode(
+    'CglUaW1lUmFuZ2USNgoIZWFybGllc3QYASABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUghlYXJsaWVzdBIyCgZsYXRlc3QYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUgZsYXRlc3Q=');
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/common.pbserver.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/common.pbserver.dart
new file mode 100644
index 0000000..693893b
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/common.pbserver.dart
@@ -0,0 +1,8 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/resultdb/proto/v1/common.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+export 'common.pb.dart';
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/invocation.pb.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/invocation.pb.dart
new file mode 100644
index 0000000..3891b2d
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/invocation.pb.dart
@@ -0,0 +1,591 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/resultdb/proto/v1/invocation.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+import 'dart:core' as $core;
+
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import '../../../../../google/protobuf/timestamp.pb.dart' as $0;
+import 'common.pb.dart' as $1;
+import 'predicate.pb.dart' as $2;
+
+import 'invocation.pbenum.dart';
+
+export 'invocation.pbenum.dart';
+
+class Invocation extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Invocation',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'luci.resultdb.v1'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'name')
+    ..e<Invocation_State>(
+        2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'state', $pb.PbFieldType.OE,
+        defaultOrMaker: Invocation_State.STATE_UNSPECIFIED,
+        valueOf: Invocation_State.valueOf,
+        enumValues: Invocation_State.values)
+    ..aOM<$0.Timestamp>(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'createTime',
+        subBuilder: $0.Timestamp.create)
+    ..pc<$1.StringPair>(
+        5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'tags', $pb.PbFieldType.PM,
+        subBuilder: $1.StringPair.create)
+    ..aOM<$0.Timestamp>(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'finalizeTime',
+        subBuilder: $0.Timestamp.create)
+    ..aOM<$0.Timestamp>(7, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'deadline',
+        subBuilder: $0.Timestamp.create)
+    ..pPS(8, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'includedInvocations')
+    ..pc<BigQueryExport>(
+        9, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'bigqueryExports', $pb.PbFieldType.PM,
+        subBuilder: BigQueryExport.create)
+    ..aOS(10, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'createdBy')
+    ..aOS(11, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'producerResource')
+    ..aOS(12, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'realm')
+    ..aOM<HistoryOptions>(13, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'historyOptions',
+        subBuilder: HistoryOptions.create)
+    ..hasRequiredFields = false;
+
+  Invocation._() : super();
+  factory Invocation({
+    $core.String? name,
+    Invocation_State? state,
+    $0.Timestamp? createTime,
+    $core.Iterable<$1.StringPair>? tags,
+    $0.Timestamp? finalizeTime,
+    $0.Timestamp? deadline,
+    $core.Iterable<$core.String>? includedInvocations,
+    $core.Iterable<BigQueryExport>? bigqueryExports,
+    $core.String? createdBy,
+    $core.String? producerResource,
+    $core.String? realm,
+    HistoryOptions? historyOptions,
+  }) {
+    final _result = create();
+    if (name != null) {
+      _result.name = name;
+    }
+    if (state != null) {
+      _result.state = state;
+    }
+    if (createTime != null) {
+      _result.createTime = createTime;
+    }
+    if (tags != null) {
+      _result.tags.addAll(tags);
+    }
+    if (finalizeTime != null) {
+      _result.finalizeTime = finalizeTime;
+    }
+    if (deadline != null) {
+      _result.deadline = deadline;
+    }
+    if (includedInvocations != null) {
+      _result.includedInvocations.addAll(includedInvocations);
+    }
+    if (bigqueryExports != null) {
+      _result.bigqueryExports.addAll(bigqueryExports);
+    }
+    if (createdBy != null) {
+      _result.createdBy = createdBy;
+    }
+    if (producerResource != null) {
+      _result.producerResource = producerResource;
+    }
+    if (realm != null) {
+      _result.realm = realm;
+    }
+    if (historyOptions != null) {
+      _result.historyOptions = historyOptions;
+    }
+    return _result;
+  }
+  factory Invocation.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory Invocation.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  Invocation clone() => Invocation()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  Invocation copyWith(void Function(Invocation) updates) =>
+      super.copyWith((message) => updates(message as Invocation)) as Invocation; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Invocation create() => Invocation._();
+  Invocation createEmptyInstance() => create();
+  static $pb.PbList<Invocation> createRepeated() => $pb.PbList<Invocation>();
+  @$core.pragma('dart2js:noInline')
+  static Invocation getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Invocation>(create);
+  static Invocation? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get name => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set name($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasName() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearName() => clearField(1);
+
+  @$pb.TagNumber(2)
+  Invocation_State get state => $_getN(1);
+  @$pb.TagNumber(2)
+  set state(Invocation_State v) {
+    setField(2, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasState() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearState() => clearField(2);
+
+  @$pb.TagNumber(4)
+  $0.Timestamp get createTime => $_getN(2);
+  @$pb.TagNumber(4)
+  set createTime($0.Timestamp v) {
+    setField(4, v);
+  }
+
+  @$pb.TagNumber(4)
+  $core.bool hasCreateTime() => $_has(2);
+  @$pb.TagNumber(4)
+  void clearCreateTime() => clearField(4);
+  @$pb.TagNumber(4)
+  $0.Timestamp ensureCreateTime() => $_ensure(2);
+
+  @$pb.TagNumber(5)
+  $core.List<$1.StringPair> get tags => $_getList(3);
+
+  @$pb.TagNumber(6)
+  $0.Timestamp get finalizeTime => $_getN(4);
+  @$pb.TagNumber(6)
+  set finalizeTime($0.Timestamp v) {
+    setField(6, v);
+  }
+
+  @$pb.TagNumber(6)
+  $core.bool hasFinalizeTime() => $_has(4);
+  @$pb.TagNumber(6)
+  void clearFinalizeTime() => clearField(6);
+  @$pb.TagNumber(6)
+  $0.Timestamp ensureFinalizeTime() => $_ensure(4);
+
+  @$pb.TagNumber(7)
+  $0.Timestamp get deadline => $_getN(5);
+  @$pb.TagNumber(7)
+  set deadline($0.Timestamp v) {
+    setField(7, v);
+  }
+
+  @$pb.TagNumber(7)
+  $core.bool hasDeadline() => $_has(5);
+  @$pb.TagNumber(7)
+  void clearDeadline() => clearField(7);
+  @$pb.TagNumber(7)
+  $0.Timestamp ensureDeadline() => $_ensure(5);
+
+  @$pb.TagNumber(8)
+  $core.List<$core.String> get includedInvocations => $_getList(6);
+
+  @$pb.TagNumber(9)
+  $core.List<BigQueryExport> get bigqueryExports => $_getList(7);
+
+  @$pb.TagNumber(10)
+  $core.String get createdBy => $_getSZ(8);
+  @$pb.TagNumber(10)
+  set createdBy($core.String v) {
+    $_setString(8, v);
+  }
+
+  @$pb.TagNumber(10)
+  $core.bool hasCreatedBy() => $_has(8);
+  @$pb.TagNumber(10)
+  void clearCreatedBy() => clearField(10);
+
+  @$pb.TagNumber(11)
+  $core.String get producerResource => $_getSZ(9);
+  @$pb.TagNumber(11)
+  set producerResource($core.String v) {
+    $_setString(9, v);
+  }
+
+  @$pb.TagNumber(11)
+  $core.bool hasProducerResource() => $_has(9);
+  @$pb.TagNumber(11)
+  void clearProducerResource() => clearField(11);
+
+  @$pb.TagNumber(12)
+  $core.String get realm => $_getSZ(10);
+  @$pb.TagNumber(12)
+  set realm($core.String v) {
+    $_setString(10, v);
+  }
+
+  @$pb.TagNumber(12)
+  $core.bool hasRealm() => $_has(10);
+  @$pb.TagNumber(12)
+  void clearRealm() => clearField(12);
+
+  @$pb.TagNumber(13)
+  HistoryOptions get historyOptions => $_getN(11);
+  @$pb.TagNumber(13)
+  set historyOptions(HistoryOptions v) {
+    setField(13, v);
+  }
+
+  @$pb.TagNumber(13)
+  $core.bool hasHistoryOptions() => $_has(11);
+  @$pb.TagNumber(13)
+  void clearHistoryOptions() => clearField(13);
+  @$pb.TagNumber(13)
+  HistoryOptions ensureHistoryOptions() => $_ensure(11);
+}
+
+class BigQueryExport_TestResults extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BigQueryExport.TestResults',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'luci.resultdb.v1'),
+      createEmptyInstance: create)
+    ..aOM<$2.TestResultPredicate>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'predicate',
+        subBuilder: $2.TestResultPredicate.create)
+    ..hasRequiredFields = false;
+
+  BigQueryExport_TestResults._() : super();
+  factory BigQueryExport_TestResults({
+    $2.TestResultPredicate? predicate,
+  }) {
+    final _result = create();
+    if (predicate != null) {
+      _result.predicate = predicate;
+    }
+    return _result;
+  }
+  factory BigQueryExport_TestResults.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BigQueryExport_TestResults.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BigQueryExport_TestResults clone() => BigQueryExport_TestResults()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BigQueryExport_TestResults copyWith(void Function(BigQueryExport_TestResults) updates) =>
+      super.copyWith((message) => updates(message as BigQueryExport_TestResults))
+          as BigQueryExport_TestResults; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BigQueryExport_TestResults create() => BigQueryExport_TestResults._();
+  BigQueryExport_TestResults createEmptyInstance() => create();
+  static $pb.PbList<BigQueryExport_TestResults> createRepeated() => $pb.PbList<BigQueryExport_TestResults>();
+  @$core.pragma('dart2js:noInline')
+  static BigQueryExport_TestResults getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BigQueryExport_TestResults>(create);
+  static BigQueryExport_TestResults? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $2.TestResultPredicate get predicate => $_getN(0);
+  @$pb.TagNumber(1)
+  set predicate($2.TestResultPredicate v) {
+    setField(1, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasPredicate() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearPredicate() => clearField(1);
+  @$pb.TagNumber(1)
+  $2.TestResultPredicate ensurePredicate() => $_ensure(0);
+}
+
+class BigQueryExport_TextArtifacts extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BigQueryExport.TextArtifacts',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'luci.resultdb.v1'),
+      createEmptyInstance: create)
+    ..aOM<$2.ArtifactPredicate>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'predicate',
+        subBuilder: $2.ArtifactPredicate.create)
+    ..hasRequiredFields = false;
+
+  BigQueryExport_TextArtifacts._() : super();
+  factory BigQueryExport_TextArtifacts({
+    $2.ArtifactPredicate? predicate,
+  }) {
+    final _result = create();
+    if (predicate != null) {
+      _result.predicate = predicate;
+    }
+    return _result;
+  }
+  factory BigQueryExport_TextArtifacts.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BigQueryExport_TextArtifacts.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BigQueryExport_TextArtifacts clone() => BigQueryExport_TextArtifacts()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BigQueryExport_TextArtifacts copyWith(void Function(BigQueryExport_TextArtifacts) updates) =>
+      super.copyWith((message) => updates(message as BigQueryExport_TextArtifacts))
+          as BigQueryExport_TextArtifacts; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BigQueryExport_TextArtifacts create() => BigQueryExport_TextArtifacts._();
+  BigQueryExport_TextArtifacts createEmptyInstance() => create();
+  static $pb.PbList<BigQueryExport_TextArtifacts> createRepeated() => $pb.PbList<BigQueryExport_TextArtifacts>();
+  @$core.pragma('dart2js:noInline')
+  static BigQueryExport_TextArtifacts getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BigQueryExport_TextArtifacts>(create);
+  static BigQueryExport_TextArtifacts? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $2.ArtifactPredicate get predicate => $_getN(0);
+  @$pb.TagNumber(1)
+  set predicate($2.ArtifactPredicate v) {
+    setField(1, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasPredicate() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearPredicate() => clearField(1);
+  @$pb.TagNumber(1)
+  $2.ArtifactPredicate ensurePredicate() => $_ensure(0);
+}
+
+enum BigQueryExport_ResultType { testResults, textArtifacts, notSet }
+
+class BigQueryExport extends $pb.GeneratedMessage {
+  static const $core.Map<$core.int, BigQueryExport_ResultType> _BigQueryExport_ResultTypeByTag = {
+    4: BigQueryExport_ResultType.testResults,
+    6: BigQueryExport_ResultType.textArtifacts,
+    0: BigQueryExport_ResultType.notSet
+  };
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BigQueryExport',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'luci.resultdb.v1'),
+      createEmptyInstance: create)
+    ..oo(0, [4, 6])
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'project')
+    ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'dataset')
+    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'table')
+    ..aOM<BigQueryExport_TestResults>(
+        4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'testResults',
+        subBuilder: BigQueryExport_TestResults.create)
+    ..aOM<BigQueryExport_TextArtifacts>(
+        6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'textArtifacts',
+        subBuilder: BigQueryExport_TextArtifacts.create)
+    ..hasRequiredFields = false;
+
+  BigQueryExport._() : super();
+  factory BigQueryExport({
+    $core.String? project,
+    $core.String? dataset,
+    $core.String? table,
+    BigQueryExport_TestResults? testResults,
+    BigQueryExport_TextArtifacts? textArtifacts,
+  }) {
+    final _result = create();
+    if (project != null) {
+      _result.project = project;
+    }
+    if (dataset != null) {
+      _result.dataset = dataset;
+    }
+    if (table != null) {
+      _result.table = table;
+    }
+    if (testResults != null) {
+      _result.testResults = testResults;
+    }
+    if (textArtifacts != null) {
+      _result.textArtifacts = textArtifacts;
+    }
+    return _result;
+  }
+  factory BigQueryExport.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BigQueryExport.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BigQueryExport clone() => BigQueryExport()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BigQueryExport copyWith(void Function(BigQueryExport) updates) =>
+      super.copyWith((message) => updates(message as BigQueryExport))
+          as BigQueryExport; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BigQueryExport create() => BigQueryExport._();
+  BigQueryExport createEmptyInstance() => create();
+  static $pb.PbList<BigQueryExport> createRepeated() => $pb.PbList<BigQueryExport>();
+  @$core.pragma('dart2js:noInline')
+  static BigQueryExport getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BigQueryExport>(create);
+  static BigQueryExport? _defaultInstance;
+
+  BigQueryExport_ResultType whichResultType() => _BigQueryExport_ResultTypeByTag[$_whichOneof(0)]!;
+  void clearResultType() => clearField($_whichOneof(0));
+
+  @$pb.TagNumber(1)
+  $core.String get project => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set project($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasProject() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearProject() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.String get dataset => $_getSZ(1);
+  @$pb.TagNumber(2)
+  set dataset($core.String v) {
+    $_setString(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasDataset() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearDataset() => clearField(2);
+
+  @$pb.TagNumber(3)
+  $core.String get table => $_getSZ(2);
+  @$pb.TagNumber(3)
+  set table($core.String v) {
+    $_setString(2, v);
+  }
+
+  @$pb.TagNumber(3)
+  $core.bool hasTable() => $_has(2);
+  @$pb.TagNumber(3)
+  void clearTable() => clearField(3);
+
+  @$pb.TagNumber(4)
+  BigQueryExport_TestResults get testResults => $_getN(3);
+  @$pb.TagNumber(4)
+  set testResults(BigQueryExport_TestResults v) {
+    setField(4, v);
+  }
+
+  @$pb.TagNumber(4)
+  $core.bool hasTestResults() => $_has(3);
+  @$pb.TagNumber(4)
+  void clearTestResults() => clearField(4);
+  @$pb.TagNumber(4)
+  BigQueryExport_TestResults ensureTestResults() => $_ensure(3);
+
+  @$pb.TagNumber(6)
+  BigQueryExport_TextArtifacts get textArtifacts => $_getN(4);
+  @$pb.TagNumber(6)
+  set textArtifacts(BigQueryExport_TextArtifacts v) {
+    setField(6, v);
+  }
+
+  @$pb.TagNumber(6)
+  $core.bool hasTextArtifacts() => $_has(4);
+  @$pb.TagNumber(6)
+  void clearTextArtifacts() => clearField(6);
+  @$pb.TagNumber(6)
+  BigQueryExport_TextArtifacts ensureTextArtifacts() => $_ensure(4);
+}
+
+class HistoryOptions extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'HistoryOptions',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'luci.resultdb.v1'),
+      createEmptyInstance: create)
+    ..aOB(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'useInvocationTimestamp')
+    ..aOM<$1.CommitPosition>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'commit',
+        subBuilder: $1.CommitPosition.create)
+    ..hasRequiredFields = false;
+
+  HistoryOptions._() : super();
+  factory HistoryOptions({
+    $core.bool? useInvocationTimestamp,
+    $1.CommitPosition? commit,
+  }) {
+    final _result = create();
+    if (useInvocationTimestamp != null) {
+      _result.useInvocationTimestamp = useInvocationTimestamp;
+    }
+    if (commit != null) {
+      _result.commit = commit;
+    }
+    return _result;
+  }
+  factory HistoryOptions.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory HistoryOptions.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  HistoryOptions clone() => HistoryOptions()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  HistoryOptions copyWith(void Function(HistoryOptions) updates) =>
+      super.copyWith((message) => updates(message as HistoryOptions))
+          as HistoryOptions; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static HistoryOptions create() => HistoryOptions._();
+  HistoryOptions createEmptyInstance() => create();
+  static $pb.PbList<HistoryOptions> createRepeated() => $pb.PbList<HistoryOptions>();
+  @$core.pragma('dart2js:noInline')
+  static HistoryOptions getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<HistoryOptions>(create);
+  static HistoryOptions? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.bool get useInvocationTimestamp => $_getBF(0);
+  @$pb.TagNumber(1)
+  set useInvocationTimestamp($core.bool v) {
+    $_setBool(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasUseInvocationTimestamp() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearUseInvocationTimestamp() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $1.CommitPosition get commit => $_getN(1);
+  @$pb.TagNumber(2)
+  set commit($1.CommitPosition v) {
+    setField(2, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasCommit() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearCommit() => clearField(2);
+  @$pb.TagNumber(2)
+  $1.CommitPosition ensureCommit() => $_ensure(1);
+}
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/invocation.pbenum.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/invocation.pbenum.dart
new file mode 100644
index 0000000..add0225
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/invocation.pbenum.dart
@@ -0,0 +1,33 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/resultdb/proto/v1/invocation.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+// ignore_for_file: UNDEFINED_SHOWN_NAME
+import 'dart:core' as $core;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+class Invocation_State extends $pb.ProtobufEnum {
+  static const Invocation_State STATE_UNSPECIFIED =
+      Invocation_State._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'STATE_UNSPECIFIED');
+  static const Invocation_State ACTIVE =
+      Invocation_State._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ACTIVE');
+  static const Invocation_State FINALIZING =
+      Invocation_State._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'FINALIZING');
+  static const Invocation_State FINALIZED =
+      Invocation_State._(3, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'FINALIZED');
+
+  static const $core.List<Invocation_State> values = <Invocation_State>[
+    STATE_UNSPECIFIED,
+    ACTIVE,
+    FINALIZING,
+    FINALIZED,
+  ];
+
+  static final $core.Map<$core.int, Invocation_State> _byValue = $pb.ProtobufEnum.initByValue(values);
+  static Invocation_State? valueOf($core.int value) => _byValue[value];
+
+  const Invocation_State._($core.int v, $core.String n) : super(v, n);
+}
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/invocation.pbjson.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/invocation.pbjson.dart
new file mode 100644
index 0000000..d4eae45
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/invocation.pbjson.dart
@@ -0,0 +1,141 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/resultdb/proto/v1/invocation.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+import 'dart:core' as $core;
+import 'dart:convert' as $convert;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use invocationDescriptor instead')
+const Invocation$json = const {
+  '1': 'Invocation',
+  '2': const [
+    const {'1': 'name', '3': 1, '4': 1, '5': 9, '8': const {}, '10': 'name'},
+    const {'1': 'state', '3': 2, '4': 1, '5': 14, '6': '.luci.resultdb.v1.Invocation.State', '10': 'state'},
+    const {
+      '1': 'create_time',
+      '3': 4,
+      '4': 1,
+      '5': 11,
+      '6': '.google.protobuf.Timestamp',
+      '8': const {},
+      '10': 'createTime'
+    },
+    const {'1': 'tags', '3': 5, '4': 3, '5': 11, '6': '.luci.resultdb.v1.StringPair', '10': 'tags'},
+    const {
+      '1': 'finalize_time',
+      '3': 6,
+      '4': 1,
+      '5': 11,
+      '6': '.google.protobuf.Timestamp',
+      '8': const {},
+      '10': 'finalizeTime'
+    },
+    const {'1': 'deadline', '3': 7, '4': 1, '5': 11, '6': '.google.protobuf.Timestamp', '10': 'deadline'},
+    const {'1': 'included_invocations', '3': 8, '4': 3, '5': 9, '10': 'includedInvocations'},
+    const {
+      '1': 'bigquery_exports',
+      '3': 9,
+      '4': 3,
+      '5': 11,
+      '6': '.luci.resultdb.v1.BigQueryExport',
+      '10': 'bigqueryExports'
+    },
+    const {'1': 'created_by', '3': 10, '4': 1, '5': 9, '8': const {}, '10': 'createdBy'},
+    const {'1': 'producer_resource', '3': 11, '4': 1, '5': 9, '10': 'producerResource'},
+    const {'1': 'realm', '3': 12, '4': 1, '5': 9, '10': 'realm'},
+    const {
+      '1': 'history_options',
+      '3': 13,
+      '4': 1,
+      '5': 11,
+      '6': '.luci.resultdb.v1.HistoryOptions',
+      '10': 'historyOptions'
+    },
+  ],
+  '4': const [Invocation_State$json],
+  '9': const [
+    const {'1': 3, '2': 4},
+  ],
+};
+
+@$core.Deprecated('Use invocationDescriptor instead')
+const Invocation_State$json = const {
+  '1': 'State',
+  '2': const [
+    const {'1': 'STATE_UNSPECIFIED', '2': 0},
+    const {'1': 'ACTIVE', '2': 1},
+    const {'1': 'FINALIZING', '2': 2},
+    const {'1': 'FINALIZED', '2': 3},
+  ],
+};
+
+/// Descriptor for `Invocation`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List invocationDescriptor = $convert.base64Decode(
+    'CgpJbnZvY2F0aW9uEhoKBG5hbWUYASABKAlCBuBBA+BBBVIEbmFtZRI4CgVzdGF0ZRgCIAEoDjIiLmx1Y2kucmVzdWx0ZGIudjEuSW52b2NhdGlvbi5TdGF0ZVIFc3RhdGUSQwoLY3JlYXRlX3RpbWUYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgbgQQPgQQVSCmNyZWF0ZVRpbWUSMAoEdGFncxgFIAMoCzIcLmx1Y2kucmVzdWx0ZGIudjEuU3RyaW5nUGFpclIEdGFncxJECg1maW5hbGl6ZV90aW1lGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDUgxmaW5hbGl6ZVRpbWUSNgoIZGVhZGxpbmUYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wUghkZWFkbGluZRIxChRpbmNsdWRlZF9pbnZvY2F0aW9ucxgIIAMoCVITaW5jbHVkZWRJbnZvY2F0aW9ucxJLChBiaWdxdWVyeV9leHBvcnRzGAkgAygLMiAubHVjaS5yZXN1bHRkYi52MS5CaWdRdWVyeUV4cG9ydFIPYmlncXVlcnlFeHBvcnRzEiIKCmNyZWF0ZWRfYnkYCiABKAlCA+BBA1IJY3JlYXRlZEJ5EisKEXByb2R1Y2VyX3Jlc291cmNlGAsgASgJUhBwcm9kdWNlclJlc291cmNlEhQKBXJlYWxtGAwgASgJUgVyZWFsbRJJCg9oaXN0b3J5X29wdGlvbnMYDSABKAsyIC5sdWNpLnJlc3VsdGRiLnYxLkhpc3RvcnlPcHRpb25zUg5oaXN0b3J5T3B0aW9ucyJJCgVTdGF0ZRIVChFTVEFURV9VTlNQRUNJRklFRBAAEgoKBkFDVElWRRABEg4KCkZJTkFMSVpJTkcQAhINCglGSU5BTElaRUQQA0oECAMQBA==');
+@$core.Deprecated('Use bigQueryExportDescriptor instead')
+const BigQueryExport$json = const {
+  '1': 'BigQueryExport',
+  '2': const [
+    const {'1': 'project', '3': 1, '4': 1, '5': 9, '8': const {}, '10': 'project'},
+    const {'1': 'dataset', '3': 2, '4': 1, '5': 9, '8': const {}, '10': 'dataset'},
+    const {'1': 'table', '3': 3, '4': 1, '5': 9, '8': const {}, '10': 'table'},
+    const {
+      '1': 'test_results',
+      '3': 4,
+      '4': 1,
+      '5': 11,
+      '6': '.luci.resultdb.v1.BigQueryExport.TestResults',
+      '9': 0,
+      '10': 'testResults'
+    },
+    const {
+      '1': 'text_artifacts',
+      '3': 6,
+      '4': 1,
+      '5': 11,
+      '6': '.luci.resultdb.v1.BigQueryExport.TextArtifacts',
+      '9': 0,
+      '10': 'textArtifacts'
+    },
+  ],
+  '3': const [BigQueryExport_TestResults$json, BigQueryExport_TextArtifacts$json],
+  '8': const [
+    const {'1': 'result_type'},
+  ],
+};
+
+@$core.Deprecated('Use bigQueryExportDescriptor instead')
+const BigQueryExport_TestResults$json = const {
+  '1': 'TestResults',
+  '2': const [
+    const {'1': 'predicate', '3': 1, '4': 1, '5': 11, '6': '.luci.resultdb.v1.TestResultPredicate', '10': 'predicate'},
+  ],
+};
+
+@$core.Deprecated('Use bigQueryExportDescriptor instead')
+const BigQueryExport_TextArtifacts$json = const {
+  '1': 'TextArtifacts',
+  '2': const [
+    const {'1': 'predicate', '3': 1, '4': 1, '5': 11, '6': '.luci.resultdb.v1.ArtifactPredicate', '10': 'predicate'},
+  ],
+};
+
+/// Descriptor for `BigQueryExport`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List bigQueryExportDescriptor = $convert.base64Decode(
+    'Cg5CaWdRdWVyeUV4cG9ydBIdCgdwcm9qZWN0GAEgASgJQgPgQQJSB3Byb2plY3QSHQoHZGF0YXNldBgCIAEoCUID4EECUgdkYXRhc2V0EhkKBXRhYmxlGAMgASgJQgPgQQJSBXRhYmxlElEKDHRlc3RfcmVzdWx0cxgEIAEoCzIsLmx1Y2kucmVzdWx0ZGIudjEuQmlnUXVlcnlFeHBvcnQuVGVzdFJlc3VsdHNIAFILdGVzdFJlc3VsdHMSVwoOdGV4dF9hcnRpZmFjdHMYBiABKAsyLi5sdWNpLnJlc3VsdGRiLnYxLkJpZ1F1ZXJ5RXhwb3J0LlRleHRBcnRpZmFjdHNIAFINdGV4dEFydGlmYWN0cxpSCgtUZXN0UmVzdWx0cxJDCglwcmVkaWNhdGUYASABKAsyJS5sdWNpLnJlc3VsdGRiLnYxLlRlc3RSZXN1bHRQcmVkaWNhdGVSCXByZWRpY2F0ZRpSCg1UZXh0QXJ0aWZhY3RzEkEKCXByZWRpY2F0ZRgBIAEoCzIjLmx1Y2kucmVzdWx0ZGIudjEuQXJ0aWZhY3RQcmVkaWNhdGVSCXByZWRpY2F0ZUINCgtyZXN1bHRfdHlwZQ==');
+@$core.Deprecated('Use historyOptionsDescriptor instead')
+const HistoryOptions$json = const {
+  '1': 'HistoryOptions',
+  '2': const [
+    const {'1': 'use_invocation_timestamp', '3': 1, '4': 1, '5': 8, '10': 'useInvocationTimestamp'},
+    const {'1': 'commit', '3': 2, '4': 1, '5': 11, '6': '.luci.resultdb.v1.CommitPosition', '10': 'commit'},
+  ],
+};
+
+/// Descriptor for `HistoryOptions`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List historyOptionsDescriptor = $convert.base64Decode(
+    'Cg5IaXN0b3J5T3B0aW9ucxI4Chh1c2VfaW52b2NhdGlvbl90aW1lc3RhbXAYASABKAhSFnVzZUludm9jYXRpb25UaW1lc3RhbXASOAoGY29tbWl0GAIgASgLMiAubHVjaS5yZXN1bHRkYi52MS5Db21taXRQb3NpdGlvblIGY29tbWl0');
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/invocation.pbserver.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/invocation.pbserver.dart
new file mode 100644
index 0000000..ee26ba0
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/invocation.pbserver.dart
@@ -0,0 +1,8 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/resultdb/proto/v1/invocation.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+export 'invocation.pb.dart';
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/predicate.pb.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/predicate.pb.dart
new file mode 100644
index 0000000..c536ee5
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/predicate.pb.dart
@@ -0,0 +1,490 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/resultdb/proto/v1/predicate.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+import 'dart:core' as $core;
+
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'common.pb.dart' as $0;
+
+import 'predicate.pbenum.dart';
+
+export 'predicate.pbenum.dart';
+
+class TestResultPredicate extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'TestResultPredicate',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'luci.resultdb.v1'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'testIdRegexp')
+    ..aOM<VariantPredicate>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'variant',
+        subBuilder: VariantPredicate.create)
+    ..e<TestResultPredicate_Expectancy>(
+        3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'expectancy', $pb.PbFieldType.OE,
+        defaultOrMaker: TestResultPredicate_Expectancy.ALL,
+        valueOf: TestResultPredicate_Expectancy.valueOf,
+        enumValues: TestResultPredicate_Expectancy.values)
+    ..aOB(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'excludeExonerated')
+    ..hasRequiredFields = false;
+
+  TestResultPredicate._() : super();
+  factory TestResultPredicate({
+    $core.String? testIdRegexp,
+    VariantPredicate? variant,
+    TestResultPredicate_Expectancy? expectancy,
+    $core.bool? excludeExonerated,
+  }) {
+    final _result = create();
+    if (testIdRegexp != null) {
+      _result.testIdRegexp = testIdRegexp;
+    }
+    if (variant != null) {
+      _result.variant = variant;
+    }
+    if (expectancy != null) {
+      _result.expectancy = expectancy;
+    }
+    if (excludeExonerated != null) {
+      _result.excludeExonerated = excludeExonerated;
+    }
+    return _result;
+  }
+  factory TestResultPredicate.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory TestResultPredicate.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  TestResultPredicate clone() => TestResultPredicate()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  TestResultPredicate copyWith(void Function(TestResultPredicate) updates) =>
+      super.copyWith((message) => updates(message as TestResultPredicate))
+          as TestResultPredicate; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static TestResultPredicate create() => TestResultPredicate._();
+  TestResultPredicate createEmptyInstance() => create();
+  static $pb.PbList<TestResultPredicate> createRepeated() => $pb.PbList<TestResultPredicate>();
+  @$core.pragma('dart2js:noInline')
+  static TestResultPredicate getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TestResultPredicate>(create);
+  static TestResultPredicate? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get testIdRegexp => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set testIdRegexp($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasTestIdRegexp() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearTestIdRegexp() => clearField(1);
+
+  @$pb.TagNumber(2)
+  VariantPredicate get variant => $_getN(1);
+  @$pb.TagNumber(2)
+  set variant(VariantPredicate v) {
+    setField(2, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasVariant() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearVariant() => clearField(2);
+  @$pb.TagNumber(2)
+  VariantPredicate ensureVariant() => $_ensure(1);
+
+  @$pb.TagNumber(3)
+  TestResultPredicate_Expectancy get expectancy => $_getN(2);
+  @$pb.TagNumber(3)
+  set expectancy(TestResultPredicate_Expectancy v) {
+    setField(3, v);
+  }
+
+  @$pb.TagNumber(3)
+  $core.bool hasExpectancy() => $_has(2);
+  @$pb.TagNumber(3)
+  void clearExpectancy() => clearField(3);
+
+  @$pb.TagNumber(4)
+  $core.bool get excludeExonerated => $_getBF(3);
+  @$pb.TagNumber(4)
+  set excludeExonerated($core.bool v) {
+    $_setBool(3, v);
+  }
+
+  @$pb.TagNumber(4)
+  $core.bool hasExcludeExonerated() => $_has(3);
+  @$pb.TagNumber(4)
+  void clearExcludeExonerated() => clearField(4);
+}
+
+class TestExonerationPredicate extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'TestExonerationPredicate',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'luci.resultdb.v1'),
+      createEmptyInstance: create)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'testIdRegexp')
+    ..aOM<VariantPredicate>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'variant',
+        subBuilder: VariantPredicate.create)
+    ..hasRequiredFields = false;
+
+  TestExonerationPredicate._() : super();
+  factory TestExonerationPredicate({
+    $core.String? testIdRegexp,
+    VariantPredicate? variant,
+  }) {
+    final _result = create();
+    if (testIdRegexp != null) {
+      _result.testIdRegexp = testIdRegexp;
+    }
+    if (variant != null) {
+      _result.variant = variant;
+    }
+    return _result;
+  }
+  factory TestExonerationPredicate.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory TestExonerationPredicate.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  TestExonerationPredicate clone() => TestExonerationPredicate()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  TestExonerationPredicate copyWith(void Function(TestExonerationPredicate) updates) =>
+      super.copyWith((message) => updates(message as TestExonerationPredicate))
+          as TestExonerationPredicate; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static TestExonerationPredicate create() => TestExonerationPredicate._();
+  TestExonerationPredicate createEmptyInstance() => create();
+  static $pb.PbList<TestExonerationPredicate> createRepeated() => $pb.PbList<TestExonerationPredicate>();
+  @$core.pragma('dart2js:noInline')
+  static TestExonerationPredicate getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<TestExonerationPredicate>(create);
+  static TestExonerationPredicate? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get testIdRegexp => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set testIdRegexp($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasTestIdRegexp() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearTestIdRegexp() => clearField(1);
+
+  @$pb.TagNumber(2)
+  VariantPredicate get variant => $_getN(1);
+  @$pb.TagNumber(2)
+  set variant(VariantPredicate v) {
+    setField(2, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasVariant() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearVariant() => clearField(2);
+  @$pb.TagNumber(2)
+  VariantPredicate ensureVariant() => $_ensure(1);
+}
+
+enum VariantPredicate_Predicate { equals, contains, notSet }
+
+class VariantPredicate extends $pb.GeneratedMessage {
+  static const $core.Map<$core.int, VariantPredicate_Predicate> _VariantPredicate_PredicateByTag = {
+    1: VariantPredicate_Predicate.equals,
+    2: VariantPredicate_Predicate.contains,
+    0: VariantPredicate_Predicate.notSet
+  };
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'VariantPredicate',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'luci.resultdb.v1'),
+      createEmptyInstance: create)
+    ..oo(0, [1, 2])
+    ..aOM<$0.Variant>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'equals',
+        subBuilder: $0.Variant.create)
+    ..aOM<$0.Variant>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'contains',
+        subBuilder: $0.Variant.create)
+    ..hasRequiredFields = false;
+
+  VariantPredicate._() : super();
+  factory VariantPredicate({
+    $0.Variant? equals,
+    $0.Variant? contains,
+  }) {
+    final _result = create();
+    if (equals != null) {
+      _result.equals = equals;
+    }
+    if (contains != null) {
+      _result.contains = contains;
+    }
+    return _result;
+  }
+  factory VariantPredicate.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory VariantPredicate.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  VariantPredicate clone() => VariantPredicate()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  VariantPredicate copyWith(void Function(VariantPredicate) updates) =>
+      super.copyWith((message) => updates(message as VariantPredicate))
+          as VariantPredicate; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static VariantPredicate create() => VariantPredicate._();
+  VariantPredicate createEmptyInstance() => create();
+  static $pb.PbList<VariantPredicate> createRepeated() => $pb.PbList<VariantPredicate>();
+  @$core.pragma('dart2js:noInline')
+  static VariantPredicate getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<VariantPredicate>(create);
+  static VariantPredicate? _defaultInstance;
+
+  VariantPredicate_Predicate whichPredicate() => _VariantPredicate_PredicateByTag[$_whichOneof(0)]!;
+  void clearPredicate() => clearField($_whichOneof(0));
+
+  @$pb.TagNumber(1)
+  $0.Variant get equals => $_getN(0);
+  @$pb.TagNumber(1)
+  set equals($0.Variant v) {
+    setField(1, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasEquals() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearEquals() => clearField(1);
+  @$pb.TagNumber(1)
+  $0.Variant ensureEquals() => $_ensure(0);
+
+  @$pb.TagNumber(2)
+  $0.Variant get contains => $_getN(1);
+  @$pb.TagNumber(2)
+  set contains($0.Variant v) {
+    setField(2, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasContains() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearContains() => clearField(2);
+  @$pb.TagNumber(2)
+  $0.Variant ensureContains() => $_ensure(1);
+}
+
+class ArtifactPredicate_EdgeTypeSet extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ArtifactPredicate.EdgeTypeSet',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'luci.resultdb.v1'),
+      createEmptyInstance: create)
+    ..aOB(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'includedInvocations')
+    ..aOB(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'testResults')
+    ..hasRequiredFields = false;
+
+  ArtifactPredicate_EdgeTypeSet._() : super();
+  factory ArtifactPredicate_EdgeTypeSet({
+    $core.bool? includedInvocations,
+    $core.bool? testResults,
+  }) {
+    final _result = create();
+    if (includedInvocations != null) {
+      _result.includedInvocations = includedInvocations;
+    }
+    if (testResults != null) {
+      _result.testResults = testResults;
+    }
+    return _result;
+  }
+  factory ArtifactPredicate_EdgeTypeSet.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory ArtifactPredicate_EdgeTypeSet.fromJson($core.String i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  ArtifactPredicate_EdgeTypeSet clone() => ArtifactPredicate_EdgeTypeSet()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  ArtifactPredicate_EdgeTypeSet copyWith(void Function(ArtifactPredicate_EdgeTypeSet) updates) =>
+      super.copyWith((message) => updates(message as ArtifactPredicate_EdgeTypeSet))
+          as ArtifactPredicate_EdgeTypeSet; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static ArtifactPredicate_EdgeTypeSet create() => ArtifactPredicate_EdgeTypeSet._();
+  ArtifactPredicate_EdgeTypeSet createEmptyInstance() => create();
+  static $pb.PbList<ArtifactPredicate_EdgeTypeSet> createRepeated() => $pb.PbList<ArtifactPredicate_EdgeTypeSet>();
+  @$core.pragma('dart2js:noInline')
+  static ArtifactPredicate_EdgeTypeSet getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ArtifactPredicate_EdgeTypeSet>(create);
+  static ArtifactPredicate_EdgeTypeSet? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.bool get includedInvocations => $_getBF(0);
+  @$pb.TagNumber(1)
+  set includedInvocations($core.bool v) {
+    $_setBool(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasIncludedInvocations() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearIncludedInvocations() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.bool get testResults => $_getBF(1);
+  @$pb.TagNumber(2)
+  set testResults($core.bool v) {
+    $_setBool(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasTestResults() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearTestResults() => clearField(2);
+}
+
+class ArtifactPredicate extends $pb.GeneratedMessage {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ArtifactPredicate',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'luci.resultdb.v1'),
+      createEmptyInstance: create)
+    ..aOM<ArtifactPredicate_EdgeTypeSet>(
+        1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'followEdges',
+        subBuilder: ArtifactPredicate_EdgeTypeSet.create)
+    ..aOM<TestResultPredicate>(
+        2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'testResultPredicate',
+        subBuilder: TestResultPredicate.create)
+    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'contentTypeRegexp')
+    ..aOS(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'artifactIdRegexp')
+    ..hasRequiredFields = false;
+
+  ArtifactPredicate._() : super();
+  factory ArtifactPredicate({
+    ArtifactPredicate_EdgeTypeSet? followEdges,
+    TestResultPredicate? testResultPredicate,
+    $core.String? contentTypeRegexp,
+    $core.String? artifactIdRegexp,
+  }) {
+    final _result = create();
+    if (followEdges != null) {
+      _result.followEdges = followEdges;
+    }
+    if (testResultPredicate != null) {
+      _result.testResultPredicate = testResultPredicate;
+    }
+    if (contentTypeRegexp != null) {
+      _result.contentTypeRegexp = contentTypeRegexp;
+    }
+    if (artifactIdRegexp != null) {
+      _result.artifactIdRegexp = artifactIdRegexp;
+    }
+    return _result;
+  }
+  factory ArtifactPredicate.fromBuffer($core.List<$core.int> i,
+          [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory ArtifactPredicate.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  ArtifactPredicate clone() => ArtifactPredicate()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  ArtifactPredicate copyWith(void Function(ArtifactPredicate) updates) =>
+      super.copyWith((message) => updates(message as ArtifactPredicate))
+          as ArtifactPredicate; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static ArtifactPredicate create() => ArtifactPredicate._();
+  ArtifactPredicate createEmptyInstance() => create();
+  static $pb.PbList<ArtifactPredicate> createRepeated() => $pb.PbList<ArtifactPredicate>();
+  @$core.pragma('dart2js:noInline')
+  static ArtifactPredicate getDefault() =>
+      _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ArtifactPredicate>(create);
+  static ArtifactPredicate? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  ArtifactPredicate_EdgeTypeSet get followEdges => $_getN(0);
+  @$pb.TagNumber(1)
+  set followEdges(ArtifactPredicate_EdgeTypeSet v) {
+    setField(1, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasFollowEdges() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearFollowEdges() => clearField(1);
+  @$pb.TagNumber(1)
+  ArtifactPredicate_EdgeTypeSet ensureFollowEdges() => $_ensure(0);
+
+  @$pb.TagNumber(2)
+  TestResultPredicate get testResultPredicate => $_getN(1);
+  @$pb.TagNumber(2)
+  set testResultPredicate(TestResultPredicate v) {
+    setField(2, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasTestResultPredicate() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearTestResultPredicate() => clearField(2);
+  @$pb.TagNumber(2)
+  TestResultPredicate ensureTestResultPredicate() => $_ensure(1);
+
+  @$pb.TagNumber(3)
+  $core.String get contentTypeRegexp => $_getSZ(2);
+  @$pb.TagNumber(3)
+  set contentTypeRegexp($core.String v) {
+    $_setString(2, v);
+  }
+
+  @$pb.TagNumber(3)
+  $core.bool hasContentTypeRegexp() => $_has(2);
+  @$pb.TagNumber(3)
+  void clearContentTypeRegexp() => clearField(3);
+
+  @$pb.TagNumber(4)
+  $core.String get artifactIdRegexp => $_getSZ(3);
+  @$pb.TagNumber(4)
+  set artifactIdRegexp($core.String v) {
+    $_setString(3, v);
+  }
+
+  @$pb.TagNumber(4)
+  $core.bool hasArtifactIdRegexp() => $_has(3);
+  @$pb.TagNumber(4)
+  void clearArtifactIdRegexp() => clearField(4);
+}
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/predicate.pbenum.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/predicate.pbenum.dart
new file mode 100644
index 0000000..4a7514b
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/predicate.pbenum.dart
@@ -0,0 +1,30 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/resultdb/proto/v1/predicate.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+// ignore_for_file: UNDEFINED_SHOWN_NAME
+import 'dart:core' as $core;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+class TestResultPredicate_Expectancy extends $pb.ProtobufEnum {
+  static const TestResultPredicate_Expectancy ALL =
+      TestResultPredicate_Expectancy._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'ALL');
+  static const TestResultPredicate_Expectancy VARIANTS_WITH_UNEXPECTED_RESULTS = TestResultPredicate_Expectancy._(
+      1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'VARIANTS_WITH_UNEXPECTED_RESULTS');
+  static const TestResultPredicate_Expectancy VARIANTS_WITH_ONLY_UNEXPECTED_RESULTS = TestResultPredicate_Expectancy._(
+      2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'VARIANTS_WITH_ONLY_UNEXPECTED_RESULTS');
+
+  static const $core.List<TestResultPredicate_Expectancy> values = <TestResultPredicate_Expectancy>[
+    ALL,
+    VARIANTS_WITH_UNEXPECTED_RESULTS,
+    VARIANTS_WITH_ONLY_UNEXPECTED_RESULTS,
+  ];
+
+  static final $core.Map<$core.int, TestResultPredicate_Expectancy> _byValue = $pb.ProtobufEnum.initByValue(values);
+  static TestResultPredicate_Expectancy? valueOf($core.int value) => _byValue[value];
+
+  const TestResultPredicate_Expectancy._($core.int v, $core.String n) : super(v, n);
+}
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/predicate.pbjson.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/predicate.pbjson.dart
new file mode 100644
index 0000000..b06ca0a
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/predicate.pbjson.dart
@@ -0,0 +1,108 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/resultdb/proto/v1/predicate.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+import 'dart:core' as $core;
+import 'dart:convert' as $convert;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use testResultPredicateDescriptor instead')
+const TestResultPredicate$json = const {
+  '1': 'TestResultPredicate',
+  '2': const [
+    const {'1': 'test_id_regexp', '3': 1, '4': 1, '5': 9, '10': 'testIdRegexp'},
+    const {'1': 'variant', '3': 2, '4': 1, '5': 11, '6': '.luci.resultdb.v1.VariantPredicate', '10': 'variant'},
+    const {
+      '1': 'expectancy',
+      '3': 3,
+      '4': 1,
+      '5': 14,
+      '6': '.luci.resultdb.v1.TestResultPredicate.Expectancy',
+      '10': 'expectancy'
+    },
+    const {'1': 'exclude_exonerated', '3': 4, '4': 1, '5': 8, '10': 'excludeExonerated'},
+  ],
+  '4': const [TestResultPredicate_Expectancy$json],
+};
+
+@$core.Deprecated('Use testResultPredicateDescriptor instead')
+const TestResultPredicate_Expectancy$json = const {
+  '1': 'Expectancy',
+  '2': const [
+    const {'1': 'ALL', '2': 0},
+    const {'1': 'VARIANTS_WITH_UNEXPECTED_RESULTS', '2': 1},
+    const {'1': 'VARIANTS_WITH_ONLY_UNEXPECTED_RESULTS', '2': 2},
+  ],
+};
+
+/// Descriptor for `TestResultPredicate`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List testResultPredicateDescriptor = $convert.base64Decode(
+    'ChNUZXN0UmVzdWx0UHJlZGljYXRlEiQKDnRlc3RfaWRfcmVnZXhwGAEgASgJUgx0ZXN0SWRSZWdleHASPAoHdmFyaWFudBgCIAEoCzIiLmx1Y2kucmVzdWx0ZGIudjEuVmFyaWFudFByZWRpY2F0ZVIHdmFyaWFudBJQCgpleHBlY3RhbmN5GAMgASgOMjAubHVjaS5yZXN1bHRkYi52MS5UZXN0UmVzdWx0UHJlZGljYXRlLkV4cGVjdGFuY3lSCmV4cGVjdGFuY3kSLQoSZXhjbHVkZV9leG9uZXJhdGVkGAQgASgIUhFleGNsdWRlRXhvbmVyYXRlZCJmCgpFeHBlY3RhbmN5EgcKA0FMTBAAEiQKIFZBUklBTlRTX1dJVEhfVU5FWFBFQ1RFRF9SRVNVTFRTEAESKQolVkFSSUFOVFNfV0lUSF9PTkxZX1VORVhQRUNURURfUkVTVUxUUxAC');
+@$core.Deprecated('Use testExonerationPredicateDescriptor instead')
+const TestExonerationPredicate$json = const {
+  '1': 'TestExonerationPredicate',
+  '2': const [
+    const {'1': 'test_id_regexp', '3': 1, '4': 1, '5': 9, '10': 'testIdRegexp'},
+    const {'1': 'variant', '3': 2, '4': 1, '5': 11, '6': '.luci.resultdb.v1.VariantPredicate', '10': 'variant'},
+  ],
+};
+
+/// Descriptor for `TestExonerationPredicate`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List testExonerationPredicateDescriptor = $convert.base64Decode(
+    'ChhUZXN0RXhvbmVyYXRpb25QcmVkaWNhdGUSJAoOdGVzdF9pZF9yZWdleHAYASABKAlSDHRlc3RJZFJlZ2V4cBI8Cgd2YXJpYW50GAIgASgLMiIubHVjaS5yZXN1bHRkYi52MS5WYXJpYW50UHJlZGljYXRlUgd2YXJpYW50');
+@$core.Deprecated('Use variantPredicateDescriptor instead')
+const VariantPredicate$json = const {
+  '1': 'VariantPredicate',
+  '2': const [
+    const {'1': 'equals', '3': 1, '4': 1, '5': 11, '6': '.luci.resultdb.v1.Variant', '9': 0, '10': 'equals'},
+    const {'1': 'contains', '3': 2, '4': 1, '5': 11, '6': '.luci.resultdb.v1.Variant', '9': 0, '10': 'contains'},
+  ],
+  '8': const [
+    const {'1': 'predicate'},
+  ],
+};
+
+/// Descriptor for `VariantPredicate`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List variantPredicateDescriptor = $convert.base64Decode(
+    'ChBWYXJpYW50UHJlZGljYXRlEjMKBmVxdWFscxgBIAEoCzIZLmx1Y2kucmVzdWx0ZGIudjEuVmFyaWFudEgAUgZlcXVhbHMSNwoIY29udGFpbnMYAiABKAsyGS5sdWNpLnJlc3VsdGRiLnYxLlZhcmlhbnRIAFIIY29udGFpbnNCCwoJcHJlZGljYXRl');
+@$core.Deprecated('Use artifactPredicateDescriptor instead')
+const ArtifactPredicate$json = const {
+  '1': 'ArtifactPredicate',
+  '2': const [
+    const {
+      '1': 'follow_edges',
+      '3': 1,
+      '4': 1,
+      '5': 11,
+      '6': '.luci.resultdb.v1.ArtifactPredicate.EdgeTypeSet',
+      '10': 'followEdges'
+    },
+    const {
+      '1': 'test_result_predicate',
+      '3': 2,
+      '4': 1,
+      '5': 11,
+      '6': '.luci.resultdb.v1.TestResultPredicate',
+      '10': 'testResultPredicate'
+    },
+    const {'1': 'content_type_regexp', '3': 3, '4': 1, '5': 9, '10': 'contentTypeRegexp'},
+    const {'1': 'artifact_id_regexp', '3': 4, '4': 1, '5': 9, '10': 'artifactIdRegexp'},
+  ],
+  '3': const [ArtifactPredicate_EdgeTypeSet$json],
+};
+
+@$core.Deprecated('Use artifactPredicateDescriptor instead')
+const ArtifactPredicate_EdgeTypeSet$json = const {
+  '1': 'EdgeTypeSet',
+  '2': const [
+    const {'1': 'included_invocations', '3': 1, '4': 1, '5': 8, '10': 'includedInvocations'},
+    const {'1': 'test_results', '3': 2, '4': 1, '5': 8, '10': 'testResults'},
+  ],
+};
+
+/// Descriptor for `ArtifactPredicate`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List artifactPredicateDescriptor = $convert.base64Decode(
+    'ChFBcnRpZmFjdFByZWRpY2F0ZRJSCgxmb2xsb3dfZWRnZXMYASABKAsyLy5sdWNpLnJlc3VsdGRiLnYxLkFydGlmYWN0UHJlZGljYXRlLkVkZ2VUeXBlU2V0Ugtmb2xsb3dFZGdlcxJZChV0ZXN0X3Jlc3VsdF9wcmVkaWNhdGUYAiABKAsyJS5sdWNpLnJlc3VsdGRiLnYxLlRlc3RSZXN1bHRQcmVkaWNhdGVSE3Rlc3RSZXN1bHRQcmVkaWNhdGUSLgoTY29udGVudF90eXBlX3JlZ2V4cBgDIAEoCVIRY29udGVudFR5cGVSZWdleHASLAoSYXJ0aWZhY3RfaWRfcmVnZXhwGAQgASgJUhBhcnRpZmFjdElkUmVnZXhwGmMKC0VkZ2VUeXBlU2V0EjEKFGluY2x1ZGVkX2ludm9jYXRpb25zGAEgASgIUhNpbmNsdWRlZEludm9jYXRpb25zEiEKDHRlc3RfcmVzdWx0cxgCIAEoCFILdGVzdFJlc3VsdHM=');
diff --git a/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/predicate.pbserver.dart b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/predicate.pbserver.dart
new file mode 100644
index 0000000..0b72f6a
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/go.chromium.org/luci/resultdb/proto/v1/predicate.pbserver.dart
@@ -0,0 +1,8 @@
+///
+//  Generated code. Do not modify.
+//  source: go.chromium.org/luci/resultdb/proto/v1/predicate.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+export 'predicate.pb.dart';
diff --git a/packages/buildbucket-dart/lib/src/generated/google/protobuf/duration.pb.dart b/packages/buildbucket-dart/lib/src/generated/google/protobuf/duration.pb.dart
new file mode 100644
index 0000000..77ccaed
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/google/protobuf/duration.pb.dart
@@ -0,0 +1,86 @@
+///
+//  Generated code. Do not modify.
+//  source: google/protobuf/duration.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'package:protobuf/src/protobuf/mixins/well_known.dart' as $mixin;
+
+class Duration extends $pb.GeneratedMessage with $mixin.DurationMixin {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Duration',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'google.protobuf'),
+      createEmptyInstance: create,
+      toProto3Json: $mixin.DurationMixin.toProto3JsonHelper,
+      fromProto3Json: $mixin.DurationMixin.fromProto3JsonHelper)
+    ..aInt64(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'seconds')
+    ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'nanos', $pb.PbFieldType.O3)
+    ..hasRequiredFields = false;
+
+  Duration._() : super();
+  factory Duration({
+    $fixnum.Int64? seconds,
+    $core.int? nanos,
+  }) {
+    final _result = create();
+    if (seconds != null) {
+      _result.seconds = seconds;
+    }
+    if (nanos != null) {
+      _result.nanos = nanos;
+    }
+    return _result;
+  }
+  factory Duration.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory Duration.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  Duration clone() => Duration()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  Duration copyWith(void Function(Duration) updates) =>
+      super.copyWith((message) => updates(message as Duration)) as Duration; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Duration create() => Duration._();
+  Duration createEmptyInstance() => create();
+  static $pb.PbList<Duration> createRepeated() => $pb.PbList<Duration>();
+  @$core.pragma('dart2js:noInline')
+  static Duration getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Duration>(create);
+  static Duration? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $fixnum.Int64 get seconds => $_getI64(0);
+  @$pb.TagNumber(1)
+  set seconds($fixnum.Int64 v) {
+    $_setInt64(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasSeconds() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearSeconds() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.int get nanos => $_getIZ(1);
+  @$pb.TagNumber(2)
+  set nanos($core.int v) {
+    $_setSignedInt32(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasNanos() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearNanos() => clearField(2);
+}
diff --git a/packages/buildbucket-dart/lib/src/generated/google/protobuf/duration.pbenum.dart b/packages/buildbucket-dart/lib/src/generated/google/protobuf/duration.pbenum.dart
new file mode 100644
index 0000000..e4337cf
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/google/protobuf/duration.pbenum.dart
@@ -0,0 +1,6 @@
+///
+//  Generated code. Do not modify.
+//  source: google/protobuf/duration.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
diff --git a/packages/buildbucket-dart/lib/src/generated/google/protobuf/duration.pbjson.dart b/packages/buildbucket-dart/lib/src/generated/google/protobuf/duration.pbjson.dart
new file mode 100644
index 0000000..6d28c81
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/google/protobuf/duration.pbjson.dart
@@ -0,0 +1,23 @@
+///
+//  Generated code. Do not modify.
+//  source: google/protobuf/duration.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+import 'dart:core' as $core;
+import 'dart:convert' as $convert;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use durationDescriptor instead')
+const Duration$json = const {
+  '1': 'Duration',
+  '2': const [
+    const {'1': 'seconds', '3': 1, '4': 1, '5': 3, '10': 'seconds'},
+    const {'1': 'nanos', '3': 2, '4': 1, '5': 5, '10': 'nanos'},
+  ],
+};
+
+/// Descriptor for `Duration`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List durationDescriptor =
+    $convert.base64Decode('CghEdXJhdGlvbhIYCgdzZWNvbmRzGAEgASgDUgdzZWNvbmRzEhQKBW5hbm9zGAIgASgFUgVuYW5vcw==');
diff --git a/packages/buildbucket-dart/lib/src/generated/google/protobuf/duration.pbserver.dart b/packages/buildbucket-dart/lib/src/generated/google/protobuf/duration.pbserver.dart
new file mode 100644
index 0000000..5ef4da4
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/google/protobuf/duration.pbserver.dart
@@ -0,0 +1,8 @@
+///
+//  Generated code. Do not modify.
+//  source: google/protobuf/duration.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+export 'duration.pb.dart';
diff --git a/packages/buildbucket-dart/lib/src/generated/google/protobuf/struct.pb.dart b/packages/buildbucket-dart/lib/src/generated/google/protobuf/struct.pb.dart
new file mode 100644
index 0000000..1302bb6
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/google/protobuf/struct.pb.dart
@@ -0,0 +1,281 @@
+///
+//  Generated code. Do not modify.
+//  source: google/protobuf/struct.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+import 'dart:core' as $core;
+
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'package:protobuf/src/protobuf/mixins/well_known.dart' as $mixin;
+
+import 'struct.pbenum.dart';
+
+export 'struct.pbenum.dart';
+
+class Struct extends $pb.GeneratedMessage with $mixin.StructMixin {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Struct',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'google.protobuf'),
+      createEmptyInstance: create,
+      toProto3Json: $mixin.StructMixin.toProto3JsonHelper,
+      fromProto3Json: $mixin.StructMixin.fromProto3JsonHelper)
+    ..m<$core.String, Value>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'fields',
+        entryClassName: 'Struct.FieldsEntry',
+        keyFieldType: $pb.PbFieldType.OS,
+        valueFieldType: $pb.PbFieldType.OM,
+        valueCreator: Value.create,
+        packageName: const $pb.PackageName('google.protobuf'))
+    ..hasRequiredFields = false;
+
+  Struct._() : super();
+  factory Struct({
+    $core.Map<$core.String, Value>? fields,
+  }) {
+    final _result = create();
+    if (fields != null) {
+      _result.fields.addAll(fields);
+    }
+    return _result;
+  }
+  factory Struct.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory Struct.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  Struct clone() => Struct()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  Struct copyWith(void Function(Struct) updates) =>
+      super.copyWith((message) => updates(message as Struct)) as Struct; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Struct create() => Struct._();
+  Struct createEmptyInstance() => create();
+  static $pb.PbList<Struct> createRepeated() => $pb.PbList<Struct>();
+  @$core.pragma('dart2js:noInline')
+  static Struct getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Struct>(create);
+  static Struct? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.Map<$core.String, Value> get fields => $_getMap(0);
+}
+
+enum Value_Kind { nullValue, numberValue, stringValue, boolValue, structValue, listValue, notSet }
+
+class Value extends $pb.GeneratedMessage with $mixin.ValueMixin {
+  static const $core.Map<$core.int, Value_Kind> _Value_KindByTag = {
+    1: Value_Kind.nullValue,
+    2: Value_Kind.numberValue,
+    3: Value_Kind.stringValue,
+    4: Value_Kind.boolValue,
+    5: Value_Kind.structValue,
+    6: Value_Kind.listValue,
+    0: Value_Kind.notSet
+  };
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Value',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'google.protobuf'),
+      createEmptyInstance: create,
+      toProto3Json: $mixin.ValueMixin.toProto3JsonHelper,
+      fromProto3Json: $mixin.ValueMixin.fromProto3JsonHelper)
+    ..oo(0, [1, 2, 3, 4, 5, 6])
+    ..e<NullValue>(
+        1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'nullValue', $pb.PbFieldType.OE,
+        defaultOrMaker: NullValue.NULL_VALUE, valueOf: NullValue.valueOf, enumValues: NullValue.values)
+    ..a<$core.double>(
+        2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'numberValue', $pb.PbFieldType.OD)
+    ..aOS(3, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'stringValue')
+    ..aOB(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'boolValue')
+    ..aOM<Struct>(5, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'structValue',
+        subBuilder: Struct.create)
+    ..aOM<ListValue>(6, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'listValue',
+        subBuilder: ListValue.create)
+    ..hasRequiredFields = false;
+
+  Value._() : super();
+  factory Value({
+    NullValue? nullValue,
+    $core.double? numberValue,
+    $core.String? stringValue,
+    $core.bool? boolValue,
+    Struct? structValue,
+    ListValue? listValue,
+  }) {
+    final _result = create();
+    if (nullValue != null) {
+      _result.nullValue = nullValue;
+    }
+    if (numberValue != null) {
+      _result.numberValue = numberValue;
+    }
+    if (stringValue != null) {
+      _result.stringValue = stringValue;
+    }
+    if (boolValue != null) {
+      _result.boolValue = boolValue;
+    }
+    if (structValue != null) {
+      _result.structValue = structValue;
+    }
+    if (listValue != null) {
+      _result.listValue = listValue;
+    }
+    return _result;
+  }
+  factory Value.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory Value.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  Value clone() => Value()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  Value copyWith(void Function(Value) updates) =>
+      super.copyWith((message) => updates(message as Value)) as Value; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Value create() => Value._();
+  Value createEmptyInstance() => create();
+  static $pb.PbList<Value> createRepeated() => $pb.PbList<Value>();
+  @$core.pragma('dart2js:noInline')
+  static Value getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Value>(create);
+  static Value? _defaultInstance;
+
+  Value_Kind whichKind() => _Value_KindByTag[$_whichOneof(0)]!;
+  void clearKind() => clearField($_whichOneof(0));
+
+  @$pb.TagNumber(1)
+  NullValue get nullValue => $_getN(0);
+  @$pb.TagNumber(1)
+  set nullValue(NullValue v) {
+    setField(1, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasNullValue() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearNullValue() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.double get numberValue => $_getN(1);
+  @$pb.TagNumber(2)
+  set numberValue($core.double v) {
+    $_setDouble(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasNumberValue() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearNumberValue() => clearField(2);
+
+  @$pb.TagNumber(3)
+  $core.String get stringValue => $_getSZ(2);
+  @$pb.TagNumber(3)
+  set stringValue($core.String v) {
+    $_setString(2, v);
+  }
+
+  @$pb.TagNumber(3)
+  $core.bool hasStringValue() => $_has(2);
+  @$pb.TagNumber(3)
+  void clearStringValue() => clearField(3);
+
+  @$pb.TagNumber(4)
+  $core.bool get boolValue => $_getBF(3);
+  @$pb.TagNumber(4)
+  set boolValue($core.bool v) {
+    $_setBool(3, v);
+  }
+
+  @$pb.TagNumber(4)
+  $core.bool hasBoolValue() => $_has(3);
+  @$pb.TagNumber(4)
+  void clearBoolValue() => clearField(4);
+
+  @$pb.TagNumber(5)
+  Struct get structValue => $_getN(4);
+  @$pb.TagNumber(5)
+  set structValue(Struct v) {
+    setField(5, v);
+  }
+
+  @$pb.TagNumber(5)
+  $core.bool hasStructValue() => $_has(4);
+  @$pb.TagNumber(5)
+  void clearStructValue() => clearField(5);
+  @$pb.TagNumber(5)
+  Struct ensureStructValue() => $_ensure(4);
+
+  @$pb.TagNumber(6)
+  ListValue get listValue => $_getN(5);
+  @$pb.TagNumber(6)
+  set listValue(ListValue v) {
+    setField(6, v);
+  }
+
+  @$pb.TagNumber(6)
+  $core.bool hasListValue() => $_has(5);
+  @$pb.TagNumber(6)
+  void clearListValue() => clearField(6);
+  @$pb.TagNumber(6)
+  ListValue ensureListValue() => $_ensure(5);
+}
+
+class ListValue extends $pb.GeneratedMessage with $mixin.ListValueMixin {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ListValue',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'google.protobuf'),
+      createEmptyInstance: create,
+      toProto3Json: $mixin.ListValueMixin.toProto3JsonHelper,
+      fromProto3Json: $mixin.ListValueMixin.fromProto3JsonHelper)
+    ..pc<Value>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'values', $pb.PbFieldType.PM,
+        subBuilder: Value.create)
+    ..hasRequiredFields = false;
+
+  ListValue._() : super();
+  factory ListValue({
+    $core.Iterable<Value>? values,
+  }) {
+    final _result = create();
+    if (values != null) {
+      _result.values.addAll(values);
+    }
+    return _result;
+  }
+  factory ListValue.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory ListValue.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  ListValue clone() => ListValue()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  ListValue copyWith(void Function(ListValue) updates) =>
+      super.copyWith((message) => updates(message as ListValue)) as ListValue; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static ListValue create() => ListValue._();
+  ListValue createEmptyInstance() => create();
+  static $pb.PbList<ListValue> createRepeated() => $pb.PbList<ListValue>();
+  @$core.pragma('dart2js:noInline')
+  static ListValue getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ListValue>(create);
+  static ListValue? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.List<Value> get values => $_getList(0);
+}
diff --git a/packages/buildbucket-dart/lib/src/generated/google/protobuf/struct.pbenum.dart b/packages/buildbucket-dart/lib/src/generated/google/protobuf/struct.pbenum.dart
new file mode 100644
index 0000000..80639c8
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/google/protobuf/struct.pbenum.dart
@@ -0,0 +1,24 @@
+///
+//  Generated code. Do not modify.
+//  source: google/protobuf/struct.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+// ignore_for_file: UNDEFINED_SHOWN_NAME
+import 'dart:core' as $core;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+class NullValue extends $pb.ProtobufEnum {
+  static const NullValue NULL_VALUE =
+      NullValue._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'NULL_VALUE');
+
+  static const $core.List<NullValue> values = <NullValue>[
+    NULL_VALUE,
+  ];
+
+  static final $core.Map<$core.int, NullValue> _byValue = $pb.ProtobufEnum.initByValue(values);
+  static NullValue? valueOf($core.int value) => _byValue[value];
+
+  const NullValue._($core.int v, $core.String n) : super(v, n);
+}
diff --git a/packages/buildbucket-dart/lib/src/generated/google/protobuf/struct.pbjson.dart b/packages/buildbucket-dart/lib/src/generated/google/protobuf/struct.pbjson.dart
new file mode 100644
index 0000000..eecfc38
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/google/protobuf/struct.pbjson.dart
@@ -0,0 +1,73 @@
+///
+//  Generated code. Do not modify.
+//  source: google/protobuf/struct.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+import 'dart:core' as $core;
+import 'dart:convert' as $convert;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use nullValueDescriptor instead')
+const NullValue$json = const {
+  '1': 'NullValue',
+  '2': const [
+    const {'1': 'NULL_VALUE', '2': 0},
+  ],
+};
+
+/// Descriptor for `NullValue`. Decode as a `google.protobuf.EnumDescriptorProto`.
+final $typed_data.Uint8List nullValueDescriptor = $convert.base64Decode('CglOdWxsVmFsdWUSDgoKTlVMTF9WQUxVRRAA');
+@$core.Deprecated('Use structDescriptor instead')
+const Struct$json = const {
+  '1': 'Struct',
+  '2': const [
+    const {'1': 'fields', '3': 1, '4': 3, '5': 11, '6': '.google.protobuf.Struct.FieldsEntry', '10': 'fields'},
+  ],
+  '3': const [Struct_FieldsEntry$json],
+};
+
+@$core.Deprecated('Use structDescriptor instead')
+const Struct_FieldsEntry$json = const {
+  '1': 'FieldsEntry',
+  '2': const [
+    const {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
+    const {'1': 'value', '3': 2, '4': 1, '5': 11, '6': '.google.protobuf.Value', '10': 'value'},
+  ],
+  '7': const {'7': true},
+};
+
+/// Descriptor for `Struct`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List structDescriptor = $convert.base64Decode(
+    'CgZTdHJ1Y3QSOwoGZmllbGRzGAEgAygLMiMuZ29vZ2xlLnByb3RvYnVmLlN0cnVjdC5GaWVsZHNFbnRyeVIGZmllbGRzGlEKC0ZpZWxkc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EiwKBXZhbHVlGAIgASgLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgV2YWx1ZToCOAE=');
+@$core.Deprecated('Use valueDescriptor instead')
+const Value$json = const {
+  '1': 'Value',
+  '2': const [
+    const {'1': 'null_value', '3': 1, '4': 1, '5': 14, '6': '.google.protobuf.NullValue', '9': 0, '10': 'nullValue'},
+    const {'1': 'number_value', '3': 2, '4': 1, '5': 1, '9': 0, '10': 'numberValue'},
+    const {'1': 'string_value', '3': 3, '4': 1, '5': 9, '9': 0, '10': 'stringValue'},
+    const {'1': 'bool_value', '3': 4, '4': 1, '5': 8, '9': 0, '10': 'boolValue'},
+    const {'1': 'struct_value', '3': 5, '4': 1, '5': 11, '6': '.google.protobuf.Struct', '9': 0, '10': 'structValue'},
+    const {'1': 'list_value', '3': 6, '4': 1, '5': 11, '6': '.google.protobuf.ListValue', '9': 0, '10': 'listValue'},
+  ],
+  '8': const [
+    const {'1': 'kind'},
+  ],
+};
+
+/// Descriptor for `Value`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List valueDescriptor = $convert.base64Decode(
+    'CgVWYWx1ZRI7CgpudWxsX3ZhbHVlGAEgASgOMhouZ29vZ2xlLnByb3RvYnVmLk51bGxWYWx1ZUgAUgludWxsVmFsdWUSIwoMbnVtYmVyX3ZhbHVlGAIgASgBSABSC251bWJlclZhbHVlEiMKDHN0cmluZ192YWx1ZRgDIAEoCUgAUgtzdHJpbmdWYWx1ZRIfCgpib29sX3ZhbHVlGAQgASgISABSCWJvb2xWYWx1ZRI8CgxzdHJ1Y3RfdmFsdWUYBSABKAsyFy5nb29nbGUucHJvdG9idWYuU3RydWN0SABSC3N0cnVjdFZhbHVlEjsKCmxpc3RfdmFsdWUYBiABKAsyGi5nb29nbGUucHJvdG9idWYuTGlzdFZhbHVlSABSCWxpc3RWYWx1ZUIGCgRraW5k');
+@$core.Deprecated('Use listValueDescriptor instead')
+const ListValue$json = const {
+  '1': 'ListValue',
+  '2': const [
+    const {'1': 'values', '3': 1, '4': 3, '5': 11, '6': '.google.protobuf.Value', '10': 'values'},
+  ],
+};
+
+/// Descriptor for `ListValue`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List listValueDescriptor =
+    $convert.base64Decode('CglMaXN0VmFsdWUSLgoGdmFsdWVzGAEgAygLMhYuZ29vZ2xlLnByb3RvYnVmLlZhbHVlUgZ2YWx1ZXM=');
diff --git a/packages/buildbucket-dart/lib/src/generated/google/protobuf/struct.pbserver.dart b/packages/buildbucket-dart/lib/src/generated/google/protobuf/struct.pbserver.dart
new file mode 100644
index 0000000..d1617f8
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/google/protobuf/struct.pbserver.dart
@@ -0,0 +1,8 @@
+///
+//  Generated code. Do not modify.
+//  source: google/protobuf/struct.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+export 'struct.pb.dart';
diff --git a/packages/buildbucket-dart/lib/src/generated/google/protobuf/timestamp.pb.dart b/packages/buildbucket-dart/lib/src/generated/google/protobuf/timestamp.pb.dart
new file mode 100644
index 0000000..86e1db7
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/google/protobuf/timestamp.pb.dart
@@ -0,0 +1,95 @@
+///
+//  Generated code. Do not modify.
+//  source: google/protobuf/timestamp.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'package:protobuf/src/protobuf/mixins/well_known.dart' as $mixin;
+
+class Timestamp extends $pb.GeneratedMessage with $mixin.TimestampMixin {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Timestamp',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'google.protobuf'),
+      createEmptyInstance: create,
+      toProto3Json: $mixin.TimestampMixin.toProto3JsonHelper,
+      fromProto3Json: $mixin.TimestampMixin.fromProto3JsonHelper)
+    ..aInt64(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'seconds')
+    ..a<$core.int>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'nanos', $pb.PbFieldType.O3)
+    ..hasRequiredFields = false;
+
+  Timestamp._() : super();
+  factory Timestamp({
+    $fixnum.Int64? seconds,
+    $core.int? nanos,
+  }) {
+    final _result = create();
+    if (seconds != null) {
+      _result.seconds = seconds;
+    }
+    if (nanos != null) {
+      _result.nanos = nanos;
+    }
+    return _result;
+  }
+  factory Timestamp.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory Timestamp.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  Timestamp clone() => Timestamp()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  Timestamp copyWith(void Function(Timestamp) updates) =>
+      super.copyWith((message) => updates(message as Timestamp)) as Timestamp; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Timestamp create() => Timestamp._();
+  Timestamp createEmptyInstance() => create();
+  static $pb.PbList<Timestamp> createRepeated() => $pb.PbList<Timestamp>();
+  @$core.pragma('dart2js:noInline')
+  static Timestamp getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Timestamp>(create);
+  static Timestamp? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $fixnum.Int64 get seconds => $_getI64(0);
+  @$pb.TagNumber(1)
+  set seconds($fixnum.Int64 v) {
+    $_setInt64(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasSeconds() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearSeconds() => clearField(1);
+
+  @$pb.TagNumber(2)
+  $core.int get nanos => $_getIZ(1);
+  @$pb.TagNumber(2)
+  set nanos($core.int v) {
+    $_setSignedInt32(1, v);
+  }
+
+  @$pb.TagNumber(2)
+  $core.bool hasNanos() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearNanos() => clearField(2);
+
+  /// Creates a new instance from [dateTime].
+  ///
+  /// Time zone information will not be preserved.
+  static Timestamp fromDateTime($core.DateTime dateTime) {
+    final result = create();
+    $mixin.TimestampMixin.setFromDateTime(result, dateTime);
+    return result;
+  }
+}
diff --git a/packages/buildbucket-dart/lib/src/generated/google/protobuf/timestamp.pbenum.dart b/packages/buildbucket-dart/lib/src/generated/google/protobuf/timestamp.pbenum.dart
new file mode 100644
index 0000000..5b33f42
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/google/protobuf/timestamp.pbenum.dart
@@ -0,0 +1,6 @@
+///
+//  Generated code. Do not modify.
+//  source: google/protobuf/timestamp.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
diff --git a/packages/buildbucket-dart/lib/src/generated/google/protobuf/timestamp.pbjson.dart b/packages/buildbucket-dart/lib/src/generated/google/protobuf/timestamp.pbjson.dart
new file mode 100644
index 0000000..d296331
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/google/protobuf/timestamp.pbjson.dart
@@ -0,0 +1,23 @@
+///
+//  Generated code. Do not modify.
+//  source: google/protobuf/timestamp.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+import 'dart:core' as $core;
+import 'dart:convert' as $convert;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use timestampDescriptor instead')
+const Timestamp$json = const {
+  '1': 'Timestamp',
+  '2': const [
+    const {'1': 'seconds', '3': 1, '4': 1, '5': 3, '10': 'seconds'},
+    const {'1': 'nanos', '3': 2, '4': 1, '5': 5, '10': 'nanos'},
+  ],
+};
+
+/// Descriptor for `Timestamp`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List timestampDescriptor =
+    $convert.base64Decode('CglUaW1lc3RhbXASGAoHc2Vjb25kcxgBIAEoA1IHc2Vjb25kcxIUCgVuYW5vcxgCIAEoBVIFbmFub3M=');
diff --git a/packages/buildbucket-dart/lib/src/generated/google/protobuf/timestamp.pbserver.dart b/packages/buildbucket-dart/lib/src/generated/google/protobuf/timestamp.pbserver.dart
new file mode 100644
index 0000000..9910206
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/google/protobuf/timestamp.pbserver.dart
@@ -0,0 +1,8 @@
+///
+//  Generated code. Do not modify.
+//  source: google/protobuf/timestamp.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+export 'timestamp.pb.dart';
diff --git a/packages/buildbucket-dart/lib/src/generated/google/protobuf/wrappers.pb.dart b/packages/buildbucket-dart/lib/src/generated/google/protobuf/wrappers.pb.dart
new file mode 100644
index 0000000..090db1b
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/google/protobuf/wrappers.pb.dart
@@ -0,0 +1,522 @@
+///
+//  Generated code. Do not modify.
+//  source: google/protobuf/wrappers.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+import 'dart:core' as $core;
+
+import 'package:fixnum/fixnum.dart' as $fixnum;
+import 'package:protobuf/protobuf.dart' as $pb;
+
+import 'package:protobuf/src/protobuf/mixins/well_known.dart' as $mixin;
+
+class DoubleValue extends $pb.GeneratedMessage with $mixin.DoubleValueMixin {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'DoubleValue',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'google.protobuf'),
+      createEmptyInstance: create,
+      toProto3Json: $mixin.DoubleValueMixin.toProto3JsonHelper,
+      fromProto3Json: $mixin.DoubleValueMixin.fromProto3JsonHelper)
+    ..a<$core.double>(
+        1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'value', $pb.PbFieldType.OD)
+    ..hasRequiredFields = false;
+
+  DoubleValue._() : super();
+  factory DoubleValue({
+    $core.double? value,
+  }) {
+    final _result = create();
+    if (value != null) {
+      _result.value = value;
+    }
+    return _result;
+  }
+  factory DoubleValue.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory DoubleValue.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  DoubleValue clone() => DoubleValue()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  DoubleValue copyWith(void Function(DoubleValue) updates) =>
+      super.copyWith((message) => updates(message as DoubleValue)) as DoubleValue; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static DoubleValue create() => DoubleValue._();
+  DoubleValue createEmptyInstance() => create();
+  static $pb.PbList<DoubleValue> createRepeated() => $pb.PbList<DoubleValue>();
+  @$core.pragma('dart2js:noInline')
+  static DoubleValue getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<DoubleValue>(create);
+  static DoubleValue? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.double get value => $_getN(0);
+  @$pb.TagNumber(1)
+  set value($core.double v) {
+    $_setDouble(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasValue() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearValue() => clearField(1);
+}
+
+class FloatValue extends $pb.GeneratedMessage with $mixin.FloatValueMixin {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'FloatValue',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'google.protobuf'),
+      createEmptyInstance: create,
+      toProto3Json: $mixin.FloatValueMixin.toProto3JsonHelper,
+      fromProto3Json: $mixin.FloatValueMixin.fromProto3JsonHelper)
+    ..a<$core.double>(
+        1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'value', $pb.PbFieldType.OF)
+    ..hasRequiredFields = false;
+
+  FloatValue._() : super();
+  factory FloatValue({
+    $core.double? value,
+  }) {
+    final _result = create();
+    if (value != null) {
+      _result.value = value;
+    }
+    return _result;
+  }
+  factory FloatValue.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory FloatValue.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  FloatValue clone() => FloatValue()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  FloatValue copyWith(void Function(FloatValue) updates) =>
+      super.copyWith((message) => updates(message as FloatValue)) as FloatValue; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static FloatValue create() => FloatValue._();
+  FloatValue createEmptyInstance() => create();
+  static $pb.PbList<FloatValue> createRepeated() => $pb.PbList<FloatValue>();
+  @$core.pragma('dart2js:noInline')
+  static FloatValue getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<FloatValue>(create);
+  static FloatValue? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.double get value => $_getN(0);
+  @$pb.TagNumber(1)
+  set value($core.double v) {
+    $_setFloat(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasValue() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearValue() => clearField(1);
+}
+
+class Int64Value extends $pb.GeneratedMessage with $mixin.Int64ValueMixin {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Int64Value',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'google.protobuf'),
+      createEmptyInstance: create,
+      toProto3Json: $mixin.Int64ValueMixin.toProto3JsonHelper,
+      fromProto3Json: $mixin.Int64ValueMixin.fromProto3JsonHelper)
+    ..aInt64(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'value')
+    ..hasRequiredFields = false;
+
+  Int64Value._() : super();
+  factory Int64Value({
+    $fixnum.Int64? value,
+  }) {
+    final _result = create();
+    if (value != null) {
+      _result.value = value;
+    }
+    return _result;
+  }
+  factory Int64Value.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory Int64Value.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  Int64Value clone() => Int64Value()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  Int64Value copyWith(void Function(Int64Value) updates) =>
+      super.copyWith((message) => updates(message as Int64Value)) as Int64Value; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Int64Value create() => Int64Value._();
+  Int64Value createEmptyInstance() => create();
+  static $pb.PbList<Int64Value> createRepeated() => $pb.PbList<Int64Value>();
+  @$core.pragma('dart2js:noInline')
+  static Int64Value getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Int64Value>(create);
+  static Int64Value? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $fixnum.Int64 get value => $_getI64(0);
+  @$pb.TagNumber(1)
+  set value($fixnum.Int64 v) {
+    $_setInt64(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasValue() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearValue() => clearField(1);
+}
+
+class UInt64Value extends $pb.GeneratedMessage with $mixin.UInt64ValueMixin {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'UInt64Value',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'google.protobuf'),
+      createEmptyInstance: create,
+      toProto3Json: $mixin.UInt64ValueMixin.toProto3JsonHelper,
+      fromProto3Json: $mixin.UInt64ValueMixin.fromProto3JsonHelper)
+    ..a<$fixnum.Int64>(
+        1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'value', $pb.PbFieldType.OU6,
+        defaultOrMaker: $fixnum.Int64.ZERO)
+    ..hasRequiredFields = false;
+
+  UInt64Value._() : super();
+  factory UInt64Value({
+    $fixnum.Int64? value,
+  }) {
+    final _result = create();
+    if (value != null) {
+      _result.value = value;
+    }
+    return _result;
+  }
+  factory UInt64Value.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory UInt64Value.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  UInt64Value clone() => UInt64Value()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  UInt64Value copyWith(void Function(UInt64Value) updates) =>
+      super.copyWith((message) => updates(message as UInt64Value)) as UInt64Value; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static UInt64Value create() => UInt64Value._();
+  UInt64Value createEmptyInstance() => create();
+  static $pb.PbList<UInt64Value> createRepeated() => $pb.PbList<UInt64Value>();
+  @$core.pragma('dart2js:noInline')
+  static UInt64Value getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<UInt64Value>(create);
+  static UInt64Value? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $fixnum.Int64 get value => $_getI64(0);
+  @$pb.TagNumber(1)
+  set value($fixnum.Int64 v) {
+    $_setInt64(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasValue() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearValue() => clearField(1);
+}
+
+class Int32Value extends $pb.GeneratedMessage with $mixin.Int32ValueMixin {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Int32Value',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'google.protobuf'),
+      createEmptyInstance: create,
+      toProto3Json: $mixin.Int32ValueMixin.toProto3JsonHelper,
+      fromProto3Json: $mixin.Int32ValueMixin.fromProto3JsonHelper)
+    ..a<$core.int>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'value', $pb.PbFieldType.O3)
+    ..hasRequiredFields = false;
+
+  Int32Value._() : super();
+  factory Int32Value({
+    $core.int? value,
+  }) {
+    final _result = create();
+    if (value != null) {
+      _result.value = value;
+    }
+    return _result;
+  }
+  factory Int32Value.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory Int32Value.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  Int32Value clone() => Int32Value()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  Int32Value copyWith(void Function(Int32Value) updates) =>
+      super.copyWith((message) => updates(message as Int32Value)) as Int32Value; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static Int32Value create() => Int32Value._();
+  Int32Value createEmptyInstance() => create();
+  static $pb.PbList<Int32Value> createRepeated() => $pb.PbList<Int32Value>();
+  @$core.pragma('dart2js:noInline')
+  static Int32Value getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<Int32Value>(create);
+  static Int32Value? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.int get value => $_getIZ(0);
+  @$pb.TagNumber(1)
+  set value($core.int v) {
+    $_setSignedInt32(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasValue() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearValue() => clearField(1);
+}
+
+class UInt32Value extends $pb.GeneratedMessage with $mixin.UInt32ValueMixin {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'UInt32Value',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'google.protobuf'),
+      createEmptyInstance: create,
+      toProto3Json: $mixin.UInt32ValueMixin.toProto3JsonHelper,
+      fromProto3Json: $mixin.UInt32ValueMixin.fromProto3JsonHelper)
+    ..a<$core.int>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'value', $pb.PbFieldType.OU3)
+    ..hasRequiredFields = false;
+
+  UInt32Value._() : super();
+  factory UInt32Value({
+    $core.int? value,
+  }) {
+    final _result = create();
+    if (value != null) {
+      _result.value = value;
+    }
+    return _result;
+  }
+  factory UInt32Value.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory UInt32Value.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  UInt32Value clone() => UInt32Value()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  UInt32Value copyWith(void Function(UInt32Value) updates) =>
+      super.copyWith((message) => updates(message as UInt32Value)) as UInt32Value; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static UInt32Value create() => UInt32Value._();
+  UInt32Value createEmptyInstance() => create();
+  static $pb.PbList<UInt32Value> createRepeated() => $pb.PbList<UInt32Value>();
+  @$core.pragma('dart2js:noInline')
+  static UInt32Value getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<UInt32Value>(create);
+  static UInt32Value? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.int get value => $_getIZ(0);
+  @$pb.TagNumber(1)
+  set value($core.int v) {
+    $_setUnsignedInt32(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasValue() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearValue() => clearField(1);
+}
+
+class BoolValue extends $pb.GeneratedMessage with $mixin.BoolValueMixin {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BoolValue',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'google.protobuf'),
+      createEmptyInstance: create,
+      toProto3Json: $mixin.BoolValueMixin.toProto3JsonHelper,
+      fromProto3Json: $mixin.BoolValueMixin.fromProto3JsonHelper)
+    ..aOB(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'value')
+    ..hasRequiredFields = false;
+
+  BoolValue._() : super();
+  factory BoolValue({
+    $core.bool? value,
+  }) {
+    final _result = create();
+    if (value != null) {
+      _result.value = value;
+    }
+    return _result;
+  }
+  factory BoolValue.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BoolValue.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BoolValue clone() => BoolValue()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BoolValue copyWith(void Function(BoolValue) updates) =>
+      super.copyWith((message) => updates(message as BoolValue)) as BoolValue; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BoolValue create() => BoolValue._();
+  BoolValue createEmptyInstance() => create();
+  static $pb.PbList<BoolValue> createRepeated() => $pb.PbList<BoolValue>();
+  @$core.pragma('dart2js:noInline')
+  static BoolValue getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BoolValue>(create);
+  static BoolValue? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.bool get value => $_getBF(0);
+  @$pb.TagNumber(1)
+  set value($core.bool v) {
+    $_setBool(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasValue() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearValue() => clearField(1);
+}
+
+class StringValue extends $pb.GeneratedMessage with $mixin.StringValueMixin {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'StringValue',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'google.protobuf'),
+      createEmptyInstance: create,
+      toProto3Json: $mixin.StringValueMixin.toProto3JsonHelper,
+      fromProto3Json: $mixin.StringValueMixin.fromProto3JsonHelper)
+    ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'value')
+    ..hasRequiredFields = false;
+
+  StringValue._() : super();
+  factory StringValue({
+    $core.String? value,
+  }) {
+    final _result = create();
+    if (value != null) {
+      _result.value = value;
+    }
+    return _result;
+  }
+  factory StringValue.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory StringValue.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  StringValue clone() => StringValue()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  StringValue copyWith(void Function(StringValue) updates) =>
+      super.copyWith((message) => updates(message as StringValue)) as StringValue; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static StringValue create() => StringValue._();
+  StringValue createEmptyInstance() => create();
+  static $pb.PbList<StringValue> createRepeated() => $pb.PbList<StringValue>();
+  @$core.pragma('dart2js:noInline')
+  static StringValue getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<StringValue>(create);
+  static StringValue? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.String get value => $_getSZ(0);
+  @$pb.TagNumber(1)
+  set value($core.String v) {
+    $_setString(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasValue() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearValue() => clearField(1);
+}
+
+class BytesValue extends $pb.GeneratedMessage with $mixin.BytesValueMixin {
+  static final $pb.BuilderInfo _i = $pb.BuilderInfo(
+      const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'BytesValue',
+      package: const $pb.PackageName(
+          const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'google.protobuf'),
+      createEmptyInstance: create,
+      toProto3Json: $mixin.BytesValueMixin.toProto3JsonHelper,
+      fromProto3Json: $mixin.BytesValueMixin.fromProto3JsonHelper)
+    ..a<$core.List<$core.int>>(
+        1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'value', $pb.PbFieldType.OY)
+    ..hasRequiredFields = false;
+
+  BytesValue._() : super();
+  factory BytesValue({
+    $core.List<$core.int>? value,
+  }) {
+    final _result = create();
+    if (value != null) {
+      _result.value = value;
+    }
+    return _result;
+  }
+  factory BytesValue.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromBuffer(i, r);
+  factory BytesValue.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) =>
+      create()..mergeFromJson(i, r);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.deepCopy] instead. '
+      'Will be removed in next major version')
+  BytesValue clone() => BytesValue()..mergeFromMessage(this);
+  @$core.Deprecated('Using this can add significant overhead to your binary. '
+      'Use [GeneratedMessageGenericExtensions.rebuild] instead. '
+      'Will be removed in next major version')
+  BytesValue copyWith(void Function(BytesValue) updates) =>
+      super.copyWith((message) => updates(message as BytesValue)) as BytesValue; // ignore: deprecated_member_use
+  $pb.BuilderInfo get info_ => _i;
+  @$core.pragma('dart2js:noInline')
+  static BytesValue create() => BytesValue._();
+  BytesValue createEmptyInstance() => create();
+  static $pb.PbList<BytesValue> createRepeated() => $pb.PbList<BytesValue>();
+  @$core.pragma('dart2js:noInline')
+  static BytesValue getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<BytesValue>(create);
+  static BytesValue? _defaultInstance;
+
+  @$pb.TagNumber(1)
+  $core.List<$core.int> get value => $_getN(0);
+  @$pb.TagNumber(1)
+  set value($core.List<$core.int> v) {
+    $_setBytes(0, v);
+  }
+
+  @$pb.TagNumber(1)
+  $core.bool hasValue() => $_has(0);
+  @$pb.TagNumber(1)
+  void clearValue() => clearField(1);
+}
diff --git a/packages/buildbucket-dart/lib/src/generated/google/protobuf/wrappers.pbenum.dart b/packages/buildbucket-dart/lib/src/generated/google/protobuf/wrappers.pbenum.dart
new file mode 100644
index 0000000..4c3f9b1
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/google/protobuf/wrappers.pbenum.dart
@@ -0,0 +1,6 @@
+///
+//  Generated code. Do not modify.
+//  source: google/protobuf/wrappers.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
diff --git a/packages/buildbucket-dart/lib/src/generated/google/protobuf/wrappers.pbjson.dart b/packages/buildbucket-dart/lib/src/generated/google/protobuf/wrappers.pbjson.dart
new file mode 100644
index 0000000..61d8526
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/google/protobuf/wrappers.pbjson.dart
@@ -0,0 +1,109 @@
+///
+//  Generated code. Do not modify.
+//  source: google/protobuf/wrappers.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+import 'dart:core' as $core;
+import 'dart:convert' as $convert;
+import 'dart:typed_data' as $typed_data;
+
+@$core.Deprecated('Use doubleValueDescriptor instead')
+const DoubleValue$json = const {
+  '1': 'DoubleValue',
+  '2': const [
+    const {'1': 'value', '3': 1, '4': 1, '5': 1, '10': 'value'},
+  ],
+};
+
+/// Descriptor for `DoubleValue`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List doubleValueDescriptor =
+    $convert.base64Decode('CgtEb3VibGVWYWx1ZRIUCgV2YWx1ZRgBIAEoAVIFdmFsdWU=');
+@$core.Deprecated('Use floatValueDescriptor instead')
+const FloatValue$json = const {
+  '1': 'FloatValue',
+  '2': const [
+    const {'1': 'value', '3': 1, '4': 1, '5': 2, '10': 'value'},
+  ],
+};
+
+/// Descriptor for `FloatValue`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List floatValueDescriptor =
+    $convert.base64Decode('CgpGbG9hdFZhbHVlEhQKBXZhbHVlGAEgASgCUgV2YWx1ZQ==');
+@$core.Deprecated('Use int64ValueDescriptor instead')
+const Int64Value$json = const {
+  '1': 'Int64Value',
+  '2': const [
+    const {'1': 'value', '3': 1, '4': 1, '5': 3, '10': 'value'},
+  ],
+};
+
+/// Descriptor for `Int64Value`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List int64ValueDescriptor =
+    $convert.base64Decode('CgpJbnQ2NFZhbHVlEhQKBXZhbHVlGAEgASgDUgV2YWx1ZQ==');
+@$core.Deprecated('Use uInt64ValueDescriptor instead')
+const UInt64Value$json = const {
+  '1': 'UInt64Value',
+  '2': const [
+    const {'1': 'value', '3': 1, '4': 1, '5': 4, '10': 'value'},
+  ],
+};
+
+/// Descriptor for `UInt64Value`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List uInt64ValueDescriptor =
+    $convert.base64Decode('CgtVSW50NjRWYWx1ZRIUCgV2YWx1ZRgBIAEoBFIFdmFsdWU=');
+@$core.Deprecated('Use int32ValueDescriptor instead')
+const Int32Value$json = const {
+  '1': 'Int32Value',
+  '2': const [
+    const {'1': 'value', '3': 1, '4': 1, '5': 5, '10': 'value'},
+  ],
+};
+
+/// Descriptor for `Int32Value`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List int32ValueDescriptor =
+    $convert.base64Decode('CgpJbnQzMlZhbHVlEhQKBXZhbHVlGAEgASgFUgV2YWx1ZQ==');
+@$core.Deprecated('Use uInt32ValueDescriptor instead')
+const UInt32Value$json = const {
+  '1': 'UInt32Value',
+  '2': const [
+    const {'1': 'value', '3': 1, '4': 1, '5': 13, '10': 'value'},
+  ],
+};
+
+/// Descriptor for `UInt32Value`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List uInt32ValueDescriptor =
+    $convert.base64Decode('CgtVSW50MzJWYWx1ZRIUCgV2YWx1ZRgBIAEoDVIFdmFsdWU=');
+@$core.Deprecated('Use boolValueDescriptor instead')
+const BoolValue$json = const {
+  '1': 'BoolValue',
+  '2': const [
+    const {'1': 'value', '3': 1, '4': 1, '5': 8, '10': 'value'},
+  ],
+};
+
+/// Descriptor for `BoolValue`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List boolValueDescriptor = $convert.base64Decode('CglCb29sVmFsdWUSFAoFdmFsdWUYASABKAhSBXZhbHVl');
+@$core.Deprecated('Use stringValueDescriptor instead')
+const StringValue$json = const {
+  '1': 'StringValue',
+  '2': const [
+    const {'1': 'value', '3': 1, '4': 1, '5': 9, '10': 'value'},
+  ],
+};
+
+/// Descriptor for `StringValue`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List stringValueDescriptor =
+    $convert.base64Decode('CgtTdHJpbmdWYWx1ZRIUCgV2YWx1ZRgBIAEoCVIFdmFsdWU=');
+@$core.Deprecated('Use bytesValueDescriptor instead')
+const BytesValue$json = const {
+  '1': 'BytesValue',
+  '2': const [
+    const {'1': 'value', '3': 1, '4': 1, '5': 12, '10': 'value'},
+  ],
+};
+
+/// Descriptor for `BytesValue`. Decode as a `google.protobuf.DescriptorProto`.
+final $typed_data.Uint8List bytesValueDescriptor =
+    $convert.base64Decode('CgpCeXRlc1ZhbHVlEhQKBXZhbHVlGAEgASgMUgV2YWx1ZQ==');
diff --git a/packages/buildbucket-dart/lib/src/generated/google/protobuf/wrappers.pbserver.dart b/packages/buildbucket-dart/lib/src/generated/google/protobuf/wrappers.pbserver.dart
new file mode 100644
index 0000000..359f582
--- /dev/null
+++ b/packages/buildbucket-dart/lib/src/generated/google/protobuf/wrappers.pbserver.dart
@@ -0,0 +1,8 @@
+///
+//  Generated code. Do not modify.
+//  source: google/protobuf/wrappers.proto
+//
+// @dart = 2.12
+// ignore_for_file: annotate_overrides,camel_case_types,constant_identifier_names,deprecated_member_use_from_same_package,directives_ordering,library_prefixes,non_constant_identifier_names,prefer_final_fields,return_of_invalid_type,unnecessary_const,unnecessary_import,unnecessary_this,unused_import,unused_shown_name
+
+export 'wrappers.pb.dart';
diff --git a/packages/buildbucket-dart/pubspec.yaml b/packages/buildbucket-dart/pubspec.yaml
new file mode 100644
index 0000000..7304318
--- /dev/null
+++ b/packages/buildbucket-dart/pubspec.yaml
@@ -0,0 +1,16 @@
+name: buildbucket_proto
+description: LUCI Buildbucket protobufs.
+version: 0.0.1
+repository: https://github.com/flutter/cocoon/tree/main/packages/buildbucket-dart
+
+environment:
+  sdk: ">=2.12.0 <3.0.0"
+
+dependencies:
+  protoc_plugin: ^20.0.1
+  fixnum: ^1.0.0
+  protobuf: ^2.0.0
+
+dev_dependencies:
+  lints: ^2.0.0
+  test: ^1.21.0
diff --git a/packages/buildbucket-dart/test/buildbucket_pb_test.dart b/packages/buildbucket-dart/test/buildbucket_pb_test.dart
new file mode 100644
index 0000000..f395d60
--- /dev/null
+++ b/packages/buildbucket-dart/test/buildbucket_pb_test.dart
@@ -0,0 +1,20 @@
+// Copyright 2022 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:buildbucket_proto/buildbucket_pb.dart';
+import 'package:test/test.dart';
+
+Map<String, dynamic> buildJson = {
+  'builder': {'project': 'flutter', 'bucket': 'try', 'builder': 'buildabc'}
+};
+
+void main() {
+  group('Build proto', () {
+    test('From json and to json', () {
+      Build build = Build();
+      build.mergeFromProto3Json(buildJson);
+      expect(build.toProto3Json(), buildJson);
+    });
+  });
+}
diff --git a/packages/buildbucket-dart/tool/regenerate.sh b/packages/buildbucket-dart/tool/regenerate.sh
new file mode 100644
index 0000000..25205c6
--- /dev/null
+++ b/packages/buildbucket-dart/tool/regenerate.sh
@@ -0,0 +1,34 @@
+#!/bin/bash
+# Copyright 2020 The Flutter Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+set -ex
+
+mkdir -p lib/src/generated
+
+rm -rf buildbucket_tmp
+mkdir -p buildbucket_tmp
+pushd buildbucket_tmp
+git clone https://chromium.googlesource.com/infra/luci/luci-go
+git clone https://github.com/googleapis/googleapis
+git clone https://github.com/protocolbuffers/protobuf
+PROTOC="protoc --plugin=protoc-gen-dart=$HOME/.pub-cache/bin/protoc-gen-dart --dart_out=grpc:lib/src/generated -Ibuildbucket_tmp/protobuf/src -Ibuildbucket_tmp/googleapis -Ibuildbucket_tmp/luci-go -Ibuildbucket_tmp/buildbucket"
+pushd luci-go
+find . -name *.proto -exec bash -c 'path={}; d=../buildbucket/go.chromium.org/luci/$(dirname $path); mkdir -p $d ; cp $path $d' \;
+popd
+popd
+$PROTOC go.chromium.org/luci/buildbucket/proto/build.proto
+$PROTOC go.chromium.org/luci/buildbucket/proto/builder_common.proto
+$PROTOC go.chromium.org/luci/buildbucket/proto/common.proto
+$PROTOC go.chromium.org/luci/buildbucket/proto/project_config.proto
+$PROTOC go.chromium.org/luci/buildbucket/proto/step.proto
+$PROTOC go.chromium.org/luci/buildbucket/proto/task.proto
+$PROTOC go.chromium.org/luci/resultdb/proto/v1/common.proto
+$PROTOC go.chromium.org/luci/resultdb/proto/v1/invocation.proto
+$PROTOC go.chromium.org/luci/resultdb/proto/v1/predicate.proto
+
+$PROTOC google/protobuf/duration.proto
+$PROTOC google/protobuf/struct.proto
+$PROTOC google/protobuf/timestamp.proto
+$PROTOC google/protobuf/wrappers.proto
diff --git a/tests.yaml b/tests.yaml
index d9e77d7..e2723a4 100644
--- a/tests.yaml
+++ b/tests.yaml
@@ -37,3 +37,6 @@
 
   - task: device_doctor
     script: test_utilities/bin/dart_test_runner.sh
+
+  - task: packages/buildbucket-dart
+    script: test_utilities/bin/dart_test_runner.sh
