This is an automated email from the ASF dual-hosted git repository.

juergbi pushed a commit to branch jbilleter/action-cache
in repository https://gitbox.apache.org/repos/asf/buildstream.git

commit 1f1b6b32bc6c25d772b36112db3c77a78d363bba
Author: Jürg Billeter <[email protected]>
AuthorDate: Fri Jul 4 09:50:05 2025 +0200

    _protos: Update local_cas.proto from buildbox
---
 requirements/requirements.in                       |   2 +-
 requirements/requirements.txt                      |   4 +-
 .../bazel/remote/asset/v1/remote_asset_pb2.py      |   6 +-
 .../bazel/remote/asset/v1/remote_asset_pb2_grpc.py |   2 +-
 .../remote/execution/v2/remote_execution_pb2.py    |   6 +-
 .../execution/v2/remote_execution_pb2_grpc.py      |   2 +-
 .../_protos/build/bazel/semver/semver_pb2.py       |   6 +-
 .../_protos/build/bazel/semver/semver_pb2_grpc.py  |   2 +-
 .../_protos/build/buildgrid/local_cas.proto        |  84 +++++++++++++
 .../_protos/build/buildgrid/local_cas_pb2.py       | 131 +++++++++++----------
 .../_protos/build/buildgrid/local_cas_pb2.pyi      |  54 +++++++--
 .../_protos/build/buildgrid/local_cas_pb2_grpc.py  |  48 +++++++-
 .../_protos/buildstream/v2/artifact_pb2.py         |   6 +-
 .../_protos/buildstream/v2/artifact_pb2_grpc.py    |   2 +-
 .../_protos/buildstream/v2/source_pb2.py           |   6 +-
 .../_protos/buildstream/v2/source_pb2_grpc.py      |   2 +-
 .../_protos/google/api/annotations_pb2.py          |   6 +-
 .../_protos/google/api/annotations_pb2_grpc.py     |   2 +-
 src/buildstream/_protos/google/api/http_pb2.py     |   6 +-
 .../_protos/google/api/http_pb2_grpc.py            |   2 +-
 .../_protos/google/bytestream/bytestream_pb2.py    |   6 +-
 .../google/bytestream/bytestream_pb2_grpc.py       |   2 +-
 .../_protos/google/longrunning/operations_pb2.py   |   6 +-
 .../google/longrunning/operations_pb2_grpc.py      |   2 +-
 src/buildstream/_protos/google/rpc/code_pb2.py     |   6 +-
 .../_protos/google/rpc/code_pb2_grpc.py            |   2 +-
 src/buildstream/_protos/google/rpc/status_pb2.py   |   6 +-
 .../_protos/google/rpc/status_pb2_grpc.py          |   2 +-
 28 files changed, 293 insertions(+), 118 deletions(-)

diff --git a/requirements/requirements.in b/requirements/requirements.in
index 0143405be..5a53c918e 100644
--- a/requirements/requirements.in
+++ b/requirements/requirements.in
@@ -4,7 +4,7 @@ Jinja2 >= 2.10
 importlib_metadata >= 3.6; python_version < "3.10"
 packaging
 pluginbase
-protobuf <6.0dev,>=5.26.1
+protobuf <6.0dev,>=5.29
 psutil
 ruamel.yaml >= 0.16.7
 ruamel.yaml.clib >= 0.1.2
diff --git a/requirements/requirements.txt b/requirements/requirements.txt
index 910b71755..4a287f7ed 100644
--- a/requirements/requirements.txt
+++ b/requirements/requirements.txt
@@ -1,9 +1,9 @@
 click==8.1.7
-grpcio==1.68.0
+grpcio==1.69.0
 Jinja2==3.1.4
 packaging==24.2
 pluginbase==1.0.1
-protobuf==5.28.3
+protobuf==5.29.5
 psutil==6.1.0
 ruamel.yaml==0.18.6
 ruamel.yaml.clib==0.2.12
diff --git 
a/src/buildstream/_protos/build/bazel/remote/asset/v1/remote_asset_pb2.py 
b/src/buildstream/_protos/build/bazel/remote/asset/v1/remote_asset_pb2.py
index ce8f6c62e..4f3335d00 100644
--- a/src/buildstream/_protos/build/bazel/remote/asset/v1/remote_asset_pb2.py
+++ b/src/buildstream/_protos/build/bazel/remote/asset/v1/remote_asset_pb2.py
@@ -2,7 +2,7 @@
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # NO CHECKED-IN PROTOBUF GENCODE
 # source: build/bazel/remote/asset/v1/remote_asset.proto
-# Protobuf Python Version: 5.28.1
+# Protobuf Python Version: 5.29.0
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import descriptor_pool as _descriptor_pool
@@ -12,8 +12,8 @@ from google.protobuf.internal import builder as _builder
 _runtime_version.ValidateProtobufRuntimeVersion(
     _runtime_version.Domain.PUBLIC,
     5,
-    28,
-    1,
+    29,
+    0,
     '',
     'build/bazel/remote/asset/v1/remote_asset.proto'
 )
diff --git 
a/src/buildstream/_protos/build/bazel/remote/asset/v1/remote_asset_pb2_grpc.py 
b/src/buildstream/_protos/build/bazel/remote/asset/v1/remote_asset_pb2_grpc.py
index ad2feca8e..71c73eff5 100644
--- 
a/src/buildstream/_protos/build/bazel/remote/asset/v1/remote_asset_pb2_grpc.py
+++ 
b/src/buildstream/_protos/build/bazel/remote/asset/v1/remote_asset_pb2_grpc.py
@@ -5,7 +5,7 @@ import warnings
 
 from buildstream._protos.build.bazel.remote.asset.v1 import remote_asset_pb2 
as build_dot_bazel_dot_remote_dot_asset_dot_v1_dot_remote__asset__pb2
 
-GRPC_GENERATED_VERSION = '1.68.0'
+GRPC_GENERATED_VERSION = '1.69.0'
 GRPC_VERSION = grpc.__version__
 _version_not_supported = False
 
diff --git 
a/src/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2.py
 
b/src/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2.py
index 147dd4c31..569ec22aa 100644
--- 
a/src/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2.py
+++ 
b/src/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2.py
@@ -2,7 +2,7 @@
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # NO CHECKED-IN PROTOBUF GENCODE
 # source: build/bazel/remote/execution/v2/remote_execution.proto
-# Protobuf Python Version: 5.28.1
+# Protobuf Python Version: 5.29.0
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import descriptor_pool as _descriptor_pool
@@ -12,8 +12,8 @@ from google.protobuf.internal import builder as _builder
 _runtime_version.ValidateProtobufRuntimeVersion(
     _runtime_version.Domain.PUBLIC,
     5,
-    28,
-    1,
+    29,
+    0,
     '',
     'build/bazel/remote/execution/v2/remote_execution.proto'
 )
diff --git 
a/src/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2_grpc.py
 
b/src/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2_grpc.py
index 2f8680032..a8e0d1e23 100644
--- 
a/src/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2_grpc.py
+++ 
b/src/buildstream/_protos/build/bazel/remote/execution/v2/remote_execution_pb2_grpc.py
@@ -6,7 +6,7 @@ import warnings
 from buildstream._protos.build.bazel.remote.execution.v2 import 
remote_execution_pb2 as 
build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2
 from buildstream._protos.google.longrunning import operations_pb2 as 
google_dot_longrunning_dot_operations__pb2
 
