From f4803cf17827ce5954364bc906b4863f99ee87f9 Mon Sep 17 00:00:00 2001
From: bbernays <ben@bernays.me>
Date: Wed, 2 Aug 2023 09:55:15 -0500
Subject: [PATCH 1/5] initial

---
 Makefile                                      |   25 +
 cloudquery/discovery_v1/discovery_grpc_pb.js  |   45 +
 cloudquery/discovery_v1/discovery_pb.js       |  450 ++
 cloudquery/plugin_v3/plugin_grpc_pb.js        |  285 +
 cloudquery/plugin_v3/plugin_pb.js             | 5134 +++++++++++++++++
 package-lock.json                             |   95 +
 package.json                                  |    5 +
 .../cloudquery/discovery_v1/discovery.proto   |   16 +
 protos/cloudquery/plugin_v3/plugin.proto      |  132 +
 9 files changed, 6187 insertions(+)
 create mode 100644 Makefile
 create mode 100644 cloudquery/discovery_v1/discovery_grpc_pb.js
 create mode 100644 cloudquery/discovery_v1/discovery_pb.js
 create mode 100644 cloudquery/plugin_v3/plugin_grpc_pb.js
 create mode 100644 cloudquery/plugin_v3/plugin_pb.js
 create mode 100644 package-lock.json
 create mode 100644 package.json
 create mode 100644 protos/cloudquery/discovery_v1/discovery.proto
 create mode 100644 protos/cloudquery/plugin_v3/plugin.proto

diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..c661a2e
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,25 @@
+clone-proto:
+	git clone https://github.com/cloudquery/plugin-pb
+
+gen-proto:
+	cd plugin-pb && git pull && cd ..
+
+	mkdir -p ./protos/cloudquery/plugin_v3
+	cp ./plugin-pb/plugin/v3/*.proto ./protos/cloudquery/plugin_v3/.
+	# python -m grpc_tools.protoc -I./protos --python_out=. --pyi_out=. --grpc_python_out=. ./protos/cloudquery/plugin_v3/*.proto
+	grpc_tools_node_protoc \
+		--js_out=import_style=commonjs,binary:. \
+		--grpc_out=grpc_js:. \
+		--plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` \
+		-I ./protos \
+		./protos/cloudquery/plugin_v3/*.proto
+
+
+	mkdir -p ./protos/cloudquery/discovery_v1
+	cp ./plugin-pb/discovery/v1/*.proto ./protos/cloudquery/discovery_v1/.
+	grpc_tools_node_protoc \
+		--js_out=import_style=commonjs,binary:. \
+		--grpc_out=grpc_js:. \
+		--plugin=protoc-gen-grpc=`which grpc_tools_node_protoc_plugin` \
+		-I ./protos \
+		./protos/cloudquery/discovery_v1/*.proto
diff --git a/cloudquery/discovery_v1/discovery_grpc_pb.js b/cloudquery/discovery_v1/discovery_grpc_pb.js
new file mode 100644
index 0000000..4bf3af4
--- /dev/null
+++ b/cloudquery/discovery_v1/discovery_grpc_pb.js
@@ -0,0 +1,45 @@
+// GENERATED CODE -- DO NOT EDIT!
+
+'use strict';
+var grpc = require('@grpc/grpc-js');
+var cloudquery_discovery_v1_discovery_pb = require('../../cloudquery/discovery_v1/discovery_pb.js');
+
+function serialize_cloudquery_discovery_v1_GetVersions_Request(arg) {
+  if (!(arg instanceof cloudquery_discovery_v1_discovery_pb.GetVersions.Request)) {
+    throw new Error('Expected argument of type cloudquery.discovery.v1.GetVersions.Request');
+  }
+  return Buffer.from(arg.serializeBinary());
+}
+
+function deserialize_cloudquery_discovery_v1_GetVersions_Request(buffer_arg) {
+  return cloudquery_discovery_v1_discovery_pb.GetVersions.Request.deserializeBinary(new Uint8Array(buffer_arg));
+}
+
+function serialize_cloudquery_discovery_v1_GetVersions_Response(arg) {
+  if (!(arg instanceof cloudquery_discovery_v1_discovery_pb.GetVersions.Response)) {
+    throw new Error('Expected argument of type cloudquery.discovery.v1.GetVersions.Response');
+  }
+  return Buffer.from(arg.serializeBinary());
+}
+
+function deserialize_cloudquery_discovery_v1_GetVersions_Response(buffer_arg) {
+  return cloudquery_discovery_v1_discovery_pb.GetVersions.Response.deserializeBinary(new Uint8Array(buffer_arg));
+}
+
+
+var DiscoveryService = exports.DiscoveryService = {
+  // Get the name of the plugin
+getVersions: {
+    path: '/cloudquery.discovery.v1.Discovery/GetVersions',
+    requestStream: false,
+    responseStream: false,
+    requestType: cloudquery_discovery_v1_discovery_pb.GetVersions.Request,
+    responseType: cloudquery_discovery_v1_discovery_pb.GetVersions.Response,
+    requestSerialize: serialize_cloudquery_discovery_v1_GetVersions_Request,
+    requestDeserialize: deserialize_cloudquery_discovery_v1_GetVersions_Request,
+    responseSerialize: serialize_cloudquery_discovery_v1_GetVersions_Response,
+    responseDeserialize: deserialize_cloudquery_discovery_v1_GetVersions_Response,
+  },
+};
+
+exports.DiscoveryClient = grpc.makeGenericClientConstructor(DiscoveryService);
diff --git a/cloudquery/discovery_v1/discovery_pb.js b/cloudquery/discovery_v1/discovery_pb.js
new file mode 100644
index 0000000..e270394
--- /dev/null
+++ b/cloudquery/discovery_v1/discovery_pb.js
@@ -0,0 +1,450 @@
+// source: cloudquery/discovery_v1/discovery.proto
+/**
+ * @fileoverview
+ * @enhanceable
+ * @suppress {missingRequire} reports error on implicit type usages.
+ * @suppress {messageConventions} JS Compiler reports an error if a variable or
+ *     field starts with 'MSG_' and isn't a translatable message.
+ * @public
+ */
+// GENERATED CODE -- DO NOT EDIT!
+/* eslint-disable */
+// @ts-nocheck
+
+var jspb = require('google-protobuf');
+var goog = jspb;
+var global = (function() {
+  if (this) { return this; }
+  if (typeof window !== 'undefined') { return window; }
+  if (typeof global !== 'undefined') { return global; }
+  if (typeof self !== 'undefined') { return self; }
+  return Function('return this')();
+}.call(null));
+
+goog.exportSymbol('proto.cloudquery.discovery.v1.GetVersions', null, global);
+goog.exportSymbol('proto.cloudquery.discovery.v1.GetVersions.Request', null, global);
+goog.exportSymbol('proto.cloudquery.discovery.v1.GetVersions.Response', null, global);
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.discovery.v1.GetVersions = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.cloudquery.discovery.v1.GetVersions, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.discovery.v1.GetVersions.displayName = 'proto.cloudquery.discovery.v1.GetVersions';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.discovery.v1.GetVersions.Request = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.cloudquery.discovery.v1.GetVersions.Request, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.discovery.v1.GetVersions.Request.displayName = 'proto.cloudquery.discovery.v1.GetVersions.Request';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.discovery.v1.GetVersions.Response = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, proto.cloudquery.discovery.v1.GetVersions.Response.repeatedFields_, null);
+};
+goog.inherits(proto.cloudquery.discovery.v1.GetVersions.Response, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.discovery.v1.GetVersions.Response.displayName = 'proto.cloudquery.discovery.v1.GetVersions.Response';
+}
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.discovery.v1.GetVersions.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.discovery.v1.GetVersions.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.discovery.v1.GetVersions} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.discovery.v1.GetVersions.toObject = function(includeInstance, msg) {
+  var f, obj = {
+
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.discovery.v1.GetVersions}
+ */
+proto.cloudquery.discovery.v1.GetVersions.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.discovery.v1.GetVersions;
+  return proto.cloudquery.discovery.v1.GetVersions.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.discovery.v1.GetVersions} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.discovery.v1.GetVersions}
+ */
+proto.cloudquery.discovery.v1.GetVersions.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.discovery.v1.GetVersions.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.discovery.v1.GetVersions.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.discovery.v1.GetVersions} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.discovery.v1.GetVersions.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.discovery.v1.GetVersions.Request.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.discovery.v1.GetVersions.Request.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.discovery.v1.GetVersions.Request} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.discovery.v1.GetVersions.Request.toObject = function(includeInstance, msg) {
+  var f, obj = {
+
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.discovery.v1.GetVersions.Request}
+ */
+proto.cloudquery.discovery.v1.GetVersions.Request.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.discovery.v1.GetVersions.Request;
+  return proto.cloudquery.discovery.v1.GetVersions.Request.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.discovery.v1.GetVersions.Request} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.discovery.v1.GetVersions.Request}
+ */
+proto.cloudquery.discovery.v1.GetVersions.Request.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.discovery.v1.GetVersions.Request.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.discovery.v1.GetVersions.Request.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.discovery.v1.GetVersions.Request} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.discovery.v1.GetVersions.Request.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+};
+
+
+
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array<number>}
+ * @const
+ */
+proto.cloudquery.discovery.v1.GetVersions.Response.repeatedFields_ = [1];
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.discovery.v1.GetVersions.Response.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.discovery.v1.GetVersions.Response.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.discovery.v1.GetVersions.Response} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.discovery.v1.GetVersions.Response.toObject = function(includeInstance, msg) {
+  var f, obj = {
+    versionsList: (f = jspb.Message.getRepeatedField(msg, 1)) == null ? undefined : f
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.discovery.v1.GetVersions.Response}
+ */
+proto.cloudquery.discovery.v1.GetVersions.Response.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.discovery.v1.GetVersions.Response;
+  return proto.cloudquery.discovery.v1.GetVersions.Response.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.discovery.v1.GetVersions.Response} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.discovery.v1.GetVersions.Response}
+ */
+proto.cloudquery.discovery.v1.GetVersions.Response.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    case 1:
+      var values = /** @type {!Array<number>} */ (reader.isDelimited() ? reader.readPackedInt32() : [reader.readInt32()]);
+      for (var i = 0; i < values.length; i++) {
+        msg.addVersions(values[i]);
+      }
+      break;
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.discovery.v1.GetVersions.Response.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.discovery.v1.GetVersions.Response.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.discovery.v1.GetVersions.Response} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.discovery.v1.GetVersions.Response.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+  f = message.getVersionsList();
+  if (f.length > 0) {
+    writer.writePackedInt32(
+      1,
+      f
+    );
+  }
+};
+
+
+/**
+ * repeated int32 versions = 1;
+ * @return {!Array<number>}
+ */
+proto.cloudquery.discovery.v1.GetVersions.Response.prototype.getVersionsList = function() {
+  return /** @type {!Array<number>} */ (jspb.Message.getRepeatedField(this, 1));
+};
+
+
+/**
+ * @param {!Array<number>} value
+ * @return {!proto.cloudquery.discovery.v1.GetVersions.Response} returns this
+ */
+proto.cloudquery.discovery.v1.GetVersions.Response.prototype.setVersionsList = function(value) {
+  return jspb.Message.setField(this, 1, value || []);
+};
+
+
+/**
+ * @param {number} value
+ * @param {number=} opt_index
+ * @return {!proto.cloudquery.discovery.v1.GetVersions.Response} returns this
+ */
+proto.cloudquery.discovery.v1.GetVersions.Response.prototype.addVersions = function(value, opt_index) {
+  return jspb.Message.addToRepeatedField(this, 1, value, opt_index);
+};
+
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.cloudquery.discovery.v1.GetVersions.Response} returns this
+ */
+proto.cloudquery.discovery.v1.GetVersions.Response.prototype.clearVersionsList = function() {
+  return this.setVersionsList([]);
+};
+
+
+goog.object.extend(exports, proto.cloudquery.discovery.v1);
diff --git a/cloudquery/plugin_v3/plugin_grpc_pb.js b/cloudquery/plugin_v3/plugin_grpc_pb.js
new file mode 100644
index 0000000..cb5a899
--- /dev/null
+++ b/cloudquery/plugin_v3/plugin_grpc_pb.js
@@ -0,0 +1,285 @@
+// GENERATED CODE -- DO NOT EDIT!
+
+'use strict';
+var grpc = require('@grpc/grpc-js');
+var cloudquery_plugin_v3_plugin_pb = require('../../cloudquery/plugin_v3/plugin_pb.js');
+var google_protobuf_timestamp_pb = require('google-protobuf/google/protobuf/timestamp_pb.js');
+
+function serialize_cloudquery_plugin_v3_Close_Request(arg) {
+  if (!(arg instanceof cloudquery_plugin_v3_plugin_pb.Close.Request)) {
+    throw new Error('Expected argument of type cloudquery.plugin.v3.Close.Request');
+  }
+  return Buffer.from(arg.serializeBinary());
+}
+
+function deserialize_cloudquery_plugin_v3_Close_Request(buffer_arg) {
+  return cloudquery_plugin_v3_plugin_pb.Close.Request.deserializeBinary(new Uint8Array(buffer_arg));
+}
+
+function serialize_cloudquery_plugin_v3_Close_Response(arg) {
+  if (!(arg instanceof cloudquery_plugin_v3_plugin_pb.Close.Response)) {
+    throw new Error('Expected argument of type cloudquery.plugin.v3.Close.Response');
+  }
+  return Buffer.from(arg.serializeBinary());
+}
+
+function deserialize_cloudquery_plugin_v3_Close_Response(buffer_arg) {
+  return cloudquery_plugin_v3_plugin_pb.Close.Response.deserializeBinary(new Uint8Array(buffer_arg));
+}
+
+function serialize_cloudquery_plugin_v3_GetName_Request(arg) {
+  if (!(arg instanceof cloudquery_plugin_v3_plugin_pb.GetName.Request)) {
+    throw new Error('Expected argument of type cloudquery.plugin.v3.GetName.Request');
+  }
+  return Buffer.from(arg.serializeBinary());
+}
+
+function deserialize_cloudquery_plugin_v3_GetName_Request(buffer_arg) {
+  return cloudquery_plugin_v3_plugin_pb.GetName.Request.deserializeBinary(new Uint8Array(buffer_arg));
+}
+
+function serialize_cloudquery_plugin_v3_GetName_Response(arg) {
+  if (!(arg instanceof cloudquery_plugin_v3_plugin_pb.GetName.Response)) {
+    throw new Error('Expected argument of type cloudquery.plugin.v3.GetName.Response');
+  }
+  return Buffer.from(arg.serializeBinary());
+}
+
+function deserialize_cloudquery_plugin_v3_GetName_Response(buffer_arg) {
+  return cloudquery_plugin_v3_plugin_pb.GetName.Response.deserializeBinary(new Uint8Array(buffer_arg));
+}
+
+function serialize_cloudquery_plugin_v3_GetTables_Request(arg) {
+  if (!(arg instanceof cloudquery_plugin_v3_plugin_pb.GetTables.Request)) {
+    throw new Error('Expected argument of type cloudquery.plugin.v3.GetTables.Request');
+  }
+  return Buffer.from(arg.serializeBinary());
+}
+
+function deserialize_cloudquery_plugin_v3_GetTables_Request(buffer_arg) {
+  return cloudquery_plugin_v3_plugin_pb.GetTables.Request.deserializeBinary(new Uint8Array(buffer_arg));
+}
+
+function serialize_cloudquery_plugin_v3_GetTables_Response(arg) {
+  if (!(arg instanceof cloudquery_plugin_v3_plugin_pb.GetTables.Response)) {
+    throw new Error('Expected argument of type cloudquery.plugin.v3.GetTables.Response');
+  }
+  return Buffer.from(arg.serializeBinary());
+}
+
+function deserialize_cloudquery_plugin_v3_GetTables_Response(buffer_arg) {
+  return cloudquery_plugin_v3_plugin_pb.GetTables.Response.deserializeBinary(new Uint8Array(buffer_arg));
+}
+
+function serialize_cloudquery_plugin_v3_GetVersion_Request(arg) {
+  if (!(arg instanceof cloudquery_plugin_v3_plugin_pb.GetVersion.Request)) {
+    throw new Error('Expected argument of type cloudquery.plugin.v3.GetVersion.Request');
+  }
+  return Buffer.from(arg.serializeBinary());
+}
+
+function deserialize_cloudquery_plugin_v3_GetVersion_Request(buffer_arg) {
+  return cloudquery_plugin_v3_plugin_pb.GetVersion.Request.deserializeBinary(new Uint8Array(buffer_arg));
+}
+
+function serialize_cloudquery_plugin_v3_GetVersion_Response(arg) {
+  if (!(arg instanceof cloudquery_plugin_v3_plugin_pb.GetVersion.Response)) {
+    throw new Error('Expected argument of type cloudquery.plugin.v3.GetVersion.Response');
+  }
+  return Buffer.from(arg.serializeBinary());
+}
+
+function deserialize_cloudquery_plugin_v3_GetVersion_Response(buffer_arg) {
+  return cloudquery_plugin_v3_plugin_pb.GetVersion.Response.deserializeBinary(new Uint8Array(buffer_arg));
+}
+
+function serialize_cloudquery_plugin_v3_Init_Request(arg) {
+  if (!(arg instanceof cloudquery_plugin_v3_plugin_pb.Init.Request)) {
+    throw new Error('Expected argument of type cloudquery.plugin.v3.Init.Request');
+  }
+  return Buffer.from(arg.serializeBinary());
+}
+
+function deserialize_cloudquery_plugin_v3_Init_Request(buffer_arg) {
+  return cloudquery_plugin_v3_plugin_pb.Init.Request.deserializeBinary(new Uint8Array(buffer_arg));
+}
+
+function serialize_cloudquery_plugin_v3_Init_Response(arg) {
+  if (!(arg instanceof cloudquery_plugin_v3_plugin_pb.Init.Response)) {
+    throw new Error('Expected argument of type cloudquery.plugin.v3.Init.Response');
+  }
+  return Buffer.from(arg.serializeBinary());
+}
+
+function deserialize_cloudquery_plugin_v3_Init_Response(buffer_arg) {
+  return cloudquery_plugin_v3_plugin_pb.Init.Response.deserializeBinary(new Uint8Array(buffer_arg));
+}
+
+function serialize_cloudquery_plugin_v3_Read_Request(arg) {
+  if (!(arg instanceof cloudquery_plugin_v3_plugin_pb.Read.Request)) {
+    throw new Error('Expected argument of type cloudquery.plugin.v3.Read.Request');
+  }
+  return Buffer.from(arg.serializeBinary());
+}
+
+function deserialize_cloudquery_plugin_v3_Read_Request(buffer_arg) {
+  return cloudquery_plugin_v3_plugin_pb.Read.Request.deserializeBinary(new Uint8Array(buffer_arg));
+}
+
+function serialize_cloudquery_plugin_v3_Read_Response(arg) {
+  if (!(arg instanceof cloudquery_plugin_v3_plugin_pb.Read.Response)) {
+    throw new Error('Expected argument of type cloudquery.plugin.v3.Read.Response');
+  }
+  return Buffer.from(arg.serializeBinary());
+}
+
+function deserialize_cloudquery_plugin_v3_Read_Response(buffer_arg) {
+  return cloudquery_plugin_v3_plugin_pb.Read.Response.deserializeBinary(new Uint8Array(buffer_arg));
+}
+
+function serialize_cloudquery_plugin_v3_Sync_Request(arg) {
+  if (!(arg instanceof cloudquery_plugin_v3_plugin_pb.Sync.Request)) {
+    throw new Error('Expected argument of type cloudquery.plugin.v3.Sync.Request');
+  }
+  return Buffer.from(arg.serializeBinary());
+}
+
+function deserialize_cloudquery_plugin_v3_Sync_Request(buffer_arg) {
+  return cloudquery_plugin_v3_plugin_pb.Sync.Request.deserializeBinary(new Uint8Array(buffer_arg));
+}
+
+function serialize_cloudquery_plugin_v3_Sync_Response(arg) {
+  if (!(arg instanceof cloudquery_plugin_v3_plugin_pb.Sync.Response)) {
+    throw new Error('Expected argument of type cloudquery.plugin.v3.Sync.Response');
+  }
+  return Buffer.from(arg.serializeBinary());
+}
+
+function deserialize_cloudquery_plugin_v3_Sync_Response(buffer_arg) {
+  return cloudquery_plugin_v3_plugin_pb.Sync.Response.deserializeBinary(new Uint8Array(buffer_arg));
+}
+
+function serialize_cloudquery_plugin_v3_Write_Request(arg) {
+  if (!(arg instanceof cloudquery_plugin_v3_plugin_pb.Write.Request)) {
+    throw new Error('Expected argument of type cloudquery.plugin.v3.Write.Request');
+  }
+  return Buffer.from(arg.serializeBinary());
+}
+
+function deserialize_cloudquery_plugin_v3_Write_Request(buffer_arg) {
+  return cloudquery_plugin_v3_plugin_pb.Write.Request.deserializeBinary(new Uint8Array(buffer_arg));
+}
+
+function serialize_cloudquery_plugin_v3_Write_Response(arg) {
+  if (!(arg instanceof cloudquery_plugin_v3_plugin_pb.Write.Response)) {
+    throw new Error('Expected argument of type cloudquery.plugin.v3.Write.Response');
+  }
+  return Buffer.from(arg.serializeBinary());
+}
+
+function deserialize_cloudquery_plugin_v3_Write_Response(buffer_arg) {
+  return cloudquery_plugin_v3_plugin_pb.Write.Response.deserializeBinary(new Uint8Array(buffer_arg));
+}
+
+
+var PluginService = exports.PluginService = {
+  // Get the name of the plugin
+getName: {
+    path: '/cloudquery.plugin.v3.Plugin/GetName',
+    requestStream: false,
+    responseStream: false,
+    requestType: cloudquery_plugin_v3_plugin_pb.GetName.Request,
+    responseType: cloudquery_plugin_v3_plugin_pb.GetName.Response,
+    requestSerialize: serialize_cloudquery_plugin_v3_GetName_Request,
+    requestDeserialize: deserialize_cloudquery_plugin_v3_GetName_Request,
+    responseSerialize: serialize_cloudquery_plugin_v3_GetName_Response,
+    responseDeserialize: deserialize_cloudquery_plugin_v3_GetName_Response,
+  },
+  // Get the current version of the plugin
+getVersion: {
+    path: '/cloudquery.plugin.v3.Plugin/GetVersion',
+    requestStream: false,
+    responseStream: false,
+    requestType: cloudquery_plugin_v3_plugin_pb.GetVersion.Request,
+    responseType: cloudquery_plugin_v3_plugin_pb.GetVersion.Response,
+    requestSerialize: serialize_cloudquery_plugin_v3_GetVersion_Request,
+    requestDeserialize: deserialize_cloudquery_plugin_v3_GetVersion_Request,
+    responseSerialize: serialize_cloudquery_plugin_v3_GetVersion_Response,
+    responseDeserialize: deserialize_cloudquery_plugin_v3_GetVersion_Response,
+  },
+  // Configure the plugin with the given credentials and mode
+init: {
+    path: '/cloudquery.plugin.v3.Plugin/Init',
+    requestStream: false,
+    responseStream: false,
+    requestType: cloudquery_plugin_v3_plugin_pb.Init.Request,
+    responseType: cloudquery_plugin_v3_plugin_pb.Init.Response,
+    requestSerialize: serialize_cloudquery_plugin_v3_Init_Request,
+    requestDeserialize: deserialize_cloudquery_plugin_v3_Init_Request,
+    responseSerialize: serialize_cloudquery_plugin_v3_Init_Response,
+    responseDeserialize: deserialize_cloudquery_plugin_v3_Init_Response,
+  },
+  // Get all tables the source plugin supports. Must be called after Init
+getTables: {
+    path: '/cloudquery.plugin.v3.Plugin/GetTables',
+    requestStream: false,
+    responseStream: false,
+    requestType: cloudquery_plugin_v3_plugin_pb.GetTables.Request,
+    responseType: cloudquery_plugin_v3_plugin_pb.GetTables.Response,
+    requestSerialize: serialize_cloudquery_plugin_v3_GetTables_Request,
+    requestDeserialize: deserialize_cloudquery_plugin_v3_GetTables_Request,
+    responseSerialize: serialize_cloudquery_plugin_v3_GetTables_Response,
+    responseDeserialize: deserialize_cloudquery_plugin_v3_GetTables_Response,
+  },
+  // Start a sync on the source plugin. It streams messages as output.
+sync: {
+    path: '/cloudquery.plugin.v3.Plugin/Sync',
+    requestStream: false,
+    responseStream: true,
+    requestType: cloudquery_plugin_v3_plugin_pb.Sync.Request,
+    responseType: cloudquery_plugin_v3_plugin_pb.Sync.Response,
+    requestSerialize: serialize_cloudquery_plugin_v3_Sync_Request,
+    requestDeserialize: deserialize_cloudquery_plugin_v3_Sync_Request,
+    responseSerialize: serialize_cloudquery_plugin_v3_Sync_Response,
+    responseDeserialize: deserialize_cloudquery_plugin_v3_Sync_Response,
+  },
+  // Start a Read on the source plugin for a given table and schema. It streams messages as output.
+// The plugin assume that that schema was used to also write the data beforehand
+read: {
+    path: '/cloudquery.plugin.v3.Plugin/Read',
+    requestStream: false,
+    responseStream: true,
+    requestType: cloudquery_plugin_v3_plugin_pb.Read.Request,
+    responseType: cloudquery_plugin_v3_plugin_pb.Read.Response,
+    requestSerialize: serialize_cloudquery_plugin_v3_Read_Request,
+    requestDeserialize: deserialize_cloudquery_plugin_v3_Read_Request,
+    responseSerialize: serialize_cloudquery_plugin_v3_Read_Response,
+    responseDeserialize: deserialize_cloudquery_plugin_v3_Read_Response,
+  },
+  // Write resources. Write is the mirror of Sync, expecting a stream of messages as input.
+write: {
+    path: '/cloudquery.plugin.v3.Plugin/Write',
+    requestStream: true,
+    responseStream: false,
+    requestType: cloudquery_plugin_v3_plugin_pb.Write.Request,
+    responseType: cloudquery_plugin_v3_plugin_pb.Write.Response,
+    requestSerialize: serialize_cloudquery_plugin_v3_Write_Request,
+    requestDeserialize: deserialize_cloudquery_plugin_v3_Write_Request,
+    responseSerialize: serialize_cloudquery_plugin_v3_Write_Response,
+    responseDeserialize: deserialize_cloudquery_plugin_v3_Write_Response,
+  },
+  // Send signal to flush and close open connections
+close: {
+    path: '/cloudquery.plugin.v3.Plugin/Close',
+    requestStream: false,
+    responseStream: false,
+    requestType: cloudquery_plugin_v3_plugin_pb.Close.Request,
+    responseType: cloudquery_plugin_v3_plugin_pb.Close.Response,
+    requestSerialize: serialize_cloudquery_plugin_v3_Close_Request,
+    requestDeserialize: deserialize_cloudquery_plugin_v3_Close_Request,
+    responseSerialize: serialize_cloudquery_plugin_v3_Close_Response,
+    responseDeserialize: deserialize_cloudquery_plugin_v3_Close_Response,
+  },
+};
+
+exports.PluginClient = grpc.makeGenericClientConstructor(PluginService);
diff --git a/cloudquery/plugin_v3/plugin_pb.js b/cloudquery/plugin_v3/plugin_pb.js
new file mode 100644
index 0000000..edf1f96
--- /dev/null
+++ b/cloudquery/plugin_v3/plugin_pb.js
@@ -0,0 +1,5134 @@
+// source: cloudquery/plugin_v3/plugin.proto
+/**
+ * @fileoverview
+ * @enhanceable
+ * @suppress {missingRequire} reports error on implicit type usages.
+ * @suppress {messageConventions} JS Compiler reports an error if a variable or
+ *     field starts with 'MSG_' and isn't a translatable message.
+ * @public
+ */
+// GENERATED CODE -- DO NOT EDIT!
+/* eslint-disable */
+// @ts-nocheck
+
+var jspb = require('google-protobuf');
+var goog = jspb;
+var global = (function() {
+  if (this) { return this; }
+  if (typeof window !== 'undefined') { return window; }
+  if (typeof global !== 'undefined') { return global; }
+  if (typeof self !== 'undefined') { return self; }
+  return Function('return this')();
+}.call(null));
+
+var google_protobuf_timestamp_pb = require('google-protobuf/google/protobuf/timestamp_pb.js');
+goog.object.extend(proto, google_protobuf_timestamp_pb);
+goog.exportSymbol('proto.cloudquery.plugin.v3.Close', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.Close.Request', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.Close.Response', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.GetName', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.GetName.Request', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.GetName.Response', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.GetTables', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.GetTables.Request', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.GetTables.Response', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.GetVersion', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.GetVersion.Request', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.GetVersion.Response', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.Init', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.Init.Request', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.Init.Response', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.Read', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.Read.Request', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.Read.Response', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.Sync', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.Sync.BackendOptions', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.Sync.MessageInsert', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.Sync.MessageMigrateTable', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.Sync.Request', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.Sync.Response', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.Sync.Response.MessageCase', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.Write', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.Write.MessageDeleteStale', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.Write.MessageInsert', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.Write.MessageMigrateTable', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.Write.Request', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.Write.Request.MessageCase', null, global);
+goog.exportSymbol('proto.cloudquery.plugin.v3.Write.Response', null, global);
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.GetName = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.cloudquery.plugin.v3.GetName, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.GetName.displayName = 'proto.cloudquery.plugin.v3.GetName';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.GetName.Request = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.cloudquery.plugin.v3.GetName.Request, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.GetName.Request.displayName = 'proto.cloudquery.plugin.v3.GetName.Request';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.GetName.Response = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.cloudquery.plugin.v3.GetName.Response, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.GetName.Response.displayName = 'proto.cloudquery.plugin.v3.GetName.Response';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.GetVersion = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.cloudquery.plugin.v3.GetVersion, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.GetVersion.displayName = 'proto.cloudquery.plugin.v3.GetVersion';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.GetVersion.Request = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.cloudquery.plugin.v3.GetVersion.Request, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.GetVersion.Request.displayName = 'proto.cloudquery.plugin.v3.GetVersion.Request';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.GetVersion.Response = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.cloudquery.plugin.v3.GetVersion.Response, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.GetVersion.Response.displayName = 'proto.cloudquery.plugin.v3.GetVersion.Response';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.Init = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.cloudquery.plugin.v3.Init, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.Init.displayName = 'proto.cloudquery.plugin.v3.Init';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.Init.Request = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.cloudquery.plugin.v3.Init.Request, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.Init.Request.displayName = 'proto.cloudquery.plugin.v3.Init.Request';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.Init.Response = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.cloudquery.plugin.v3.Init.Response, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.Init.Response.displayName = 'proto.cloudquery.plugin.v3.Init.Response';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.GetTables = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.cloudquery.plugin.v3.GetTables, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.GetTables.displayName = 'proto.cloudquery.plugin.v3.GetTables';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.GetTables.Request = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, proto.cloudquery.plugin.v3.GetTables.Request.repeatedFields_, null);
+};
+goog.inherits(proto.cloudquery.plugin.v3.GetTables.Request, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.GetTables.Request.displayName = 'proto.cloudquery.plugin.v3.GetTables.Request';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.GetTables.Response = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, proto.cloudquery.plugin.v3.GetTables.Response.repeatedFields_, null);
+};
+goog.inherits(proto.cloudquery.plugin.v3.GetTables.Response, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.GetTables.Response.displayName = 'proto.cloudquery.plugin.v3.GetTables.Response';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.Sync = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.cloudquery.plugin.v3.Sync, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.Sync.displayName = 'proto.cloudquery.plugin.v3.Sync';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.Sync.MessageInsert = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.cloudquery.plugin.v3.Sync.MessageInsert, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.Sync.MessageInsert.displayName = 'proto.cloudquery.plugin.v3.Sync.MessageInsert';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.Sync.MessageMigrateTable = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.cloudquery.plugin.v3.Sync.MessageMigrateTable, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.Sync.MessageMigrateTable.displayName = 'proto.cloudquery.plugin.v3.Sync.MessageMigrateTable';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.Sync.BackendOptions = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.cloudquery.plugin.v3.Sync.BackendOptions, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.Sync.BackendOptions.displayName = 'proto.cloudquery.plugin.v3.Sync.BackendOptions';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.Sync.Request = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, proto.cloudquery.plugin.v3.Sync.Request.repeatedFields_, null);
+};
+goog.inherits(proto.cloudquery.plugin.v3.Sync.Request, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.Sync.Request.displayName = 'proto.cloudquery.plugin.v3.Sync.Request';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.Sync.Response = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cloudquery.plugin.v3.Sync.Response.oneofGroups_);
+};
+goog.inherits(proto.cloudquery.plugin.v3.Sync.Response, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.Sync.Response.displayName = 'proto.cloudquery.plugin.v3.Sync.Response';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.Read = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.cloudquery.plugin.v3.Read, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.Read.displayName = 'proto.cloudquery.plugin.v3.Read';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.Read.Request = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.cloudquery.plugin.v3.Read.Request, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.Read.Request.displayName = 'proto.cloudquery.plugin.v3.Read.Request';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.Read.Response = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.cloudquery.plugin.v3.Read.Response, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.Read.Response.displayName = 'proto.cloudquery.plugin.v3.Read.Response';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.Write = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.cloudquery.plugin.v3.Write, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.Write.displayName = 'proto.cloudquery.plugin.v3.Write';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.Write.MessageMigrateTable = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.cloudquery.plugin.v3.Write.MessageMigrateTable, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.Write.MessageMigrateTable.displayName = 'proto.cloudquery.plugin.v3.Write.MessageMigrateTable';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.Write.MessageInsert = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.cloudquery.plugin.v3.Write.MessageInsert, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.Write.MessageInsert.displayName = 'proto.cloudquery.plugin.v3.Write.MessageInsert';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.Write.MessageDeleteStale = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.cloudquery.plugin.v3.Write.MessageDeleteStale, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.Write.MessageDeleteStale.displayName = 'proto.cloudquery.plugin.v3.Write.MessageDeleteStale';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.Write.Request = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, proto.cloudquery.plugin.v3.Write.Request.oneofGroups_);
+};
+goog.inherits(proto.cloudquery.plugin.v3.Write.Request, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.Write.Request.displayName = 'proto.cloudquery.plugin.v3.Write.Request';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.Write.Response = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.cloudquery.plugin.v3.Write.Response, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.Write.Response.displayName = 'proto.cloudquery.plugin.v3.Write.Response';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.Close = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.cloudquery.plugin.v3.Close, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.Close.displayName = 'proto.cloudquery.plugin.v3.Close';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.Close.Request = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.cloudquery.plugin.v3.Close.Request, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.Close.Request.displayName = 'proto.cloudquery.plugin.v3.Close.Request';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.cloudquery.plugin.v3.Close.Response = function(opt_data) {
+  jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.cloudquery.plugin.v3.Close.Response, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+  /**
+   * @public
+   * @override
+   */
+  proto.cloudquery.plugin.v3.Close.Response.displayName = 'proto.cloudquery.plugin.v3.Close.Response';
+}
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.GetName.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.GetName.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.GetName} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.GetName.toObject = function(includeInstance, msg) {
+  var f, obj = {
+
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.GetName}
+ */
+proto.cloudquery.plugin.v3.GetName.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.GetName;
+  return proto.cloudquery.plugin.v3.GetName.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.GetName} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.GetName}
+ */
+proto.cloudquery.plugin.v3.GetName.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.GetName.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.GetName.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.GetName} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.GetName.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.GetName.Request.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.GetName.Request.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.GetName.Request} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.GetName.Request.toObject = function(includeInstance, msg) {
+  var f, obj = {
+
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.GetName.Request}
+ */
+proto.cloudquery.plugin.v3.GetName.Request.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.GetName.Request;
+  return proto.cloudquery.plugin.v3.GetName.Request.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.GetName.Request} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.GetName.Request}
+ */
+proto.cloudquery.plugin.v3.GetName.Request.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.GetName.Request.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.GetName.Request.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.GetName.Request} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.GetName.Request.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.GetName.Response.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.GetName.Response.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.GetName.Response} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.GetName.Response.toObject = function(includeInstance, msg) {
+  var f, obj = {
+    name: jspb.Message.getFieldWithDefault(msg, 1, "")
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.GetName.Response}
+ */
+proto.cloudquery.plugin.v3.GetName.Response.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.GetName.Response;
+  return proto.cloudquery.plugin.v3.GetName.Response.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.GetName.Response} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.GetName.Response}
+ */
+proto.cloudquery.plugin.v3.GetName.Response.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    case 1:
+      var value = /** @type {string} */ (reader.readString());
+      msg.setName(value);
+      break;
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.GetName.Response.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.GetName.Response.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.GetName.Response} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.GetName.Response.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+  f = message.getName();
+  if (f.length > 0) {
+    writer.writeString(
+      1,
+      f
+    );
+  }
+};
+
+
+/**
+ * optional string name = 1;
+ * @return {string}
+ */
+proto.cloudquery.plugin.v3.GetName.Response.prototype.getName = function() {
+  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.cloudquery.plugin.v3.GetName.Response} returns this
+ */
+proto.cloudquery.plugin.v3.GetName.Response.prototype.setName = function(value) {
+  return jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.GetVersion.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.GetVersion.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.GetVersion} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.GetVersion.toObject = function(includeInstance, msg) {
+  var f, obj = {
+
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.GetVersion}
+ */
+proto.cloudquery.plugin.v3.GetVersion.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.GetVersion;
+  return proto.cloudquery.plugin.v3.GetVersion.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.GetVersion} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.GetVersion}
+ */
+proto.cloudquery.plugin.v3.GetVersion.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.GetVersion.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.GetVersion.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.GetVersion} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.GetVersion.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.GetVersion.Request.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.GetVersion.Request.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.GetVersion.Request} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.GetVersion.Request.toObject = function(includeInstance, msg) {
+  var f, obj = {
+
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.GetVersion.Request}
+ */
+proto.cloudquery.plugin.v3.GetVersion.Request.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.GetVersion.Request;
+  return proto.cloudquery.plugin.v3.GetVersion.Request.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.GetVersion.Request} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.GetVersion.Request}
+ */
+proto.cloudquery.plugin.v3.GetVersion.Request.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.GetVersion.Request.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.GetVersion.Request.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.GetVersion.Request} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.GetVersion.Request.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.GetVersion.Response.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.GetVersion.Response.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.GetVersion.Response} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.GetVersion.Response.toObject = function(includeInstance, msg) {
+  var f, obj = {
+    version: jspb.Message.getFieldWithDefault(msg, 1, "")
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.GetVersion.Response}
+ */
+proto.cloudquery.plugin.v3.GetVersion.Response.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.GetVersion.Response;
+  return proto.cloudquery.plugin.v3.GetVersion.Response.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.GetVersion.Response} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.GetVersion.Response}
+ */
+proto.cloudquery.plugin.v3.GetVersion.Response.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    case 1:
+      var value = /** @type {string} */ (reader.readString());
+      msg.setVersion(value);
+      break;
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.GetVersion.Response.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.GetVersion.Response.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.GetVersion.Response} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.GetVersion.Response.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+  f = message.getVersion();
+  if (f.length > 0) {
+    writer.writeString(
+      1,
+      f
+    );
+  }
+};
+
+
+/**
+ * optional string version = 1;
+ * @return {string}
+ */
+proto.cloudquery.plugin.v3.GetVersion.Response.prototype.getVersion = function() {
+  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.cloudquery.plugin.v3.GetVersion.Response} returns this
+ */
+proto.cloudquery.plugin.v3.GetVersion.Response.prototype.setVersion = function(value) {
+  return jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.Init.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.Init.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.Init} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Init.toObject = function(includeInstance, msg) {
+  var f, obj = {
+
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.Init}
+ */
+proto.cloudquery.plugin.v3.Init.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.Init;
+  return proto.cloudquery.plugin.v3.Init.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.Init} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.Init}
+ */
+proto.cloudquery.plugin.v3.Init.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.Init.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.Init.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.Init} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Init.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.Init.Request.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.Init.Request.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.Init.Request} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Init.Request.toObject = function(includeInstance, msg) {
+  var f, obj = {
+    spec: msg.getSpec_asB64(),
+    noConnection: jspb.Message.getBooleanFieldWithDefault(msg, 2, false)
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.Init.Request}
+ */
+proto.cloudquery.plugin.v3.Init.Request.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.Init.Request;
+  return proto.cloudquery.plugin.v3.Init.Request.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.Init.Request} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.Init.Request}
+ */
+proto.cloudquery.plugin.v3.Init.Request.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    case 1:
+      var value = /** @type {!Uint8Array} */ (reader.readBytes());
+      msg.setSpec(value);
+      break;
+    case 2:
+      var value = /** @type {boolean} */ (reader.readBool());
+      msg.setNoConnection(value);
+      break;
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.Init.Request.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.Init.Request.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.Init.Request} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Init.Request.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+  f = message.getSpec_asU8();
+  if (f.length > 0) {
+    writer.writeBytes(
+      1,
+      f
+    );
+  }
+  f = message.getNoConnection();
+  if (f) {
+    writer.writeBool(
+      2,
+      f
+    );
+  }
+};
+
+
+/**
+ * optional bytes spec = 1;
+ * @return {!(string|Uint8Array)}
+ */
+proto.cloudquery.plugin.v3.Init.Request.prototype.getSpec = function() {
+  return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/**
+ * optional bytes spec = 1;
+ * This is a type-conversion wrapper around `getSpec()`
+ * @return {string}
+ */
+proto.cloudquery.plugin.v3.Init.Request.prototype.getSpec_asB64 = function() {
+  return /** @type {string} */ (jspb.Message.bytesAsB64(
+      this.getSpec()));
+};
+
+
+/**
+ * optional bytes spec = 1;
+ * Note that Uint8Array is not supported on all browsers.
+ * @see http://caniuse.com/Uint8Array
+ * This is a type-conversion wrapper around `getSpec()`
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.Init.Request.prototype.getSpec_asU8 = function() {
+  return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8(
+      this.getSpec()));
+};
+
+
+/**
+ * @param {!(string|Uint8Array)} value
+ * @return {!proto.cloudquery.plugin.v3.Init.Request} returns this
+ */
+proto.cloudquery.plugin.v3.Init.Request.prototype.setSpec = function(value) {
+  return jspb.Message.setProto3BytesField(this, 1, value);
+};
+
+
+/**
+ * optional bool no_connection = 2;
+ * @return {boolean}
+ */
+proto.cloudquery.plugin.v3.Init.Request.prototype.getNoConnection = function() {
+  return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false));
+};
+
+
+/**
+ * @param {boolean} value
+ * @return {!proto.cloudquery.plugin.v3.Init.Request} returns this
+ */
+proto.cloudquery.plugin.v3.Init.Request.prototype.setNoConnection = function(value) {
+  return jspb.Message.setProto3BooleanField(this, 2, value);
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.Init.Response.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.Init.Response.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.Init.Response} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Init.Response.toObject = function(includeInstance, msg) {
+  var f, obj = {
+
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.Init.Response}
+ */
+proto.cloudquery.plugin.v3.Init.Response.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.Init.Response;
+  return proto.cloudquery.plugin.v3.Init.Response.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.Init.Response} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.Init.Response}
+ */
+proto.cloudquery.plugin.v3.Init.Response.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.Init.Response.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.Init.Response.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.Init.Response} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Init.Response.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.GetTables.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.GetTables.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.GetTables} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.GetTables.toObject = function(includeInstance, msg) {
+  var f, obj = {
+
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.GetTables}
+ */
+proto.cloudquery.plugin.v3.GetTables.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.GetTables;
+  return proto.cloudquery.plugin.v3.GetTables.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.GetTables} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.GetTables}
+ */
+proto.cloudquery.plugin.v3.GetTables.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.GetTables.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.GetTables.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.GetTables} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.GetTables.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+};
+
+
+
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array<number>}
+ * @const
+ */
+proto.cloudquery.plugin.v3.GetTables.Request.repeatedFields_ = [1,2];
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.GetTables.Request.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.GetTables.Request.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.GetTables.Request} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.GetTables.Request.toObject = function(includeInstance, msg) {
+  var f, obj = {
+    tablesList: (f = jspb.Message.getRepeatedField(msg, 1)) == null ? undefined : f,
+    skipTablesList: (f = jspb.Message.getRepeatedField(msg, 2)) == null ? undefined : f
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.GetTables.Request}
+ */
+proto.cloudquery.plugin.v3.GetTables.Request.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.GetTables.Request;
+  return proto.cloudquery.plugin.v3.GetTables.Request.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.GetTables.Request} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.GetTables.Request}
+ */
+proto.cloudquery.plugin.v3.GetTables.Request.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    case 1:
+      var value = /** @type {string} */ (reader.readString());
+      msg.addTables(value);
+      break;
+    case 2:
+      var value = /** @type {string} */ (reader.readString());
+      msg.addSkipTables(value);
+      break;
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.GetTables.Request.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.GetTables.Request.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.GetTables.Request} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.GetTables.Request.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+  f = message.getTablesList();
+  if (f.length > 0) {
+    writer.writeRepeatedString(
+      1,
+      f
+    );
+  }
+  f = message.getSkipTablesList();
+  if (f.length > 0) {
+    writer.writeRepeatedString(
+      2,
+      f
+    );
+  }
+};
+
+
+/**
+ * repeated string tables = 1;
+ * @return {!Array<string>}
+ */
+proto.cloudquery.plugin.v3.GetTables.Request.prototype.getTablesList = function() {
+  return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1));
+};
+
+
+/**
+ * @param {!Array<string>} value
+ * @return {!proto.cloudquery.plugin.v3.GetTables.Request} returns this
+ */
+proto.cloudquery.plugin.v3.GetTables.Request.prototype.setTablesList = function(value) {
+  return jspb.Message.setField(this, 1, value || []);
+};
+
+
+/**
+ * @param {string} value
+ * @param {number=} opt_index
+ * @return {!proto.cloudquery.plugin.v3.GetTables.Request} returns this
+ */
+proto.cloudquery.plugin.v3.GetTables.Request.prototype.addTables = function(value, opt_index) {
+  return jspb.Message.addToRepeatedField(this, 1, value, opt_index);
+};
+
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.cloudquery.plugin.v3.GetTables.Request} returns this
+ */
+proto.cloudquery.plugin.v3.GetTables.Request.prototype.clearTablesList = function() {
+  return this.setTablesList([]);
+};
+
+
+/**
+ * repeated string skip_tables = 2;
+ * @return {!Array<string>}
+ */
+proto.cloudquery.plugin.v3.GetTables.Request.prototype.getSkipTablesList = function() {
+  return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2));
+};
+
+
+/**
+ * @param {!Array<string>} value
+ * @return {!proto.cloudquery.plugin.v3.GetTables.Request} returns this
+ */
+proto.cloudquery.plugin.v3.GetTables.Request.prototype.setSkipTablesList = function(value) {
+  return jspb.Message.setField(this, 2, value || []);
+};
+
+
+/**
+ * @param {string} value
+ * @param {number=} opt_index
+ * @return {!proto.cloudquery.plugin.v3.GetTables.Request} returns this
+ */
+proto.cloudquery.plugin.v3.GetTables.Request.prototype.addSkipTables = function(value, opt_index) {
+  return jspb.Message.addToRepeatedField(this, 2, value, opt_index);
+};
+
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.cloudquery.plugin.v3.GetTables.Request} returns this
+ */
+proto.cloudquery.plugin.v3.GetTables.Request.prototype.clearSkipTablesList = function() {
+  return this.setSkipTablesList([]);
+};
+
+
+
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array<number>}
+ * @const
+ */
+proto.cloudquery.plugin.v3.GetTables.Response.repeatedFields_ = [1];
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.GetTables.Response.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.GetTables.Response.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.GetTables.Response} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.GetTables.Response.toObject = function(includeInstance, msg) {
+  var f, obj = {
+    tablesList: msg.getTablesList_asB64()
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.GetTables.Response}
+ */
+proto.cloudquery.plugin.v3.GetTables.Response.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.GetTables.Response;
+  return proto.cloudquery.plugin.v3.GetTables.Response.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.GetTables.Response} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.GetTables.Response}
+ */
+proto.cloudquery.plugin.v3.GetTables.Response.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    case 1:
+      var value = /** @type {!Uint8Array} */ (reader.readBytes());
+      msg.addTables(value);
+      break;
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.GetTables.Response.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.GetTables.Response.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.GetTables.Response} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.GetTables.Response.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+  f = message.getTablesList_asU8();
+  if (f.length > 0) {
+    writer.writeRepeatedBytes(
+      1,
+      f
+    );
+  }
+};
+
+
+/**
+ * repeated bytes tables = 1;
+ * @return {!(Array<!Uint8Array>|Array<string>)}
+ */
+proto.cloudquery.plugin.v3.GetTables.Response.prototype.getTablesList = function() {
+  return /** @type {!(Array<!Uint8Array>|Array<string>)} */ (jspb.Message.getRepeatedField(this, 1));
+};
+
+
+/**
+ * repeated bytes tables = 1;
+ * This is a type-conversion wrapper around `getTablesList()`
+ * @return {!Array<string>}
+ */
+proto.cloudquery.plugin.v3.GetTables.Response.prototype.getTablesList_asB64 = function() {
+  return /** @type {!Array<string>} */ (jspb.Message.bytesListAsB64(
+      this.getTablesList()));
+};
+
+
+/**
+ * repeated bytes tables = 1;
+ * Note that Uint8Array is not supported on all browsers.
+ * @see http://caniuse.com/Uint8Array
+ * This is a type-conversion wrapper around `getTablesList()`
+ * @return {!Array<!Uint8Array>}
+ */
+proto.cloudquery.plugin.v3.GetTables.Response.prototype.getTablesList_asU8 = function() {
+  return /** @type {!Array<!Uint8Array>} */ (jspb.Message.bytesListAsU8(
+      this.getTablesList()));
+};
+
+
+/**
+ * @param {!(Array<!Uint8Array>|Array<string>)} value
+ * @return {!proto.cloudquery.plugin.v3.GetTables.Response} returns this
+ */
+proto.cloudquery.plugin.v3.GetTables.Response.prototype.setTablesList = function(value) {
+  return jspb.Message.setField(this, 1, value || []);
+};
+
+
+/**
+ * @param {!(string|Uint8Array)} value
+ * @param {number=} opt_index
+ * @return {!proto.cloudquery.plugin.v3.GetTables.Response} returns this
+ */
+proto.cloudquery.plugin.v3.GetTables.Response.prototype.addTables = function(value, opt_index) {
+  return jspb.Message.addToRepeatedField(this, 1, value, opt_index);
+};
+
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.cloudquery.plugin.v3.GetTables.Response} returns this
+ */
+proto.cloudquery.plugin.v3.GetTables.Response.prototype.clearTablesList = function() {
+  return this.setTablesList([]);
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.Sync.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.Sync.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.Sync} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Sync.toObject = function(includeInstance, msg) {
+  var f, obj = {
+
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.Sync}
+ */
+proto.cloudquery.plugin.v3.Sync.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.Sync;
+  return proto.cloudquery.plugin.v3.Sync.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.Sync} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.Sync}
+ */
+proto.cloudquery.plugin.v3.Sync.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.Sync.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.Sync.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.Sync} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Sync.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.Sync.MessageInsert.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.Sync.MessageInsert.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.Sync.MessageInsert} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Sync.MessageInsert.toObject = function(includeInstance, msg) {
+  var f, obj = {
+    record: msg.getRecord_asB64()
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.Sync.MessageInsert}
+ */
+proto.cloudquery.plugin.v3.Sync.MessageInsert.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.Sync.MessageInsert;
+  return proto.cloudquery.plugin.v3.Sync.MessageInsert.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.Sync.MessageInsert} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.Sync.MessageInsert}
+ */
+proto.cloudquery.plugin.v3.Sync.MessageInsert.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    case 1:
+      var value = /** @type {!Uint8Array} */ (reader.readBytes());
+      msg.setRecord(value);
+      break;
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.Sync.MessageInsert.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.Sync.MessageInsert.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.Sync.MessageInsert} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Sync.MessageInsert.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+  f = message.getRecord_asU8();
+  if (f.length > 0) {
+    writer.writeBytes(
+      1,
+      f
+    );
+  }
+};
+
+
+/**
+ * optional bytes record = 1;
+ * @return {!(string|Uint8Array)}
+ */
+proto.cloudquery.plugin.v3.Sync.MessageInsert.prototype.getRecord = function() {
+  return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/**
+ * optional bytes record = 1;
+ * This is a type-conversion wrapper around `getRecord()`
+ * @return {string}
+ */
+proto.cloudquery.plugin.v3.Sync.MessageInsert.prototype.getRecord_asB64 = function() {
+  return /** @type {string} */ (jspb.Message.bytesAsB64(
+      this.getRecord()));
+};
+
+
+/**
+ * optional bytes record = 1;
+ * Note that Uint8Array is not supported on all browsers.
+ * @see http://caniuse.com/Uint8Array
+ * This is a type-conversion wrapper around `getRecord()`
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.Sync.MessageInsert.prototype.getRecord_asU8 = function() {
+  return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8(
+      this.getRecord()));
+};
+
+
+/**
+ * @param {!(string|Uint8Array)} value
+ * @return {!proto.cloudquery.plugin.v3.Sync.MessageInsert} returns this
+ */
+proto.cloudquery.plugin.v3.Sync.MessageInsert.prototype.setRecord = function(value) {
+  return jspb.Message.setProto3BytesField(this, 1, value);
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.Sync.MessageMigrateTable.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.Sync.MessageMigrateTable.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.Sync.MessageMigrateTable} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Sync.MessageMigrateTable.toObject = function(includeInstance, msg) {
+  var f, obj = {
+    table: msg.getTable_asB64()
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.Sync.MessageMigrateTable}
+ */
+proto.cloudquery.plugin.v3.Sync.MessageMigrateTable.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.Sync.MessageMigrateTable;
+  return proto.cloudquery.plugin.v3.Sync.MessageMigrateTable.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.Sync.MessageMigrateTable} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.Sync.MessageMigrateTable}
+ */
+proto.cloudquery.plugin.v3.Sync.MessageMigrateTable.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    case 1:
+      var value = /** @type {!Uint8Array} */ (reader.readBytes());
+      msg.setTable(value);
+      break;
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.Sync.MessageMigrateTable.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.Sync.MessageMigrateTable.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.Sync.MessageMigrateTable} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Sync.MessageMigrateTable.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+  f = message.getTable_asU8();
+  if (f.length > 0) {
+    writer.writeBytes(
+      1,
+      f
+    );
+  }
+};
+
+
+/**
+ * optional bytes table = 1;
+ * @return {!(string|Uint8Array)}
+ */
+proto.cloudquery.plugin.v3.Sync.MessageMigrateTable.prototype.getTable = function() {
+  return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/**
+ * optional bytes table = 1;
+ * This is a type-conversion wrapper around `getTable()`
+ * @return {string}
+ */
+proto.cloudquery.plugin.v3.Sync.MessageMigrateTable.prototype.getTable_asB64 = function() {
+  return /** @type {string} */ (jspb.Message.bytesAsB64(
+      this.getTable()));
+};
+
+
+/**
+ * optional bytes table = 1;
+ * Note that Uint8Array is not supported on all browsers.
+ * @see http://caniuse.com/Uint8Array
+ * This is a type-conversion wrapper around `getTable()`
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.Sync.MessageMigrateTable.prototype.getTable_asU8 = function() {
+  return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8(
+      this.getTable()));
+};
+
+
+/**
+ * @param {!(string|Uint8Array)} value
+ * @return {!proto.cloudquery.plugin.v3.Sync.MessageMigrateTable} returns this
+ */
+proto.cloudquery.plugin.v3.Sync.MessageMigrateTable.prototype.setTable = function(value) {
+  return jspb.Message.setProto3BytesField(this, 1, value);
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.Sync.BackendOptions.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.Sync.BackendOptions.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.Sync.BackendOptions} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Sync.BackendOptions.toObject = function(includeInstance, msg) {
+  var f, obj = {
+    tableName: jspb.Message.getFieldWithDefault(msg, 1, ""),
+    connection: jspb.Message.getFieldWithDefault(msg, 2, "")
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.Sync.BackendOptions}
+ */
+proto.cloudquery.plugin.v3.Sync.BackendOptions.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.Sync.BackendOptions;
+  return proto.cloudquery.plugin.v3.Sync.BackendOptions.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.Sync.BackendOptions} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.Sync.BackendOptions}
+ */
+proto.cloudquery.plugin.v3.Sync.BackendOptions.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    case 1:
+      var value = /** @type {string} */ (reader.readString());
+      msg.setTableName(value);
+      break;
+    case 2:
+      var value = /** @type {string} */ (reader.readString());
+      msg.setConnection(value);
+      break;
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.Sync.BackendOptions.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.Sync.BackendOptions.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.Sync.BackendOptions} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Sync.BackendOptions.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+  f = message.getTableName();
+  if (f.length > 0) {
+    writer.writeString(
+      1,
+      f
+    );
+  }
+  f = message.getConnection();
+  if (f.length > 0) {
+    writer.writeString(
+      2,
+      f
+    );
+  }
+};
+
+
+/**
+ * optional string table_name = 1;
+ * @return {string}
+ */
+proto.cloudquery.plugin.v3.Sync.BackendOptions.prototype.getTableName = function() {
+  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.cloudquery.plugin.v3.Sync.BackendOptions} returns this
+ */
+proto.cloudquery.plugin.v3.Sync.BackendOptions.prototype.setTableName = function(value) {
+  return jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+/**
+ * optional string connection = 2;
+ * @return {string}
+ */
+proto.cloudquery.plugin.v3.Sync.BackendOptions.prototype.getConnection = function() {
+  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.cloudquery.plugin.v3.Sync.BackendOptions} returns this
+ */
+proto.cloudquery.plugin.v3.Sync.BackendOptions.prototype.setConnection = function(value) {
+  return jspb.Message.setProto3StringField(this, 2, value);
+};
+
+
+
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array<number>}
+ * @const
+ */
+proto.cloudquery.plugin.v3.Sync.Request.repeatedFields_ = [1,2];
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.Sync.Request.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.Sync.Request.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.Sync.Request} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Sync.Request.toObject = function(includeInstance, msg) {
+  var f, obj = {
+    tablesList: (f = jspb.Message.getRepeatedField(msg, 1)) == null ? undefined : f,
+    skipTablesList: (f = jspb.Message.getRepeatedField(msg, 2)) == null ? undefined : f,
+    skipDependentTables: jspb.Message.getBooleanFieldWithDefault(msg, 3, false),
+    deterministicCqId: jspb.Message.getBooleanFieldWithDefault(msg, 4, false),
+    backend: (f = msg.getBackend()) && proto.cloudquery.plugin.v3.Sync.BackendOptions.toObject(includeInstance, f)
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.Sync.Request}
+ */
+proto.cloudquery.plugin.v3.Sync.Request.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.Sync.Request;
+  return proto.cloudquery.plugin.v3.Sync.Request.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.Sync.Request} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.Sync.Request}
+ */
+proto.cloudquery.plugin.v3.Sync.Request.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    case 1:
+      var value = /** @type {string} */ (reader.readString());
+      msg.addTables(value);
+      break;
+    case 2:
+      var value = /** @type {string} */ (reader.readString());
+      msg.addSkipTables(value);
+      break;
+    case 3:
+      var value = /** @type {boolean} */ (reader.readBool());
+      msg.setSkipDependentTables(value);
+      break;
+    case 4:
+      var value = /** @type {boolean} */ (reader.readBool());
+      msg.setDeterministicCqId(value);
+      break;
+    case 5:
+      var value = new proto.cloudquery.plugin.v3.Sync.BackendOptions;
+      reader.readMessage(value,proto.cloudquery.plugin.v3.Sync.BackendOptions.deserializeBinaryFromReader);
+      msg.setBackend(value);
+      break;
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.Sync.Request.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.Sync.Request.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.Sync.Request} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Sync.Request.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+  f = message.getTablesList();
+  if (f.length > 0) {
+    writer.writeRepeatedString(
+      1,
+      f
+    );
+  }
+  f = message.getSkipTablesList();
+  if (f.length > 0) {
+    writer.writeRepeatedString(
+      2,
+      f
+    );
+  }
+  f = message.getSkipDependentTables();
+  if (f) {
+    writer.writeBool(
+      3,
+      f
+    );
+  }
+  f = message.getDeterministicCqId();
+  if (f) {
+    writer.writeBool(
+      4,
+      f
+    );
+  }
+  f = message.getBackend();
+  if (f != null) {
+    writer.writeMessage(
+      5,
+      f,
+      proto.cloudquery.plugin.v3.Sync.BackendOptions.serializeBinaryToWriter
+    );
+  }
+};
+
+
+/**
+ * repeated string tables = 1;
+ * @return {!Array<string>}
+ */
+proto.cloudquery.plugin.v3.Sync.Request.prototype.getTablesList = function() {
+  return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 1));
+};
+
+
+/**
+ * @param {!Array<string>} value
+ * @return {!proto.cloudquery.plugin.v3.Sync.Request} returns this
+ */
+proto.cloudquery.plugin.v3.Sync.Request.prototype.setTablesList = function(value) {
+  return jspb.Message.setField(this, 1, value || []);
+};
+
+
+/**
+ * @param {string} value
+ * @param {number=} opt_index
+ * @return {!proto.cloudquery.plugin.v3.Sync.Request} returns this
+ */
+proto.cloudquery.plugin.v3.Sync.Request.prototype.addTables = function(value, opt_index) {
+  return jspb.Message.addToRepeatedField(this, 1, value, opt_index);
+};
+
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.cloudquery.plugin.v3.Sync.Request} returns this
+ */
+proto.cloudquery.plugin.v3.Sync.Request.prototype.clearTablesList = function() {
+  return this.setTablesList([]);
+};
+
+
+/**
+ * repeated string skip_tables = 2;
+ * @return {!Array<string>}
+ */
+proto.cloudquery.plugin.v3.Sync.Request.prototype.getSkipTablesList = function() {
+  return /** @type {!Array<string>} */ (jspb.Message.getRepeatedField(this, 2));
+};
+
+
+/**
+ * @param {!Array<string>} value
+ * @return {!proto.cloudquery.plugin.v3.Sync.Request} returns this
+ */
+proto.cloudquery.plugin.v3.Sync.Request.prototype.setSkipTablesList = function(value) {
+  return jspb.Message.setField(this, 2, value || []);
+};
+
+
+/**
+ * @param {string} value
+ * @param {number=} opt_index
+ * @return {!proto.cloudquery.plugin.v3.Sync.Request} returns this
+ */
+proto.cloudquery.plugin.v3.Sync.Request.prototype.addSkipTables = function(value, opt_index) {
+  return jspb.Message.addToRepeatedField(this, 2, value, opt_index);
+};
+
+
+/**
+ * Clears the list making it empty but non-null.
+ * @return {!proto.cloudquery.plugin.v3.Sync.Request} returns this
+ */
+proto.cloudquery.plugin.v3.Sync.Request.prototype.clearSkipTablesList = function() {
+  return this.setSkipTablesList([]);
+};
+
+
+/**
+ * optional bool skip_dependent_tables = 3;
+ * @return {boolean}
+ */
+proto.cloudquery.plugin.v3.Sync.Request.prototype.getSkipDependentTables = function() {
+  return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 3, false));
+};
+
+
+/**
+ * @param {boolean} value
+ * @return {!proto.cloudquery.plugin.v3.Sync.Request} returns this
+ */
+proto.cloudquery.plugin.v3.Sync.Request.prototype.setSkipDependentTables = function(value) {
+  return jspb.Message.setProto3BooleanField(this, 3, value);
+};
+
+
+/**
+ * optional bool deterministic_cq_id = 4;
+ * @return {boolean}
+ */
+proto.cloudquery.plugin.v3.Sync.Request.prototype.getDeterministicCqId = function() {
+  return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false));
+};
+
+
+/**
+ * @param {boolean} value
+ * @return {!proto.cloudquery.plugin.v3.Sync.Request} returns this
+ */
+proto.cloudquery.plugin.v3.Sync.Request.prototype.setDeterministicCqId = function(value) {
+  return jspb.Message.setProto3BooleanField(this, 4, value);
+};
+
+
+/**
+ * optional BackendOptions backend = 5;
+ * @return {?proto.cloudquery.plugin.v3.Sync.BackendOptions}
+ */
+proto.cloudquery.plugin.v3.Sync.Request.prototype.getBackend = function() {
+  return /** @type{?proto.cloudquery.plugin.v3.Sync.BackendOptions} */ (
+    jspb.Message.getWrapperField(this, proto.cloudquery.plugin.v3.Sync.BackendOptions, 5));
+};
+
+
+/**
+ * @param {?proto.cloudquery.plugin.v3.Sync.BackendOptions|undefined} value
+ * @return {!proto.cloudquery.plugin.v3.Sync.Request} returns this
+*/
+proto.cloudquery.plugin.v3.Sync.Request.prototype.setBackend = function(value) {
+  return jspb.Message.setWrapperField(this, 5, value);
+};
+
+
+/**
+ * Clears the message field making it undefined.
+ * @return {!proto.cloudquery.plugin.v3.Sync.Request} returns this
+ */
+proto.cloudquery.plugin.v3.Sync.Request.prototype.clearBackend = function() {
+  return this.setBackend(undefined);
+};
+
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.cloudquery.plugin.v3.Sync.Request.prototype.hasBackend = function() {
+  return jspb.Message.getField(this, 5) != null;
+};
+
+
+
+/**
+ * Oneof group definitions for this message. Each group defines the field
+ * numbers belonging to that group. When of these fields' value is set, all
+ * other fields in the group are cleared. During deserialization, if multiple
+ * fields are encountered for a group, only the last value seen will be kept.
+ * @private {!Array<!Array<number>>}
+ * @const
+ */
+proto.cloudquery.plugin.v3.Sync.Response.oneofGroups_ = [[1,2]];
+
+/**
+ * @enum {number}
+ */
+proto.cloudquery.plugin.v3.Sync.Response.MessageCase = {
+  MESSAGE_NOT_SET: 0,
+  MIGRATE_TABLE: 1,
+  INSERT: 2
+};
+
+/**
+ * @return {proto.cloudquery.plugin.v3.Sync.Response.MessageCase}
+ */
+proto.cloudquery.plugin.v3.Sync.Response.prototype.getMessageCase = function() {
+  return /** @type {proto.cloudquery.plugin.v3.Sync.Response.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cloudquery.plugin.v3.Sync.Response.oneofGroups_[0]));
+};
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.Sync.Response.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.Sync.Response.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.Sync.Response} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Sync.Response.toObject = function(includeInstance, msg) {
+  var f, obj = {
+    migrateTable: (f = msg.getMigrateTable()) && proto.cloudquery.plugin.v3.Sync.MessageMigrateTable.toObject(includeInstance, f),
+    insert: (f = msg.getInsert()) && proto.cloudquery.plugin.v3.Sync.MessageInsert.toObject(includeInstance, f)
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.Sync.Response}
+ */
+proto.cloudquery.plugin.v3.Sync.Response.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.Sync.Response;
+  return proto.cloudquery.plugin.v3.Sync.Response.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.Sync.Response} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.Sync.Response}
+ */
+proto.cloudquery.plugin.v3.Sync.Response.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    case 1:
+      var value = new proto.cloudquery.plugin.v3.Sync.MessageMigrateTable;
+      reader.readMessage(value,proto.cloudquery.plugin.v3.Sync.MessageMigrateTable.deserializeBinaryFromReader);
+      msg.setMigrateTable(value);
+      break;
+    case 2:
+      var value = new proto.cloudquery.plugin.v3.Sync.MessageInsert;
+      reader.readMessage(value,proto.cloudquery.plugin.v3.Sync.MessageInsert.deserializeBinaryFromReader);
+      msg.setInsert(value);
+      break;
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.Sync.Response.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.Sync.Response.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.Sync.Response} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Sync.Response.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+  f = message.getMigrateTable();
+  if (f != null) {
+    writer.writeMessage(
+      1,
+      f,
+      proto.cloudquery.plugin.v3.Sync.MessageMigrateTable.serializeBinaryToWriter
+    );
+  }
+  f = message.getInsert();
+  if (f != null) {
+    writer.writeMessage(
+      2,
+      f,
+      proto.cloudquery.plugin.v3.Sync.MessageInsert.serializeBinaryToWriter
+    );
+  }
+};
+
+
+/**
+ * optional MessageMigrateTable migrate_table = 1;
+ * @return {?proto.cloudquery.plugin.v3.Sync.MessageMigrateTable}
+ */
+proto.cloudquery.plugin.v3.Sync.Response.prototype.getMigrateTable = function() {
+  return /** @type{?proto.cloudquery.plugin.v3.Sync.MessageMigrateTable} */ (
+    jspb.Message.getWrapperField(this, proto.cloudquery.plugin.v3.Sync.MessageMigrateTable, 1));
+};
+
+
+/**
+ * @param {?proto.cloudquery.plugin.v3.Sync.MessageMigrateTable|undefined} value
+ * @return {!proto.cloudquery.plugin.v3.Sync.Response} returns this
+*/
+proto.cloudquery.plugin.v3.Sync.Response.prototype.setMigrateTable = function(value) {
+  return jspb.Message.setOneofWrapperField(this, 1, proto.cloudquery.plugin.v3.Sync.Response.oneofGroups_[0], value);
+};
+
+
+/**
+ * Clears the message field making it undefined.
+ * @return {!proto.cloudquery.plugin.v3.Sync.Response} returns this
+ */
+proto.cloudquery.plugin.v3.Sync.Response.prototype.clearMigrateTable = function() {
+  return this.setMigrateTable(undefined);
+};
+
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.cloudquery.plugin.v3.Sync.Response.prototype.hasMigrateTable = function() {
+  return jspb.Message.getField(this, 1) != null;
+};
+
+
+/**
+ * optional MessageInsert insert = 2;
+ * @return {?proto.cloudquery.plugin.v3.Sync.MessageInsert}
+ */
+proto.cloudquery.plugin.v3.Sync.Response.prototype.getInsert = function() {
+  return /** @type{?proto.cloudquery.plugin.v3.Sync.MessageInsert} */ (
+    jspb.Message.getWrapperField(this, proto.cloudquery.plugin.v3.Sync.MessageInsert, 2));
+};
+
+
+/**
+ * @param {?proto.cloudquery.plugin.v3.Sync.MessageInsert|undefined} value
+ * @return {!proto.cloudquery.plugin.v3.Sync.Response} returns this
+*/
+proto.cloudquery.plugin.v3.Sync.Response.prototype.setInsert = function(value) {
+  return jspb.Message.setOneofWrapperField(this, 2, proto.cloudquery.plugin.v3.Sync.Response.oneofGroups_[0], value);
+};
+
+
+/**
+ * Clears the message field making it undefined.
+ * @return {!proto.cloudquery.plugin.v3.Sync.Response} returns this
+ */
+proto.cloudquery.plugin.v3.Sync.Response.prototype.clearInsert = function() {
+  return this.setInsert(undefined);
+};
+
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.cloudquery.plugin.v3.Sync.Response.prototype.hasInsert = function() {
+  return jspb.Message.getField(this, 2) != null;
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.Read.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.Read.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.Read} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Read.toObject = function(includeInstance, msg) {
+  var f, obj = {
+
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.Read}
+ */
+proto.cloudquery.plugin.v3.Read.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.Read;
+  return proto.cloudquery.plugin.v3.Read.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.Read} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.Read}
+ */
+proto.cloudquery.plugin.v3.Read.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.Read.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.Read.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.Read} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Read.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.Read.Request.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.Read.Request.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.Read.Request} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Read.Request.toObject = function(includeInstance, msg) {
+  var f, obj = {
+    table: msg.getTable_asB64()
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.Read.Request}
+ */
+proto.cloudquery.plugin.v3.Read.Request.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.Read.Request;
+  return proto.cloudquery.plugin.v3.Read.Request.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.Read.Request} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.Read.Request}
+ */
+proto.cloudquery.plugin.v3.Read.Request.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    case 1:
+      var value = /** @type {!Uint8Array} */ (reader.readBytes());
+      msg.setTable(value);
+      break;
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.Read.Request.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.Read.Request.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.Read.Request} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Read.Request.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+  f = message.getTable_asU8();
+  if (f.length > 0) {
+    writer.writeBytes(
+      1,
+      f
+    );
+  }
+};
+
+
+/**
+ * optional bytes table = 1;
+ * @return {!(string|Uint8Array)}
+ */
+proto.cloudquery.plugin.v3.Read.Request.prototype.getTable = function() {
+  return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/**
+ * optional bytes table = 1;
+ * This is a type-conversion wrapper around `getTable()`
+ * @return {string}
+ */
+proto.cloudquery.plugin.v3.Read.Request.prototype.getTable_asB64 = function() {
+  return /** @type {string} */ (jspb.Message.bytesAsB64(
+      this.getTable()));
+};
+
+
+/**
+ * optional bytes table = 1;
+ * Note that Uint8Array is not supported on all browsers.
+ * @see http://caniuse.com/Uint8Array
+ * This is a type-conversion wrapper around `getTable()`
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.Read.Request.prototype.getTable_asU8 = function() {
+  return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8(
+      this.getTable()));
+};
+
+
+/**
+ * @param {!(string|Uint8Array)} value
+ * @return {!proto.cloudquery.plugin.v3.Read.Request} returns this
+ */
+proto.cloudquery.plugin.v3.Read.Request.prototype.setTable = function(value) {
+  return jspb.Message.setProto3BytesField(this, 1, value);
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.Read.Response.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.Read.Response.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.Read.Response} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Read.Response.toObject = function(includeInstance, msg) {
+  var f, obj = {
+    record: msg.getRecord_asB64()
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.Read.Response}
+ */
+proto.cloudquery.plugin.v3.Read.Response.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.Read.Response;
+  return proto.cloudquery.plugin.v3.Read.Response.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.Read.Response} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.Read.Response}
+ */
+proto.cloudquery.plugin.v3.Read.Response.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    case 1:
+      var value = /** @type {!Uint8Array} */ (reader.readBytes());
+      msg.setRecord(value);
+      break;
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.Read.Response.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.Read.Response.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.Read.Response} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Read.Response.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+  f = message.getRecord_asU8();
+  if (f.length > 0) {
+    writer.writeBytes(
+      1,
+      f
+    );
+  }
+};
+
+
+/**
+ * optional bytes record = 1;
+ * @return {!(string|Uint8Array)}
+ */
+proto.cloudquery.plugin.v3.Read.Response.prototype.getRecord = function() {
+  return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/**
+ * optional bytes record = 1;
+ * This is a type-conversion wrapper around `getRecord()`
+ * @return {string}
+ */
+proto.cloudquery.plugin.v3.Read.Response.prototype.getRecord_asB64 = function() {
+  return /** @type {string} */ (jspb.Message.bytesAsB64(
+      this.getRecord()));
+};
+
+
+/**
+ * optional bytes record = 1;
+ * Note that Uint8Array is not supported on all browsers.
+ * @see http://caniuse.com/Uint8Array
+ * This is a type-conversion wrapper around `getRecord()`
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.Read.Response.prototype.getRecord_asU8 = function() {
+  return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8(
+      this.getRecord()));
+};
+
+
+/**
+ * @param {!(string|Uint8Array)} value
+ * @return {!proto.cloudquery.plugin.v3.Read.Response} returns this
+ */
+proto.cloudquery.plugin.v3.Read.Response.prototype.setRecord = function(value) {
+  return jspb.Message.setProto3BytesField(this, 1, value);
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.Write.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.Write.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.Write} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Write.toObject = function(includeInstance, msg) {
+  var f, obj = {
+
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.Write}
+ */
+proto.cloudquery.plugin.v3.Write.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.Write;
+  return proto.cloudquery.plugin.v3.Write.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.Write} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.Write}
+ */
+proto.cloudquery.plugin.v3.Write.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.Write.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.Write.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.Write} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Write.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.Write.MessageMigrateTable.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.Write.MessageMigrateTable.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.Write.MessageMigrateTable} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Write.MessageMigrateTable.toObject = function(includeInstance, msg) {
+  var f, obj = {
+    table: msg.getTable_asB64(),
+    migrateForce: jspb.Message.getBooleanFieldWithDefault(msg, 2, false)
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.Write.MessageMigrateTable}
+ */
+proto.cloudquery.plugin.v3.Write.MessageMigrateTable.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.Write.MessageMigrateTable;
+  return proto.cloudquery.plugin.v3.Write.MessageMigrateTable.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.Write.MessageMigrateTable} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.Write.MessageMigrateTable}
+ */
+proto.cloudquery.plugin.v3.Write.MessageMigrateTable.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    case 1:
+      var value = /** @type {!Uint8Array} */ (reader.readBytes());
+      msg.setTable(value);
+      break;
+    case 2:
+      var value = /** @type {boolean} */ (reader.readBool());
+      msg.setMigrateForce(value);
+      break;
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.Write.MessageMigrateTable.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.Write.MessageMigrateTable.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.Write.MessageMigrateTable} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Write.MessageMigrateTable.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+  f = message.getTable_asU8();
+  if (f.length > 0) {
+    writer.writeBytes(
+      1,
+      f
+    );
+  }
+  f = message.getMigrateForce();
+  if (f) {
+    writer.writeBool(
+      2,
+      f
+    );
+  }
+};
+
+
+/**
+ * optional bytes table = 1;
+ * @return {!(string|Uint8Array)}
+ */
+proto.cloudquery.plugin.v3.Write.MessageMigrateTable.prototype.getTable = function() {
+  return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/**
+ * optional bytes table = 1;
+ * This is a type-conversion wrapper around `getTable()`
+ * @return {string}
+ */
+proto.cloudquery.plugin.v3.Write.MessageMigrateTable.prototype.getTable_asB64 = function() {
+  return /** @type {string} */ (jspb.Message.bytesAsB64(
+      this.getTable()));
+};
+
+
+/**
+ * optional bytes table = 1;
+ * Note that Uint8Array is not supported on all browsers.
+ * @see http://caniuse.com/Uint8Array
+ * This is a type-conversion wrapper around `getTable()`
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.Write.MessageMigrateTable.prototype.getTable_asU8 = function() {
+  return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8(
+      this.getTable()));
+};
+
+
+/**
+ * @param {!(string|Uint8Array)} value
+ * @return {!proto.cloudquery.plugin.v3.Write.MessageMigrateTable} returns this
+ */
+proto.cloudquery.plugin.v3.Write.MessageMigrateTable.prototype.setTable = function(value) {
+  return jspb.Message.setProto3BytesField(this, 1, value);
+};
+
+
+/**
+ * optional bool migrate_force = 2;
+ * @return {boolean}
+ */
+proto.cloudquery.plugin.v3.Write.MessageMigrateTable.prototype.getMigrateForce = function() {
+  return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 2, false));
+};
+
+
+/**
+ * @param {boolean} value
+ * @return {!proto.cloudquery.plugin.v3.Write.MessageMigrateTable} returns this
+ */
+proto.cloudquery.plugin.v3.Write.MessageMigrateTable.prototype.setMigrateForce = function(value) {
+  return jspb.Message.setProto3BooleanField(this, 2, value);
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.Write.MessageInsert.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.Write.MessageInsert.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.Write.MessageInsert} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Write.MessageInsert.toObject = function(includeInstance, msg) {
+  var f, obj = {
+    record: msg.getRecord_asB64()
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.Write.MessageInsert}
+ */
+proto.cloudquery.plugin.v3.Write.MessageInsert.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.Write.MessageInsert;
+  return proto.cloudquery.plugin.v3.Write.MessageInsert.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.Write.MessageInsert} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.Write.MessageInsert}
+ */
+proto.cloudquery.plugin.v3.Write.MessageInsert.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    case 1:
+      var value = /** @type {!Uint8Array} */ (reader.readBytes());
+      msg.setRecord(value);
+      break;
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.Write.MessageInsert.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.Write.MessageInsert.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.Write.MessageInsert} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Write.MessageInsert.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+  f = message.getRecord_asU8();
+  if (f.length > 0) {
+    writer.writeBytes(
+      1,
+      f
+    );
+  }
+};
+
+
+/**
+ * optional bytes record = 1;
+ * @return {!(string|Uint8Array)}
+ */
+proto.cloudquery.plugin.v3.Write.MessageInsert.prototype.getRecord = function() {
+  return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/**
+ * optional bytes record = 1;
+ * This is a type-conversion wrapper around `getRecord()`
+ * @return {string}
+ */
+proto.cloudquery.plugin.v3.Write.MessageInsert.prototype.getRecord_asB64 = function() {
+  return /** @type {string} */ (jspb.Message.bytesAsB64(
+      this.getRecord()));
+};
+
+
+/**
+ * optional bytes record = 1;
+ * Note that Uint8Array is not supported on all browsers.
+ * @see http://caniuse.com/Uint8Array
+ * This is a type-conversion wrapper around `getRecord()`
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.Write.MessageInsert.prototype.getRecord_asU8 = function() {
+  return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8(
+      this.getRecord()));
+};
+
+
+/**
+ * @param {!(string|Uint8Array)} value
+ * @return {!proto.cloudquery.plugin.v3.Write.MessageInsert} returns this
+ */
+proto.cloudquery.plugin.v3.Write.MessageInsert.prototype.setRecord = function(value) {
+  return jspb.Message.setProto3BytesField(this, 1, value);
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.Write.MessageDeleteStale.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.Write.MessageDeleteStale.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.Write.MessageDeleteStale} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Write.MessageDeleteStale.toObject = function(includeInstance, msg) {
+  var f, obj = {
+    table: msg.getTable_asB64(),
+    sourceName: jspb.Message.getFieldWithDefault(msg, 2, ""),
+    syncTime: (f = msg.getSyncTime()) && google_protobuf_timestamp_pb.Timestamp.toObject(includeInstance, f),
+    tableName: jspb.Message.getFieldWithDefault(msg, 4, "")
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.Write.MessageDeleteStale}
+ */
+proto.cloudquery.plugin.v3.Write.MessageDeleteStale.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.Write.MessageDeleteStale;
+  return proto.cloudquery.plugin.v3.Write.MessageDeleteStale.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.Write.MessageDeleteStale} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.Write.MessageDeleteStale}
+ */
+proto.cloudquery.plugin.v3.Write.MessageDeleteStale.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    case 1:
+      var value = /** @type {!Uint8Array} */ (reader.readBytes());
+      msg.setTable(value);
+      break;
+    case 2:
+      var value = /** @type {string} */ (reader.readString());
+      msg.setSourceName(value);
+      break;
+    case 3:
+      var value = new google_protobuf_timestamp_pb.Timestamp;
+      reader.readMessage(value,google_protobuf_timestamp_pb.Timestamp.deserializeBinaryFromReader);
+      msg.setSyncTime(value);
+      break;
+    case 4:
+      var value = /** @type {string} */ (reader.readString());
+      msg.setTableName(value);
+      break;
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.Write.MessageDeleteStale.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.Write.MessageDeleteStale.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.Write.MessageDeleteStale} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Write.MessageDeleteStale.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+  f = message.getTable_asU8();
+  if (f.length > 0) {
+    writer.writeBytes(
+      1,
+      f
+    );
+  }
+  f = message.getSourceName();
+  if (f.length > 0) {
+    writer.writeString(
+      2,
+      f
+    );
+  }
+  f = message.getSyncTime();
+  if (f != null) {
+    writer.writeMessage(
+      3,
+      f,
+      google_protobuf_timestamp_pb.Timestamp.serializeBinaryToWriter
+    );
+  }
+  f = message.getTableName();
+  if (f.length > 0) {
+    writer.writeString(
+      4,
+      f
+    );
+  }
+};
+
+
+/**
+ * optional bytes table = 1;
+ * @return {!(string|Uint8Array)}
+ */
+proto.cloudquery.plugin.v3.Write.MessageDeleteStale.prototype.getTable = function() {
+  return /** @type {!(string|Uint8Array)} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/**
+ * optional bytes table = 1;
+ * This is a type-conversion wrapper around `getTable()`
+ * @return {string}
+ */
+proto.cloudquery.plugin.v3.Write.MessageDeleteStale.prototype.getTable_asB64 = function() {
+  return /** @type {string} */ (jspb.Message.bytesAsB64(
+      this.getTable()));
+};
+
+
+/**
+ * optional bytes table = 1;
+ * Note that Uint8Array is not supported on all browsers.
+ * @see http://caniuse.com/Uint8Array
+ * This is a type-conversion wrapper around `getTable()`
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.Write.MessageDeleteStale.prototype.getTable_asU8 = function() {
+  return /** @type {!Uint8Array} */ (jspb.Message.bytesAsU8(
+      this.getTable()));
+};
+
+
+/**
+ * @param {!(string|Uint8Array)} value
+ * @return {!proto.cloudquery.plugin.v3.Write.MessageDeleteStale} returns this
+ */
+proto.cloudquery.plugin.v3.Write.MessageDeleteStale.prototype.setTable = function(value) {
+  return jspb.Message.setProto3BytesField(this, 1, value);
+};
+
+
+/**
+ * optional string source_name = 2;
+ * @return {string}
+ */
+proto.cloudquery.plugin.v3.Write.MessageDeleteStale.prototype.getSourceName = function() {
+  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.cloudquery.plugin.v3.Write.MessageDeleteStale} returns this
+ */
+proto.cloudquery.plugin.v3.Write.MessageDeleteStale.prototype.setSourceName = function(value) {
+  return jspb.Message.setProto3StringField(this, 2, value);
+};
+
+
+/**
+ * optional google.protobuf.Timestamp sync_time = 3;
+ * @return {?proto.google.protobuf.Timestamp}
+ */
+proto.cloudquery.plugin.v3.Write.MessageDeleteStale.prototype.getSyncTime = function() {
+  return /** @type{?proto.google.protobuf.Timestamp} */ (
+    jspb.Message.getWrapperField(this, google_protobuf_timestamp_pb.Timestamp, 3));
+};
+
+
+/**
+ * @param {?proto.google.protobuf.Timestamp|undefined} value
+ * @return {!proto.cloudquery.plugin.v3.Write.MessageDeleteStale} returns this
+*/
+proto.cloudquery.plugin.v3.Write.MessageDeleteStale.prototype.setSyncTime = function(value) {
+  return jspb.Message.setWrapperField(this, 3, value);
+};
+
+
+/**
+ * Clears the message field making it undefined.
+ * @return {!proto.cloudquery.plugin.v3.Write.MessageDeleteStale} returns this
+ */
+proto.cloudquery.plugin.v3.Write.MessageDeleteStale.prototype.clearSyncTime = function() {
+  return this.setSyncTime(undefined);
+};
+
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.cloudquery.plugin.v3.Write.MessageDeleteStale.prototype.hasSyncTime = function() {
+  return jspb.Message.getField(this, 3) != null;
+};
+
+
+/**
+ * optional string table_name = 4;
+ * @return {string}
+ */
+proto.cloudquery.plugin.v3.Write.MessageDeleteStale.prototype.getTableName = function() {
+  return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, ""));
+};
+
+
+/**
+ * @param {string} value
+ * @return {!proto.cloudquery.plugin.v3.Write.MessageDeleteStale} returns this
+ */
+proto.cloudquery.plugin.v3.Write.MessageDeleteStale.prototype.setTableName = function(value) {
+  return jspb.Message.setProto3StringField(this, 4, value);
+};
+
+
+
+/**
+ * Oneof group definitions for this message. Each group defines the field
+ * numbers belonging to that group. When of these fields' value is set, all
+ * other fields in the group are cleared. During deserialization, if multiple
+ * fields are encountered for a group, only the last value seen will be kept.
+ * @private {!Array<!Array<number>>}
+ * @const
+ */
+proto.cloudquery.plugin.v3.Write.Request.oneofGroups_ = [[1,2,3]];
+
+/**
+ * @enum {number}
+ */
+proto.cloudquery.plugin.v3.Write.Request.MessageCase = {
+  MESSAGE_NOT_SET: 0,
+  MIGRATE_TABLE: 1,
+  INSERT: 2,
+  DELETE: 3
+};
+
+/**
+ * @return {proto.cloudquery.plugin.v3.Write.Request.MessageCase}
+ */
+proto.cloudquery.plugin.v3.Write.Request.prototype.getMessageCase = function() {
+  return /** @type {proto.cloudquery.plugin.v3.Write.Request.MessageCase} */(jspb.Message.computeOneofCase(this, proto.cloudquery.plugin.v3.Write.Request.oneofGroups_[0]));
+};
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.Write.Request.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.Write.Request.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.Write.Request} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Write.Request.toObject = function(includeInstance, msg) {
+  var f, obj = {
+    migrateTable: (f = msg.getMigrateTable()) && proto.cloudquery.plugin.v3.Write.MessageMigrateTable.toObject(includeInstance, f),
+    insert: (f = msg.getInsert()) && proto.cloudquery.plugin.v3.Write.MessageInsert.toObject(includeInstance, f),
+    pb_delete: (f = msg.getDelete()) && proto.cloudquery.plugin.v3.Write.MessageDeleteStale.toObject(includeInstance, f)
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.Write.Request}
+ */
+proto.cloudquery.plugin.v3.Write.Request.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.Write.Request;
+  return proto.cloudquery.plugin.v3.Write.Request.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.Write.Request} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.Write.Request}
+ */
+proto.cloudquery.plugin.v3.Write.Request.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    case 1:
+      var value = new proto.cloudquery.plugin.v3.Write.MessageMigrateTable;
+      reader.readMessage(value,proto.cloudquery.plugin.v3.Write.MessageMigrateTable.deserializeBinaryFromReader);
+      msg.setMigrateTable(value);
+      break;
+    case 2:
+      var value = new proto.cloudquery.plugin.v3.Write.MessageInsert;
+      reader.readMessage(value,proto.cloudquery.plugin.v3.Write.MessageInsert.deserializeBinaryFromReader);
+      msg.setInsert(value);
+      break;
+    case 3:
+      var value = new proto.cloudquery.plugin.v3.Write.MessageDeleteStale;
+      reader.readMessage(value,proto.cloudquery.plugin.v3.Write.MessageDeleteStale.deserializeBinaryFromReader);
+      msg.setDelete(value);
+      break;
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.Write.Request.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.Write.Request.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.Write.Request} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Write.Request.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+  f = message.getMigrateTable();
+  if (f != null) {
+    writer.writeMessage(
+      1,
+      f,
+      proto.cloudquery.plugin.v3.Write.MessageMigrateTable.serializeBinaryToWriter
+    );
+  }
+  f = message.getInsert();
+  if (f != null) {
+    writer.writeMessage(
+      2,
+      f,
+      proto.cloudquery.plugin.v3.Write.MessageInsert.serializeBinaryToWriter
+    );
+  }
+  f = message.getDelete();
+  if (f != null) {
+    writer.writeMessage(
+      3,
+      f,
+      proto.cloudquery.plugin.v3.Write.MessageDeleteStale.serializeBinaryToWriter
+    );
+  }
+};
+
+
+/**
+ * optional MessageMigrateTable migrate_table = 1;
+ * @return {?proto.cloudquery.plugin.v3.Write.MessageMigrateTable}
+ */
+proto.cloudquery.plugin.v3.Write.Request.prototype.getMigrateTable = function() {
+  return /** @type{?proto.cloudquery.plugin.v3.Write.MessageMigrateTable} */ (
+    jspb.Message.getWrapperField(this, proto.cloudquery.plugin.v3.Write.MessageMigrateTable, 1));
+};
+
+
+/**
+ * @param {?proto.cloudquery.plugin.v3.Write.MessageMigrateTable|undefined} value
+ * @return {!proto.cloudquery.plugin.v3.Write.Request} returns this
+*/
+proto.cloudquery.plugin.v3.Write.Request.prototype.setMigrateTable = function(value) {
+  return jspb.Message.setOneofWrapperField(this, 1, proto.cloudquery.plugin.v3.Write.Request.oneofGroups_[0], value);
+};
+
+
+/**
+ * Clears the message field making it undefined.
+ * @return {!proto.cloudquery.plugin.v3.Write.Request} returns this
+ */
+proto.cloudquery.plugin.v3.Write.Request.prototype.clearMigrateTable = function() {
+  return this.setMigrateTable(undefined);
+};
+
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.cloudquery.plugin.v3.Write.Request.prototype.hasMigrateTable = function() {
+  return jspb.Message.getField(this, 1) != null;
+};
+
+
+/**
+ * optional MessageInsert insert = 2;
+ * @return {?proto.cloudquery.plugin.v3.Write.MessageInsert}
+ */
+proto.cloudquery.plugin.v3.Write.Request.prototype.getInsert = function() {
+  return /** @type{?proto.cloudquery.plugin.v3.Write.MessageInsert} */ (
+    jspb.Message.getWrapperField(this, proto.cloudquery.plugin.v3.Write.MessageInsert, 2));
+};
+
+
+/**
+ * @param {?proto.cloudquery.plugin.v3.Write.MessageInsert|undefined} value
+ * @return {!proto.cloudquery.plugin.v3.Write.Request} returns this
+*/
+proto.cloudquery.plugin.v3.Write.Request.prototype.setInsert = function(value) {
+  return jspb.Message.setOneofWrapperField(this, 2, proto.cloudquery.plugin.v3.Write.Request.oneofGroups_[0], value);
+};
+
+
+/**
+ * Clears the message field making it undefined.
+ * @return {!proto.cloudquery.plugin.v3.Write.Request} returns this
+ */
+proto.cloudquery.plugin.v3.Write.Request.prototype.clearInsert = function() {
+  return this.setInsert(undefined);
+};
+
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.cloudquery.plugin.v3.Write.Request.prototype.hasInsert = function() {
+  return jspb.Message.getField(this, 2) != null;
+};
+
+
+/**
+ * optional MessageDeleteStale delete = 3;
+ * @return {?proto.cloudquery.plugin.v3.Write.MessageDeleteStale}
+ */
+proto.cloudquery.plugin.v3.Write.Request.prototype.getDelete = function() {
+  return /** @type{?proto.cloudquery.plugin.v3.Write.MessageDeleteStale} */ (
+    jspb.Message.getWrapperField(this, proto.cloudquery.plugin.v3.Write.MessageDeleteStale, 3));
+};
+
+
+/**
+ * @param {?proto.cloudquery.plugin.v3.Write.MessageDeleteStale|undefined} value
+ * @return {!proto.cloudquery.plugin.v3.Write.Request} returns this
+*/
+proto.cloudquery.plugin.v3.Write.Request.prototype.setDelete = function(value) {
+  return jspb.Message.setOneofWrapperField(this, 3, proto.cloudquery.plugin.v3.Write.Request.oneofGroups_[0], value);
+};
+
+
+/**
+ * Clears the message field making it undefined.
+ * @return {!proto.cloudquery.plugin.v3.Write.Request} returns this
+ */
+proto.cloudquery.plugin.v3.Write.Request.prototype.clearDelete = function() {
+  return this.setDelete(undefined);
+};
+
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.cloudquery.plugin.v3.Write.Request.prototype.hasDelete = function() {
+  return jspb.Message.getField(this, 3) != null;
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.Write.Response.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.Write.Response.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.Write.Response} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Write.Response.toObject = function(includeInstance, msg) {
+  var f, obj = {
+
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.Write.Response}
+ */
+proto.cloudquery.plugin.v3.Write.Response.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.Write.Response;
+  return proto.cloudquery.plugin.v3.Write.Response.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.Write.Response} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.Write.Response}
+ */
+proto.cloudquery.plugin.v3.Write.Response.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.Write.Response.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.Write.Response.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.Write.Response} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Write.Response.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.Close.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.Close.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.Close} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Close.toObject = function(includeInstance, msg) {
+  var f, obj = {
+
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.Close}
+ */
+proto.cloudquery.plugin.v3.Close.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.Close;
+  return proto.cloudquery.plugin.v3.Close.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.Close} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.Close}
+ */
+proto.cloudquery.plugin.v3.Close.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.Close.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.Close.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.Close} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Close.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.Close.Request.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.Close.Request.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.Close.Request} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Close.Request.toObject = function(includeInstance, msg) {
+  var f, obj = {
+
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.Close.Request}
+ */
+proto.cloudquery.plugin.v3.Close.Request.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.Close.Request;
+  return proto.cloudquery.plugin.v3.Close.Request.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.Close.Request} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.Close.Request}
+ */
+proto.cloudquery.plugin.v3.Close.Request.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.Close.Request.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.Close.Request.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.Close.Request} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Close.Request.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ *     net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ *     JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.cloudquery.plugin.v3.Close.Response.prototype.toObject = function(opt_includeInstance) {
+  return proto.cloudquery.plugin.v3.Close.Response.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ *     the JSPB instance for transitional soy proto support:
+ *     http://goto/soy-param-migration
+ * @param {!proto.cloudquery.plugin.v3.Close.Response} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Close.Response.toObject = function(includeInstance, msg) {
+  var f, obj = {
+
+  };
+
+  if (includeInstance) {
+    obj.$jspbMessageInstance = msg;
+  }
+  return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.cloudquery.plugin.v3.Close.Response}
+ */
+proto.cloudquery.plugin.v3.Close.Response.deserializeBinary = function(bytes) {
+  var reader = new jspb.BinaryReader(bytes);
+  var msg = new proto.cloudquery.plugin.v3.Close.Response;
+  return proto.cloudquery.plugin.v3.Close.Response.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.cloudquery.plugin.v3.Close.Response} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.cloudquery.plugin.v3.Close.Response}
+ */
+proto.cloudquery.plugin.v3.Close.Response.deserializeBinaryFromReader = function(msg, reader) {
+  while (reader.nextField()) {
+    if (reader.isEndGroup()) {
+      break;
+    }
+    var field = reader.getFieldNumber();
+    switch (field) {
+    default:
+      reader.skipField();
+      break;
+    }
+  }
+  return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.cloudquery.plugin.v3.Close.Response.prototype.serializeBinary = function() {
+  var writer = new jspb.BinaryWriter();
+  proto.cloudquery.plugin.v3.Close.Response.serializeBinaryToWriter(this, writer);
+  return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.cloudquery.plugin.v3.Close.Response} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.cloudquery.plugin.v3.Close.Response.serializeBinaryToWriter = function(message, writer) {
+  var f = undefined;
+};
+
+
+goog.object.extend(exports, proto.cloudquery.plugin.v3);
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..900515b
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,95 @@
+{
+  "name": "plugin-pb-js",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "devDependencies": {
+        "grpc_tools_node_protoc_ts": "^5.3.3"
+      }
+    },
+    "node_modules/google-protobuf": {
+      "version": "3.15.8",
+      "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.15.8.tgz",
+      "integrity": "sha512-2jtfdqTaSxk0cuBJBtTTWsot4WtR9RVr2rXg7x7OoqiuOKopPrwXpM1G4dXIkLcUNRh3RKzz76C8IOkksZSeOw==",
+      "dev": true
+    },
+    "node_modules/grpc_tools_node_protoc_ts": {
+      "version": "5.3.3",
+      "resolved": "https://registry.npmjs.org/grpc_tools_node_protoc_ts/-/grpc_tools_node_protoc_ts-5.3.3.tgz",
+      "integrity": "sha512-M/YrklvVXMtuuj9kb42PxeouZhs7Ul+R4e/31XwrankUcKL8cQQP50Q9q+KEHGyHQaPt6VtKKsxMgLaKbCxeww==",
+      "dev": true,
+      "dependencies": {
+        "google-protobuf": "3.15.8",
+        "handlebars": "4.7.7"
+      },
+      "bin": {
+        "protoc-gen-ts": "bin/protoc-gen-ts"
+      }
+    },
+    "node_modules/handlebars": {
+      "version": "4.7.7",
+      "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
+      "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
+      "dev": true,
+      "dependencies": {
+        "minimist": "^1.2.5",
+        "neo-async": "^2.6.0",
+        "source-map": "^0.6.1",
+        "wordwrap": "^1.0.0"
+      },
+      "bin": {
+        "handlebars": "bin/handlebars"
+      },
+      "engines": {
+        "node": ">=0.4.7"
+      },
+      "optionalDependencies": {
+        "uglify-js": "^3.1.4"
+      }
+    },
+    "node_modules/minimist": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+      "dev": true,
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/neo-async": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+      "dev": true
+    },
+    "node_modules/source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/uglify-js": {
+      "version": "3.17.4",
+      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz",
+      "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==",
+      "dev": true,
+      "optional": true,
+      "bin": {
+        "uglifyjs": "bin/uglifyjs"
+      },
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/wordwrap": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+      "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
+      "dev": true
+    }
+  }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..21dac4f
--- /dev/null
+++ b/package.json
@@ -0,0 +1,5 @@
+{
+  "devDependencies": {
+    "grpc_tools_node_protoc_ts": "^5.3.3"
+  }
+}
diff --git a/protos/cloudquery/discovery_v1/discovery.proto b/protos/cloudquery/discovery_v1/discovery.proto
new file mode 100644
index 0000000..ad8c595
--- /dev/null
+++ b/protos/cloudquery/discovery_v1/discovery.proto
@@ -0,0 +1,16 @@
+syntax = "proto3";
+package cloudquery.discovery.v1;
+
+option go_package = "github.com/cloudquery/plugin-pb-go/pb/discovery/v1;discovery";
+
+service Discovery {
+  // Get the name of the plugin
+  rpc GetVersions(GetVersions.Request) returns (GetVersions.Response);
+}
+
+message GetVersions {
+  message Request {}
+  message Response {
+    repeated int32 versions = 1;
+  }
+}
diff --git a/protos/cloudquery/plugin_v3/plugin.proto b/protos/cloudquery/plugin_v3/plugin.proto
new file mode 100644
index 0000000..eedb367
--- /dev/null
+++ b/protos/cloudquery/plugin_v3/plugin.proto
@@ -0,0 +1,132 @@
+syntax = "proto3";
+package cloudquery.plugin.v3;
+
+import "google/protobuf/timestamp.proto";
+
+option go_package = "github.com/cloudquery/plugin-pb-go/pb/plugin/v3;plugin";
+
+service Plugin {
+  // Get the name of the plugin
+  rpc GetName(GetName.Request) returns (GetName.Response);
+  // Get the current version of the plugin
+  rpc GetVersion(GetVersion.Request) returns (GetVersion.Response);
+  // Configure the plugin with the given credentials and mode
+  rpc Init(Init.Request) returns (Init.Response);
+  // Get all tables the source plugin supports. Must be called after Init
+  rpc GetTables(GetTables.Request) returns (GetTables.Response);
+  // Start a sync on the source plugin. It streams messages as output.
+  rpc Sync(Sync.Request) returns (stream Sync.Response);
+  // Start a Read on the source plugin for a given table and schema. It streams messages as output.
+  // The plugin assume that that schema was used to also write the data beforehand
+  rpc Read(Read.Request) returns (stream Read.Response);
+  // Write resources. Write is the mirror of Sync, expecting a stream of messages as input.
+  rpc Write(stream Write.Request) returns (Write.Response);
+  // Send signal to flush and close open connections
+  rpc Close(Close.Request) returns (Close.Response);
+}
+
+message GetName {
+  message Request {}
+  message Response {
+    string name = 1;
+  }
+}
+
+message GetVersion {
+  message Request {}
+  message Response {
+    string version = 1;
+  }
+}
+
+message Init {
+  message Request {
+    bytes spec = 1; // Internal plugin-specific spec
+    bool no_connection = 2; // A flag to indicate plugins should skip establishing a connection
+  }
+  message Response {}
+}
+
+message GetTables {
+  message Request {
+    repeated string tables = 1;
+    repeated string skip_tables = 2;
+  }
+  message Response {
+    // marshalled []arrow.Schema
+    repeated bytes tables = 1;
+  }
+}
+
+message Sync {
+  message MessageInsert {
+    // marshalled arrow.Record
+    bytes record = 1;
+  }
+  message MessageMigrateTable {
+    // marshalled arrow.Schema
+    bytes table = 1;
+  }
+  message BackendOptions {
+    // table name to use for state backend
+    string table_name = 1;
+    // connection path to use for state backend
+    string connection = 2;
+  }
+  message Request {
+    repeated string tables = 1;
+    repeated string skip_tables = 2;
+    bool skip_dependent_tables = 3;
+    bool deterministic_cq_id = 4;
+    BackendOptions backend = 5;
+  }
+  message Response {
+    oneof message {
+      Sync.MessageMigrateTable migrate_table = 1;
+      Sync.MessageInsert insert = 2;
+    }
+  }
+}
+
+message Read {
+  message Request {
+    // marshalled arrow.Schema
+    bytes table = 1;
+  }
+  message Response {
+    // marshalled arrow.Record
+    bytes record = 1;
+  }
+}
+
+message Write {
+  message MessageMigrateTable {
+    // marshalled arrow.Schema
+    bytes table = 1;
+    bool migrate_force = 2;
+  }
+  message MessageInsert {
+    // marshalled arrow.Record
+    bytes record = 1;
+  }
+  message MessageDeleteStale {
+    // marshalled arrow.Schema
+    bytes table = 1 [deprecated = true];
+    string source_name = 2;
+    google.protobuf.Timestamp sync_time = 3;
+    string table_name = 4;
+  }
+  message Request {
+    oneof message {
+      Write.MessageMigrateTable migrate_table = 1;
+      Write.MessageInsert insert = 2;
+      Write.MessageDeleteStale delete = 3;
+    }
+  }
+  message Response {}
+}
+
+message Close {
+  message Request {}
+  message Response {}
+}

