diff --git a/docs/synq/core.md b/docs/synq/core.md
deleted file mode 100644
index 7076c27..0000000
--- a/docs/synq/core.md
+++ /dev/null
@@ -1,265 +0,0 @@
-# Protocol Documentation
-
-
-## Table of Contents
-
-- [synq/core/v1/platforms.proto](#synq_core_v1_platforms-proto)
- - [Platform](#synq-core-v1-Platform)
-
-- [synq/core/v1/entity.proto](#synq_core_v1_entity-proto)
- - [Asset](#synq-core-v1-Asset)
- - [Entity](#synq-core-v1-Entity)
- - [EntityRef](#synq-core-v1-EntityRef)
- - [Monitor](#synq-core-v1-Monitor)
- - [MonitorSegment](#synq-core-v1-MonitorSegment)
-
-- [synq/core/v1/entity_type.proto](#synq_core_v1_entity_type-proto)
- - [EntityType](#synq-core-v1-EntityType)
-
-- [Scalar Value Types](#scalar-value-types)
-
-
-
-
-
Top
-
-## synq/core/v1/platforms.proto
-
-
-
-
-
-
-
-### Platform
-Platforms supported by Synq.
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| PLATFORM_UNSPECIFIED | 0 | |
-| PLATFORM_BIGQUERY | 10 | |
-| PLATFORM_LOOKER | 20 | |
-| PLATFORM_DBT | 30 | |
-| PLATFORM_DBT_CLOUD | 31 | |
-| PLATFORM_DBT_SELF_HOSTED | 32 | |
-| PLATFORM_SNOWFLAKE | 50 | |
-| PLATFORM_REDSHIFT | 80 | |
-| PLATFORM_TABLEAU | 110 | |
-| PLATFORM_AIRFLOW | 120 | |
-| PLATFORM_CLICKHOUSE | 130 | |
-| PLATFORM_POSTGRES | 160 | |
-| PLATFORM_MYSQL | 170 | |
-
-
-
-
-
-
-
-
-
-
-
-Top
-
-## synq/core/v1/entity.proto
-
-
-
-
-
-### Asset
-Entity: Asset.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| asset_path | [string](#string) | | |
-| platform | [Platform](#synq-core-v1-Platform) | | |
-
-
-
-
-
-
-
-
-### Entity
-Entity in Synq.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| asset | [Asset](#synq-core-v1-Asset) | | |
-| monitor | [Monitor](#synq-core-v1-Monitor) | | |
-| monitor_segment | [MonitorSegment](#synq-core-v1-MonitorSegment) | | |
-
-
-
-
-
-
-
-
-### EntityRef
-Lightweight reference to an Entity
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| path | [string](#string) | | Unique path for entity. |
-| type | [EntityType](#synq-core-v1-EntityType) | | Type of entity. |
-| name | [string](#string) | optional | Human friendly name. |
-
-
-
-
-
-
-
-
-### Monitor
-Entity: Monitor
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| monitor_path | [string](#string) | | |
-
-
-
-
-
-
-
-
-### MonitorSegment
-Entity: Monitor Segment
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| monitor_path | [string](#string) | | |
-| metric_id | [string](#string) | | |
-| segment | [string](#string) | | |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Top
-
-## synq/core/v1/entity_type.proto
-
-
-
-
-
-
-
-### EntityType
-Type of Entity.
-This enum lists all the types currently supported by Synq.
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| ENTITY_TYPE_UNSPECIFIED | 0 | |
-| ENTITY_TYPE_FOLDER | 1 | |
-| ENTITY_TYPE_BQ_PROJECT | 101 | |
-| ENTITY_TYPE_BQ_DATASET | 102 | |
-| ENTITY_TYPE_BQ_TABLE | 103 | |
-| ENTITY_TYPE_BQ_VIEW | 105 | |
-| ENTITY_TYPE_LOOKER_LOOK | 201 | |
-| ENTITY_TYPE_LOOKER_EXPLORE | 203 | |
-| ENTITY_TYPE_LOOKER_VIEW | 207 | |
-| ENTITY_TYPE_LOOKER_DASHBOARD | 208 | |
-| ENTITY_TYPE_DBT_MODEL | 301 | |
-| ENTITY_TYPE_DBT_TEST | 302 | |
-| ENTITY_TYPE_DBT_SOURCE | 303 | |
-| ENTITY_TYPE_DBT_MACRO | 304 | |
-| ENTITY_TYPE_DBT_PROJECT | 306 | |
-| ENTITY_TYPE_DBT_METRIC | 307 | |
-| ENTITY_TYPE_DBT_SNAPSHOT | 310 | |
-| ENTITY_TYPE_DBT_SEED | 311 | |
-| ENTITY_TYPE_DBT_ANALYSIS | 312 | |
-| ENTITY_TYPE_DBT_EXPOSURE | 313 | |
-| ENTITY_TYPE_DBT_GROUP | 314 | |
-| ENTITY_TYPE_DBT_CLOUD_ACCOUNT | 351 | |
-| ENTITY_TYPE_DBT_CLOUD_PROJECT | 352 | |
-| ENTITY_TYPE_DBT_CLOUD_JOB | 353 | |
-| ENTITY_TYPE_DBT_CLOUD_JOB_STEP | 354 | |
-| ENTITY_TYPE_SNOWFLAKE_PROJECT | 501 | |
-| ENTITY_TYPE_SNOWFLAKE_DATASET | 502 | |
-| ENTITY_TYPE_SNOWFLAKE_TABLE | 503 | |
-| ENTITY_TYPE_SNOWFLAKE_ACCOUNT | 505 | |
-| ENTITY_TYPE_SNOWFLAKE_DATABASE | 506 | |
-| ENTITY_TYPE_SNOWFLAKE_SCHEMA | 507 | |
-| ENTITY_TYPE_SNOWFLAKE_VIEW | 508 | |
-| ENTITY_TYPE_REDSHIFT_DATABASE | 801 | |
-| ENTITY_TYPE_REDSHIFT_SCHEMA | 802 | |
-| ENTITY_TYPE_REDSHIFT_TABLE | 803 | |
-| ENTITY_TYPE_REDSHIFT_VIEW | 805 | |
-| ENTITY_TYPE_TABLEAU_EMBEDDED | 1101 | |
-| ENTITY_TYPE_TABLEAU_PUBLISHED | 1102 | |
-| ENTITY_TYPE_TABLEAU_CUSTOM_SQL | 1103 | |
-| ENTITY_TYPE_TABLEAU_TABLE | 1104 | |
-| ENTITY_TYPE_TABLEAU_SHEET | 1105 | |
-| ENTITY_TYPE_TABLEAU_DASHBOARD | 1106 | |
-| ENTITY_TYPE_AIRFLOW_DAG | 1201 | |
-| ENTITY_TYPE_AIRFLOW_TASK | 1202 | |
-| ENTITY_TYPE_CLICKHOUSE_DATABASE | 1301 | |
-| ENTITY_TYPE_CLICKHOUSE_SCHEMA | 1302 | |
-| ENTITY_TYPE_CLICKHOUSE_TABLE | 1303 | |
-| ENTITY_TYPE_CLICKHOUSE_VIEW | 1305 | |
-| ENTITY_TYPE_ANOMALY_INTEGRATION | 1401 | |
-| ENTITY_TYPE_ANOMALY_MONITOR | 1403 | |
-| ENTITY_TYPE_ANOMALY_MONITOR_SEGMENT | 1404 | |
-| ENTITY_TYPE_POSTGRES_DATABASE | 1601 | |
-| ENTITY_TYPE_POSTGRES_SCHEMA | 1602 | |
-| ENTITY_TYPE_POSTGRES_TABLE | 1603 | |
-| ENTITY_TYPE_POSTGRES_VIEW | 1605 | |
-| ENTITY_TYPE_MYSQL_DATABASE | 1701 | |
-| ENTITY_TYPE_MYSQL_SCHEMA | 1702 | |
-| ENTITY_TYPE_MYSQL_TABLE | 1703 | |
-| ENTITY_TYPE_MYSQL_VIEW | 1705 | |
-
-
-
-
-
-
-
-
-
-
-## Scalar Value Types
-
-| .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby |
-| ----------- | ----- | --- | ---- | ------ | -- | -- | --- | ---- |
-| double | | double | double | float | float64 | double | float | Float |
-| float | | float | float | float | float32 | float | float | Float |
-| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) |
-| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | int64 | long | integer/string | Bignum |
-| uint32 | Uses variable-length encoding. | uint32 | int | int/long | uint32 | uint | integer | Bignum or Fixnum (as required) |
-| uint64 | Uses variable-length encoding. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum or Fixnum (as required) |
-| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) |
-| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | int64 | long | integer/string | Bignum |
-| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | uint32 | uint | integer | Bignum or Fixnum (as required) |
-| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum |
-| sfixed32 | Always four bytes. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) |
-| sfixed64 | Always eight bytes. | int64 | long | int/long | int64 | long | integer/string | Bignum |
-| bool | | bool | boolean | boolean | bool | bool | boolean | TrueClass/FalseClass |
-| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | string | string | string | String (UTF-8) |
-| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | []byte | ByteString | string | String (ASCII-8BIT) |
-
diff --git a/docs/synq/entities.mdx b/docs/synq/entities.mdx
new file mode 100644
index 0000000..d34be75
--- /dev/null
+++ b/docs/synq/entities.mdx
@@ -0,0 +1,1446 @@
+
+
+
+
+ Protocol Documentation
+
+
+
+
+
+
+
+
+
+
+ Protocol Documentation
+
+ Table of Contents
+
+
+
+
+
+
+
synq/entities/v1/entities_service.proto Top
+
+
+
+
+ BatchGetEntitiesRequest
+ BatchGetEntitiesRequest is the request message for the BatchGetEntities method.
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ ids
+ Identifier
+ repeated
+ Identifiers of the entities to get.
+
+
+
+
+
+
+
+
+
+ BatchGetEntitiesResponse
+ BatchGetEntitiesResponse is the response message for the BatchGetEntities method.
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ entities
+ Entity
+ repeated
+ The entities that were retrieved.
+
+
+
+
+
+
+
+
+
+ DeleteEntityRequest
+ DeleteEntityRequest is the request message for the DeleteEntity method.
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ id
+ Identifier
+
+ Identifier of the entity to delete.
+
+
+
+
+
+
+
+
+
+ DeleteEntityResponse
+ DeleteEntityResponse is the response message for the DeleteEntity method.
+
+
+
+
+
+ GetEntityRequest
+ GetEntityRequest is the request message for the GetEntity method.
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ id
+ Identifier
+
+ Identifier of the entity to get.
+
+
+
+
+
+
+
+
+
+ GetEntityResponse
+ GetEntityResponse is the response message for the GetEntity method.
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ entity
+ Entity
+
+ The entity that was retrieved.
+
+
+
+
+
+
+
+
+
+ UpsertEntityRequest
+ UpsertEntityRequest is the request message for the UpsertEntity method.
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ entity
+ Entity
+
+ The entity to create or update.
+
+
+
+
+
+
+
+
+
+ UpsertEntityResponse
+ UpsertEntityResponse is the response message for the UpsertEntity method.
+
+
+
+
+
+
+
+
+
+
+
+ EntitiesService
+ EntitiesService is a service for managing custom entities. Entities can represent
various data platform concepts such as services, consumers, applications or data pipelines
that are not natively available in Synq.
Entities are identified by a unique identifier and can be created, updated, read and deleted.
+
+
+
+
+
+
+
synq/entities/v1/entities.proto Top
+
+
+
+
+ Entity
+ Entity is the base type for all entities in the system. Its always attached to a given
client workspace and can be uniquely identified by its id.
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ workspace
+ string
+
+ Immutable workspace identifier that this entity belongs to.
+
+
+
+ id
+ Identifier
+
+ Unique identifier for this entity.
+
+
+
+ name
+ string
+
+ Name of the entity that is displayed to the user.
+
+
+
+ description
+ string
+
+ Description of the entity that is displayed in relevant contexts.
+
+
+
+ created_at
+ google.protobuf.Timestamp
+
+ Timestamp when the entity was created.
+
+
+
+ updated_at
+ google.protobuf.Timestamp
+
+ Timestamp when the entity was last updated.
+
+
+
+ deleted_at
+ google.protobuf.Timestamp
+
+ Timestamp when the entity was deleted. If this is set, the entity is considered deleted.
+
+
+
+ synq_path
+ string
+
+ Return only value. Synq Path to the entity. This is a unique path that can be used to access the entity in the Synq's UI.
+
+
+
+ synq_catalog_url
+ string
+
+ Return only value. Synq URL to the entity. This is a unique URL that can be used to access the entity in the Synq's UI.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
synq/entities/v1/identifiers.proto Top
+
+
+
+
+ AirflowDagIdentifier
+
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ integration_id
+ string
+
+ Synq integration_id that identifies the Airflow instance
+
+
+
+ dag_id
+ string
+
+ Airflow dag_id that identifies the DAG
+
+
+
+
+
+
+
+
+
+ AirflowTaskIdentifier
+
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ integration_id
+ string
+
+ Synq integration_id that identifies the Airflow instance
+
+
+
+ dag_id
+ string
+
+ Airflow dag_id that identifies the DAG
+
+
+
+ task_id
+ string
+
+ Airflow task_id that identifies the task within the DAG
+
+
+
+
+
+
+
+
+
+ BigqueryTableIdentifier
+
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ project
+ string
+
+ BigQuery project
+
+
+
+ dataset
+ string
+
+ BigQuery dataset id
+
+
+
+ table
+ string
+
+ BigQuery table name
+
+
+
+
+
+
+
+
+
+ ClickhouseTableIdentifier
+
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ host
+ string
+
+ Clickhouse host inclusive of port
+
+
+
+ schema
+ string
+
+ Clickhouse database
+
+
+
+ table
+ string
+
+ Clickhouse table
+
+
+
+
+
+
+
+
+
+ CustomIdentifier
+
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ id
+ string
+
+ Id that identifies the custom entity
+The Id should be unique within the custom entity Identifier.
+
+
+
+
+
+
+
+
+
+ DatabricksTableIdentifier
+
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ workspace
+ string
+
+
+
+
+
+ catalog
+ string
+
+ Databricks catalog
+
+
+
+ schema
+ string
+
+ Databricks schema
+
+
+
+ table
+ string
+
+ Databricks table or view
+
+
+
+
+
+
+
+
+
+ DataproductIdentifier
+
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ id
+ string
+
+ Dataproduct id that identifies the Dataproduct
+
+
+
+
+
+
+
+
+
+ DbtCloudNodeIdentifier
+
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ project_id
+ string
+
+ Your dbt Cloud project id
+
+
+
+ account_id
+ string
+
+ Your dbt Cloud account id
+
+
+
+ node_id
+ string
+
+ Dbt node_id that identifies one of dbt DAG nodes (model, test, etc)
+
+
+
+
+
+
+
+
+
+ DbtCoreNodeIdentifier
+
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ integration_id
+ string
+
+ Synq integration_id that identifies the dbt Core project
+
+
+
+ node_id
+ string
+
+ Dbt node_id that identifies one of dbt DAG nodes (model, test, etc)
+
+
+
+
+
+
+
+
+
+ Identifier
+ Identifier is a unique reference to an entity in Synq system. Entity identifiers
are designed to closely mimic identifiers used by data platforms and tools. To construct
an identifier, you need to know the kind of the entity and the ids that you would normally
use to identify it in the data platform or tool. For example, to identify a table in BigQuery,
you would need to know the project, dataset, and table names.
+
+
+
+
+
+
+
+
+ MysqlTableIdentifier
+
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ host
+ string
+
+ Mysql host inclusive of port
+
+
+
+ schema
+ string
+
+ Mysql database
+
+
+
+ table
+ string
+
+ Mysql table
+
+
+
+
+
+
+
+
+
+ PostgresTableIdentifier
+
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ host
+ string
+
+ Postgres host inclusive of port
+
+
+
+ database
+ string
+
+ Postgres database
+
+
+
+ schema
+ string
+
+ Postgres schema
+
+
+
+ table
+ string
+
+ Postgres table
+
+
+
+
+
+
+
+
+
+ RedshiftTableIdentifier
+
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ cluster
+ string
+
+ Redshift cluster
+
+
+
+ database
+ string
+
+ Redshift database
+
+
+
+ schema
+ string
+
+ Redshift schema
+
+
+
+ table
+ string
+
+ Redshift table
+
+
+
+
+
+
+
+
+
+ SnowflakeTableIdentifier
+
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ account
+ string
+
+ Snowflake account
+
+
+
+ database
+ string
+
+ Snowflake database
+
+
+
+ schema
+ string
+
+ Snowflake schema
+
+
+
+ table
+ string
+
+ Snowflake table
+
+
+
+
+
+
+
+
+
+ SynqPathIdentifier
+
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ path
+ string
+
+ Synq path that identifies the Synq entity, needs to be one of supported paths
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Scalar Value Types
+
+
+ .proto Type Notes C++ Java Python Go C# PHP Ruby
+
+
+
+
+ double
+
+ double
+ double
+ float
+ float64
+ double
+ float
+ Float
+
+
+
+ float
+
+ float
+ float
+ float
+ float32
+ float
+ float
+ Float
+
+
+
+ int32
+ Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead.
+ int32
+ int
+ int
+ int32
+ int
+ integer
+ Bignum or Fixnum (as required)
+
+
+
+ int64
+ Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead.
+ int64
+ long
+ int/long
+ int64
+ long
+ integer/string
+ Bignum
+
+
+
+ uint32
+ Uses variable-length encoding.
+ uint32
+ int
+ int/long
+ uint32
+ uint
+ integer
+ Bignum or Fixnum (as required)
+
+
+
+ uint64
+ Uses variable-length encoding.
+ uint64
+ long
+ int/long
+ uint64
+ ulong
+ integer/string
+ Bignum or Fixnum (as required)
+
+
+
+ sint32
+ Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s.
+ int32
+ int
+ int
+ int32
+ int
+ integer
+ Bignum or Fixnum (as required)
+
+
+
+ sint64
+ Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s.
+ int64
+ long
+ int/long
+ int64
+ long
+ integer/string
+ Bignum
+
+
+
+ fixed32
+ Always four bytes. More efficient than uint32 if values are often greater than 2^28.
+ uint32
+ int
+ int
+ uint32
+ uint
+ integer
+ Bignum or Fixnum (as required)
+
+
+
+ fixed64
+ Always eight bytes. More efficient than uint64 if values are often greater than 2^56.
+ uint64
+ long
+ int/long
+ uint64
+ ulong
+ integer/string
+ Bignum
+
+
+
+ sfixed32
+ Always four bytes.
+ int32
+ int
+ int
+ int32
+ int
+ integer
+ Bignum or Fixnum (as required)
+
+
+
+ sfixed64
+ Always eight bytes.
+ int64
+ long
+ int/long
+ int64
+ long
+ integer/string
+ Bignum
+
+
+
+ bool
+
+ bool
+ boolean
+ boolean
+ bool
+ bool
+ boolean
+ TrueClass/FalseClass
+
+
+
+ string
+ A string must always contain UTF-8 encoded or 7-bit ASCII text.
+ string
+ String
+ str/unicode
+ string
+ string
+ string
+ String (UTF-8)
+
+
+
+ bytes
+ May contain any arbitrary sequence of bytes.
+ string
+ ByteString
+ str
+ []byte
+ ByteString
+ string
+ String (ASCII-8BIT)
+
+
+
+
+
+
+
diff --git a/docs/synq/example.md b/docs/synq/example.md
deleted file mode 100644
index 628cc61..0000000
--- a/docs/synq/example.md
+++ /dev/null
@@ -1,535 +0,0 @@
-# Protocol Documentation
-
-
-## Table of Contents
-
-- [synq/example/v2/example_service.proto](#synq_example_v2_example_service-proto)
- - [AddExampleRequest](#synq-example-v2-AddExampleRequest)
- - [AddExampleResponse](#synq-example-v2-AddExampleResponse)
- - [ExampleResponse](#synq-example-v2-ExampleResponse)
- - [GetExampleRequest](#synq-example-v2-GetExampleRequest)
- - [GetExampleResponse](#synq-example-v2-GetExampleResponse)
- - [ListExamplesRequest](#synq-example-v2-ListExamplesRequest)
- - [ListExamplesResponse](#synq-example-v2-ListExamplesResponse)
- - [RemoveExampleRequest](#synq-example-v2-RemoveExampleRequest)
- - [RemoveExampleResponse](#synq-example-v2-RemoveExampleResponse)
- - [UpdateExampleRequest](#synq-example-v2-UpdateExampleRequest)
- - [UpdateExampleResponse](#synq-example-v2-UpdateExampleResponse)
-
- - [ExampleService](#synq-example-v2-ExampleService)
-
-- [synq/example/v2/example.proto](#synq_example_v2_example-proto)
- - [Example](#synq-example-v2-Example)
-
-- [synq/example/v1/example_service.proto](#synq_example_v1_example_service-proto)
- - [AddExampleRequest](#synq-example-v1-AddExampleRequest)
- - [AddExampleResponse](#synq-example-v1-AddExampleResponse)
- - [ExampleResponse](#synq-example-v1-ExampleResponse)
- - [GetExampleRequest](#synq-example-v1-GetExampleRequest)
- - [GetExampleResponse](#synq-example-v1-GetExampleResponse)
- - [ListExamplesRequest](#synq-example-v1-ListExamplesRequest)
- - [ListExamplesResponse](#synq-example-v1-ListExamplesResponse)
- - [RemoveExampleRequest](#synq-example-v1-RemoveExampleRequest)
- - [RemoveExampleResponse](#synq-example-v1-RemoveExampleResponse)
- - [UpdateExampleRequest](#synq-example-v1-UpdateExampleRequest)
- - [UpdateExampleResponse](#synq-example-v1-UpdateExampleResponse)
-
- - [ExampleService](#synq-example-v1-ExampleService)
-
-- [synq/example/v1/example.proto](#synq_example_v1_example-proto)
- - [Example](#synq-example-v1-Example)
-
-- [Scalar Value Types](#scalar-value-types)
-
-
-
-
-Top
-
-## synq/example/v2/example_service.proto
-
-
-
-
-
-### AddExampleRequest
-AddExampleRequest contains the parameters required to create an example.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| text | [string](#string) | | The example itself. |
-| description | [string](#string) | optional | Optional description of the example. |
-| is_visible | [bool](#bool) | | Whether the example is visible to users. |
-
-
-
-
-
-
-
-
-### AddExampleResponse
-Response contains the created example.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| example | [Example](#synq-example-v2-Example) | | |
-
-
-
-
-
-
-
-
-### ExampleResponse
-
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| example | [Example](#synq-example-v2-Example) | | |
-
-
-
-
-
-
-
-
-### GetExampleRequest
-GetExampleRequest gets an example by its ID.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| id | [string](#string) | | |
-
-
-
-
-
-
-
-
-### GetExampleResponse
-
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| example | [Example](#synq-example-v2-Example) | | |
-
-
-
-
-
-
-
-
-### ListExamplesRequest
-ListExamplesRequest streams examples from the server.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| ids | [string](#string) | repeated | |
-
-
-
-
-
-
-
-
-### ListExamplesResponse
-
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| example | [Example](#synq-example-v2-Example) | | |
-
-
-
-
-
-
-
-
-### RemoveExampleRequest
-RemoveExampleRequest removes an example by its ID.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| id | [string](#string) | | |
-
-
-
-
-
-
-
-
-### RemoveExampleResponse
-
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| success | [bool](#bool) | | |
-
-
-
-
-
-
-
-
-### UpdateExampleRequest
-UpdateExampleRequest contains updateable fields inside an example.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| text | [string](#string) | optional | Optional update of the example text. |
-| description | [string](#string) | optional | Optional update of the example description. |
-| is_visible | [bool](#bool) | optional | Optional update of example visibility. |
-
-
-
-
-
-
-
-
-### UpdateExampleResponse
-Response with updated example.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| example | [Example](#synq-example-v2-Example) | | |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-### ExampleService
-ExamplesService is a sample service to display how documentation in protos will work.
-The service implements a basic CRUD API and contains server streaming example.
-
-| Method Name | Request Type | Response Type | Description |
-| ----------- | ------------ | ------------- | ------------|
-| AddExample | [AddExampleRequest](#synq-example-v2-AddExampleRequest) | [AddExampleResponse](#synq-example-v2-AddExampleResponse) | AddExample adds the given example to the system. |
-| UpdateExample | [UpdateExampleRequest](#synq-example-v2-UpdateExampleRequest) | [UpdateExampleResponse](#synq-example-v2-UpdateExampleResponse) | UpdateExample updates the given example. Throws an error if the example was not found. |
-| GetExample | [GetExampleRequest](#synq-example-v2-GetExampleRequest) | [GetExampleResponse](#synq-example-v2-GetExampleResponse) | GetExample returns the requested example. |
-| ListExamples | [ListExamplesRequest](#synq-example-v2-ListExamplesRequest) | [ListExamplesResponse](#synq-example-v2-ListExamplesResponse) stream | ListExamples streams the requested examples. |
-| RemoveExample | [RemoveExampleRequest](#synq-example-v2-RemoveExampleRequest) | [RemoveExampleResponse](#synq-example-v2-RemoveExampleResponse) | RemoveExample removes the provided example from the system. Fails silently if the example was not found. |
-
-
-
-
-
-
-Top
-
-## synq/example/v2/example.proto
-
-
-
-
-
-### Example
-Example is the core model of this package.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| id | [string](#string) | | `id` is generated by the system when a new example is created. It is required to refer to an example in any future operations (like update or remove). |
-| text | [string](#string) | | The example itself. |
-| description | [string](#string) | optional | Optional description of the example. |
-| is_visible | [bool](#bool) | | Whether the example is visible to users. |
-| created_at | [google.protobuf.Timestamp](#google-protobuf-Timestamp) | | Example creation time. |
-| updated_at | [google.protobuf.Timestamp](#google-protobuf-Timestamp) | | Example last update time. |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Top
-
-## synq/example/v1/example_service.proto
-
-
-
-
-
-### AddExampleRequest
-AddExampleRequest contains the parameters required to create an example.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| text | [string](#string) | | The example itself. |
-| description | [string](#string) | optional | Optional description of the example. |
-
-
-
-
-
-
-
-
-### AddExampleResponse
-Response contains the created example.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| example | [Example](#synq-example-v1-Example) | | |
-
-
-
-
-
-
-
-
-### ExampleResponse
-
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| example | [Example](#synq-example-v1-Example) | | |
-
-
-
-
-
-
-
-
-### GetExampleRequest
-GetExampleRequest gets an example by its ID.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| id | [string](#string) | | |
-
-
-
-
-
-
-
-
-### GetExampleResponse
-
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| example | [Example](#synq-example-v1-Example) | | |
-
-
-
-
-
-
-
-
-### ListExamplesRequest
-ListExamplesRequest streams examples from the server.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| ids | [string](#string) | repeated | |
-
-
-
-
-
-
-
-
-### ListExamplesResponse
-
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| example | [Example](#synq-example-v1-Example) | | |
-
-
-
-
-
-
-
-
-### RemoveExampleRequest
-RemoveExampleRequest removes an example by its ID.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| id | [string](#string) | | |
-
-
-
-
-
-
-
-
-### RemoveExampleResponse
-
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| success | [bool](#bool) | | |
-
-
-
-
-
-
-
-
-### UpdateExampleRequest
-UpdateExampleRequest contains updateable fields inside an example.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| id | [string](#string) | | Id of the example to update |
-| text | [string](#string) | optional | Optional update of the example text. |
-| description | [string](#string) | optional | Optional update of the example description. |
-
-
-
-
-
-
-
-
-### UpdateExampleResponse
-Response with updated example.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| example | [Example](#synq-example-v1-Example) | | |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-### ExampleService
-ExamplesService is a sample service to display how documentation in protos will work.
-The service implements a basic CRUD API and contains server streaming example.
-
-| Method Name | Request Type | Response Type | Description |
-| ----------- | ------------ | ------------- | ------------|
-| AddExample | [AddExampleRequest](#synq-example-v1-AddExampleRequest) | [AddExampleResponse](#synq-example-v1-AddExampleResponse) | AddExample adds the given example to the system. |
-| UpdateExample | [UpdateExampleRequest](#synq-example-v1-UpdateExampleRequest) | [UpdateExampleResponse](#synq-example-v1-UpdateExampleResponse) | UpdateExample updates the given example. Throws an error if the example was not found. |
-| GetExample | [GetExampleRequest](#synq-example-v1-GetExampleRequest) | [GetExampleResponse](#synq-example-v1-GetExampleResponse) | GetExample returns the requested example. |
-| ListExamples | [ListExamplesRequest](#synq-example-v1-ListExamplesRequest) | [ListExamplesResponse](#synq-example-v1-ListExamplesResponse) stream | ListExamples streams the requested examples. |
-| RemoveExample | [RemoveExampleRequest](#synq-example-v1-RemoveExampleRequest) | [RemoveExampleResponse](#synq-example-v1-RemoveExampleResponse) | RemoveExample removes the provided example from the system. Fails silently if the example was not found. |
-
-
-
-
-
-
-Top
-
-## synq/example/v1/example.proto
-
-
-
-
-
-### Example
-Example is the core model of this package.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| id | [string](#string) | | `id` is generated by the system when a new example is created. It is required to refer to an example in any future operations (like update or remove). |
-| text | [string](#string) | | The example itself. |
-| description | [string](#string) | optional | Optional description of the example. |
-| created_at | [google.protobuf.Timestamp](#google-protobuf-Timestamp) | | Example creation time. |
-| updated_at | [google.protobuf.Timestamp](#google-protobuf-Timestamp) | | Example last update time. |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-## Scalar Value Types
-
-| .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby |
-| ----------- | ----- | --- | ---- | ------ | -- | -- | --- | ---- |
-| double | | double | double | float | float64 | double | float | Float |
-| float | | float | float | float | float32 | float | float | Float |
-| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) |
-| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | int64 | long | integer/string | Bignum |
-| uint32 | Uses variable-length encoding. | uint32 | int | int/long | uint32 | uint | integer | Bignum or Fixnum (as required) |
-| uint64 | Uses variable-length encoding. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum or Fixnum (as required) |
-| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) |
-| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | int64 | long | integer/string | Bignum |
-| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | uint32 | uint | integer | Bignum or Fixnum (as required) |
-| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum |
-| sfixed32 | Always four bytes. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) |
-| sfixed64 | Always eight bytes. | int64 | long | int/long | int64 | long | integer/string | Bignum |
-| bool | | bool | boolean | boolean | bool | bool | boolean | TrueClass/FalseClass |
-| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | string | string | string | String (UTF-8) |
-| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | []byte | ByteString | string | String (ASCII-8BIT) |
-
diff --git a/docs/synq/lineage.mdx b/docs/synq/lineage.mdx
new file mode 100644
index 0000000..3aa7244
--- /dev/null
+++ b/docs/synq/lineage.mdx
@@ -0,0 +1,1193 @@
+
+
+
+
+ Protocol Documentation
+
+
+
+
+
+
+
+
+
+
+ Protocol Documentation
+
+ Table of Contents
+
+
+
+
+
+
+
synq/lineage/v1/relationships.proto Top
+
+
+
+
+ Relationship
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
synq/lineage/v1/lineage.proto Top
+
+
+
+
+ CllDetails
+
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ columns
+ Column
+ repeated
+ Column details for CLL.
+
+
+
+ cll_state
+ CllState
+
+ State of the CLL parse. UNSPECIFIED if CLL was not requested.
+
+
+
+ cll_messages
+ string
+ repeated
+ Messages related to CLL.
+e.g. Description of parse errors, etc.
+
+
+
+
+
+
+
+
+
+ Column
+ Column in a table-like asset (used in CLL mode).
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ column_id
+ string
+
+ ID string for the column. This is the parsed column name.
+
+
+
+ name
+ string
+ optional
+ Original column name as fetched from the table.
+
+
+
+ native_type
+ string
+ optional
+ Column type as fetched from the table.
+
+
+
+
+
+
+
+
+
+ ColumnDependency
+ Indicates data flow between columns.
Source columns are used to compute value of target columns.
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ source_node_idx
+ uint32
+
+ Index of source node in the lineage nodes list.
+
+
+
+ source_node_column_id
+ string
+
+
+
+
+
+ target_node_idx
+ uint32
+
+ Index of target node in the lineage nodes list.
+
+
+
+ target_node_column_id
+ string
+
+
+
+
+
+
+
+
+
+
+
+ Lineage
+ Lineage defines the lineage of table-like entities.
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ nodes
+ LineageNode
+ repeated
+ Nodes in the lineage with their identities and columns.
+
+
+
+ node_dependencies
+ NodeDependency
+ repeated
+ All edges in the lineage between nodes.
+This can be parsed to create a graph of all the nodes.
+
+
+
+ is_cll
+ bool
+
+ Indicates whether the lineage was filtered for column level lineage (CLL).
+
+
+
+ column_dependencies
+ ColumnDependency
+ repeated
+ Dependencies between columns. Populated only for CLL.
+
+
+
+
+
+
+
+
+
+ LineageNode
+ Node in a lineage graph representing one or more entities (e.g. database table).
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ ids
+ synq.entities.v1.Identifier
+ repeated
+ All entities which have the same identity as this node. Must be at least one item.
+These are sorted by closeness to the type of the start point entities.
+e.g. if requesting lineage of a DBT source, first entity should be from DBT, similarly when viewing table it will be other tables.
+
+
+
+ position
+ NodePosition
+
+ Position of the node in the lineage.
+
+
+
+ cll_details
+ CllDetails
+ optional
+ Populated only for Column Level Lineage (CLL).
+
+
+
+
+
+
+
+
+
+ NodeDependency
+ Indicates data flow between nodes.
Source nodes are used to compute value of target nodes.
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ source_node_idx
+ uint32
+
+ Index of source node in the lineage nodes list.
+
+
+
+ target_node_idx
+ uint32
+
+ Index of target node in the lineage nodes list.
+
+
+
+
+
+
+
+
+
+
+
+ CllState
+
+
+
+ Name Number Description
+
+
+
+
+ CLL_STATE_UNSPECIFIED
+ 0
+ Unspecified state.
+
+
+
+ CLL_STATE_PARSE_FAILED
+ 1
+ Parsing of the asset SQL failed. No upstream dependencies can be found.
+
+
+
+ CLL_STATE_EXTRACTION_FAILED
+ 2
+ Extraction of the asset SQL failed. Some unsupported SQL features may be used. Some details might be missing.
+
+
+
+ CLL_STATE_RESOLUTION_FAILED
+ 3
+ Not all columns or tables were found upstream, lineage is not complete.
+
+
+
+ CLL_STATE_OK
+ 10
+ No known issues present.
+
+
+
+
+
+ NodePosition
+
+
+
+ Name Number Description
+
+
+
+
+ NODE_POSITION_UNSPECIFIED
+ 0
+
+
+
+
+ NODE_POSITION_START_NODE
+ 1
+ Node is one of the requested start point.
+
+
+
+ NODE_POSITION_UPSTREAM
+ 2
+ Node is upstream of the requested start point.
+
+
+
+ NODE_POSITION_DOWNSTREAM
+ 3
+ Node is downstream of the requested start point.
+
+
+
+
+
+
+
+
+
+
+
+
+
synq/lineage/v1/relationships_service.proto Top
+
+
+
+
+ DeleteRelationshipsRequest
+
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ relationships
+ Relationship
+ repeated
+
+
+
+
+
+
+
+
+
+
+ DeleteRelationshipsResponse
+
+
+
+
+
+
+ UpsertRelationshipsRequest
+
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ relationships
+ Relationship
+ repeated
+
+
+
+
+
+
+
+
+
+
+ UpsertRelationshipsResponse
+
+
+
+
+
+
+
+
+
+
+
+
+ RelationshipsService
+ RelationshipsService allow management of relationships between entities. Relationships can
be created, updated, and deleted between 2 custom entities, or between a custom entity and Synq native entity.enum
There is no option to create relationships between 2 Synq native entities (dbt model, BI dashboard, etc.).
+
+
+
+
+
+
+
synq/lineage/v1/lineage_service.proto Top
+
+
+
+
+ EntitiesStartPoint
+
+
+
+
+
+
+
+
+
+ EntityColumnsStartPoint
+
+
+
+
+
+
+
+
+
+ GetLineageRequest
+
+
+
+
+
+
+
+
+
+ GetLineageResponse
+
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ lineage
+ Lineage
+
+
+
+
+
+
+
+
+
+
+
+ GetLineageStartPoint
+ Possible starting points to get lineage from.
+
+
+
+
+
+
+
+
+
+
+ LineageDirection
+ Direction of the lineage to query.
+
+
+ Name Number Description
+
+
+
+
+ LINEAGE_DIRECTION_UNSPECIFIED
+ 0
+
+
+
+
+ LINEAGE_DIRECTION_UPSTREAM
+ 1
+
+
+
+
+ LINEAGE_DIRECTION_DOWNSTREAM
+ 2
+
+
+
+
+ LINEAGE_DIRECTION_UPSTREAM_DOWNSTREAM
+ 3
+
+
+
+
+
+
+
+
+
+
+ LineageService
+ LineageService allows you to fetch:
* Entity level lineage from a starting point of one or more entities.
* Column Level lineage from a starting point of multiple columns of a single entity.
+
+
+
+
+
+ Scalar Value Types
+
+
+ .proto Type Notes C++ Java Python Go C# PHP Ruby
+
+
+
+
+ double
+
+ double
+ double
+ float
+ float64
+ double
+ float
+ Float
+
+
+
+ float
+
+ float
+ float
+ float
+ float32
+ float
+ float
+ Float
+
+
+
+ int32
+ Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead.
+ int32
+ int
+ int
+ int32
+ int
+ integer
+ Bignum or Fixnum (as required)
+
+
+
+ int64
+ Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead.
+ int64
+ long
+ int/long
+ int64
+ long
+ integer/string
+ Bignum
+
+
+
+ uint32
+ Uses variable-length encoding.
+ uint32
+ int
+ int/long
+ uint32
+ uint
+ integer
+ Bignum or Fixnum (as required)
+
+
+
+ uint64
+ Uses variable-length encoding.
+ uint64
+ long
+ int/long
+ uint64
+ ulong
+ integer/string
+ Bignum or Fixnum (as required)
+
+
+
+ sint32
+ Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s.
+ int32
+ int
+ int
+ int32
+ int
+ integer
+ Bignum or Fixnum (as required)
+
+
+
+ sint64
+ Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s.
+ int64
+ long
+ int/long
+ int64
+ long
+ integer/string
+ Bignum
+
+
+
+ fixed32
+ Always four bytes. More efficient than uint32 if values are often greater than 2^28.
+ uint32
+ int
+ int
+ uint32
+ uint
+ integer
+ Bignum or Fixnum (as required)
+
+
+
+ fixed64
+ Always eight bytes. More efficient than uint64 if values are often greater than 2^56.
+ uint64
+ long
+ int/long
+ uint64
+ ulong
+ integer/string
+ Bignum
+
+
+
+ sfixed32
+ Always four bytes.
+ int32
+ int
+ int
+ int32
+ int
+ integer
+ Bignum or Fixnum (as required)
+
+
+
+ sfixed64
+ Always eight bytes.
+ int64
+ long
+ int/long
+ int64
+ long
+ integer/string
+ Bignum
+
+
+
+ bool
+
+ bool
+ boolean
+ boolean
+ bool
+ bool
+ boolean
+ TrueClass/FalseClass
+
+
+
+ string
+ A string must always contain UTF-8 encoded or 7-bit ASCII text.
+ string
+ String
+ str/unicode
+ string
+ string
+ string
+ String (UTF-8)
+
+
+
+ bytes
+ May contain any arbitrary sequence of bytes.
+ string
+ ByteString
+ str
+ []byte
+ ByteString
+ string
+ String (ASCII-8BIT)
+
+
+
+
+
+
+
diff --git a/docs/synq/schemas.md b/docs/synq/schemas.md
deleted file mode 100644
index 84aafb9..0000000
--- a/docs/synq/schemas.md
+++ /dev/null
@@ -1,322 +0,0 @@
-# Protocol Documentation
-
-
-## Table of Contents
-
-- [synq/schemas/v1/lineage.proto](#synq_schemas_v1_lineage-proto)
- - [CllDetails](#synq-schemas-v1-CllDetails)
- - [Column](#synq-schemas-v1-Column)
- - [ColumnDependency](#synq-schemas-v1-ColumnDependency)
- - [Lineage](#synq-schemas-v1-Lineage)
- - [LineageNode](#synq-schemas-v1-LineageNode)
- - [NodeDependency](#synq-schemas-v1-NodeDependency)
-
- - [CllState](#synq-schemas-v1-CllState)
- - [NodePosition](#synq-schemas-v1-NodePosition)
-
-- [synq/schemas/v1/lineage_service.proto](#synq_schemas_v1_lineage_service-proto)
- - [EntitiesStartPoint](#synq-schemas-v1-EntitiesStartPoint)
- - [EntityColumnsStartPoint](#synq-schemas-v1-EntityColumnsStartPoint)
- - [GetLineageRequest](#synq-schemas-v1-GetLineageRequest)
- - [GetLineageResponse](#synq-schemas-v1-GetLineageResponse)
- - [GetLineageStartPoint](#synq-schemas-v1-GetLineageStartPoint)
-
- - [LineageDirection](#synq-schemas-v1-LineageDirection)
-
- - [LineageService](#synq-schemas-v1-LineageService)
-
-- [Scalar Value Types](#scalar-value-types)
-
-
-
-
-Top
-
-## synq/schemas/v1/lineage.proto
-
-
-
-
-
-### CllDetails
-
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| columns | [Column](#synq-schemas-v1-Column) | repeated | Column details for CLL. |
-| cll_state | [CllState](#synq-schemas-v1-CllState) | | State of the CLL parse. UNSPECIFIED if CLL was not requested. |
-| cll_messages | [string](#string) | repeated | Messages related to CLL. e.g. Description of parse errors, etc. |
-
-
-
-
-
-
-
-
-### Column
-Column in a table-like asset (used in CLL mode).
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| column_id | [string](#string) | | ID string for the column. This is the parsed column name. |
-| name | [string](#string) | optional | Original column name as fetched from the table. |
-| native_type | [string](#string) | optional | Column type as fetched from the table. |
-
-
-
-
-
-
-
-
-### ColumnDependency
-Indicates data flow between columns.
-Source columns are used to compute value of target columns.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| source_node_idx | [uint32](#uint32) | | Index of source node in the lineage nodes list. |
-| source_node_column_id | [string](#string) | | |
-| target_node_idx | [uint32](#uint32) | | Index of target node in the lineage nodes list. |
-| target_node_column_id | [string](#string) | | |
-
-
-
-
-
-
-
-
-### Lineage
-Lineage defines the lineage of table-like entities.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| nodes | [LineageNode](#synq-schemas-v1-LineageNode) | repeated | Nodes in the lineage with their identities and columns. |
-| node_dependencies | [NodeDependency](#synq-schemas-v1-NodeDependency) | repeated | All edges in the lineage between nodes. This can be parsed to create a graph of all the nodes. |
-| is_cll | [bool](#bool) | | Indicates whether the lineage was filtered for column level lineage (CLL). |
-| column_dependencies | [ColumnDependency](#synq-schemas-v1-ColumnDependency) | repeated | Dependencies between columns. Populated only for CLL. |
-
-
-
-
-
-
-
-
-### LineageNode
-Node in a lineage graph representing one or more entiities (e.g. database table).
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| entities | [synq.core.v1.EntityRef](#synq-core-v1-EntityRef) | repeated | All entities which have the same identity as this node. Must be at least one item. These are sorted by closeness to the type of the start point entities. e.g. if requesting lineage of a DBT source, first entity should be from DBT, similarly when viewing table it will be other tables. |
-| position | [NodePosition](#synq-schemas-v1-NodePosition) | | Position of the node in the lineage. |
-| cll_details | [CllDetails](#synq-schemas-v1-CllDetails) | optional | Populated only for Column Level Lineage (CLL). |
-
-
-
-
-
-
-
-
-### NodeDependency
-Indicates data flow between nodes.
-Source nodes are used to compute value of target nodes.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| source_node_idx | [uint32](#uint32) | | Index of source node in the lineage nodes list. |
-| target_node_idx | [uint32](#uint32) | | Index of target node in the lineage nodes list. |
-
-
-
-
-
-
-
-
-
-
-### CllState
-
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| CLL_STATE_UNSPECIFIED | 0 | Unspecified state. |
-| CLL_STATE_PARSE_FAILED | 1 | Parsing of the asset SQL failed. No upstream dependencies can be found. |
-| CLL_STATE_EXTRACTION_FAILED | 2 | Extraction of the asset SQL failed. Some unsupported SQL features may be used. Some details might be missing. |
-| CLL_STATE_RESOLUTION_FAILED | 3 | Not all columns or tables were found upstream, lineage is not complete. |
-| CLL_STATE_OK | 10 | No known issues present. |
-
-
-
-
-
-### NodePosition
-
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| NODE_POSITION_UNSPECIFIED | 0 | |
-| NODE_POSITION_START_NODE | 1 | Node is one of the requested start point. |
-| NODE_POSITION_UPSTREAM | 2 | Node is upstream of the requested start point. |
-| NODE_POSITION_DOWNSTREAM | 3 | Node is downstream of the requested start point. |
-
-
-
-
-
-
-
-
-
-
-
-Top
-
-## synq/schemas/v1/lineage_service.proto
-
-
-
-
-
-### EntitiesStartPoint
-
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| entities | [synq.core.v1.EntityRef](#synq-core-v1-EntityRef) | repeated | |
-
-
-
-
-
-
-
-
-### EntityColumnsStartPoint
-
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| entitiy | [synq.core.v1.EntityRef](#synq-core-v1-EntityRef) | | |
-| column_ids | [string](#string) | repeated | |
-
-
-
-
-
-
-
-
-### GetLineageRequest
-
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| lineage_direction | [LineageDirection](#synq-schemas-v1-LineageDirection) | | |
-| start_point | [GetLineageStartPoint](#synq-schemas-v1-GetLineageStartPoint) | | |
-| max_depth | [int32](#int32) | optional | |
-
-
-
-
-
-
-
-
-### GetLineageResponse
-
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| lineage | [Lineage](#synq-schemas-v1-Lineage) | | |
-
-
-
-
-
-
-
-
-### GetLineageStartPoint
-Possible starting points to get lineage from.
-
-
-| Field | Type | Label | Description |
-| ----- | ---- | ----- | ----------- |
-| entities | [EntitiesStartPoint](#synq-schemas-v1-EntitiesStartPoint) | | |
-| entity_columns | [EntityColumnsStartPoint](#synq-schemas-v1-EntityColumnsStartPoint) | | |
-
-
-
-
-
-
-
-
-
-
-### LineageDirection
-Direction of the lineage to query.
-
-| Name | Number | Description |
-| ---- | ------ | ----------- |
-| LINEAGE_DIRECTION_UNSPECIFIED | 0 | |
-| LINEAGE_DIRECTION_UPSTREAM | 1 | |
-| LINEAGE_DIRECTION_DOWNSTREAM | 2 | |
-| LINEAGE_DIRECTION_UPSTREAM_DOWNSTREAM | 3 | |
-
-
-
-
-
-
-
-
-
-### LineageService
-LineageService allows you to fetch:
-* Entity level lineage from a starting point of one or more entities.
-* Column Level lineage from a starting point of multiple columns of a single entity.
-
-| Method Name | Request Type | Response Type | Description |
-| ----------- | ------------ | ------------- | ------------|
-| GetLineage | [GetLineageRequest](#synq-schemas-v1-GetLineageRequest) | [GetLineageResponse](#synq-schemas-v1-GetLineageResponse) | |
-
-
-
-
-
-## Scalar Value Types
-
-| .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby |
-| ----------- | ----- | --- | ---- | ------ | -- | -- | --- | ---- |
-| double | | double | double | float | float64 | double | float | Float |
-| float | | float | float | float | float32 | float | float | Float |
-| int32 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) |
-| int64 | Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. | int64 | long | int/long | int64 | long | integer/string | Bignum |
-| uint32 | Uses variable-length encoding. | uint32 | int | int/long | uint32 | uint | integer | Bignum or Fixnum (as required) |
-| uint64 | Uses variable-length encoding. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum or Fixnum (as required) |
-| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) |
-| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | int64 | long | integer/string | Bignum |
-| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | uint32 | uint | integer | Bignum or Fixnum (as required) |
-| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum |
-| sfixed32 | Always four bytes. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) |
-| sfixed64 | Always eight bytes. | int64 | long | int/long | int64 | long | integer/string | Bignum |
-| bool | | bool | boolean | boolean | bool | bool | boolean | TrueClass/FalseClass |
-| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | string | string | string | String (UTF-8) |
-| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | []byte | ByteString | string | String (ASCII-8BIT) |
-
diff --git a/docs/synq/status.mdx b/docs/synq/status.mdx
new file mode 100644
index 0000000..214164f
--- /dev/null
+++ b/docs/synq/status.mdx
@@ -0,0 +1,984 @@
+
+
+
+
+ Protocol Documentation
+
+
+
+
+
+
+
+
+
+
+ Protocol Documentation
+
+ Table of Contents
+
+
+
+
+
+
+
synq/status/v1/entity_incidents_service.proto Top
+
+
+
+
+ BatchGetIncidentsRequest
+ BatchGetIncidentsRequest is the request message for the BatchGetIssues method.
+
+
+
+
+
+
+
+
+ BatchGetIncidentsResponse
+ BatchGetIncidentsResponse is the response message for the BatchGetIssues method.
+
+
+
+
+
+
+
+
+ GetIncidentsRequest
+ GetIncidentsRequest is the request message for the GetEntity method.
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ id
+ synq.entities.v1.Identifier
+
+ Identifier of the entity to get incidents for.
+
+
+
+ fetch_upstream_incidents
+ bool
+
+ Retrieve incidents of upstream entities.
+
+
+
+
+
+
+
+
+
+ GetIncidentsResponse
+ GetIncidentsResponse is the response message for the GetEntity method.
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ id
+ synq.entities.v1.Identifier
+
+ Identifier of the entity.
+
+
+
+ entity_open_incidents
+ EntityIncident
+ repeated
+ Open incident associated with the entity requested.
+
+
+
+ upstream_open_incidents
+ EntityIncident
+ repeated
+ Open incidents associated with the upstream entities if requested.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ EntityIncidentsService
+ EntityIncidentsService is the service which retrieves entity status.
+
+
+
+
+
+
+
synq/status/v1/entity_issues_service.proto Top
+
+
+
+
+ BatchGetIssuesStatusRequest
+ BatchGetIssuesStatusRequest is the request message for the BatchGetIssues method.
+
+
+
+
+
+
+
+
+ BatchGetIssuesStatusResponse
+ BatchGetIssuesStatusResponse is the response message for the BatchGetIssues method.
+
+
+
+
+
+
+
+
+ GetIssuesStatusRequest
+ GetIssuesStatusRequest is the request message for the GetEntity method.
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ id
+ synq.entities.v1.Identifier
+
+ Identifier of the entity to get status for.
+
+
+
+ fetch_upstream_status
+ bool
+
+ Retrieve status of upstream entities.
+
+
+
+
+
+
+
+
+
+ GetIssuesStatusResponse
+ GetIssuesStatusResponse is the response message for the GetEntity method.
+
+
+
+
+
+
+
+
+ GetIssuesStatusResponse.IssuesSummary
+
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ total_count
+ int32
+
+ Number of issues for the entity.
+
+
+
+ warn_count
+ int32
+
+ Number of issues for the entity with status 'warn'.
+
+
+
+ error_count
+ int32
+
+ Number of issues for the entity with status 'error'.
+
+
+
+ critical_count
+ int32
+
+ Number of issues for the entity with status 'critical'.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ EntityIssuesService
+ EntityIssuesService is the service which retrieves entity issues status.
+
+
+
+
+
+
+
synq/status/v1/entity_incidents.proto Top
+
+
+
+
+ EntityIncident
+
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ id
+ string
+
+ Unique identifier of the incident.
+
+
+
+ url
+ string
+
+ URL of the incident.
+
+
+
+ name
+ string
+
+ Name of the incident give by the user.
+
+
+
+ created_by
+ string
+
+ Information about author of the incident.
+
+
+
+ created_at
+ google.protobuf.Timestamp
+
+ Time when the incident was created.
+
+
+
+ updated_by
+ string
+
+ Information about the user who last updated the incident.
+
+
+
+ updated_at
+ google.protobuf.Timestamp
+
+ Time when the incident was last updated.
+
+
+
+ is_resolved
+ bool
+
+ Indicates if all issues inside the incident are resolved.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
synq/status/v1/entity_issues.proto Top
+
+
+
+
+
+
+ IssueStatus
+
+
+
+ Name Number Description
+
+
+
+
+ ISSUE_STATUS_UNSPECIFIED
+ 0
+
+
+
+
+ ISSUE_STATUS_OK
+ 10
+
+
+
+
+ ISSUE_STATUS_WARN
+ 20
+
+
+
+
+ ISSUE_STATUS_ERROR
+ 30
+
+
+
+
+ ISSUE_STATUS_CRITICAL
+ 40
+
+
+
+
+
+
+
+
+
+
+
+
+ Scalar Value Types
+
+
+ .proto Type Notes C++ Java Python Go C# PHP Ruby
+
+
+
+
+ double
+
+ double
+ double
+ float
+ float64
+ double
+ float
+ Float
+
+
+
+ float
+
+ float
+ float
+ float
+ float32
+ float
+ float
+ Float
+
+
+
+ int32
+ Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead.
+ int32
+ int
+ int
+ int32
+ int
+ integer
+ Bignum or Fixnum (as required)
+
+
+
+ int64
+ Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead.
+ int64
+ long
+ int/long
+ int64
+ long
+ integer/string
+ Bignum
+
+
+
+ uint32
+ Uses variable-length encoding.
+ uint32
+ int
+ int/long
+ uint32
+ uint
+ integer
+ Bignum or Fixnum (as required)
+
+
+
+ uint64
+ Uses variable-length encoding.
+ uint64
+ long
+ int/long
+ uint64
+ ulong
+ integer/string
+ Bignum or Fixnum (as required)
+
+
+
+ sint32
+ Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s.
+ int32
+ int
+ int
+ int32
+ int
+ integer
+ Bignum or Fixnum (as required)
+
+
+
+ sint64
+ Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s.
+ int64
+ long
+ int/long
+ int64
+ long
+ integer/string
+ Bignum
+
+
+
+ fixed32
+ Always four bytes. More efficient than uint32 if values are often greater than 2^28.
+ uint32
+ int
+ int
+ uint32
+ uint
+ integer
+ Bignum or Fixnum (as required)
+
+
+
+ fixed64
+ Always eight bytes. More efficient than uint64 if values are often greater than 2^56.
+ uint64
+ long
+ int/long
+ uint64
+ ulong
+ integer/string
+ Bignum
+
+
+
+ sfixed32
+ Always four bytes.
+ int32
+ int
+ int
+ int32
+ int
+ integer
+ Bignum or Fixnum (as required)
+
+
+
+ sfixed64
+ Always eight bytes.
+ int64
+ long
+ int/long
+ int64
+ long
+ integer/string
+ Bignum
+
+
+
+ bool
+
+ bool
+ boolean
+ boolean
+ bool
+ bool
+ boolean
+ TrueClass/FalseClass
+
+
+
+ string
+ A string must always contain UTF-8 encoded or 7-bit ASCII text.
+ string
+ String
+ str/unicode
+ string
+ string
+ string
+ String (UTF-8)
+
+
+
+ bytes
+ May contain any arbitrary sequence of bytes.
+ string
+ ByteString
+ str
+ []byte
+ ByteString
+ string
+ String (ASCII-8BIT)
+
+
+
+
+
+
+
diff --git a/docs/synq/v1.mdx b/docs/synq/v1.mdx
new file mode 100644
index 0000000..7c38246
--- /dev/null
+++ b/docs/synq/v1.mdx
@@ -0,0 +1,499 @@
+
+
+
+
+ Protocol Documentation
+
+
+
+
+
+
+
+
+
+
+ Protocol Documentation
+
+ Table of Contents
+
+
+
+
+
+
+
synq/v1/scope_authorization.proto Top
+
+
+
+
+ ScopeAuthorization
+
+
+
+
+
+ Field Type Label Description
+
+
+
+
+ scopes
+ Scope
+ repeated
+
+
+
+
+
+
+
+
+
+
+
+
+ Scope
+
+
+
+ Name Number Description
+
+
+
+
+ SCOPE_UNSPECIFIED
+ 0
+
+
+
+
+ SCOPE_ENTITY_READ
+ 1
+
+
+
+
+ SCOPE_ENTITY_EDIT
+ 2
+
+
+
+
+ SCOPE_LINEAGE_READ
+ 10
+
+
+
+
+ SCOPE_LINEAGE_EDIT
+ 11
+
+
+
+
+ SCOPE_STATUS_READ
+ 20
+
+
+
+
+
+
+
+
+ File-level Extensions
+
+
+
+
+
+
+ Scalar Value Types
+
+
+ .proto Type Notes C++ Java Python Go C# PHP Ruby
+
+
+
+
+ double
+
+ double
+ double
+ float
+ float64
+ double
+ float
+ Float
+
+
+
+ float
+
+ float
+ float
+ float
+ float32
+ float
+ float
+ Float
+
+
+
+ int32
+ Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead.
+ int32
+ int
+ int
+ int32
+ int
+ integer
+ Bignum or Fixnum (as required)
+
+
+
+ int64
+ Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead.
+ int64
+ long
+ int/long
+ int64
+ long
+ integer/string
+ Bignum
+
+
+
+ uint32
+ Uses variable-length encoding.
+ uint32
+ int
+ int/long
+ uint32
+ uint
+ integer
+ Bignum or Fixnum (as required)
+
+
+
+ uint64
+ Uses variable-length encoding.
+ uint64
+ long
+ int/long
+ uint64
+ ulong
+ integer/string
+ Bignum or Fixnum (as required)
+
+
+
+ sint32
+ Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s.
+ int32
+ int
+ int
+ int32
+ int
+ integer
+ Bignum or Fixnum (as required)
+
+
+
+ sint64
+ Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s.
+ int64
+ long
+ int/long
+ int64
+ long
+ integer/string
+ Bignum
+
+
+
+ fixed32
+ Always four bytes. More efficient than uint32 if values are often greater than 2^28.
+ uint32
+ int
+ int
+ uint32
+ uint
+ integer
+ Bignum or Fixnum (as required)
+
+
+
+ fixed64
+ Always eight bytes. More efficient than uint64 if values are often greater than 2^56.
+ uint64
+ long
+ int/long
+ uint64
+ ulong
+ integer/string
+ Bignum
+
+
+
+ sfixed32
+ Always four bytes.
+ int32
+ int
+ int
+ int32
+ int
+ integer
+ Bignum or Fixnum (as required)
+
+
+
+ sfixed64
+ Always eight bytes.
+ int64
+ long
+ int/long
+ int64
+ long
+ integer/string
+ Bignum
+
+
+
+ bool
+
+ bool
+ boolean
+ boolean
+ bool
+ bool
+ boolean
+ TrueClass/FalseClass
+
+
+
+ string
+ A string must always contain UTF-8 encoded or 7-bit ASCII text.
+ string
+ String
+ str/unicode
+ string
+ string
+ string
+ String (UTF-8)
+
+
+
+ bytes
+ May contain any arbitrary sequence of bytes.
+ string
+ ByteString
+ str
+ []byte
+ ByteString
+ string
+ String (ASCII-8BIT)
+
+
+
+
+
+
+
diff --git a/protos/synq/core/v1/entity.proto b/protos/synq/core/v1/entity.proto
deleted file mode 100644
index 180714d..0000000
--- a/protos/synq/core/v1/entity.proto
+++ /dev/null
@@ -1,42 +0,0 @@
-syntax = "proto3";
-
-package synq.core.v1;
-
-import "synq/core/v1/entity_type.proto";
-import "synq/core/v1/platforms.proto";
-
-option go_package = "github.com/getsynq/api/core/v1";
-
-// Lightweight reference to an Entity
-message EntityRef {
- string path = 1; // Unique path for entity.
- EntityType type = 2; // Type of entity.
- optional string name = 3; // Human friendly name.
-}
-
-// Entity in Synq.
-message Entity {
- oneof data {
- Asset asset = 1;
- Monitor monitor = 2;
- MonitorSegment monitor_segment = 3;
- }
-}
-
-// Entity: Asset.
-message Asset {
- string asset_path = 1;
- Platform platform = 2;
-}
-
-// Entity: Monitor
-message Monitor {
- string monitor_path = 1;
-}
-
-// Entity: Monitor Segment
-message MonitorSegment {
- string monitor_path = 1;
- string metric_id = 2;
- string segment = 3;
-}
diff --git a/protos/synq/core/v1/entity_type.proto b/protos/synq/core/v1/entity_type.proto
deleted file mode 100644
index 8ae820d..0000000
--- a/protos/synq/core/v1/entity_type.proto
+++ /dev/null
@@ -1,103 +0,0 @@
-syntax = "proto3";
-
-package synq.core.v1;
-
-option go_package = "github.com/getsynq/api/core/v1";
-
-// Type of Entity.
-// This enum lists all the types currently supported by Synq.
-enum EntityType {
- ENTITY_TYPE_UNSPECIFIED = 0;
- ENTITY_TYPE_FOLDER = 1;
-
- // BIGQUERY 1XX
-
- ENTITY_TYPE_BQ_PROJECT = 101;
- ENTITY_TYPE_BQ_DATASET = 102;
- ENTITY_TYPE_BQ_TABLE = 103;
- ENTITY_TYPE_BQ_VIEW = 105;
-
- // LOOKER 2XX
-
- ENTITY_TYPE_LOOKER_LOOK = 201;
- ENTITY_TYPE_LOOKER_EXPLORE = 203;
- ENTITY_TYPE_LOOKER_VIEW = 207;
- ENTITY_TYPE_LOOKER_DASHBOARD = 208;
-
- // DBT 3XX
-
- ENTITY_TYPE_DBT_MODEL = 301;
- ENTITY_TYPE_DBT_TEST = 302;
- ENTITY_TYPE_DBT_SOURCE = 303;
- ENTITY_TYPE_DBT_MACRO = 304;
- ENTITY_TYPE_DBT_PROJECT = 306;
- ENTITY_TYPE_DBT_METRIC = 307;
- ENTITY_TYPE_DBT_SNAPSHOT = 310;
- ENTITY_TYPE_DBT_SEED = 311;
- ENTITY_TYPE_DBT_ANALYSIS = 312;
- ENTITY_TYPE_DBT_EXPOSURE = 313;
- ENTITY_TYPE_DBT_GROUP = 314;
-
- // DBT 35X
-
- ENTITY_TYPE_DBT_CLOUD_ACCOUNT = 351;
- ENTITY_TYPE_DBT_CLOUD_PROJECT = 352;
- ENTITY_TYPE_DBT_CLOUD_JOB = 353;
- ENTITY_TYPE_DBT_CLOUD_JOB_STEP = 354;
-
- // SNOWFLAKE 5XX
-
- ENTITY_TYPE_SNOWFLAKE_PROJECT = 501;
- ENTITY_TYPE_SNOWFLAKE_DATASET = 502;
- ENTITY_TYPE_SNOWFLAKE_TABLE = 503;
- ENTITY_TYPE_SNOWFLAKE_ACCOUNT = 505;
- ENTITY_TYPE_SNOWFLAKE_DATABASE = 506;
- ENTITY_TYPE_SNOWFLAKE_SCHEMA = 507;
- ENTITY_TYPE_SNOWFLAKE_VIEW = 508;
-
- // REDSHIFT 8XX
-
- ENTITY_TYPE_REDSHIFT_DATABASE = 801;
- ENTITY_TYPE_REDSHIFT_SCHEMA = 802;
- ENTITY_TYPE_REDSHIFT_TABLE = 803;
- ENTITY_TYPE_REDSHIFT_VIEW = 805;
-
- // TABLEAU 11xx
-
- ENTITY_TYPE_TABLEAU_EMBEDDED = 1101;
- ENTITY_TYPE_TABLEAU_PUBLISHED = 1102;
- ENTITY_TYPE_TABLEAU_CUSTOM_SQL = 1103;
- ENTITY_TYPE_TABLEAU_TABLE = 1104;
- ENTITY_TYPE_TABLEAU_SHEET = 1105;
- ENTITY_TYPE_TABLEAU_DASHBOARD = 1106;
-
- // AIRFLOW 12xx
-
- ENTITY_TYPE_AIRFLOW_DAG = 1201;
- ENTITY_TYPE_AIRFLOW_TASK = 1202;
-
- // CLICKHOUSE 13XX
-
- ENTITY_TYPE_CLICKHOUSE_DATABASE = 1301;
- ENTITY_TYPE_CLICKHOUSE_SCHEMA = 1302;
- ENTITY_TYPE_CLICKHOUSE_TABLE = 1303;
- ENTITY_TYPE_CLICKHOUSE_VIEW = 1305;
-
- ENTITY_TYPE_ANOMALY_INTEGRATION = 1401;
- ENTITY_TYPE_ANOMALY_MONITOR = 1403;
- ENTITY_TYPE_ANOMALY_MONITOR_SEGMENT = 1404;
-
- // POSTGRES 16XX
-
- ENTITY_TYPE_POSTGRES_DATABASE = 1601;
- ENTITY_TYPE_POSTGRES_SCHEMA = 1602;
- ENTITY_TYPE_POSTGRES_TABLE = 1603;
- ENTITY_TYPE_POSTGRES_VIEW = 1605;
-
- // MYSQL 17XX
-
- ENTITY_TYPE_MYSQL_DATABASE = 1701;
- ENTITY_TYPE_MYSQL_SCHEMA = 1702;
- ENTITY_TYPE_MYSQL_TABLE = 1703;
- ENTITY_TYPE_MYSQL_VIEW = 1705;
-}
diff --git a/protos/synq/core/v1/platforms.proto b/protos/synq/core/v1/platforms.proto
deleted file mode 100644
index 86cff52..0000000
--- a/protos/synq/core/v1/platforms.proto
+++ /dev/null
@@ -1,23 +0,0 @@
-syntax = "proto3";
-
-package synq.core.v1;
-
-option go_package = "github.com/getsynq/api/core/v1";
-
-// Platforms supported by Synq.
-enum Platform {
- reserved 60, 70, 90, 140, 150, 1000;
- PLATFORM_UNSPECIFIED = 0;
- PLATFORM_BIGQUERY = 10;
- PLATFORM_LOOKER = 20;
- PLATFORM_DBT = 30;
- PLATFORM_DBT_CLOUD = 31;
- PLATFORM_DBT_SELF_HOSTED = 32;
- PLATFORM_SNOWFLAKE = 50;
- PLATFORM_REDSHIFT = 80;
- PLATFORM_TABLEAU = 110;
- PLATFORM_AIRFLOW = 120;
- PLATFORM_CLICKHOUSE = 130;
- PLATFORM_POSTGRES = 160;
- PLATFORM_MYSQL = 170;
-}
diff --git a/protos/synq/entities/v1/entities.proto b/protos/synq/entities/v1/entities.proto
new file mode 100644
index 0000000..9e520e7
--- /dev/null
+++ b/protos/synq/entities/v1/entities.proto
@@ -0,0 +1,39 @@
+syntax = "proto3";
+
+package synq.entities.v1;
+
+import "buf/validate/validate.proto";
+import "google/protobuf/timestamp.proto";
+import "synq/entities/v1/identifiers.proto";
+
+option go_package = "github.com/getsynq/api/entities/v1";
+
+// Entity is the base type for all entities in the system. Its always attached to a given
+// client workspace and can be uniquely identified by its id.
+message Entity {
+ // Immutable workspace identifier that this entity belongs to.
+ string workspace = 1;
+
+ // Unique identifier for this entity.
+ Identifier id = 2 [(buf.validate.field).required = true];
+
+ // Name of the entity that is displayed to the user.
+ string name = 3 [(buf.validate.field).required = true];
+
+ // Description of the entity that is displayed in relevant contexts.
+ string description = 4;
+
+ // Timestamp when the entity was created.
+ google.protobuf.Timestamp created_at = 5;
+
+ // Timestamp when the entity was last updated.
+ google.protobuf.Timestamp updated_at = 6;
+
+ // Timestamp when the entity was deleted. If this is set, the entity is considered deleted.
+ google.protobuf.Timestamp deleted_at = 7;
+
+ // Return only value. Synq Path to the entity. This is a unique path that can be used to access the entity in the Synq's UI.
+ string synq_path = 8;
+ // Return only value. Synq URL to the entity. This is a unique URL that can be used to access the entity in the Synq's UI.
+ string synq_catalog_url = 9;
+}
diff --git a/protos/synq/entities/v1/entities_service.proto b/protos/synq/entities/v1/entities_service.proto
new file mode 100644
index 0000000..23b0346
--- /dev/null
+++ b/protos/synq/entities/v1/entities_service.proto
@@ -0,0 +1,96 @@
+syntax = "proto3";
+
+package synq.entities.v1;
+
+import "buf/validate/validate.proto";
+import "synq/entities/v1/entities.proto";
+import "synq/entities/v1/identifiers.proto";
+import "synq/v1/scope_authorization.proto";
+
+option go_package = "github.com/getsynq/api/entities/v1";
+
+// EntitiesService is a service for managing custom entities. Entities can represent
+// various data platform concepts such as services, consumers, applications or data pipelines
+// that are not natively available in Synq.
+//
+// Entities are identified by a unique identifier and can be created, updated, read and deleted.
+//
+service EntitiesService {
+ // Get specific entity by its identifier.
+ rpc GetEntity(GetEntityRequest) returns (GetEntityResponse) {
+ option (synq.v1.scope_authorization) = {
+ scopes: [
+ SCOPE_ENTITY_READ
+ ]
+ };
+ }
+
+ // Get multiple entities by their identifiers.
+ rpc BatchGetEntities(BatchGetEntitiesRequest) returns (BatchGetEntitiesResponse) {
+ option (synq.v1.scope_authorization) = {
+ scopes: [
+ SCOPE_ENTITY_READ
+ ]
+ };
+ }
+
+ // Create or update an entity. If the entity does not exist, it will be created, otherwise it will be updated. Entities are identified and deduplicated by their Identifier in a scope of a given customer workspace.
+ rpc UpsertEntity(UpsertEntityRequest) returns (UpsertEntityResponse) {
+ option (synq.v1.scope_authorization) = {
+ scopes: [
+ SCOPE_ENTITY_EDIT
+ ]
+ };
+ }
+
+ // Delete an entity by its identifier. If the entity does not exist, it will be a no-op.
+ rpc DeleteEntity(DeleteEntityRequest) returns (DeleteEntityResponse) {
+ option (synq.v1.scope_authorization) = {
+ scopes: [
+ SCOPE_ENTITY_EDIT
+ ]
+ };
+ }
+}
+
+// GetEntityRequest is the request message for the GetEntity method.
+message GetEntityRequest {
+ // Identifier of the entity to get.
+ Identifier id = 1 [(buf.validate.field).required = true];
+}
+
+// GetEntityResponse is the response message for the GetEntity method.
+message GetEntityResponse {
+ // The entity that was retrieved.
+ Entity entity = 1;
+}
+
+// BatchGetEntitiesRequest is the request message for the BatchGetEntities method.
+message BatchGetEntitiesRequest {
+ // Identifiers of the entities to get.
+ repeated Identifier ids = 1 [(buf.validate.field).required = true];
+}
+
+// BatchGetEntitiesResponse is the response message for the BatchGetEntities method.
+message BatchGetEntitiesResponse {
+ // The entities that were retrieved.
+ repeated Entity entities = 1;
+}
+
+// UpsertEntityRequest is the request message for the UpsertEntity method.
+message UpsertEntityRequest {
+ // The entity to create or update.
+ entities.v1.Entity entity = 1 [(buf.validate.field).required = true];
+}
+
+// UpsertEntityResponse is the response message for the UpsertEntity method.
+message UpsertEntityResponse {}
+
+// DeleteEntityRequest is the request message for the DeleteEntity method.
+message DeleteEntityRequest {
+ // Identifier of the entity to delete.
+ Identifier id = 1 [(buf.validate.field).required = true];
+}
+
+// DeleteEntityResponse is the response message for the DeleteEntity method.
+message DeleteEntityResponse {}
diff --git a/protos/synq/entities/v1/identifiers.proto b/protos/synq/entities/v1/identifiers.proto
new file mode 100644
index 0000000..6bc18b1
--- /dev/null
+++ b/protos/synq/entities/v1/identifiers.proto
@@ -0,0 +1,227 @@
+syntax = "proto3";
+
+package synq.entities.v1;
+
+import "buf/validate/validate.proto";
+
+option go_package = "github.com/getsynq/api/entities/v1";
+
+// Identifier is a unique reference to an entity in Synq system. Entity identifiers
+// are designed to closely mimic identifiers used by data platforms and tools. To construct
+// an identifier, you need to know the kind of the entity and the ids that you would normally
+// use to identify it in the data platform or tool. For example, to identify a table in BigQuery,
+// you would need to know the project, dataset, and table names.
+message Identifier {
+ oneof id {
+ option (buf.validate.oneof).required = true;
+ // Dbt node that identifies one of dbt DAG nodes (model, test, etc) in dbt Core project
+ DbtCoreNodeIdentifier dbt_core_node = 1;
+
+ // Dbt node that identifies one of dbt DAG nodes (model, test, etc) in dbt Cloud project
+ DbtCloudNodeIdentifier dbt_cloud_node = 2;
+
+ // BigQuery table identifier
+ BigqueryTableIdentifier bigquery_table = 3;
+
+ // Snowflake table identifier
+ SnowflakeTableIdentifier snowflake_table = 4;
+
+ // Redshift table identifier
+ RedshiftTableIdentifier redshift_table = 5;
+
+ // Postgres table identifier
+ PostgresTableIdentifier postgres_table = 6;
+
+ // Mysql table identifier
+ MysqlTableIdentifier mysql_table = 7;
+
+ // Clickhouse table identifier
+ ClickhouseTableIdentifier clickhouse_table = 8;
+
+ // Databricks table identifier
+ DatabricksTableIdentifier databricks_table = 14;
+
+ // Airflow DAG identifier
+ AirflowDagIdentifier airflow_dag = 9;
+
+ // Airflow task identifier within a given DAG
+ AirflowTaskIdentifier airflow_task = 10;
+
+ // Custom identifier to be used with all custom created entities
+ CustomIdentifier custom = 11;
+
+ // Dataproduct identifier
+ DataproductIdentifier dataproduct = 12;
+
+ // SynqPath identifier
+ SynqPathIdentifier synq_path = 13;
+ }
+}
+
+//
+// DBT
+//
+
+message DbtCoreNodeIdentifier {
+ // Synq integration_id that identifies the dbt Core project
+ string integration_id = 1 [
+ (buf.validate.field).required = true,
+ (buf.validate.field).string.uuid = true
+ ];
+
+ // Dbt node_id that identifies one of dbt DAG nodes (model, test, etc)
+ string node_id = 2 [(buf.validate.field).required = true];
+}
+
+message DbtCloudNodeIdentifier {
+ // Your dbt Cloud project id
+ string project_id = 1 [(buf.validate.field).required = true];
+
+ // Your dbt Cloud account id
+ string account_id = 2;
+
+ // Dbt node_id that identifies one of dbt DAG nodes (model, test, etc)
+ string node_id = 3 [(buf.validate.field).required = true];
+}
+
+//
+// DATA PLATFORMS
+//
+
+message BigqueryTableIdentifier {
+ // BigQuery project
+ string project = 1 [(buf.validate.field).required = true];
+
+ // BigQuery dataset id
+ string dataset = 2 [(buf.validate.field).required = true];
+
+ // BigQuery table name
+ string table = 3 [(buf.validate.field).required = true];
+}
+
+message SnowflakeTableIdentifier {
+ // Snowflake account
+ string account = 1 [(buf.validate.field).required = true];
+
+ // Snowflake database
+ string database = 2 [(buf.validate.field).required = true];
+
+ // Snowflake schema
+ string schema = 3 [(buf.validate.field).required = true];
+
+ // Snowflake table
+ string table = 4 [(buf.validate.field).required = true];
+}
+
+message RedshiftTableIdentifier {
+ // Redshift cluster
+ string cluster = 1 [(buf.validate.field).required = true];
+
+ // Redshift database
+ string database = 2 [(buf.validate.field).required = true];
+
+ // Redshift schema
+ string schema = 3 [(buf.validate.field).required = true];
+
+ // Redshift table
+ string table = 4 [(buf.validate.field).required = true];
+}
+
+message PostgresTableIdentifier {
+ // Postgres host inclusive of port
+ string host = 1 [(buf.validate.field).required = true];
+
+ // Postgres database
+ string database = 2 [(buf.validate.field).required = true];
+
+ // Postgres schema
+ string schema = 3 [(buf.validate.field).required = true];
+
+ // Postgres table
+ string table = 4 [(buf.validate.field).required = true];
+}
+
+message MysqlTableIdentifier {
+ // Mysql host inclusive of port
+ string host = 1 [(buf.validate.field).required = true];
+
+ // Mysql database
+ string schema = 2 [(buf.validate.field).required = true];
+
+ // Mysql table
+ string table = 3 [(buf.validate.field).required = true];
+}
+
+message ClickhouseTableIdentifier {
+ // Clickhouse host inclusive of port
+ string host = 1 [(buf.validate.field).required = true];
+
+ // Clickhouse database
+ string schema = 2 [(buf.validate.field).required = true];
+
+ // Clickhouse table
+ string table = 3 [(buf.validate.field).required = true];
+}
+
+message DatabricksTableIdentifier {
+ string workspace = 1 [(buf.validate.field).required = true];
+
+ // Databricks catalog
+ string catalog = 2 [(buf.validate.field).required = true];
+
+ // Databricks schema
+ string schema = 3 [(buf.validate.field).required = true];
+
+ // Databricks table or view
+ string table = 4 [(buf.validate.field).required = true];
+}
+
+message AirflowDagIdentifier {
+ // Synq integration_id that identifies the Airflow instance
+ string integration_id = 1 [(buf.validate.field).required = true];
+
+ // Airflow dag_id that identifies the DAG
+ string dag_id = 2 [(buf.validate.field).required = true];
+}
+
+message AirflowTaskIdentifier {
+ // Synq integration_id that identifies the Airflow instance
+ string integration_id = 1 [(buf.validate.field).required = true];
+
+ // Airflow dag_id that identifies the DAG
+ string dag_id = 2 [(buf.validate.field).required = true];
+
+ // Airflow task_id that identifies the task within the DAG
+ string task_id = 3 [(buf.validate.field).required = true];
+}
+
+//
+// CUSTOM
+//
+
+message CustomIdentifier {
+ // Id that identifies the custom entity
+ // The Id should be unique within the custom entity Identifier.
+ string id = 1 [(buf.validate.field).required = true];
+}
+
+//
+// DATAPRODUCT
+//
+
+message DataproductIdentifier {
+ // Dataproduct id that identifies the Dataproduct
+ string id = 1 [
+ (buf.validate.field).required = true,
+ (buf.validate.field).string.uuid = true
+ ];
+}
+
+//
+// SYNQ PATH
+//
+
+message SynqPathIdentifier {
+ // Synq path that identifies the Synq entity, needs to be one of supported paths
+ string path = 1 [(buf.validate.field).required = true];
+}
diff --git a/protos/synq/example/v1/example.proto b/protos/synq/example/v1/example.proto
deleted file mode 100644
index 4c0a010..0000000
--- a/protos/synq/example/v1/example.proto
+++ /dev/null
@@ -1,22 +0,0 @@
-syntax = "proto3";
-
-package synq.example.v1;
-
-import "google/protobuf/timestamp.proto";
-
-option go_package = "github.com/getsynq/api/example/v1";
-
-
-/**
- * Example is the core model of this package.
- */
-message Example {
- // `id` is generated by the system when a new example is created.
- // It is required to refer to an example in any future operations (like update or remove).
- string id = 1;
- /* The example itself. */
- string text = 2;
- optional string description = 3; /// Optional description of the example.
- google.protobuf.Timestamp created_at = 4; /// Example creation time.
- google.protobuf.Timestamp updated_at = 5; /// Example last update time.
-}
diff --git a/protos/synq/example/v1/example_service.proto b/protos/synq/example/v1/example_service.proto
deleted file mode 100644
index 6fa30fa..0000000
--- a/protos/synq/example/v1/example_service.proto
+++ /dev/null
@@ -1,88 +0,0 @@
-syntax = "proto3";
-
-package synq.example.v1;
-
-import "synq/example/v1/example.proto";
-
-option go_package = "github.com/getsynq/api/example/v1";
-
-
-// ExamplesService is a sample service to display how documentation in protos will work.
-// The service implements a basic CRUD API and contains server streaming example.
-service ExampleService {
- // AddExample adds the given example to the system.
- rpc AddExample(AddExampleRequest) returns (AddExampleResponse) {}
-
- // UpdateExample updates the given example.
- // Throws an error if the example was not found.
- rpc UpdateExample(UpdateExampleRequest) returns (UpdateExampleResponse) {}
-
- // GetExample returns the requested example.
- rpc GetExample(GetExampleRequest) returns (GetExampleResponse) {}
-
- // ListExamples streams the requested examples.
- rpc ListExamples(ListExamplesRequest) returns (stream ListExamplesResponse) {}
-
- // RemoveExample removes the provided example from the system.
- // Fails silently if the example was not found.
- rpc RemoveExample(RemoveExampleRequest) returns (RemoveExampleResponse) {}
-}
-
-/**
- * AddExampleRequest contains the parameters required to create an example.
- */
-message AddExampleRequest {
- /* The example itself. */
- string text = 1;
- optional string description = 2; /// Optional description of the example.
-}
-
-// Response contains the created example.
-message AddExampleResponse {
- Example example = 1;
-}
-
-/**
- * UpdateExampleRequest contains updateable fields inside an example.
- */
-message UpdateExampleRequest {
- string id = 1; /// Id of the example to update
- optional string text = 2; /// Optional update of the example text.
- optional string description = 3; /// Optional update of the example description.
-}
-
-// Response with updated example.
-message UpdateExampleResponse {
- Example example = 1;
-}
-
-// GetExampleRequest gets an example by its ID.
-message GetExampleRequest {
- string id = 1;
-}
-
-message GetExampleResponse {
- Example example = 1;
-}
-
-// ListExamplesRequest streams examples from the server.
-message ListExamplesRequest {
- repeated string ids = 1;
-}
-
-message ExampleResponse {
- Example example = 1;
-}
-
-message ListExamplesResponse {
- Example example = 1;
-}
-
-// RemoveExampleRequest removes an example by its ID.
-message RemoveExampleRequest {
- string id = 1;
-}
-
-message RemoveExampleResponse {
- bool success = 1;
-}
diff --git a/protos/synq/example/v2/example.proto b/protos/synq/example/v2/example.proto
deleted file mode 100644
index 02caf73..0000000
--- a/protos/synq/example/v2/example.proto
+++ /dev/null
@@ -1,23 +0,0 @@
-syntax = "proto3";
-
-package synq.example.v2;
-
-import "google/protobuf/timestamp.proto";
-
-option go_package = "github.com/getsynq/api/example/v2";
-
-
-/**
- * Example is the core model of this package.
- */
-message Example {
- // `id` is generated by the system when a new example is created.
- // It is required to refer to an example in any future operations (like update or remove).
- string id = 1;
- /* The example itself. */
- string text = 2;
- optional string description = 3; /// Optional description of the example.
- bool is_visible = 4; /// Whether the example is visible to users.
- google.protobuf.Timestamp created_at = 5; /// Example creation time.
- google.protobuf.Timestamp updated_at = 6; /// Example last update time.
-}
diff --git a/protos/synq/example/v2/example_service.proto b/protos/synq/example/v2/example_service.proto
deleted file mode 100644
index 7f538f6..0000000
--- a/protos/synq/example/v2/example_service.proto
+++ /dev/null
@@ -1,90 +0,0 @@
-syntax = "proto3";
-
-package synq.example.v2;
-
-import "synq/example/v2/example.proto";
-
-option go_package = "github.com/getsynq/api/example/v2";
-
-
-// ExamplesService is a sample service to display how documentation in protos will work.
-// The service implements a basic CRUD API and contains server streaming example.
-service ExampleService {
- // AddExample adds the given example to the system.
- rpc AddExample(AddExampleRequest) returns (AddExampleResponse) {}
-
- // UpdateExample updates the given example.
- // Throws an error if the example was not found.
- rpc UpdateExample(UpdateExampleRequest) returns (UpdateExampleResponse) {}
-
- // GetExample returns the requested example.
- rpc GetExample(GetExampleRequest) returns (GetExampleResponse) {}
-
- // ListExamples streams the requested examples.
- rpc ListExamples(ListExamplesRequest) returns (stream ListExamplesResponse) {}
-
- // RemoveExample removes the provided example from the system.
- // Fails silently if the example was not found.
- rpc RemoveExample(RemoveExampleRequest) returns (RemoveExampleResponse) {}
-}
-
-/**
- * AddExampleRequest contains the parameters required to create an example.
- */
-message AddExampleRequest {
- /* The example itself. */
- string text = 1;
- optional string description = 2; /// Optional description of the example.
- bool is_visible = 3; /// Whether the example is visible to users.
-}
-
-// Response contains the created example.
-message AddExampleResponse {
- Example example = 1;
-}
-
-/**
- * UpdateExampleRequest contains updateable fields inside an example.
- */
-message UpdateExampleRequest {
- optional string text = 1; /// Optional update of the example text.
- optional string description = 2; /// Optional update of the example description.
- optional bool is_visible = 3; /// Optional update of example visibility.
-}
-
-// Response with updated example.
-message UpdateExampleResponse {
- Example example = 1;
-}
-
-// GetExampleRequest gets an example by its ID.
-message GetExampleRequest {
- string id = 1;
-}
-
-message GetExampleResponse {
- Example example = 1;
-}
-
-// ListExamplesRequest streams examples from the server.
-message ListExamplesRequest {
- repeated string ids = 1;
-}
-
-message ListExamplesResponse {
- Example example = 1;
-}
-
-message ExampleResponse {
- Example example = 1;
-}
-
-
-// RemoveExampleRequest removes an example by its ID.
-message RemoveExampleRequest {
- string id = 1;
-}
-
-message RemoveExampleResponse {
- bool success = 1;
-}
diff --git a/protos/synq/schemas/v1/lineage.proto b/protos/synq/lineage/v1/lineage.proto
similarity index 90%
rename from protos/synq/schemas/v1/lineage.proto
rename to protos/synq/lineage/v1/lineage.proto
index a2a2b01..4133053 100644
--- a/protos/synq/schemas/v1/lineage.proto
+++ b/protos/synq/lineage/v1/lineage.proto
@@ -1,11 +1,10 @@
syntax = "proto3";
-package synq.schemas.v1;
+package synq.lineage.v1;
-import "synq/core/v1/entity.proto";
-
-option go_package = "github.com/getsynq/api/schemas/v1";
+import "synq/entities/v1/identifiers.proto";
+option go_package = "github.com/getsynq/api/lineage/v1";
// Lineage defines the lineage of table-like entities.
message Lineage {
@@ -44,12 +43,12 @@ enum NodePosition {
NODE_POSITION_DOWNSTREAM = 3; // Node is downstream of the requested start point.
}
-// Node in a lineage graph representing one or more entiities (e.g. database table).
+// Node in a lineage graph representing one or more entities (e.g. database table).
message LineageNode {
// All entities which have the same identity as this node. Must be at least one item.
// These are sorted by closeness to the type of the start point entities.
// e.g. if requesting lineage of a DBT source, first entity should be from DBT, similarly when viewing table it will be other tables.
- repeated core.v1.EntityRef entities = 1;
+ repeated entities.v1.Identifier ids = 1;
// Position of the node in the lineage.
NodePosition position = 2;
// Populated only for Column Level Lineage (CLL).
@@ -69,7 +68,7 @@ message CllDetails {
// Column in a table-like asset (used in CLL mode).
message Column {
string column_id = 1; // ID string for the column. This is the parsed column name.
- optional string name = 2; // Original column name as fetched from the table.
+ optional string name = 2; // Original column name as fetched from the table.
optional string native_type = 3; // Column type as fetched from the table.
}
diff --git a/protos/synq/schemas/v1/lineage_service.proto b/protos/synq/lineage/v1/lineage_service.proto
similarity index 69%
rename from protos/synq/schemas/v1/lineage_service.proto
rename to protos/synq/lineage/v1/lineage_service.proto
index f97e9b0..b4aa442 100644
--- a/protos/synq/schemas/v1/lineage_service.proto
+++ b/protos/synq/lineage/v1/lineage_service.proto
@@ -1,18 +1,24 @@
syntax = "proto3";
-package synq.schemas.v1;
+package synq.lineage.v1;
-import "synq/core/v1/entity.proto";
-import "synq/schemas/v1/lineage.proto";
-
-option go_package = "github.com/getsynq/api/schemas/v1";
+import "synq/entities/v1/identifiers.proto";
+import "synq/lineage/v1/lineage.proto";
+import "synq/v1/scope_authorization.proto";
+option go_package = "github.com/getsynq/api/lineage/v1";
// LineageService allows you to fetch:
// * Entity level lineage from a starting point of one or more entities.
// * Column Level lineage from a starting point of multiple columns of a single entity.
service LineageService {
- rpc GetLineage(GetLineageRequest) returns (GetLineageResponse) {}
+ rpc GetLineage(GetLineageRequest) returns (GetLineageResponse) {
+ option (synq.v1.scope_authorization) = {
+ scopes: [
+ SCOPE_LINEAGE_READ
+ ]
+ };
+ }
}
message GetLineageRequest {
@@ -42,10 +48,10 @@ message GetLineageStartPoint {
}
message EntitiesStartPoint {
- repeated core.v1.EntityRef entities = 1;
+ repeated entities.v1.Identifier entities = 1;
}
message EntityColumnsStartPoint {
- core.v1.EntityRef entitiy = 1;
- repeated string column_ids = 2;
+ entities.v1.Identifier id = 1;
+ repeated string column_names = 2;
}
diff --git a/protos/synq/lineage/v1/relationships.proto b/protos/synq/lineage/v1/relationships.proto
new file mode 100644
index 0000000..416675b
--- /dev/null
+++ b/protos/synq/lineage/v1/relationships.proto
@@ -0,0 +1,13 @@
+syntax = "proto3";
+
+package synq.lineage.v1;
+
+import "buf/validate/validate.proto";
+import "synq/entities/v1/identifiers.proto";
+
+option go_package = "github.com/getsynq/api/lineage/v1";
+
+message Relationship {
+ entities.v1.Identifier upstream = 1 [(buf.validate.field).required = true];
+ entities.v1.Identifier downstream = 2 [(buf.validate.field).required = true];
+}
diff --git a/protos/synq/lineage/v1/relationships_service.proto b/protos/synq/lineage/v1/relationships_service.proto
new file mode 100644
index 0000000..9b0afce
--- /dev/null
+++ b/protos/synq/lineage/v1/relationships_service.proto
@@ -0,0 +1,44 @@
+syntax = "proto3";
+
+package synq.lineage.v1;
+
+import "buf/validate/validate.proto";
+import "synq/lineage/v1/relationships.proto";
+import "synq/v1/scope_authorization.proto";
+
+option go_package = "github.com/getsynq/api/lineage/v1";
+
+// RelationshipsService allow management of relationships between entities. Relationships can
+// be created, updated, and deleted between 2 custom entities, or between a custom entity and Synq native entity.enum
+// There is no option to create relationships between 2 Synq native entities (dbt model, BI dashboard, etc.).
+service RelationshipsService {
+ // Create or update relationships between entities. If the relationship already exists, it will be updated, otherwise it will be created.
+ rpc UpsertRelationships(UpsertRelationshipsRequest) returns (UpsertRelationshipsResponse) {
+ option (synq.v1.scope_authorization) = {
+ scopes: [
+ SCOPE_LINEAGE_EDIT
+ ]
+ };
+ }
+
+ // Delete relationships between entities. If the relationship does not exist, it will be ignored.
+ rpc DeleteRelationships(DeleteRelationshipsRequest) returns (DeleteRelationshipsResponse) {
+ option (synq.v1.scope_authorization) = {
+ scopes: [
+ SCOPE_LINEAGE_EDIT
+ ]
+ };
+ }
+}
+
+message UpsertRelationshipsRequest {
+ repeated Relationship relationships = 1 [(buf.validate.field).required = true];
+}
+
+message UpsertRelationshipsResponse {}
+
+message DeleteRelationshipsRequest {
+ repeated Relationship relationships = 1 [(buf.validate.field).required = true];
+}
+
+message DeleteRelationshipsResponse {}
diff --git a/protos/synq/status/v1/entity_incidents.proto b/protos/synq/status/v1/entity_incidents.proto
new file mode 100644
index 0000000..cfb8cef
--- /dev/null
+++ b/protos/synq/status/v1/entity_incidents.proto
@@ -0,0 +1,31 @@
+syntax = "proto3";
+
+package synq.status.v1;
+
+import "google/protobuf/timestamp.proto";
+
+option go_package = "github.com/getsynq/api/status/v1";
+
+message EntityIncident {
+ // Unique identifier of the incident.
+ string id = 1;
+
+ // URL of the incident.
+ string url = 2;
+
+ // Name of the incident give by the user.
+ string name = 3;
+
+ // Information about author of the incident.
+ string created_by = 4;
+ // Time when the incident was created.
+ google.protobuf.Timestamp created_at = 5;
+
+ // Information about the user who last updated the incident.
+ string updated_by = 6;
+ // Time when the incident was last updated.
+ google.protobuf.Timestamp updated_at = 7;
+
+ // Indicates if all issues inside the incident are resolved.
+ bool is_resolved = 8;
+}
diff --git a/protos/synq/status/v1/entity_incidents_service.proto b/protos/synq/status/v1/entity_incidents_service.proto
new file mode 100644
index 0000000..79d830f
--- /dev/null
+++ b/protos/synq/status/v1/entity_incidents_service.proto
@@ -0,0 +1,60 @@
+syntax = "proto3";
+
+package synq.status.v1;
+
+import "buf/validate/validate.proto";
+import "synq/entities/v1/identifiers.proto";
+import "synq/status/v1/entity_incidents.proto";
+import "synq/v1/scope_authorization.proto";
+
+option go_package = "github.com/getsynq/api/status/v1";
+
+// EntityIncidentsService is the service which retrieves entity status.
+//
+service EntityIncidentsService {
+ // Get specific entity status by its identifier.
+ rpc GetIncidents(GetIncidentsRequest) returns (GetIncidentsResponse) {
+ option (synq.v1.scope_authorization) = {
+ scopes: [
+ SCOPE_STATUS_READ
+ ]
+ };
+ }
+
+ // Get multiple entity statuses by their identifiers.
+ rpc BatchGetIncidents(BatchGetIncidentsRequest) returns (BatchGetIncidentsResponse) {
+ option (synq.v1.scope_authorization) = {
+ scopes: [
+ SCOPE_STATUS_READ
+ ]
+ };
+ }
+}
+
+// GetIncidentsRequest is the request message for the GetEntity method.
+message GetIncidentsRequest {
+ // Identifier of the entity to get incidents for.
+ synq.entities.v1.Identifier id = 1 [(buf.validate.field).required = true];
+ // Retrieve incidents of upstream entities.
+ bool fetch_upstream_incidents = 2;
+}
+
+// GetIncidentsResponse is the response message for the GetEntity method.
+message GetIncidentsResponse {
+ // Identifier of the entity.
+ synq.entities.v1.Identifier id = 1 [(buf.validate.field).required = true];
+ // Open incident associated with the entity requested.
+ repeated EntityIncident entity_open_incidents = 2;
+ // Open incidents associated with the upstream entities if requested.
+ repeated EntityIncident upstream_open_incidents = 3;
+}
+
+// BatchGetIncidentsRequest is the request message for the BatchGetIssues method.
+message BatchGetIncidentsRequest {
+ repeated GetIncidentsRequest requests = 1 [(buf.validate.field).required = true];
+}
+
+// BatchGetIncidentsResponse is the response message for the BatchGetIssues method.
+message BatchGetIncidentsResponse {
+ repeated GetIncidentsResponse responses = 1 [(buf.validate.field).required = true];
+}
diff --git a/protos/synq/status/v1/entity_issues.proto b/protos/synq/status/v1/entity_issues.proto
new file mode 100644
index 0000000..91ec829
--- /dev/null
+++ b/protos/synq/status/v1/entity_issues.proto
@@ -0,0 +1,13 @@
+syntax = "proto3";
+
+package synq.status.v1;
+
+option go_package = "github.com/getsynq/api/status/v1";
+
+enum IssueStatus {
+ ISSUE_STATUS_UNSPECIFIED = 0;
+ ISSUE_STATUS_OK = 10;
+ ISSUE_STATUS_WARN = 20;
+ ISSUE_STATUS_ERROR = 30;
+ ISSUE_STATUS_CRITICAL = 40;
+}
diff --git a/protos/synq/status/v1/entity_issues_service.proto b/protos/synq/status/v1/entity_issues_service.proto
new file mode 100644
index 0000000..25a8894
--- /dev/null
+++ b/protos/synq/status/v1/entity_issues_service.proto
@@ -0,0 +1,73 @@
+syntax = "proto3";
+
+package synq.status.v1;
+
+import "buf/validate/validate.proto";
+import "synq/entities/v1/identifiers.proto";
+import "synq/status/v1/entity_issues.proto";
+import "synq/v1/scope_authorization.proto";
+
+option go_package = "github.com/getsynq/api/status/v1";
+
+// EntityIssuesService is the service which retrieves entity issues status.
+//
+service EntityIssuesService {
+ // Get specific entity status by its identifier.
+ rpc GetIssuesStatus(GetIssuesStatusRequest) returns (GetIssuesStatusResponse) {
+ option (synq.v1.scope_authorization) = {
+ scopes: [
+ SCOPE_STATUS_READ
+ ]
+ };
+ }
+
+ // Get multiple entity statuses by their identifiers.
+ rpc BatchGetIssuesStatus(BatchGetIssuesStatusRequest) returns (BatchGetIssuesStatusResponse) {
+ option (synq.v1.scope_authorization) = {
+ scopes: [
+ SCOPE_STATUS_READ
+ ]
+ };
+ }
+}
+
+// GetIssuesStatusRequest is the request message for the GetEntity method.
+message GetIssuesStatusRequest {
+ // Identifier of the entity to get status for.
+ synq.entities.v1.Identifier id = 1 [(buf.validate.field).required = true];
+ // Retrieve status of upstream entities.
+ bool fetch_upstream_status = 2;
+}
+
+// GetIssuesStatusResponse is the response message for the GetEntity method.
+message GetIssuesStatusResponse {
+ message IssuesSummary {
+ // Number of issues for the entity.
+ int32 total_count = 1;
+ // Number of issues for the entity with status 'warn'.
+ int32 warn_count = 2;
+ // Number of issues for the entity with status 'error'.
+ int32 error_count = 3;
+ // Number of issues for the entity with status 'critical'.
+ int32 critical_count = 4;
+ }
+
+ // Identifier of the entity.
+ synq.entities.v1.Identifier id = 1 [(buf.validate.field).required = true];
+ // Status of the entity requested.
+ IssueStatus entity_issues_status = 2;
+ IssuesSummary entity_issues_summary = 3;
+ // Optionally, the status of all upstream entities.
+ IssueStatus upstream_issues_status = 4;
+ IssuesSummary upstream_issues_summary = 5;
+}
+
+// BatchGetIssuesStatusRequest is the request message for the BatchGetIssues method.
+message BatchGetIssuesStatusRequest {
+ repeated GetIssuesStatusRequest requests = 1 [(buf.validate.field).required = true];
+}
+
+// BatchGetIssuesStatusResponse is the response message for the BatchGetIssues method.
+message BatchGetIssuesStatusResponse {
+ repeated GetIssuesStatusResponse responses = 1 [(buf.validate.field).required = true];
+}
diff --git a/protos/synq/v1/scope_authorization.proto b/protos/synq/v1/scope_authorization.proto
new file mode 100644
index 0000000..3e4ad45
--- /dev/null
+++ b/protos/synq/v1/scope_authorization.proto
@@ -0,0 +1,27 @@
+syntax = "proto3";
+package synq.v1;
+
+import "google/protobuf/descriptor.proto";
+
+option go_package = "github.com/getsynq/api/v1";
+
+extend google.protobuf.MethodOptions {
+ ScopeAuthorization scope_authorization = 50010;
+}
+
+enum Scope {
+ SCOPE_UNSPECIFIED = 0;
+
+ SCOPE_ENTITY_READ = 1;
+ SCOPE_ENTITY_EDIT = 2;
+
+ SCOPE_LINEAGE_READ = 10;
+ SCOPE_LINEAGE_EDIT = 11;
+
+ SCOPE_STATUS_READ = 20;
+}
+
+
+message ScopeAuthorization {
+ repeated Scope scopes = 1;
+}
\ No newline at end of file
diff --git a/scripts/copy_protos.sh b/scripts/copy_protos.sh
old mode 100644
new mode 100755
index 83c9335..51d9976
--- a/scripts/copy_protos.sh
+++ b/scripts/copy_protos.sh
@@ -28,7 +28,7 @@ for pd in "${proto_dirs[@]}"; do
# ensure dest exists
mkdir -p $dest
echo "$pd -> $dest"
- rsync -avW --include='*.proto' --no-compress "${pd}/" "${dest}/" --delete
+ rsync -avW --include='*.proto' "${pd}/" "${dest}/" --delete
done
set +e
diff --git a/scripts/generate_docs.sh b/scripts/generate_docs.sh
old mode 100644
new mode 100755
index d0c352d..e275064
--- a/scripts/generate_docs.sh
+++ b/scripts/generate_docs.sh
@@ -1,11 +1,14 @@
#!/bin/bash
+MY_PATH="$(dirname -- "${BASH_SOURCE[0]}")"
+TEMPLATE = "$MY_PATH/../templates/grpc-md.tmpl"
+
PROTOS_DIR="."
DOCS_DIR="./tmp"
set -e
-VALID_ARGS=$(getopt -o p:d: --long protos:,docs: -- "$@")
+VALID_ARGS=$(getopt -o p:d:I: --long protos:,docs: -- "$@")
if [[ $? -ne 0 ]]; then
exit 1;
fi
@@ -21,6 +24,10 @@ while [ : ]; do
DOCS_DIR=$2
shift 2
;;
+ -I)
+ PROTOC_OPTS="$PROTOC_OPTS --proto_path=$2"
+ shift 2
+ ;;
--) shift;
break
;;
@@ -44,9 +51,8 @@ for module_dir in $module_dirs; do
version=`basename $version_dir`
proto_files=`find $version_dir -name *.proto -type f`
if [[ "${proto_files}" != "" ]]; then
- protoc --proto_path=${PROTOS_DIR} \
- --doc_out="${DOCS_DIR}/${module}/" \
- --doc_opt=markdown,${version}.md \
+ protoc --proto_path=${PROTOS_DIR} $PROTOC_OPTS \
+ --doc_out=$TEMPLATE,"${version}.mdx:${DOCS_DIR}/${module}/" \
${proto_files}
fi
done
@@ -55,5 +61,7 @@ for module_dir in $module_dirs; do
fi
done
+rm -rf tmp
+
set +e
exit 0
diff --git a/scripts/generate_docs_simple.sh b/scripts/generate_docs_simple.sh
new file mode 100755
index 0000000..49d6958
--- /dev/null
+++ b/scripts/generate_docs_simple.sh
@@ -0,0 +1,38 @@
+#!/bin/bash
+
+PROTOS_DIR="."
+
+set -e
+
+VALID_ARGS=$(getopt -o I: -- "$@")
+if [[ $? -ne 0 ]]; then
+ exit 1;
+fi
+
+PROTOC_OPTS=""
+eval set -- "$VALID_ARGS"
+while [ : ]; do
+ case "$1" in
+ -I)
+ PROTOC_OPTS="$PROTOC_OPTS --proto_path=$2"
+ shift 2
+ ;;
+ --) shift;
+ break
+ ;;
+ esac
+done
+
+echo "Generating docs..."
+
+# Find all .proto files in subdirectories
+proto_files=$(find "${PROTOS_DIR}" -type f -name "*.proto")
+
+protoc --proto_path="${PROTOS_DIR}" ${PROTOC_OPTS}\
+ --doc_out=_repo/templates/grpc-md.tmpl,api.mdx:. \
+ ${proto_files}
+
+mv api.mdx ../../docs/api-reference/api.mdx
+
+set +e
+exit 0
\ No newline at end of file
diff --git a/scripts/test_compile.sh b/scripts/test_compile.sh
old mode 100644
new mode 100755
index be5c4cb..880ce62
--- a/scripts/test_compile.sh
+++ b/scripts/test_compile.sh
@@ -6,13 +6,22 @@ DIRTY=false
set -e
-VALID_ARGS=$(getopt -o dp:g: --long dirty,protos:,gen: -- "$@")
+PATH="/opt/homebrew/opt/gnu-getopt/bin:$PATH"
+
+# Parse the options
+VALID_ARGS=$(getopt -o dp:g:I: --long dirty,protos:,gen: -- "$@")
if [[ $? -ne 0 ]]; then
- exit 1;
+ exit 1
fi
+# Evaluate the parsed options
eval set -- "$VALID_ARGS"
-while [ : ]; do
+
+PROTOC_OPTS=""
+
+echo $@
+
+while true; do
case "$1" in
-d | --dirty)
DIRTY=true
@@ -22,6 +31,10 @@ while [ : ]; do
PROTOS_DIR=$2
shift 2
;;
+ -I)
+ PROTOC_OPTS="$PROTOC_OPTS --proto_path=$2"
+ shift 2
+ ;;
-g | --gen)
GEN_DIR=$2
shift 2
@@ -29,6 +42,10 @@ while [ : ]; do
--) shift;
break
;;
+ *)
+ echo "Unknown option: $1" >&2
+ exit 1
+ ;;
esac
done
@@ -49,7 +66,7 @@ for module_dir in $module_dirs; do
version=`basename $version_dir`
proto_files=`find $version_dir -name *.proto -type f`
if [[ "${proto_files}" != "" ]]; then
- protoc --proto_path=${PROTOS_DIR} \
+ protoc --proto_path=${PROTOS_DIR} $PROTOC_OPTS \
--go_out=${GEN_DIR} \
--go-grpc_out=${GEN_DIR} \
--doc_out=${DOCS_DIR}/${module} \
diff --git a/templates/grpc-md-orig.tmpl b/templates/grpc-md-orig.tmpl
new file mode 100644
index 0000000..4bae028
--- /dev/null
+++ b/templates/grpc-md-orig.tmpl
@@ -0,0 +1,76 @@
+
+# API Reference
+
+# Table of Contents
+{{range .Files}}
+{{if .HasServices}}
+- Services
+ {{range .Services}} - [{{.Name}}](#{{.FullName | lower | replace "." ""}})
+ {{end}}
+{{end}}
+{{if .HasMessages}}
+- Messages
+ {{range .Messages}} - [{{.LongName}}](#{{.LongName | lower | replace "." ""}})
+ {{end}}
+{{end}}
+{{if .HasEnums}}
+- Enums
+ {{range .Enums}} - [{{.LongName}}](#{{.LongName | lower | replace "." ""}})
+ {{end}}
+{{end}}
+{{end}}
+- [Scalar Value Types](#scalar-value-types)
+
+{{range .Files}}
+
+{{range .Services -}}
+# {{.Name}} {#{{.FullName | lower | replace "." ""}}}
+{{.Description}}
+
+{{range .Methods -}}
+## {{.Name}}
+
+> **rpc** {{.Name}}([{{.RequestLongType}}](#{{.RequestLongType | lower | replace "." ""}}))
+ [{{.ResponseLongType}}](#{{.ResponseLongType | lower | replace "." ""}})
+
+{{ .Description}}
+{{end}}
+{{end}}
+
+# Messages
+{{range .Messages}}
+
+## {{.LongName}} {#{{.LongName | lower | replace "." ""}}}
+{{.Description}}
+
+{{if .HasFields}}
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+{{range .Fields -}}
+ | {{if .IsOneof}}[**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) {{.OneofDecl}}.{{end}}{{.Name}} | [{{if .IsMap}}map {{else}}{{.Label}} {{end}}{{.LongType}}](#{{.LongType | lower | replace "." ""}}) | {{if .Description}}{{nobr .Description}}{{if .DefaultValue}} Default: {{.DefaultValue}}{{end}}{{else}}none{{end}} |
+{{end}}
+{{end}}
+{{end}}
+
+# Enums
+{{range .Enums}}
+
+## {{.LongName}} {#{{.LongName | lower | replace "." ""}}}
+{{.Description}}
+
+| Name | Number | Description |
+| ---- | ------ | ----------- |
+{{range .Values -}}
+ | {{.Name}} | {{.Number}} | {{if .Description}}{{nobr .Description}}{{else}}none{{end}} |
+{{end}}
+
+{{end}}
+{{end}}
+
+# Scalar Value Types
+
+| .proto Type | Notes | C++ Type | Java Type | Python Type |
+| ----------- | ----- | -------- | --------- | ----------- |
+{{range .Scalars -}}
+ |
{{.ProtoType}} | {{.Notes}} | {{.CppType}} | {{.JavaType}} | {{.PythonType}} |
+{{end}}
\ No newline at end of file
diff --git a/templates/grpc-md.tmpl b/templates/grpc-md.tmpl
new file mode 100644
index 0000000..00f5fc8
--- /dev/null
+++ b/templates/grpc-md.tmpl
@@ -0,0 +1,61 @@
+## Services
+
+{{range .Files}}
+{{range .Services -}}
+### {{.Name}}
+({{.FullName}})
+
+{{.Description}}
+
+{{range .Methods -}}
+#### {{.Name}}
+
+{{.Name}} ([{{.RequestType}}](#{{.RequestType | lower | replace "." ""}})) [{{.ResponseType}}](#{{.ResponseType | lower | replace "." ""}})
+
+{{ .Description}}
+
+{{end}}
+{{end}}
+{{end}}
+
+## Messages
+
+{{range .Files}}
+{{range .Messages}}
+### {{.LongName}}
+
+({{.FullName}})
+
+{{.Description}}
+
+{{if .HasFields}}
+| Field | Type | Description |
+| ----- | ---- | ----------- |
+{{range .Fields -}}
+ | {{if .IsOneof}}[**oneof**](https://developers.google.com/protocol-buffers/docs/proto3#oneof) {{.OneofDecl}}.{{end}}{{.Name}} | [{{if .IsMap}}map {{else}}{{.Label}} {{end}}{{.Type}}](#{{.Type | lower | replace "." ""}}) | {{if .Description}}{{nobr .Description}}{{if .DefaultValue}} Default: {{.DefaultValue}}{{end}}{{else}}none{{end}} |
+{{end}}
+{{end}}
+
+
+{{end}}
+
+{{end}}
+
+# Enums
+{{range .Files}}
+{{range .Enums}}
+
+### {{.LongName}}
+
+({{.FullName}})
+
+{{.Description}}
+
+| Name | Number | Description |
+| ---- | ------ | ----------- |
+{{range .Values -}}
+ | {{.Name}} | {{.Number}} | {{if .Description}}{{nobr .Description}}{{else}}none{{end}} |
+{{end}}
+
+{{end}}
+{{end}}
\ No newline at end of file