-GRPC_GENERATED_VERSION = '1.68.0'
+GRPC_GENERATED_VERSION = '1.69.0'
 GRPC_VERSION = grpc.__version__
 _version_not_supported = False
 
diff --git a/src/buildstream/_protos/build/bazel/semver/semver_pb2.py 
b/src/buildstream/_protos/build/bazel/semver/semver_pb2.py
index 325c2ea33..79fea7670 100644
--- a/src/buildstream/_protos/build/bazel/semver/semver_pb2.py
+++ b/src/buildstream/_protos/build/bazel/semver/semver_pb2.py
@@ -2,7 +2,7 @@
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # NO CHECKED-IN PROTOBUF GENCODE
 # source: build/bazel/semver/semver.proto
-# Protobuf Python Version: 5.28.1
+# Protobuf Python Version: 5.29.0
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import descriptor_pool as _descriptor_pool
@@ -12,8 +12,8 @@ from google.protobuf.internal import builder as _builder
 _runtime_version.ValidateProtobufRuntimeVersion(
     _runtime_version.Domain.PUBLIC,
     5,
-    28,
-    1,
+    29,
+    0,
     '',
     'build/bazel/semver/semver.proto'
 )
diff --git a/src/buildstream/_protos/build/bazel/semver/semver_pb2_grpc.py 
b/src/buildstream/_protos/build/bazel/semver/semver_pb2_grpc.py
index 544c9fc9f..db6d404d9 100644
--- a/src/buildstream/_protos/build/bazel/semver/semver_pb2_grpc.py
+++ b/src/buildstream/_protos/build/bazel/semver/semver_pb2_grpc.py
@@ -4,7 +4,7 @@ import grpc
 import warnings
 
 
-GRPC_GENERATED_VERSION = '1.68.0'
+GRPC_GENERATED_VERSION = '1.69.0'
 GRPC_VERSION = grpc.__version__
 _version_not_supported = False
 
diff --git a/src/buildstream/_protos/build/buildgrid/local_cas.proto 
b/src/buildstream/_protos/build/buildgrid/local_cas.proto
index a04c4aca4..0dc0cbc36 100644
--- a/src/buildstream/_protos/build/buildgrid/local_cas.proto
+++ b/src/buildstream/_protos/build/buildgrid/local_cas.proto
@@ -19,8 +19,14 @@ package build.buildgrid;
 import "build/bazel/remote/execution/v2/remote_execution.proto";
 import "google/rpc/status.proto";
 import "google/protobuf/duration.proto";