From 76343549904582c662b6e2e5949fa7a44b852976 Mon Sep 17 00:00:00 2001
From: bbernays <ben@bernays.me>
Date: Wed, 2 Aug 2023 09:59:10 -0500
Subject: [PATCH 2/5] Delete discovery.proto

---
 protos/cloudquery/discovery_v1/discovery.proto | 16 ----------------
 1 file changed, 16 deletions(-)
 delete mode 100644 protos/cloudquery/discovery_v1/discovery.proto

diff --git a/protos/cloudquery/discovery_v1/discovery.proto b/protos/cloudquery/discovery_v1/discovery.proto
deleted file mode 100644
index ad8c595..0000000
--- a/protos/cloudquery/discovery_v1/discovery.proto
+++ /dev/null
@@ -1,16 +0,0 @@
-syntax = "proto3";
-package cloudquery.discovery.v1;
-
-option go_package = "github.com/cloudquery/plugin-pb-go/pb/discovery/v1;discovery";
-
-service Discovery {
-  // Get the name of the plugin
-  rpc GetVersions(GetVersions.Request) returns (GetVersions.Response);
-}
-
-message GetVersions {
-  message Request {}
-  message Response {
-    repeated int32 versions = 1;
-  }
-}

From 57bc2e8f497fe93399d88bedc63eb6eb1869f587 Mon Sep 17 00:00:00 2001
From: bbernays <ben@bernays.me>
Date: Wed, 2 Aug 2023 09:59:12 -0500
Subject: [PATCH 3/5] Delete plugin.proto

