Adds a buildbucket package. (#2324)

* Temporarily add logging of results messages.

This will give us visibility of the message format required to report
results from builders from dart-internal.

* Adds a buildbucket package.

Dart & Flutter use buildbucket extensively and we have been replicating
the parsing logic in multiple places instead of using the protos
directly. This package provides compiled protos for the interaction with
buildbucket V2.

Bug: https://github.com/flutter/flutter/issues/115490

* Revert changes to handler.

* Revert changes handler.

* Revert handler.

* Fix licenses and address comments.

* Ignore generated proto files during analysis.

* Remove ws from bash script.

* Format generated files.
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