+import "google/protobuf/wrappers.proto";
 
 service LocalContentAddressableStorage {
+  // Retrieves the configuration details for the local CAS server.
+  // This RPC allows clients to obtain information such as the hostname,
+  // user ID, and storage root of the local CAS server.
+  rpc GetLocalServerDetails(GetLocalServerDetailsRequest) returns 
(LocalServerDetails) {}
+
   // Fetch blobs from a remote CAS to the local cache.
   //
   // This request is equivalent to ByteStream `Read` or `BatchReadBlobs`
@@ -158,6 +164,41 @@ service LocalContentAddressableStorage {
   rpc GetLocalDiskUsage(GetLocalDiskUsageRequest) returns 
(GetLocalDiskUsageResponse) {}
 }
 
+// A request message for
+// 
[LocalContentAddressableStorage.GetLocalServerDetails][build.buildgrid.v2.LocalContentAddressableStorage.GetLocalServerDetails].
+message GetLocalServerDetailsRequest
+{
+    // The instance of the execution system to operate against. A server may
+    // support multiple instances of the execution system (with their own
+    // workers, storage, caches, etc.). The server MAY require use of this
+    // field to select between them in an implementation-defined fashion,
+    // otherwise it can be omitted.
+    string instance_name = 1;
+}
+
+// A response message for
+// 
[LocalContentAddressableStorage.GetLocalServerDetails][build.buildgrid.v2.LocalContentAddressableStorage.GetLocalServerDetails].
+message LocalServerDetails
+{
+    // The hostname where the local CAS server is running.
+    // This is used to determine if the client is running on the same host as
+    // the server. When running on the same host, you may access the
+    // storage_root directly.
+    string hostname = 1;
+
+    // The user ID (UID) which owns the local CAS process.
+    // This is used to determine if the client is running as the same user as
+    // the server. When running as the same user, hardlinking from the
+    // storage_root is dangerous.
+    int64 process_uid = 2;
+
+    // The absolute path to the local CAS cache directory.
+    // The storage_root contains locally stored blobs for digests in CAS.
+    // The local path to a blob has the following format:
+    //     storage_root/objects/{hash[:2]}/{hash[2:]}
+    string storage_root = 3;
+}
+
 // A request message for
 // 
[LocalContentAddressableStorage.FetchMissingBlobs][build.buildgrid.v2.LocalContentAddressableStorage.FetchMissingBlobs].
 message FetchMissingBlobsRequest {
@@ -302,6 +343,36 @@ message StageTreeRequest {
   // This will be used to ensure that the files have the right permissions
   // for access without risking corruption of files in the local cache.
   Credentials access_credentials = 4;
+
+  // The path, relative to the staging directory, where a server socket should
+  // be created for access to the Remote Execution API.
+  string remote_apis_socket_path = 7;
+
+  // The commands to run against the tree before it is cleaned.
+  // Each command must be an absolute path to an executable which can be run as
+  // `/path/to/command <path-to-stage-dir>`.
+  // The working directory of launched commands will be the same as the 
LocalCAS
+  // server process.
+  // The server SHOULD maintain an allowlist of commands that can be launched.
+  repeated string pre_unstage_commands = 5;
+
+  enum StagingMode {
+    // The staging mode is not specified. The LocalCAS server will use the 
default
+    // staging mode chosen from its configuration and environment.
+    DEFAULT = 0;
+
+    // The tree will be staged using libfuse.
+    FUSE = 1;
+
+    // The tree will be staged by copying or linking files from the local
+    // cache. The exact behavior depends on the filesystem, contents of the
+    // tree and the credentials of the client.
+    COPY_OR_LINK = 2;
+  }
+
+  // The staging mode to use for the tree.
+  // `INVALID_ARGUMENT` is returned if the server does not support the 
requested mode.
+  StagingMode staging_mode = 6;
 }
 
 // A response message for
@@ -356,6 +427,11 @@ message CaptureTreeRequest {
   // and `bypass_local_cache` are set, the server MUST return an 
InvalidArgument
   // error.
   bool skip_upload = 8;
+
+  // The mask to apply to the files and directories being captured.
+  // For example, a mask of `0222` will result in contents being captured as 
read-only.
+  // This is only effective when the unix_mode property is captured.
+  google.protobuf.UInt32Value unix_mode_mask = 9;
 }
 
 // A response message for
@@ -419,6 +495,11 @@ message CaptureFilesRequest {
   // and `bypass_local_cache` are set, the server MUST return an 
InvalidArgument
   // error.
   bool skip_upload = 7;
+
+  // The mask to apply to the files being captured.
+  // For example, a mask of `0222` will result in contents being captured as 
read-only.
+  // This is only effective when the unix_mode property is captured.
+  google.protobuf.UInt32Value unix_mode_mask = 8;
 }
 
 // A response message for
@@ -528,6 +609,9 @@ message Remote {
 
   // How long to wait for a response from the remote.
   google.protobuf.Duration request_timeout = 11;
+
+  // If set, don't upload any blobs, action results or assets to the remote.
+  bool read_only = 12;
 }
 
 // A request message for
diff --git a/src/buildstream/_protos/build/buildgrid/local_cas_pb2.py 
b/src/buildstream/_protos/build/buildgrid/local_cas_pb2.py
index 13da13f42..30bebeae3 100644
--- a/src/buildstream/_protos/build/buildgrid/local_cas_pb2.py
+++ b/src/buildstream/_protos/build/buildgrid/local_cas_pb2.py
@@ -2,7 +2,7 @@
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # NO CHECKED-IN PROTOBUF GENCODE
 # source: build/buildgrid/local_cas.proto
-# Protobuf Python Version: 5.28.1
+# Protobuf Python Version: 5.29.0
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import descriptor_pool as _descriptor_pool
@@ -12,8 +12,8 @@ from google.protobuf.internal import builder as _builder
 _runtime_version.ValidateProtobufRuntimeVersion(
     _runtime_version.Domain.PUBLIC,
     5,
-    28,
-    1,
+    29,
+    0,
     '',
     'build/buildgrid/local_cas.proto'
 )
@@ -25,71 +25,78 @@ _sym_db = _symbol_database.Default()
 from buildstream._protos.build.bazel.remote.execution.v2 import 
remote_execution_pb2 as 
build_dot_bazel_dot_remote_dot_execution_dot_v2_dot_remote__execution__pb2
 from buildstream._protos.google.rpc import status_pb2 as 
google_dot_rpc_dot_status__pb2
 from google.protobuf import duration_pb2 as 
google_dot_protobuf_dot_duration__pb2
+from google.protobuf import wrappers_pb2 as 
google_dot_protobuf_dot_wrappers__pb2
 
 
-DESCRIPTOR = 
_descriptor_pool.Default().AddSerializedFile(b'\n\x1f\x62uild/buildgrid/local_cas.proto\x12\x0f\x62uild.buildgrid\x1a\x36\x62uild/bazel/remote/execution/v2/remote_execution.proto\x1a\x17google/rpc/status.proto\x1a\x1egoogle/protobuf/duration.proto\"p\n\x18\x46\x65tchMissingBlobsRequest\x12\x15\n\rinstance_name\x18\x01
 \x01(\t\x12=\n\x0c\x62lob_digests\x18\x02 
\x03(\x0b\x32\'.build.bazel.remote.execution.v2.Digest\"\xcc\x01\n\x19\x46\x65tchMissingBlobsResponse\x12\x46\n\tresp
 [...]
+DESCRIPTOR = 
_descriptor_pool.Default().AddSerializedFile(b'\n\x1f\x62uild/buildgrid/local_cas.proto\x12\x0f\x62uild.buildgrid\x1a\x36\x62uild/bazel/remote/execution/v2/remote_execution.proto\x1a\x17google/rpc/status.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1egoogle/protobuf/wrappers.proto\"5\n\x1cGetLocalServerDetailsRequest\x12\x15\n\rinstance_name\x18\x01
 \x01(\t\"Q\n\x12LocalServerDetails\x12\x10\n\x08hostname\x18\x01 
\x01(\t\x12\x13\n\x0bprocess_uid\x18\x02 \x01(\x03\x12\x14 [...]
 
 _globals = globals()
 _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
 _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 
'build.buildgrid.local_cas_pb2', _globals)
 if not _descriptor._USE_C_DESCRIPTORS:
   DESCRIPTOR._loaded_options = None
-  _globals['_FETCHMISSINGBLOBSREQUEST']._serialized_start=165
-  _globals['_FETCHMISSINGBLOBSREQUEST']._serialized_end=277
-  _globals['_FETCHMISSINGBLOBSRESPONSE']._serialized_start=280
-  _globals['_FETCHMISSINGBLOBSRESPONSE']._serialized_end=484
-  _globals['_FETCHMISSINGBLOBSRESPONSE_RESPONSE']._serialized_start=381
-  _globals['_FETCHMISSINGBLOBSRESPONSE_RESPONSE']._serialized_end=484
-  _globals['_UPLOADMISSINGBLOBSREQUEST']._serialized_start=486
-  _globals['_UPLOADMISSINGBLOBSREQUEST']._serialized_end=599
-  _globals['_UPLOADMISSINGBLOBSRESPONSE']._serialized_start=602
-  _globals['_UPLOADMISSINGBLOBSRESPONSE']._serialized_end=808
-  _globals['_UPLOADMISSINGBLOBSRESPONSE_RESPONSE']._serialized_start=381
-  _globals['_UPLOADMISSINGBLOBSRESPONSE_RESPONSE']._serialized_end=484
-  _globals['_FETCHTREEREQUEST']._serialized_start=811
-  _globals['_FETCHTREEREQUEST']._serialized_end=940
-  _globals['_FETCHTREERESPONSE']._serialized_start=942
-  _globals['_FETCHTREERESPONSE']._serialized_end=961
-  _globals['_UPLOADTREEREQUEST']._serialized_start=963
-  _globals['_UPLOADTREEREQUEST']._serialized_end=1067
-  _globals['_UPLOADTREERESPONSE']._serialized_start=1069
-  _globals['_UPLOADTREERESPONSE']._serialized_end=1089
-  _globals['_STAGETREEREQUEST']._serialized_start=1092
-  _globals['_STAGETREEREQUEST']._serialized_end=1325
-  _globals['_STAGETREEREQUEST_CREDENTIALS']._serialized_start=1286
-  _globals['_STAGETREEREQUEST_CREDENTIALS']._serialized_end=1325
-  _globals['_STAGETREERESPONSE']._serialized_start=1327
-  _globals['_STAGETREERESPONSE']._serialized_end=1360
-  _globals['_CAPTURETREEREQUEST']._serialized_start=1363
-  _globals['_CAPTURETREEREQUEST']._serialized_end=1625
-  _globals['_CAPTURETREERESPONSE']._serialized_start=1628
-  _globals['_CAPTURETREERESPONSE']._serialized_end=1912
-  _globals['_CAPTURETREERESPONSE_RESPONSE']._serialized_start=1718
-  _globals['_CAPTURETREERESPONSE_RESPONSE']._serialized_end=1912
-  _globals['_CAPTUREFILESREQUEST']._serialized_start=1915
-  _globals['_CAPTUREFILESREQUEST']._serialized_end=2081
-  _globals['_CAPTUREFILESRESPONSE']._serialized_start=2084
-  _globals['_CAPTUREFILESRESPONSE']._serialized_end=2396
-  _globals['_CAPTUREFILESRESPONSE_RESPONSE']._serialized_start=2176
-  _globals['_CAPTUREFILESRESPONSE_RESPONSE']._serialized_end=2396
-  _globals['_GETINSTANCENAMEFORREMOTEREQUEST']._serialized_start=2399
-  _globals['_GETINSTANCENAMEFORREMOTEREQUEST']._serialized_end=2530
-  _globals['_GETINSTANCENAMEFORREMOTERESPONSE']._serialized_start=2532
-  _globals['_GETINSTANCENAMEFORREMOTERESPONSE']._serialized_end=2589
-  _globals['_REMOTE']._serialized_start=2592
-  _globals['_REMOTE']._serialized_end=2962
-  _globals['_GETINSTANCENAMEFORREMOTESREQUEST']._serialized_start=2965
-  _globals['_GETINSTANCENAMEFORREMOTESREQUEST']._serialized_end=3222
-  _globals['_GETINSTANCENAMEFORREMOTESRESPONSE']._serialized_start=3224
-  _globals['_GETINSTANCENAMEFORREMOTESRESPONSE']._serialized_end=3282
-  _globals['_GETINSTANCENAMEFORNAMESPACEREQUEST']._serialized_start=3284
-  _globals['_GETINSTANCENAMEFORNAMESPACEREQUEST']._serialized_end=3357
-  _globals['_GETINSTANCENAMEFORNAMESPACERESPONSE']._serialized_start=3359
-  _globals['_GETINSTANCENAMEFORNAMESPACERESPONSE']._serialized_end=3419
-  _globals['_GETLOCALDISKUSAGEREQUEST']._serialized_start=3421
-  _globals['_GETLOCALDISKUSAGEREQUEST']._serialized_end=3447
-  _globals['_GETLOCALDISKUSAGERESPONSE']._serialized_start=3449
-  _globals['_GETLOCALDISKUSAGERESPONSE']._serialized_end=3517
-  _globals['_LOCALCONTENTADDRESSABLESTORAGE']._serialized_start=3520
-  _globals['_LOCALCONTENTADDRESSABLESTORAGE']._serialized_end=4745
+  _globals['_GETLOCALSERVERDETAILSREQUEST']._serialized_start=197
+  _globals['_GETLOCALSERVERDETAILSREQUEST']._serialized_end=250
+  _globals['_LOCALSERVERDETAILS']._serialized_start=252
+  _globals['_LOCALSERVERDETAILS']._serialized_end=333
+  _globals['_FETCHMISSINGBLOBSREQUEST']._serialized_start=335
+  _globals['_FETCHMISSINGBLOBSREQUEST']._serialized_end=447
+  _globals['_FETCHMISSINGBLOBSRESPONSE']._serialized_start=450
+  _globals['_FETCHMISSINGBLOBSRESPONSE']._serialized_end=654
+  _globals['_FETCHMISSINGBLOBSRESPONSE_RESPONSE']._serialized_start=551
+  _globals['_FETCHMISSINGBLOBSRESPONSE_RESPONSE']._serialized_end=654
+  _globals['_UPLOADMISSINGBLOBSREQUEST']._serialized_start=656
+  _globals['_UPLOADMISSINGBLOBSREQUEST']._serialized_end=769
+  _globals['_UPLOADMISSINGBLOBSRESPONSE']._serialized_start=772
+  _globals['_UPLOADMISSINGBLOBSRESPONSE']._serialized_end=978
+  _globals['_UPLOADMISSINGBLOBSRESPONSE_RESPONSE']._serialized_start=551
+  _globals['_UPLOADMISSINGBLOBSRESPONSE_RESPONSE']._serialized_end=654
+  _globals['_FETCHTREEREQUEST']._serialized_start=981
+  _globals['_FETCHTREEREQUEST']._serialized_end=1110
+  _globals['_FETCHTREERESPONSE']._serialized_start=1112
+  _globals['_FETCHTREERESPONSE']._serialized_end=1131
+  _globals['_UPLOADTREEREQUEST']._serialized_start=1133
+  _globals['_UPLOADTREEREQUEST']._serialized_end=1237
+  _globals['_UPLOADTREERESPONSE']._serialized_start=1239
+  _globals['_UPLOADTREERESPONSE']._serialized_end=1259
+  _globals['_STAGETREEREQUEST']._serialized_start=1262
+  _globals['_STAGETREEREQUEST']._serialized_end=1683
+  _globals['_STAGETREEREQUEST_CREDENTIALS']._serialized_start=1588
+  _globals['_STAGETREEREQUEST_CREDENTIALS']._serialized_end=1627
+  _globals['_STAGETREEREQUEST_STAGINGMODE']._serialized_start=1629
+  _globals['_STAGETREEREQUEST_STAGINGMODE']._serialized_end=1683
+  _globals['_STAGETREERESPONSE']._serialized_start=1685
+  _globals['_STAGETREERESPONSE']._serialized_end=1718
+  _globals['_CAPTURETREEREQUEST']._serialized_start=1721
+  _globals['_CAPTURETREEREQUEST']._serialized_end=2037
+  _globals['_CAPTURETREERESPONSE']._serialized_start=2040
+  _globals['_CAPTURETREERESPONSE']._serialized_end=2324
+  _globals['_CAPTURETREERESPONSE_RESPONSE']._serialized_start=2130
+  _globals['_CAPTURETREERESPONSE_RESPONSE']._serialized_end=2324
+  _globals['_CAPTUREFILESREQUEST']._serialized_start=2327
+  _globals['_CAPTUREFILESREQUEST']._serialized_end=2547
+  _globals['_CAPTUREFILESRESPONSE']._serialized_start=2550
+  _globals['_CAPTUREFILESRESPONSE']._serialized_end=2862
+  _globals['_CAPTUREFILESRESPONSE_RESPONSE']._serialized_start=2642
+  _globals['_CAPTUREFILESRESPONSE_RESPONSE']._serialized_end=2862
+  _globals['_GETINSTANCENAMEFORREMOTEREQUEST']._serialized_start=2865
+  _globals['_GETINSTANCENAMEFORREMOTEREQUEST']._serialized_end=2996
+  _globals['_GETINSTANCENAMEFORREMOTERESPONSE']._serialized_start=2998
+  _globals['_GETINSTANCENAMEFORREMOTERESPONSE']._serialized_end=3055
+  _globals['_REMOTE']._serialized_start=3058
+  _globals['_REMOTE']._serialized_end=3447
+  _globals['_GETINSTANCENAMEFORREMOTESREQUEST']._serialized_start=3450
+  _globals['_GETINSTANCENAMEFORREMOTESREQUEST']._serialized_end=3707
+  _globals['_GETINSTANCENAMEFORREMOTESRESPONSE']._serialized_start=3709
+  _globals['_GETINSTANCENAMEFORREMOTESRESPONSE']._serialized_end=3767
+  _globals['_GETINSTANCENAMEFORNAMESPACEREQUEST']._serialized_start=3769
+  _globals['_GETINSTANCENAMEFORNAMESPACEREQUEST']._serialized_end=3842
+  _globals['_GETINSTANCENAMEFORNAMESPACERESPONSE']._serialized_start=3844
+  _globals['_GETINSTANCENAMEFORNAMESPACERESPONSE']._serialized_end=3904
+  _globals['_GETLOCALDISKUSAGEREQUEST']._serialized_start=3906
+  _globals['_GETLOCALDISKUSAGEREQUEST']._serialized_end=3932
+  _globals['_GETLOCALDISKUSAGERESPONSE']._serialized_start=3934
+  _globals['_GETLOCALDISKUSAGERESPONSE']._serialized_end=4002
+  _globals['_LOCALCONTENTADDRESSABLESTORAGE']._serialized_start=4005
+  _globals['_LOCALCONTENTADDRESSABLESTORAGE']._serialized_end=5341
 # @@protoc_insertion_point(module_scope)
diff --git a/src/buildstream/_protos/build/buildgrid/local_cas_pb2.pyi 
b/src/buildstream/_protos/build/buildgrid/local_cas_pb2.pyi
index 0dcaf3fb3..86a3bf22a 100644
--- a/src/buildstream/_protos/build/buildgrid/local_cas_pb2.pyi
+++ b/src/buildstream/_protos/build/buildgrid/local_cas_pb2.pyi
@@ -1,13 +1,31 @@
 from build.bazel.remote.execution.v2 import remote_execution_pb2 as 
_remote_execution_pb2
 from google.rpc import status_pb2 as _status_pb2
 from google.protobuf import duration_pb2 as _duration_pb2
+from google.protobuf import wrappers_pb2 as _wrappers_pb2
 from google.protobuf.internal import containers as _containers
+from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import message as _message
 from typing import ClassVar as _ClassVar, Iterable as _Iterable, Mapping as 
_Mapping, Optional as _Optional, Union as _Union
 
 DESCRIPTOR: _descriptor.FileDescriptor
 
+class GetLocalServerDetailsRequest(_message.Message):
+    __slots__ = ("instance_name",)
+    INSTANCE_NAME_FIELD_NUMBER: _ClassVar[int]
+    instance_name: str
+    def __init__(self, instance_name: _Optional[str] = ...) -> None: ...
+
+class LocalServerDetails(_message.Message):
+    __slots__ = ("hostname", "process_uid", "storage_root")
+    HOSTNAME_FIELD_NUMBER: _ClassVar[int]
+    PROCESS_UID_FIELD_NUMBER: _ClassVar[int]
+    STORAGE_ROOT_FIELD_NUMBER: _ClassVar[int]
+    hostname: str
+    process_uid: int
+    storage_root: str
+    def __init__(self, hostname: _Optional[str] = ..., process_uid: 
_Optional[int] = ..., storage_root: _Optional[str] = ...) -> None: ...
+
 class FetchMissingBlobsRequest(_message.Message):
     __slots__ = ("instance_name", "blob_digests")
     INSTANCE_NAME_FIELD_NUMBER: _ClassVar[int]
@@ -77,7 +95,15 @@ class UploadTreeResponse(_message.Message):
     def __init__(self) -> None: ...
 
 class StageTreeRequest(_message.Message):
-    __slots__ = ("instance_name", "root_digest", "path", "access_credentials")
+    __slots__ = ("instance_name", "root_digest", "path", "access_credentials", 
"remote_apis_socket_path", "pre_unstage_commands", "staging_mode")
+    class StagingMode(int, metaclass=_enum_type_wrapper.EnumTypeWrapper):
+        __slots__ = ()
+        DEFAULT: _ClassVar[StageTreeRequest.StagingMode]
+        FUSE: _ClassVar[StageTreeRequest.StagingMode]
+        COPY_OR_LINK: _ClassVar[StageTreeRequest.StagingMode]
+    DEFAULT: StageTreeRequest.StagingMode
+    FUSE: StageTreeRequest.StagingMode
+    COPY_OR_LINK: StageTreeRequest.StagingMode
     class Credentials(_message.Message):
         __slots__ = ("uid", "gid")
         UID_FIELD_NUMBER: _ClassVar[int]
@@ -89,11 +115,17 @@ class StageTreeRequest(_message.Message):
     ROOT_DIGEST_FIELD_NUMBER: _ClassVar[int]
     PATH_FIELD_NUMBER: _ClassVar[int]
     ACCESS_CREDENTIALS_FIELD_NUMBER: _ClassVar[int]
+    REMOTE_APIS_SOCKET_PATH_FIELD_NUMBER: _ClassVar[int]
+    PRE_UNSTAGE_COMMANDS_FIELD_NUMBER: _ClassVar[int]
+    STAGING_MODE_FIELD_NUMBER: _ClassVar[int]
     instance_name: str
     root_digest: _remote_execution_pb2.Digest
     path: str
     access_credentials: StageTreeRequest.Credentials
-    def __init__(self, instance_name: _Optional[str] = ..., root_digest: 
_Optional[_Union[_remote_execution_pb2.Digest, _Mapping]] = ..., path: 
_Optional[str] = ..., access_credentials: 
_Optional[_Union[StageTreeRequest.Credentials, _Mapping]] = ...) -> None: ...
+    remote_apis_socket_path: str
+    pre_unstage_commands: _containers.RepeatedScalarFieldContainer[str]
+    staging_mode: StageTreeRequest.StagingMode
+    def __init__(self, instance_name: _Optional[str] = ..., root_digest: 
_Optional[_Union[_remote_execution_pb2.Digest, _Mapping]] = ..., path: 
_Optional[str] = ..., access_credentials: 
_Optional[_Union[StageTreeRequest.Credentials, _Mapping]] = ..., 
remote_apis_socket_path: _Optional[str] = ..., pre_unstage_commands: 
_Optional[_Iterable[str]] = ..., staging_mode: 
_Optional[_Union[StageTreeRequest.StagingMode, str]] = ...) -> None: ...
 
 class StageTreeResponse(_message.Message):
     __slots__ = ("path",)
@@ -102,7 +134,7 @@ class StageTreeResponse(_message.Message):
     def __init__(self, path: _Optional[str] = ...) -> None: ...
 
 class CaptureTreeRequest(_message.Message):
-    __slots__ = ("instance_name", "root", "path", "bypass_local_cache", 
"node_properties", "move_files", "output_directory_format", "skip_upload")
+    __slots__ = ("instance_name", "root", "path", "bypass_local_cache", 
"node_properties", "move_files", "output_directory_format", "skip_upload", 
"unix_mode_mask")
     INSTANCE_NAME_FIELD_NUMBER: _ClassVar[int]
     ROOT_FIELD_NUMBER: _ClassVar[int]
     PATH_FIELD_NUMBER: _ClassVar[int]
@@ -111,6 +143,7 @@ class CaptureTreeRequest(_message.Message):
     MOVE_FILES_FIELD_NUMBER: _ClassVar[int]
     OUTPUT_DIRECTORY_FORMAT_FIELD_NUMBER: _ClassVar[int]
     SKIP_UPLOAD_FIELD_NUMBER: _ClassVar[int]
+    UNIX_MODE_MASK_FIELD_NUMBER: _ClassVar[int]
     instance_name: str
     root: str
     path: _containers.RepeatedScalarFieldContainer[str]
@@ -119,7 +152,8 @@ class CaptureTreeRequest(_message.Message):
     move_files: bool
     output_directory_format: 
_remote_execution_pb2.Command.OutputDirectoryFormat
     skip_upload: bool
-    def __init__(self, instance_name: _Optional[str] = ..., root: 
_Optional[str] = ..., path: _Optional[_Iterable[str]] = ..., 
bypass_local_cache: bool = ..., node_properties: _Optional[_Iterable[str]] = 
..., move_files: bool = ..., output_directory_format: 
_Optional[_Union[_remote_execution_pb2.Command.OutputDirectoryFormat, str]] = 
..., skip_upload: bool = ...) -> None: ...
+    unix_mode_mask: _wrappers_pb2.UInt32Value
+    def __init__(self, instance_name: _Optional[str] = ..., root: 
_Optional[str] = ..., path: _Optional[_Iterable[str]] = ..., 
bypass_local_cache: bool = ..., node_properties: _Optional[_Iterable[str]] = 
..., move_files: bool = ..., output_directory_format: 
_Optional[_Union[_remote_execution_pb2.Command.OutputDirectoryFormat, str]] = 
..., skip_upload: bool = ..., unix_mode_mask: 
_Optional[_Union[_wrappers_pb2.UInt32Value, _Mapping]] = ...) -> None: ...
 
 class CaptureTreeResponse(_message.Message):
     __slots__ = ("responses",)
@@ -139,7 +173,7 @@ class CaptureTreeResponse(_message.Message):
     def __init__(self, responses: 
_Optional[_Iterable[_Union[CaptureTreeResponse.Response, _Mapping]]] = ...) -> 
None: ...
 
 class CaptureFilesRequest(_message.Message):
-    __slots__ = ("instance_name", "root", "path", "bypass_local_cache", 
"node_properties", "move_files", "skip_upload")
+    __slots__ = ("instance_name", "root", "path", "bypass_local_cache", 
"node_properties", "move_files", "skip_upload", "unix_mode_mask")
     INSTANCE_NAME_FIELD_NUMBER: _ClassVar[int]
     ROOT_FIELD_NUMBER: _ClassVar[int]
     PATH_FIELD_NUMBER: _ClassVar[int]
@@ -147,6 +181,7 @@ class CaptureFilesRequest(_message.Message):
     NODE_PROPERTIES_FIELD_NUMBER: _ClassVar[int]
     MOVE_FILES_FIELD_NUMBER: _ClassVar[int]
     SKIP_UPLOAD_FIELD_NUMBER: _ClassVar[int]
+    UNIX_MODE_MASK_FIELD_NUMBER: _ClassVar[int]
     instance_name: str
     root: str
     path: _containers.RepeatedScalarFieldContainer[str]
@@ -154,7 +189,8 @@ class CaptureFilesRequest(_message.Message):
     node_properties: _containers.RepeatedScalarFieldContainer[str]
     move_files: bool
     skip_upload: bool
-    def __init__(self, instance_name: _Optional[str] = ..., root: 
_Optional[str] = ..., path: _Optional[_Iterable[str]] = ..., 
bypass_local_cache: bool = ..., node_properties: _Optional[_Iterable[str]] = 
..., move_files: bool = ..., skip_upload: bool = ...) -> None: ...
+    unix_mode_mask: _wrappers_pb2.UInt32Value
+    def __init__(self, instance_name: _Optional[str] = ..., root: 
_Optional[str] = ..., path: _Optional[_Iterable[str]] = ..., 
bypass_local_cache: bool = ..., node_properties: _Optional[_Iterable[str]] = 
..., move_files: bool = ..., skip_upload: bool = ..., unix_mode_mask: 
_Optional[_Union[_wrappers_pb2.UInt32Value, _Mapping]] = ...) -> None: ...
 
 class CaptureFilesResponse(_message.Message):
     __slots__ = ("responses",)
@@ -196,7 +232,7 @@ class GetInstanceNameForRemoteResponse(_message.Message):
     def __init__(self, instance_name: _Optional[str] = ...) -> None: ...
 
 class Remote(_message.Message):
-    __slots__ = ("url", "instance_name", "server_cert", "client_key", 
"client_cert", "access_token_path", "access_token_reload_interval", 
"keepalive_time", "retry_limit", "retry_delay", "request_timeout")
+    __slots__ = ("url", "instance_name", "server_cert", "client_key", 
"client_cert", "access_token_path", "access_token_reload_interval", 
"keepalive_time", "retry_limit", "retry_delay", "request_timeout", "read_only")
     URL_FIELD_NUMBER: _ClassVar[int]
     INSTANCE_NAME_FIELD_NUMBER: _ClassVar[int]
     SERVER_CERT_FIELD_NUMBER: _ClassVar[int]
@@ -208,6 +244,7 @@ class Remote(_message.Message):
     RETRY_LIMIT_FIELD_NUMBER: _ClassVar[int]
     RETRY_DELAY_FIELD_NUMBER: _ClassVar[int]
     REQUEST_TIMEOUT_FIELD_NUMBER: _ClassVar[int]
+    READ_ONLY_FIELD_NUMBER: _ClassVar[int]
     url: str
     instance_name: str
     server_cert: bytes
@@ -219,7 +256,8 @@ class Remote(_message.Message):
     retry_limit: int
     retry_delay: _duration_pb2.Duration
     request_timeout: _duration_pb2.Duration
-    def __init__(self, url: _Optional[str] = ..., instance_name: 
_Optional[str] = ..., server_cert: _Optional[bytes] = ..., client_key: 
_Optional[bytes] = ..., client_cert: _Optional[bytes] = ..., access_token_path: 
_Optional[str] = ..., access_token_reload_interval: 
_Optional[_Union[_duration_pb2.Duration, _Mapping]] = ..., keepalive_time: 
_Optional[_Union[_duration_pb2.Duration, _Mapping]] = ..., retry_limit: 
_Optional[int] = ..., retry_delay: _Optional[_Union[_duration_pb2.Duration, _ 
[...]
+    read_only: bool
+    def __init__(self, url: _Optional[str] = ..., instance_name: 
_Optional[str] = ..., server_cert: _Optional[bytes] = ..., client_key: 
_Optional[bytes] = ..., client_cert: _Optional[bytes] = ..., access_token_path: 
_Optional[str] = ..., access_token_reload_interval: 
_Optional[_Union[_duration_pb2.Duration, _Mapping]] = ..., keepalive_time: 
_Optional[_Union[_duration_pb2.Duration, _Mapping]] = ..., retry_limit: 
_Optional[int] = ..., retry_delay: _Optional[_Union[_duration_pb2.Duration, _ 
[...]
 
 class GetInstanceNameForRemotesRequest(_message.Message):
     __slots__ = ("instance_name", "content_addressable_storage", 
"remote_asset", "action_cache", "execution")
diff --git a/src/buildstream/_protos/build/buildgrid/local_cas_pb2_grpc.py 
b/src/buildstream/_protos/build/buildgrid/local_cas_pb2_grpc.py
index f890b7c02..6c0a69e7e 100644
--- a/src/buildstream/_protos/build/buildgrid/local_cas_pb2_grpc.py
+++ b/src/buildstream/_protos/build/buildgrid/local_cas_pb2_grpc.py
@@ -5,7 +5,7 @@ import warnings
 
 from buildstream._protos.build.buildgrid import local_cas_pb2 as 
build_dot_buildgrid_dot_local__cas__pb2
 
-GRPC_GENERATED_VERSION = '1.68.0'
+GRPC_GENERATED_VERSION = '1.69.0'
 GRPC_VERSION = grpc.__version__
 _version_not_supported = False
 
@@ -34,6 +34,11 @@ class LocalContentAddressableStorageStub(object):
         Args:
             channel: A grpc.Channel.
         """
+        self.GetLocalServerDetails = channel.unary_unary(
+                
'/build.buildgrid.LocalContentAddressableStorage/GetLocalServerDetails',
+                
request_serializer=build_dot_buildgrid_dot_local__cas__pb2.GetLocalServerDetailsRequest.SerializeToString,
+                
response_deserializer=build_dot_buildgrid_dot_local__cas__pb2.LocalServerDetails.FromString,
+                _registered_method=True)
         self.FetchMissingBlobs = channel.unary_unary(
                 
'/build.buildgrid.LocalContentAddressableStorage/FetchMissingBlobs',
                 
request_serializer=build_dot_buildgrid_dot_local__cas__pb2.FetchMissingBlobsRequest.SerializeToString,
@@ -94,6 +99,15 @@ class LocalContentAddressableStorageStub(object):
 class LocalContentAddressableStorageServicer(object):
     """Missing associated documentation comment in .proto file."""
 
+    def GetLocalServerDetails(self, request, context):
+        """Retrieves the configuration details for the local CAS server.
+        This RPC allows clients to obtain information such as the hostname,
+        user ID, and storage root of the local CAS server.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
     def FetchMissingBlobs(self, request, context):
         """Fetch blobs from a remote CAS to the local cache.
 
@@ -277,6 +291,11 @@ class LocalContentAddressableStorageServicer(object):
 
 def add_LocalContentAddressableStorageServicer_to_server(servicer, server):
     rpc_method_handlers = {
+            'GetLocalServerDetails': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetLocalServerDetails,
+                    
request_deserializer=build_dot_buildgrid_dot_local__cas__pb2.GetLocalServerDetailsRequest.FromString,
+                    
response_serializer=build_dot_buildgrid_dot_local__cas__pb2.LocalServerDetails.SerializeToString,
+            ),
             'FetchMissingBlobs': grpc.unary_unary_rpc_method_handler(
                     servicer.FetchMissingBlobs,
                     
request_deserializer=build_dot_buildgrid_dot_local__cas__pb2.FetchMissingBlobsRequest.FromString,
@@ -343,6 +362,33 @@ def 
add_LocalContentAddressableStorageServicer_to_server(servicer, server):
 class LocalContentAddressableStorage(object):
     """Missing associated documentation comment in .proto file."""
 
+    @staticmethod
+    def GetLocalServerDetails(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(
+            request,
+            target,
+            
'/build.buildgrid.LocalContentAddressableStorage/GetLocalServerDetails',
+            
build_dot_buildgrid_dot_local__cas__pb2.GetLocalServerDetailsRequest.SerializeToString,
+            
build_dot_buildgrid_dot_local__cas__pb2.LocalServerDetails.FromString,
+            options,
+            channel_credentials,
+            insecure,
+            call_credentials,
+            compression,
+            wait_for_ready,
+            timeout,
+            metadata,
+            _registered_method=True)
+
     @staticmethod
     def FetchMissingBlobs(request,
             target,
diff --git a/src/buildstream/_protos/buildstream/v2/artifact_pb2.py 
b/src/buildstream/_protos/buildstream/v2/artifact_pb2.py
index cce08c186..21cc67f4f 100644
--- a/src/buildstream/_protos/buildstream/v2/artifact_pb2.py
+++ b/src/buildstream/_protos/buildstream/v2/artifact_pb2.py
@@ -2,7 +2,7 @@
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # NO CHECKED-IN PROTOBUF GENCODE
 # source: buildstream/v2/artifact.proto
-# Protobuf Python Version: 5.28.1
+# Protobuf Python Version: 5.29.0
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import descriptor_pool as _descriptor_pool
@@ -12,8 +12,8 @@ from google.protobuf.internal import builder as _builder
 _runtime_version.ValidateProtobufRuntimeVersion(
     _runtime_version.Domain.PUBLIC,
     5,
-    28,
-    1,
+    29,
+    0,
     '',
     'buildstream/v2/artifact.proto'
 )
diff --git a/src/buildstream/_protos/buildstream/v2/artifact_pb2_grpc.py 
b/src/buildstream/_protos/buildstream/v2/artifact_pb2_grpc.py
index 546aaff8e..cbc767062 100644
--- a/src/buildstream/_protos/buildstream/v2/artifact_pb2_grpc.py
+++ b/src/buildstream/_protos/buildstream/v2/artifact_pb2_grpc.py
@@ -4,7 +4,7 @@ import grpc
 import warnings
 
 
-GRPC_GENERATED_VERSION = '1.68.0'
+GRPC_GENERATED_VERSION = '1.69.0'
 GRPC_VERSION = grpc.__version__
 _version_not_supported = False
 
diff --git a/src/buildstream/_protos/buildstream/v2/source_pb2.py 
b/src/buildstream/_protos/buildstream/v2/source_pb2.py
index 25a1dcc34..6e9b9dce8 100644
--- a/src/buildstream/_protos/buildstream/v2/source_pb2.py
+++ b/src/buildstream/_protos/buildstream/v2/source_pb2.py
@@ -2,7 +2,7 @@
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # NO CHECKED-IN PROTOBUF GENCODE
 # source: buildstream/v2/source.proto
-# Protobuf Python Version: 5.28.1
+# Protobuf Python Version: 5.29.0
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import descriptor_pool as _descriptor_pool
@@ -12,8 +12,8 @@ from google.protobuf.internal import builder as _builder
 _runtime_version.ValidateProtobufRuntimeVersion(
     _runtime_version.Domain.PUBLIC,
     5,
-    28,
-    1,
+    29,
+    0,
     '',
     'buildstream/v2/source.proto'
 )
diff --git a/src/buildstream/_protos/buildstream/v2/source_pb2_grpc.py 
b/src/buildstream/_protos/buildstream/v2/source_pb2_grpc.py
index 1a5d0b008..e675bf116 100644
--- a/src/buildstream/_protos/buildstream/v2/source_pb2_grpc.py
+++ b/src/buildstream/_protos/buildstream/v2/source_pb2_grpc.py
@@ -4,7 +4,7 @@ import grpc
 import warnings
 
 
-GRPC_GENERATED_VERSION = '1.68.0'
+GRPC_GENERATED_VERSION = '1.69.0'
 GRPC_VERSION = grpc.__version__
 _version_not_supported = False
 
diff --git a/src/buildstream/_protos/google/api/annotations_pb2.py 
b/src/buildstream/_protos/google/api/annotations_pb2.py
index 84e221d89..4853c79aa 100644
--- a/src/buildstream/_protos/google/api/annotations_pb2.py
+++ b/src/buildstream/_protos/google/api/annotations_pb2.py
@@ -2,7 +2,7 @@
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # NO CHECKED-IN PROTOBUF GENCODE
 # source: google/api/annotations.proto
-# Protobuf Python Version: 5.28.1
+# Protobuf Python Version: 5.29.0
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import descriptor_pool as _descriptor_pool
@@ -12,8 +12,8 @@ from google.protobuf.internal import builder as _builder
 _runtime_version.ValidateProtobufRuntimeVersion(
     _runtime_version.Domain.PUBLIC,
     5,
-    28,
-    1,
+    29,
+    0,
     '',
     'google/api/annotations.proto'
 )
diff --git a/src/buildstream/_protos/google/api/annotations_pb2_grpc.py 
b/src/buildstream/_protos/google/api/annotations_pb2_grpc.py
index 20414b108..54e739def 100644
--- a/src/buildstream/_protos/google/api/annotations_pb2_grpc.py
+++ b/src/buildstream/_protos/google/api/annotations_pb2_grpc.py
@@ -4,7 +4,7 @@ import grpc
 import warnings
 
 
-GRPC_GENERATED_VERSION = '1.68.0'
+GRPC_GENERATED_VERSION = '1.69.0'
 GRPC_VERSION = grpc.__version__
 _version_not_supported = False
 
diff --git a/src/buildstream/_protos/google/api/http_pb2.py 
b/src/buildstream/_protos/google/api/http_pb2.py
index 4c8494956..3f97534f9 100644
--- a/src/buildstream/_protos/google/api/http_pb2.py
+++ b/src/buildstream/_protos/google/api/http_pb2.py
@@ -2,7 +2,7 @@
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # NO CHECKED-IN PROTOBUF GENCODE
 # source: google/api/http.proto
-# Protobuf Python Version: 5.28.1
+# Protobuf Python Version: 5.29.0
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import descriptor_pool as _descriptor_pool
@@ -12,8 +12,8 @@ from google.protobuf.internal import builder as _builder
 _runtime_version.ValidateProtobufRuntimeVersion(
     _runtime_version.Domain.PUBLIC,
     5,
-    28,
-    1,
+    29,
+    0,
     '',
     'google/api/http.proto'
 )
diff --git a/src/buildstream/_protos/google/api/http_pb2_grpc.py 
b/src/buildstream/_protos/google/api/http_pb2_grpc.py
index 9c8eb1768..16f692651 100644
--- a/src/buildstream/_protos/google/api/http_pb2_grpc.py
+++ b/src/buildstream/_protos/google/api/http_pb2_grpc.py
@@ -4,7 +4,7 @@ import grpc
 import warnings
 
 
-GRPC_GENERATED_VERSION = '1.68.0'
+GRPC_GENERATED_VERSION = '1.69.0'
 GRPC_VERSION = grpc.__version__
 _version_not_supported = False
 
diff --git a/src/buildstream/_protos/google/bytestream/bytestream_pb2.py 
b/src/buildstream/_protos/google/bytestream/bytestream_pb2.py
index ab047f310..4184fa9ef 100644
--- a/src/buildstream/_protos/google/bytestream/bytestream_pb2.py
+++ b/src/buildstream/_protos/google/bytestream/bytestream_pb2.py
@@ -2,7 +2,7 @@
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # NO CHECKED-IN PROTOBUF GENCODE
 # source: google/bytestream/bytestream.proto
-# Protobuf Python Version: 5.28.1
+# Protobuf Python Version: 5.29.0
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import descriptor_pool as _descriptor_pool
@@ -12,8 +12,8 @@ from google.protobuf.internal import builder as _builder
 _runtime_version.ValidateProtobufRuntimeVersion(
     _runtime_version.Domain.PUBLIC,
     5,
-    28,
-    1,
+    29,
+    0,
     '',
     'google/bytestream/bytestream.proto'
 )
diff --git a/src/buildstream/_protos/google/bytestream/bytestream_pb2_grpc.py 
b/src/buildstream/_protos/google/bytestream/bytestream_pb2_grpc.py
index 164d68fef..8dc0d89f2 100644
--- a/src/buildstream/_protos/google/bytestream/bytestream_pb2_grpc.py
+++ b/src/buildstream/_protos/google/bytestream/bytestream_pb2_grpc.py
@@ -5,7 +5,7 @@ import warnings
 
 from buildstream._protos.google.bytestream import bytestream_pb2 as 
google_dot_bytestream_dot_bytestream__pb2
 
-GRPC_GENERATED_VERSION = '1.68.0'
+GRPC_GENERATED_VERSION = '1.69.0'
 GRPC_VERSION = grpc.__version__
 _version_not_supported = False
 
diff --git a/src/buildstream/_protos/google/longrunning/operations_pb2.py 
b/src/buildstream/_protos/google/longrunning/operations_pb2.py
index e1e27af54..30fbe66a6 100644
--- a/src/buildstream/_protos/google/longrunning/operations_pb2.py
+++ b/src/buildstream/_protos/google/longrunning/operations_pb2.py
@@ -2,7 +2,7 @@
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # NO CHECKED-IN PROTOBUF GENCODE
 # source: google/longrunning/operations.proto
-# Protobuf Python Version: 5.28.1
+# Protobuf Python Version: 5.29.0
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import descriptor_pool as _descriptor_pool
@@ -12,8 +12,8 @@ from google.protobuf.internal import builder as _builder
 _runtime_version.ValidateProtobufRuntimeVersion(
     _runtime_version.Domain.PUBLIC,
     5,
-    28,
-    1,
+    29,
+    0,
     '',
     'google/longrunning/operations.proto'
 )
diff --git a/src/buildstream/_protos/google/longrunning/operations_pb2_grpc.py 
b/src/buildstream/_protos/google/longrunning/operations_pb2_grpc.py
index fa1bfe4c9..e0a190752 100644
--- a/src/buildstream/_protos/google/longrunning/operations_pb2_grpc.py
+++ b/src/buildstream/_protos/google/longrunning/operations_pb2_grpc.py
@@ -6,7 +6,7 @@ import warnings
 from buildstream._protos.google.longrunning import operations_pb2 as 
google_dot_longrunning_dot_operations__pb2
 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
 
-GRPC_GENERATED_VERSION = '1.68.0'
+GRPC_GENERATED_VERSION = '1.69.0'
 GRPC_VERSION = grpc.__version__
 _version_not_supported = False
 
diff --git a/src/buildstream/_protos/google/rpc/code_pb2.py 
b/src/buildstream/_protos/google/rpc/code_pb2.py
index bb6a169b3..730260e3d 100644
--- a/src/buildstream/_protos/google/rpc/code_pb2.py
+++ b/src/buildstream/_protos/google/rpc/code_pb2.py
@@ -2,7 +2,7 @@
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # NO CHECKED-IN PROTOBUF GENCODE
 # source: google/rpc/code.proto
-# Protobuf Python Version: 5.28.1
+# Protobuf Python Version: 5.29.0
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import descriptor_pool as _descriptor_pool
@@ -12,8 +12,8 @@ from google.protobuf.internal import builder as _builder
 _runtime_version.ValidateProtobufRuntimeVersion(
     _runtime_version.Domain.PUBLIC,
     5,
-    28,
-    1,
+    29,
+    0,
     '',
     'google/rpc/code.proto'
 )
diff --git a/src/buildstream/_protos/google/rpc/code_pb2_grpc.py 
b/src/buildstream/_protos/google/rpc/code_pb2_grpc.py
index 1a1ef383c..4ee204bf4 100644
--- a/src/buildstream/_protos/google/rpc/code_pb2_grpc.py
+++ b/src/buildstream/_protos/google/rpc/code_pb2_grpc.py
@@ -4,7 +4,7 @@ import grpc
 import warnings
 
 
-GRPC_GENERATED_VERSION = '1.68.0'
+GRPC_GENERATED_VERSION = '1.69.0'
 GRPC_VERSION = grpc.__version__
 _version_not_supported = False
 
diff --git a/src/buildstream/_protos/google/rpc/status_pb2.py 
b/src/buildstream/_protos/google/rpc/status_pb2.py
index d89b20312..fef3e5840 100644
--- a/src/buildstream/_protos/google/rpc/status_pb2.py
+++ b/src/buildstream/_protos/google/rpc/status_pb2.py
@@ -2,7 +2,7 @@
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # NO CHECKED-IN PROTOBUF GENCODE
 # source: google/rpc/status.proto
-# Protobuf Python Version: 5.28.1
+# Protobuf Python Version: 5.29.0
 """Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import descriptor_pool as _descriptor_pool
@@ -12,8 +12,8 @@ from google.protobuf.internal import builder as _builder
 _runtime_version.ValidateProtobufRuntimeVersion(
     _runtime_version.Domain.PUBLIC,
     5,
-    28,
-    1,
+    29,
+    0,
     '',
     'google/rpc/status.proto'
 )
diff --git a/src/buildstream/_protos/google/rpc/status_pb2_grpc.py 
b/src/buildstream/_protos/google/rpc/status_pb2_grpc.py
index da039705c..80f01f3ea 100644
--- a/src/buildstream/_protos/google/rpc/status_pb2_grpc.py
+++ b/src/buildstream/_protos/google/rpc/status_pb2_grpc.py
@@ -4,7 +4,7 @@ import grpc
 import warnings
 
 
-GRPC_GENERATED_VERSION = '1.68.0'
+GRPC_GENERATED_VERSION = '1.69.0'
 GRPC_VERSION = grpc.__version__
 _version_not_supported = False
 

Reply via email to