---
 protos/cloudquery/plugin_v3/plugin.proto | 132 -----------------------
 1 file changed, 132 deletions(-)
 delete mode 100644 protos/cloudquery/plugin_v3/plugin.proto

diff --git a/protos/cloudquery/plugin_v3/plugin.proto b/protos/cloudquery/plugin_v3/plugin.proto
deleted file mode 100644
index eedb367..0000000
--- a/protos/cloudquery/plugin_v3/plugin.proto
+++ /dev/null
@@ -1,132 +0,0 @@
-syntax = "proto3";
-package cloudquery.plugin.v3;
-
-import "google/protobuf/timestamp.proto";
-
-option go_package = "github.com/cloudquery/plugin-pb-go/pb/plugin/v3;plugin";
-
-service Plugin {
-  // Get the name of the plugin
-  rpc GetName(GetName.Request) returns (GetName.Response);
-  // Get the current version of the plugin
-  rpc GetVersion(GetVersion.Request) returns (GetVersion.Response);
-  // Configure the plugin with the given credentials and mode
-  rpc Init(Init.Request) returns (Init.Response);
-  // Get all tables the source plugin supports. Must be called after Init
-  rpc GetTables(GetTables.Request) returns (GetTables.Response);
-  // Start a sync on the source plugin. It streams messages as output.
-  rpc Sync(Sync.Request) returns (stream Sync.Response);
-  // Start a Read on the source plugin for a given table and schema. It streams messages as output.
-  // The plugin assume that that schema was used to also write the data beforehand
-  rpc Read(Read.Request) returns (stream Read.Response);
-  // Write resources. Write is the mirror of Sync, expecting a stream of messages as input.
-  rpc Write(stream Write.Request) returns (Write.Response);
-  // Send signal to flush and close open connections
-  rpc Close(Close.Request) returns (Close.Response);
-}
-
-message GetName {
-  message Request {}
-  message Response {
-    string name = 1;
-  }
-}
-
-message GetVersion {
-  message Request {}
-  message Response {
-    string version = 1;
-  }
-}
-
-message Init {
-  message Request {
-    bytes spec = 1; // Internal plugin-specific spec
-    bool no_connection = 2; // A flag to indicate plugins should skip establishing a connection
-  }
-  message Response {}
-}
-
-message GetTables {
-  message Request {
-    repeated string tables = 1;
-    repeated string skip_tables = 2;
-  }
-  message Response {
-    // marshalled []arrow.Schema
-    repeated bytes tables = 1;
-  }
-}
-
-message Sync {
-  message MessageInsert {
-    // marshalled arrow.Record
-    bytes record = 1;
-  }
-  message MessageMigrateTable {
-    // marshalled arrow.Schema
-    bytes table = 1;
-  }
-  message BackendOptions {
-    // table name to use for state backend
-    string table_name = 1;
-    // connection path to use for state backend
-    string connection = 2;
-  }
-  message Request {
-    repeated string tables = 1;
-    repeated string skip_tables = 2;
-    bool skip_dependent_tables = 3;
-    bool deterministic_cq_id = 4;
-    BackendOptions backend = 5;
-  }
-  message Response {
-    oneof message {
-      Sync.MessageMigrateTable migrate_table = 1;
-      Sync.MessageInsert insert = 2;
-    }
-  }
-}
-
-message Read {
-  message Request {
-    // marshalled arrow.Schema
-    bytes table = 1;
-  }
-  message Response {
-    // marshalled arrow.Record
-    bytes record = 1;
-  }
-}
-
-message Write {
-  message MessageMigrateTable {
-    // marshalled arrow.Schema
-    bytes table = 1;
-    bool migrate_force = 2;
-  }
-  message MessageInsert {
-    // marshalled arrow.Record
-    bytes record = 1;
-  }
-  message MessageDeleteStale {
-    // marshalled arrow.Schema
-    bytes table = 1 [deprecated = true];
-    string source_name = 2;
-    google.protobuf.Timestamp sync_time = 3;
-    string table_name = 4;
-  }
-  message Request {
-    oneof message {
-      Write.MessageMigrateTable migrate_table = 1;
-      Write.MessageInsert insert = 2;
-      Write.MessageDeleteStale delete = 3;
-    }
-  }
-  message Response {}
-}
-
-message Close {
-  message Request {}
-  message Response {}
-}

From 12db84db0fc920d05f8f291c1fe8fb5bf34aedb7 Mon Sep 17 00:00:00 2001
From: bbernays <ben@bernays.me>
Date: Wed, 2 Aug 2023 10:02:37 -0500
Subject: [PATCH 4/5] Update .gitignore

---
 .gitignore | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/.gitignore b/.gitignore
index c6bba59..4929488 100644
--- a/.gitignore
+++ b/.gitignore
@@ -128,3 +128,6 @@ dist
 .yarn/build-state.yml
 .yarn/install-state.gz
 .pnp.*
+
+plugin-pb/
+protos/*

From 84810fd3997fc0a58a5164ca1d1855544f0d2ad3 Mon Sep 17 00:00:00 2001
From: bbernays <ben@bernays.me>
Date: Wed, 2 Aug 2023 10:02:40 -0500
Subject: [PATCH 5/5] Update Makefile

---
 Makefile | 1 -
 1 file changed, 1 deletion(-)

diff --git a/Makefile b/Makefile
index c661a2e..6e346f5 100644
--- a/Makefile
+++ b/Makefile
@@ -6,7 +6,6 @@ gen-proto:
 
 	mkdir -p ./protos/cloudquery/plugin_v3
 	cp ./plugin-pb/plugin/v3/*.proto ./protos/cloudquery/plugin_v3/.
-	# python -m grpc_tools.protoc -I./protos --python_out=. --pyi_out=. --grpc_python_out=. ./protos/cloudquery/plugin_v3/*.proto
 	grpc_tools_node_protoc \
 		--js_out=import_style=commonjs,binary:. \
 		--grpc_out=grpc_js:. \
