Skip to content
Configuration, connections & runners

Configuration, connections & runners

This page covers how a FACE instance is told about the systems it reads from and the compute it runs on. ConfigService stores connections: a source system, its non-secret settings and a separately held credential bundle. The same service tests connections, explores a source’s catalogue and takes bounded samples from it. It also registers runners, reports health, manages the integration settings (messaging numbers, billing and Google credentials, partner links) and offers two direct Databricks helpers. RunnerEnrollmentService works the other way round. A runner that the control plane cannot dial, for example one behind NAT, opens an outbound stream and receives its fetch work over that stream. Authentication and status-code conventions are on the API overview.

Secrets are write-only. Credentials go in once, through CreateConnectionRequest.credentials (or the secret-valued fields of a connector config message), and are held apart from the connection record. No RPC on this page returns a stored secret. Connection config messages come back with their secret fields empty, and GetIntegrationConfig reports only whether a secret is configured.

Summary

ServiceRPCKindPurpose
ConfigServiceListConnectionsUnaryList stored connections, each with its credential state and source backing
ConfigServiceCreateConnectionUnaryStore a connection together with its credentials
ConfigServiceDeleteConnectionUnaryRemove a connection and its credential bundle
ConfigServiceTestConnectionUnaryLive-probe a stored connection where the connector supports it
ConfigServiceExploreConnectionUnaryRead a source’s catalogue (datasets, columns, keys, governance) without reading rows
ConfigServiceSampleConnectionDatasetUnaryRead a bounded sample of real rows from one dataset
ConfigServiceListRunnersUnaryList registered, managed and self-enrolled runners
ConfigServiceCreateRunnerUnaryRegister a runner
ConfigServiceGetRunnerHealthUnaryProcess health of the serving instance, with unmeasured fields named
ConfigServiceListResourcesUnaryList the agent grammar and prompt-template resources bundled with the deployment
ConfigServiceCreateDatabricksClusterUnaryCreate a Databricks cluster and wait for it to run
ConfigServiceRunDatabricksJobUnaryCreate a Databricks notebook job on an existing cluster and run it
ConfigServiceGetIntegrationConfigUnaryRead integration settings (secrets reported as configured or not)
ConfigServiceSetIntegrationConfigUnarySave integration settings; secrets are write-only
RunnerEnrollmentServiceEnrollBidirectional streamingA runner’s outbound, long-lived stream for receiving fetch work

ConfigService

Full name semantics.v1.ConfigService.

Instance configuration: connections, runners, integration settings and resources. Every RPC needs a bearer session. Service-account tokens are refused (PERMISSION_DENIED) on every ConfigService RPC except ListConnections and ListRunners, which a workload needs in order to run. The handlers add no further role check, so any other recognised role may call them.

ListConnections

rpc ListConnections(ListConnectionsRequest) returns (ListConnectionsResponse);
  • Kind: Unary.
  • Auth: Bearer session. Service-account tokens are allowed.
  • Errors: INTERNAL when the connection registry cannot be read.

Returns every connection stored on this instance. Each row carries two server-computed fields that answer different questions. credential_state tells you whether this node holds a credential bundle for the connection. source_backing tells you whether the address points at a demo mock service. Nothing is dialled to compute either. Use TestConnection to find out whether a source is reachable.

Connection config messages come back with their secret fields empty. Properties whose names look like secrets are moved to the credential store when the connection is created, so they do not appear in properties either.

Request: ListConnectionsRequest

No fields.

Response: ListConnectionsResponse

FieldTypeDescription
connectionsrepeated ConnectionEvery stored connection. credential_state and source_backing are filled on each row.
warningsrepeated stringConditions that apply to the list as a whole. It is empty in the normal case. When the operator has not configured durable storage for connection credentials, it carries a warning that the credential bundles may not survive a restart, so rows may outlive their secrets. The text is written for a person: show it as is and do not match on its wording.

CreateConnection

rpc CreateConnection(CreateConnectionRequest) returns (CreateConnectionResponse);
  • Kind: Unary.
  • Auth: Bearer session. Service-account tokens are refused.
  • Errors: None as gRPC status. Every failure returns success: false with message: no connection in the request, an id that already exists, an invalid id, a missing type, a malformed runner-deploy setting, or a credential store that could not be written.

Stores a connection and its credentials in a single operation. The credential bundle is written first. If that write fails, no connection record is created, so a success: true always means that both were stored.

  • Id. If connection.id is empty, the server generates one. Either way the id comes back in connection_id, on failure too, so a retry can reuse it instead of creating a second row. An id must not be blank, must not have leading or trailing whitespace, must not contain a path separator or a NUL byte, and must not start with .. An id that already exists is refused. There is no update RPC: to change a connection, delete it and create it again.
  • Type. connection.type is required. The server normalises its spelling to the canonical type name, so “Service Now”, “service-now” and “servicenow” are one type. A type the catalogue does not know is stored in normalised form rather than refused. See Connection types and credential keys.
  • Credentials. There are two sources, and the server merges them into one write-only bundle: the credentials map, and the secret-valued fields of the config message (password, client_secret, api_key, personal_access_token, service_account_json, security_token). When both set the same key, the map wins. A properties entry whose name looks like a secret (for example *_token, *_secret) is moved into the bundle as well. Values that look like secrets are refused in the Snowflake and Databricks runner-deploy settings.
  • Warnings. These are the same as ListConnectionsResponse.warnings. A warning is not a failure: the connection was created, and the caller is told what the storage does and does not guarantee.

Request: CreateConnectionRequest

FieldTypeDescription
connectionConnectionThe connection to store. credential_state and source_backing are ignored on input.
credentialsmap<string, string>Secret values, keyed by the type’s credential key names. Stored in the credential store. Never returned.

Response: CreateConnectionResponse

FieldTypeDescription
successboolTrue when the connection and its credentials were stored.
connection_idstringThe connection’s id, which the server generated if the request left it empty. Set on failure as well.
messagestringThe reason on failure. Empty on success.
warningsrepeated stringStorage-durability warnings, as in ListConnectionsResponse. Not a failure.

DeleteConnection

rpc DeleteConnection(DeleteConnectionRequest) returns (DeleteConnectionResponse);
  • Kind: Unary.
  • Auth: Bearer session. Service-account tokens are refused.
  • Errors: None as gRPC status. Read outcome: DELETE_CONNECTION_OUTCOME_NOT_FOUND for an unknown id, DELETE_CONNECTION_OUTCOME_FAILED for an empty id or a storage failure.

Removes a stored connection and its credential bundle. The credential bundle is removed first, and the record is kept if that fails. DELETED therefore never means that the record went while the secret stayed.

What a delete does not do:

  • It does not revoke anything at the source. Nothing is dialled. A key that must be revoked has to be revoked in the system that issued it.
  • It does not rewrite references. Fetch definitions, rules and lineage records that name this connection id keep the id, and it no longer resolves.
  • NOT_FOUND means only that this instance does not hold the id now. It does not prove that the connection never existed elsewhere, for example on another instance or in a snapshot restored later.

Request: DeleteConnectionRequest

FieldTypeDescription
connection_idstringThe id to remove. Surrounding whitespace is trimmed. An empty id is refused with outcome: FAILED and message “no connection id provided”. It is never reported as not found.

Response: DeleteConnectionResponse

FieldTypeDescription
successboolExactly outcome == DELETE_CONNECTION_OUTCOME_DELETED. Branch on outcome.
outcomeDeleteConnectionOutcomeWhich of the three results happened.
connection_idstringThe id that was asked about, echoed back on every path. It is empty when the request id was empty.
messagestringHuman-readable detail. On FAILED it carries the underlying error. Do not branch on it.
warningsrepeated stringStorage-durability warnings, as in ListConnectionsResponse. On an instance without durable storage, a delete may not survive a restart.

TestConnection

rpc TestConnection(TestConnectionRequest) returns (TestConnectionResponse);
  • Kind: Unary.
  • Auth: Bearer session. Service-account tokens are refused.
  • Errors: None as gRPC status. Returns success: false with message when the connection cannot be read, does not exist (“Connection not found”), has a type with no registered connector, or fails its probe.

Looks up the stored connection and its credentials and asks the connector to probe the source. Read success and live_check_performed together:

successlive_check_performedMeaning
truetrueThe source answered and accepted the credentials (“Connectivity verified”).
truefalseThe connector for this type has no live probe. The configuration is stored and nothing was verified. This is not a failure.
falsetrueThe probe ran and failed. message carries the connector’s error.
falsefalseNo probe was attempted: the connection could not be resolved (see message).

Even a true/true result only establishes that the endpoint is reachable and that the credential was accepted. It does not establish that records exist, that a sensor is publishing, or that the credential has scope for any other resource.

Request: TestConnectionRequest

FieldTypeDescription
connection_idstringThe stored connection to test. Credentials are read from the credential store. They are never sent on this call.

Response: TestConnectionResponse

FieldTypeDescription
successboolSee the table above.
messagestringHuman-readable result or error. Do not branch on it.
live_check_performedboolWhether a connector with a live probe actually dialled the source.

ExploreConnection

rpc ExploreConnection(ExploreConnectionRequest) returns (ExploreConnectionResponse);
  • Kind: Unary.
  • Auth: Bearer session. Service-account tokens are refused.
  • Errors: None as gRPC status. Every outcome is a normal response. Check discovery_attempted, then description.supported, description.reason and description.aspects.

Asks a stored connection’s source what it holds: datasets, columns and their declared types, the source’s own comments and tags, the declared keys, and column masks and row filters where the catalogue publishes them. Every field comes from the source or is left empty. The response discloses table names, column names and comments, and it never carries row data: datasets[].sample is always unset. To read rows, call SampleConnectionDataset.

  • When the id is empty or unknown, when the registry cannot be read, or when no connector is registered for the type, discovery_attempted is false and description.supported is false, with reason saying which.
  • When the connector ran and failed, discovery_attempted is true, supported is false, and reason quotes what the source or driver said. A failed read is not a statement that the source is empty.
  • When the connection has no stored credentials, the attempt is still made with none. A connector that needs a credential says so in reason.

How to read the result:

  • A catalogue read is not a reachability check. Some connectors answer from a protocol handshake and some from a metadata query. supported: false can be a real answer: “this protocol has no catalogue”.
  • The result shows only what this principal can see. Catalogues filter by the connection credential’s grants, so an empty list means “none visible to this role”. Check aspects before concluding that something is absent.
  • A declared key is not an enforced one. See DeclaredRelationship.
  • An absent mask does not prove an unredacted read. Redaction applied outside the catalogue, or by a view in front of the table, is invisible here.

Request: ExploreConnectionRequest

FieldTypeDescription
connection_idstringThe stored connection to explore. Credentials are read from the credential store by id.

Response: ExploreConnectionResponse

FieldTypeDescription
descriptionSourceDescriptionWhat the source said. Always set. datasets[].sample is always unset.
discovery_attemptedboolWhether the connector’s discovery actually ran. False means nothing was asked of the source (see description.reason). This is not a success flag: true with supported false is a normal answer.

SampleConnectionDataset

rpc SampleConnectionDataset(SampleConnectionDatasetRequest) returns (SampleConnectionDatasetResponse);
  • Kind: Unary.
  • Auth: Bearer session. Service-account tokens are refused.
  • Errors: None as gRPC status. Every refusal or failure returns sampled: false with reason and no sample.

Reads a bounded set of actual rows from one dataset on a stored connection. It is the only RPC on this service that returns customer data. Bounded sampling is currently implemented for Snowflake and Databricks connections. For any other type the call is refused with a reason saying that this backend has not implemented sampling for that source type.

Processing order:

  1. name must be non-empty.

  2. row_limit must be between 0 and 1000. A value outside that range is refused, not clamped. 0 means the connector’s default. Each connector then applies its own ceiling:

    • Databricks: default 25 rows. Anything above 1000 is refused.
    • Snowflake: default 10 rows. Anything above 100 is reduced to 100.

    In both cases the bound actually used is reported in sample.row_limit.

  3. The connection is resolved, and its connector must support sampling.

  4. The server first runs a discovery on the source to find the dataset’s masked columns and row filter. This step is best-effort. If it fails, or the dataset is not in the listing (matching ignores case, and an empty qualifier matches any), the sample is still taken and sample.governance_checked is false.

  5. Every part of the dataset name is checked against the identifier allowlist and quoted for the target warehouse. A name the allowlist refuses is refused with the reason. It is never escaped around.

What a sample does not establish:

  • These rows are not the dataset. A null rate, a distinct count or a missing value over a sample says nothing about the table. sample.basis carries the sample size, and sample.caveats is never empty.
  • A sample can be truthful and still unrepresentative. A masked column returns masked values, and a row filter silently removes rows. Show masked_columns, row_filter and governance_checked beside the rows.
  • The sampling methods differ. A FIRST_ROWS read is the first rows the engine produced. On a time-clustered table, that is one slice of time.
  • NULL, the empty string and the literal text “NULL” are three different cells. See SampleCell.

Request: SampleConnectionDatasetRequest

FieldTypeDescription
connection_idstringThe stored connection.
qualifierstringThe dataset’s namespace exactly as ExploreConnection reported it (DescribedDataset.qualifier). Send it separately from name. Do not join the two with a dot, because the server re-quotes each part for the target warehouse.
namestringThe dataset’s name as discovery reported it. Required.
row_limitint32Row bound, 0 to 1000. 0 means the connector’s default. Values outside the range are refused. No value produces an unbounded read.

Response: SampleConnectionDatasetResponse

FieldTypeDescription
sampleDatasetSampleThe rows and everything needed to interpret them. Unset when nothing was sampled. It is never an empty sample.
sampledboolWhether a sampler actually read rows from the source.
reasonstringWhy nothing was sampled, when sampled is false: missing name, bound out of range, unresolved connection, unsupported type, a name the allowlist refused, or a read failure (in the source’s words where the source refused). Empty when sampled is true.

ListRunners

rpc ListRunners(ListRunnersRequest) returns (ListRunnersResponse);
  • Kind: Unary.
  • Auth: Bearer session. Service-account tokens are allowed.
  • Errors: A storage failure is returned as the store’s error, which surfaces as UNKNOWN.

Returns three kinds of runner, in this order:

  1. The managed runner. An entry named Runink Managed Runner is always listed first unless a stored runner already has that name. It has type CloudRun. Its state is RUNNING, with the forwarding endpoint, only when a live heartbeat from a managed runner is present in the replicated registry. Otherwise state is UNKNOWN. compute_units is 0, which means unknown: provisioned capacity is not metered.
  2. Stored runners, registered with CreateRunner. These are returned exactly as stored, including their state string.
  3. Self-enrolled runners that currently hold an open Enroll stream, scoped to the caller’s own tenant. Each has type Local, an empty endpoint (it has no address the control plane can dial), state RUNNING, an empty local_config, and a description that gives the time the stream opened, the time since the last message and the reported load. RUNNING here means that the stream is open. Nothing has probed the runner. These entries are not persisted and disappear when the stream closes.

Request: ListRunnersRequest

No fields.

Response: ListRunnersResponse

FieldTypeDescription
runnersrepeated RunnerManaged, stored and self-enrolled runners, as described above.

CreateRunner

rpc CreateRunner(CreateRunnerRequest) returns (CreateRunnerResponse);
  • Kind: Unary.
  • Auth: Bearer session. Service-account tokens are refused.
  • Errors: None as gRPC status. Returns success: false (with no message) when the runner cannot be stored.

Stores a runner definition on the instance. The server generates runner_id. When runner.name is empty, the generated id is used as the name. When runner is omitted, a runner named Unknown is stored. A compute_units of 0 is stored as 1. Registering a runner dials nothing and does not check the endpoint.

Request: CreateRunnerRequest

FieldTypeDescription
runnerRunnerThe runner to store.

Response: CreateRunnerResponse

FieldTypeDescription
successboolTrue when the runner was stored.
runner_idstringServer-generated id. Empty on failure.

GetRunnerHealth

rpc GetRunnerHealth(GetRunnerHealthRequest) returns (GetRunnerHealthResponse);
  • Kind: Unary.
  • Auth: Bearer session. Service-account tokens are refused.
  • Errors: None.

Reports the health of the FACE server process that answers the call. It takes two CPU samples about 120 ms apart, so expect that much latency. Only some fields are measured. unmeasured names every field this build does not measure, and those fields are zero or empty. Show them as unknown, never as values. Currently request_rate, latency_p95, error_rate, raft_status, raft_index and active_nodes are always listed, and cpu_usage is listed as well when the host CPU cannot be sampled.

Request: GetRunnerHealthRequest

No fields.

Response: GetRunnerHealthResponse

FieldTypeDescription
cpu_usagedoubleHost CPU utilisation, as a percentage. It is 0 and listed in unmeasured when the CPU cannot be sampled.
memory_usagedoubleHeap memory currently allocated by the process, in MB.
active_goroutinesint32Number of goroutines in the process.
request_ratedoubleNot measured in this build (always listed in unmeasured).
latency_p95doubleNot measured in this build (always listed in unmeasured).
error_ratedoubleNot measured in this build (always listed in unmeasured).
raft_statusstringRaft role (“Leader”, “Follower”). Not measured in this build: always empty and listed in unmeasured.
raft_indexint64Not measured in this build (always listed in unmeasured).
active_nodesint32Not measured in this build (always listed in unmeasured).
unmeasuredrepeated stringNames of the fields above that were not measured. Empty would mean every field was measured.

ListResources

rpc ListResources(ListResourcesRequest) returns (ListResourcesResponse);
  • Kind: Unary.
  • Auth: Bearer session. Service-account tokens are refused.
  • Errors: FAILED_PRECONDITION when the deployment’s bundled agent-resource catalogue is not available, which is a packaging fault and not an empty catalogue. INTERNAL when listing the catalogue fails part-way.

Lists the agent resources bundled with the deployment. These are JSON grammar files (type grammar) and prompt templates (type template). For a template, content is the extracted system prompt, not the raw template file. A template with no extractable system prompt is left out, and so is any resource that cannot be read.

Request: ListResourcesRequest

No fields.

Response: ListResourcesResponse

FieldTypeDescription
resourcesrepeated ResourceThe bundled resources.

CreateDatabricksCluster

rpc CreateDatabricksCluster(CreateDatabricksClusterRequest) returns (CreateDatabricksClusterResponse);
  • Kind: Unary.
  • Auth: Bearer session. Service-account tokens are refused. It is refused with PERMISSION_DENIED on the LITE subscription tier, because the feature requires the Dedicated or Enterprise tier.
  • Errors: When Databricks rejects the cluster-creation request itself, the call fails with that error, which surfaces as UNKNOWN. Every other failure (client setup, listing Spark versions or node types, choosing defaults, or the cluster failing to start) returns success: false with error_message.

Creates a cluster directly in the Databricks workspace at databricks_host, using databricks_token. The token is used for this call only and is not stored. The call waits until the cluster is running before it answers. Defaults:

  • spark_version: the latest LTS runtime.
  • node_type_id: the smallest node type with local disk.
  • num_workers: 1 when 0.
  • autotermination_minutes: 15 when 0.

Request: CreateDatabricksClusterRequest

FieldTypeDescription
cluster_namestringName for the new cluster.
num_workersint32Worker count. 0 means 1.
autotermination_minutesint32Idle minutes before the cluster terminates. 0 means 15.
databricks_hoststringWorkspace URL, for example https://<workspace>.cloud.databricks.com.
databricks_tokenstringPersonal access token for the workspace. Used for this call only, and never stored or returned.
spark_versionstringOptional. Empty means the latest LTS runtime.
node_type_idstringOptional. Empty means the smallest node type with local disk.

Response: CreateDatabricksClusterResponse

FieldTypeDescription
successboolTrue when the cluster was created and reached a running state.
cluster_idstringThe Databricks cluster id.
cluster_urlstringLink to the cluster’s configuration page in the workspace.
statestringThe cluster state reported by Databricks, for example RUNNING.
error_messagestringThe reason when success is false.

RunDatabricksJob

rpc RunDatabricksJob(RunDatabricksJobRequest) returns (RunDatabricksJobResponse);
  • Kind: Unary.
  • Auth: Bearer session. Service-account tokens are refused.
  • Errors: None as gRPC status. Returns success: false with error_message when the client cannot be created, the job cannot be created, the run cannot be started, or the run’s status cannot be obtained.

Creates a single-task notebook job in the Databricks workspace at databricks_host and runs it on existing_cluster_id. The call waits for the run to finish before it answers. The token is used for this call only and is not stored.

Request: RunDatabricksJobRequest

FieldTypeDescription
job_namestringName of the job to create.
job_descriptionstringDescription of the job’s task.
task_keystringKey of the job’s single task.
existing_cluster_idstringThe cluster to run the task on.
notebook_pathstringWorkspace path of the notebook to run.
databricks_hoststringWorkspace URL.
databricks_tokenstringPersonal access token for the workspace. Used for this call only, and never stored or returned.

Response: RunDatabricksJobResponse

FieldTypeDescription
successboolTrue when the job was created and run and the run’s status was obtained.
job_idint64The Databricks job id.
run_idint64The Databricks run id.
job_urlstringLink to the job in the workspace.
run_urlstringLink to the run in the workspace.
error_messagestringThe reason when success is false.

GetIntegrationConfig

rpc GetIntegrationConfig(GetIntegrationConfigRequest) returns (GetIntegrationConfigResponse);
  • Kind: Unary.
  • Auth: Bearer session. Service-account tokens are refused.
  • Errors: INTERNAL when the integration settings cannot be read.

Returns the instance’s integration settings. No secret is ever returned. The Stripe secret key and the Google service-account credentials appear only as the booleans stripe_configured and google_credentials_configured. The response carries no prefix, suffix or length of either secret. An unset contact number is returned empty, and the server substitutes no default.

Request: GetIntegrationConfigRequest

No fields.

Response: GetIntegrationConfigResponse

FieldTypeDescription
whatsapp_phone_numberstringWhatsApp number used for outbound notifications. Empty when unset.
carrier_phone_numberstringNumber used for carrier calls. Empty when unset.
sms_phone_numberstringNumber used for SMS. Empty when unset.
google_analytics_idstringGoogle Analytics id.
partnersrepeated PartnerPartner links.
stripe_configuredboolTrue when a Stripe secret key is stored. Nothing is dialled to compute this, so it says nothing about whether Stripe accepts the key.
google_credentials_configuredboolTrue when Google service-account credentials are stored.

Reserved: fields 1 (stripe_api_key) and 5 (google_credentials). They are never reused.

SetIntegrationConfig

rpc SetIntegrationConfig(SetIntegrationConfigRequest) returns (SetIntegrationConfigResponse);
  • Kind: Unary.
  • Auth: Bearer session. Service-account tokens are refused.
  • Errors: None as gRPC status. Returns success: false with message when the current settings cannot be read or the new settings cannot be saved.

Saves the integration settings. Every non-secret field is a full replacement: an empty value clears it, and partners replaces the whole list. The two secrets work differently because they are write-only. An empty or blank value keeps the stored secret, a non-blank value (trimmed) replaces it, and only the matching remove_* flag erases it. A client can therefore load the settings, change a phone number and save them without resending, or accidentally erasing, the secrets it never received. On success message is “Configuration saved successfully”.

Request: SetIntegrationConfigRequest

FieldTypeDescription
stripe_api_keystringStripe secret key. Write-only. Empty keeps the stored key.
whatsapp_phone_numberstringFull replacement.
carrier_phone_numberstringFull replacement.
sms_phone_numberstringFull replacement.
google_credentialsstringGoogle service-account credentials. Write-only. Empty keeps the stored value.
google_analytics_idstringFull replacement.
partnersrepeated PartnerFull replacement of the partner list.
remove_stripe_api_keyboolErase the stored Stripe key. Takes precedence over a non-empty stripe_api_key.
remove_google_credentialsboolErase the stored Google credentials. Takes precedence over a non-empty google_credentials.

Response: SetIntegrationConfigResponse

FieldTypeDescription
successboolTrue when the settings were saved.
messagestringResult or error text.

RunnerEnrollmentService

Full name semantics.v1.RunnerEnrollmentService.

This is outbound runner enrolment. A runner that the control plane cannot reach, because it is behind NAT or on a network the control plane cannot address, dials out, holds one stream open and receives fetch work down that same stream. An enrolled runner is not a mesh peer. It holds no mesh certificate, takes no part in consensus and receives no replicated state. Everything it needs travels in the assignment.

Enroll

rpc Enroll(stream EnrollRequest) returns (stream EnrollResponse);
  • Kind: Bidirectional streaming. This needs native gRPC over HTTP/2. Browser gRPC-web cannot carry it.
  • Auth: Bearer token in the stream metadata, and it must be a service-account token. An org admin mints one for their own tenant with IdentityService/GenerateServiceAccountKey (see Identity). A user’s session token cannot enrol a runner, including an admin’s. A client certificate alone is not enough.
  • Errors:
    • PERMISSION_DENIED: the token is not a service-account token, or the session carries no verified tenant.
    • INVALID_ARGUMENT: the stream closed before a first message, the first message is not a hello, a second hello arrives on an established stream, or a message of an unrecognised kind arrives.

Protocol:

  1. The runner opens the stream and sends EnrollRequest{hello} first. Anything else is refused and nothing is registered.
  2. The server registers the runner under the caller’s verified tenant and answers EnrollResponse{accepted}.
  3. The runner sends heartbeat messages with its current load, and the server may send assignment messages at any time. Each assignment carries a dispatch_id and a RunFetchRequest. The runner answers with EnrollRequest{result}, quoting the same dispatch_id. A result whose dispatch_id matches no in-flight dispatch is dropped.
  4. Closing the stream, whether by a clean end, cancellation or a transport error, de-registers the runner. There is no separate deregistration call. When the stream ends, the server closes its side without an error.

Behaviour worth knowing:

  • Registration key. The server sanitises runner_id: it keeps only letters, digits, -, _ and ., and caps the id at 64 characters. If nothing survives, the server generates an id. The runner is keyed by (verified tenant, id), so it cannot collide with or impersonate another tenant’s runner. If a new stream enrols with an id that is already held in the same tenant, the new stream takes over the registration (last writer wins). This lets a restarted runner reclaim its slot.
  • Claims are not verified. name, version and capabilities are the runner’s own statements. Nothing probes the runner, checks its build or refuses an old version, and there is no approval step.
  • How work arrives. When FetchService/RunFetch runs for a tenant that has enrolled runners, the fetch goes down one of their streams. A runner_id that names an enrolled runner selects that runner and is never redirected. With no runner_id, the least-loaded enrolled runner is chosen. With no matching enrolled runner, the platform uses its normal path. If the result carries error, the fetch fails with INTERNAL. If it carries neither error nor fetch, that is a protocol fault and is reported as INTERNAL. If the runner does not answer within 10 minutes, the fetch returns DEADLINE_EXCEEDED, and the run may still be in progress on the runner. A runner that disconnects before the work is sent causes UNAVAILABLE. See Fetch for RunFetchRequest and RunFetchResponse.
  • Visibility. An enrolled runner appears in ListRunners for its tenant only, and only while the stream is open.
  • Heartbeats are advisory. The server advises an interval of 15 seconds but evicts nobody for missing heartbeats. Only the stream closing de-registers a runner.

Request stream: EnrollRequest

FieldTypeDescription
helloRunnerHellooneof message. Must be the first message, and only the first.
heartbeatRunnerHeartbeatoneof message. Updates the runner’s reported load.
resultRunnerWorkResultoneof message. The answer to an assignment.

Response stream: EnrollResponse

FieldTypeDescription
acceptedEnrollmentAcceptedoneof message. Sent once, in answer to the hello.
assignmentRunnerWorkAssignmentoneof message. A unit of work for the runner.

Messages

Connection

A stored connection. Exactly one member of the config oneof is set. For a given type it is the member listed in Connection types and credential keys. Secret-valued fields inside the config message are accepted on create, moved to the credential store and always empty on read.

FieldTypeDescription
namestringDisplay name. Not required, and never interpreted. Use source_backing to tell a demo mock from a live system, never the name.
typestringConnection type. Required on create. The server normalises it to the canonical type name.
environmentstringFree-form tier label of the customer’s estate, for example prod, uat or demo. It does not say whether the source is a mock.
runnerstringThe runner this connection is associated with.
idstringConnection id. On create, the server generates one when this is empty.
excelExcelConnectionConfigoneof config.
sharepointSharePointConnectionConfigoneof config.
mysqlMySqlConnectionConfigoneof config.
postgresPostgresConnectionConfigoneof config.
bigqueryBigQueryConnectionConfigoneof config.
databricksDatabricksConnectionConfigoneof config.
snowflakeSnowflakeConnectionConfigoneof config.
hubspotHubspotConnectionConfigoneof config.
salesforceSalesforceConnectionConfigoneof config.
guidewireGuidewireConnectionConfigoneof config.
sapSAPConnectionConfigoneof config.
inventoryInventoryConnectionConfigoneof config.
omsOMSConnectionConfigoneof config. Older per-system shape. New connections use logistics_api.
whsWHSConnectionConfigoneof config. Older per-system shape. New connections use logistics_api.
documentDocumentConnectionConfigoneof config.
d365D365ConnectionConfigoneof config.
servicenowServiceNowConnectionConfigoneof config.
tmsTMSConnectionConfigoneof config. Older per-system shape. New connections use logistics_api.
ymsYMSConnectionConfigoneof config. Older per-system shape. New connections use logistics_api.
imsInventoryConnectionConfigoneof config. IMS reuses the inventory shape.
iotIoTConnectionConfigoneof config.
cctvCctvConnectionConfigoneof config.
object_storeObjectStoreConnectionConfigoneof config.
mqttMQTTConnectionConfigoneof config.
rfidRFIDConnectionConfigoneof config.
gpsGPSConnectionConfigoneof config.
sensor_gatewaySensorGatewayConnectionConfigoneof config.
logistics_apiLogisticsAPIConnectionConfigoneof config. The shared shape for new OMS, WMS, WHS, YMS, TMS and IMS connections.
kafkaKafkaConnectionConfigoneof config.
propertiesmap<string, string>Free-form, non-secret properties. A key whose name looks like a secret is moved to the credential store on create and does not come back here. A pasted connection string is split into settings and credentials.
credential_stateCredentialStateWhat this node knows about the connection’s credential bundle. Filled by ListConnections only, and UNSPECIFIED everywhere else.
source_backingSourceBackingWhat stands behind the connection. Filled by ListConnections only, and UNSPECIFIED everywhere else.

Connection types and credential keys

Put credentials in CreateConnectionRequest.credentials under these keys. Fields in the table that are marked secret are also accepted on the config message and moved into the credential bundle. Types marked “none” need no secret. Their credential_state is NONE_NEEDED, which is a normal state.

typeConfig memberCredential keys
excelexcelnone
sharepointsharepointclient_secret
mysqlmysqlpassword
postgrespostgrespassword
bigquerybigqueryservice_account_json
databricksdatabrickspersonal_access_token
snowflakesnowflakepassword
hubspothubspotapi_key
salesforcesalesforcepassword, security_token, client_secret
guidewireguidewirepassword
sapsappassword
inventoryinventoryapi_key
imsimsapi_key
omsomsapi_key
whswhsapi_key
tmstmsapi_key
ymsymsapi_key
iotiotapi_key
cctvcctvpassword
documentdocumentnone
objectstoreobject_storeaccess_key, secret_key, session_token, service_account_json, account_key, sas_token (whichever the provider uses)
d365d365client_secret
servicenowservicenowpassword, client_secret
mqttmqttpassword
rfidrfidtoken, api_key, password
gpsgpstoken, api_key, password
sensorgatewaysensor_gatewaytoken, api_key, password
logisticsapilogistics_apiapi_key, token, password, client_secret (per auth_mode)
kafkakafkapassword (SASL), schema_registry_password
githubnone (repository owner and repo go in properties)personal_access_token. A GitHub connection can be stored and listed, but it cannot be fetched from.

ExcelConnectionConfig

FieldTypeDescription
file_pathstringLocation of the workbook.
has_headerboolWhether the first row is a header.

SharePointConnectionConfig

FieldTypeDescription
site_urlstringSharePoint site URL.
tenant_idstringDirectory tenant id.
client_idstringApplication (client) id.
client_secretstringSecret. Write-only, empty on read.

MySqlConnectionConfig

FieldTypeDescription
hoststringServer host.
portint32Server port.
databasestringDatabase name.
usernamestringUser name.
passwordstringSecret. Write-only, empty on read.

PostgresConnectionConfig

FieldTypeDescription
hoststringServer host.
portint32Server port.
databasestringDatabase name.
usernamestringUser name.
passwordstringSecret. Write-only, empty on read.
ssl_modestringTLS mode.

BigQueryConnectionConfig

FieldTypeDescription
project_idstringGoogle Cloud project id.
dataset_idstringBigQuery dataset id.
service_account_jsonstringSecret. Service-account key JSON. Write-only, empty on read.

DatabricksConnectionConfig

The runner-deploy settings are all optional and none of them is secret. When set, each is checked for format on create, and a value that looks like a credential is refused.

FieldTypeDescription
hoststringWorkspace host.
http_pathstringSQL warehouse or cluster HTTP path.
personal_access_tokenstringSecret. Write-only, empty on read.
cluster_policy_idstringRunner deploy: a cluster policy id (letters and digits).
node_type_idstringRunner deploy: a node type id, for example i3.xlarge.
spark_versionstringRunner deploy: a Databricks Runtime version, for example 15.4.x-scala2.12.
runner_artifactstringRunner deploy: a Unity Catalog volume path (/Volumes/catalog/schema/volume/...), with no .. segment. Must be set together with runner_artifact_sha256.
runner_artifact_sha256stringRunner deploy: 64 lowercase hex characters. Must be set together with runner_artifact.
runner_scopestringRunner deploy: the name of a Databricks secret scope (letters, digits, -, _, @, ., at most 128 characters). It is never a secret.
service_principalstringRunner deploy: the service principal’s application id (a lowercase UUID). It is not the principal’s OAuth secret.

SnowflakeConnectionConfig

The runner-deploy settings are all optional and none of them is secret. When set, each is checked for format on create.

FieldTypeDescription
accountstringSnowflake account identifier.
warehousestringVirtual warehouse.
databasestringDatabase.
schemastringSchema.
userstringUser name.
passwordstringSecret. Write-only, empty on read.
rolestringRole to use.
compute_poolstringRunner deploy: a Snowflake identifier.
image_repositorystringRunner deploy: an image repository path, /DB/SCHEMA/REPO.
runner_imagestringRunner deploy: an image pinned by digest (core-runner@sha256:<64 lowercase hex>), never a tag.
network_rulestringRunner deploy: a Snowflake identifier, optionally db.schema.rule.
external_access_integrationstringRunner deploy: a Snowflake identifier.

HubspotConnectionConfig

FieldTypeDescription
api_keystringSecret. Write-only, empty on read.

SalesforceConnectionConfig

FieldTypeDescription
login_urlstringLogin endpoint.
usernamestringUser name.
passwordstringSecret. Write-only, empty on read.
security_tokenstringSecret. Write-only, empty on read.
client_idstringConnected-app client id.
client_secretstringSecret. Write-only, empty on read.

GuidewireConnectionConfig

FieldTypeDescription
base_urlstringAPI base URL.
usernamestringUser name.
passwordstringSecret. Write-only, empty on read.
tenant_idstringTenant id.

SAPConnectionConfig

FieldTypeDescription
system_idstringSAP system id.
clientstringSAP client.
usernamestringUser name.
passwordstringSecret. Write-only, empty on read.
hoststringApplication server host.
system_numberstringSAP system number.

InventoryConnectionConfig

Used by both inventory and ims.

FieldTypeDescription
base_urlstringAPI base URL.
api_keystringSecret. Write-only, empty on read.
providerstringVendor, for example “Manhattan” or “Oracle”.

OMSConnectionConfig

FieldTypeDescription
base_urlstringAPI base URL.
api_keystringSecret. Write-only, empty on read.
system_typestringVendor system, for example “IBM Sterling” or “NetSuite”.

WHSConnectionConfig

FieldTypeDescription
base_urlstringAPI base URL.
api_keystringSecret. Write-only, empty on read.
warehouse_idstringWarehouse id.

TMSConnectionConfig

FieldTypeDescription
base_urlstringAPI base URL.
api_keystringSecret. Write-only, empty on read.
providerstringVendor.

YMSConnectionConfig

FieldTypeDescription
base_urlstringAPI base URL.
api_keystringSecret. Write-only, empty on read.
yard_idstringYard id.

IoTConnectionConfig

FieldTypeDescription
endpointstringEndpoint address.
api_keystringSecret. Write-only, empty on read.
protocolstringFor example MQTT or AMQP. For a subscription with topics, use MQTTConnectionConfig.

CctvConnectionConfig

A video feed that the CCTV extractor samples frames from.

FieldTypeDescription
endpoint_urlstringAn rtsp:// or http(s):// feed, or a file the server can read. Empty for a device-capture source.
usernamestringOptional RTSP user name. Kept out of the URL so that the credential never sits in a logged or displayed string.
passwordstringSecret. Optional RTSP password. Write-only, empty on read.
max_framesint32Frames sampled per extraction. 0 means the server default, not “none”.
transportstringRTSP transport: tcp (default) or udp.
device_captureboolMarks a push source: the client’s own camera in recording mode, with frames sent by the client. There is no endpoint to dial. The server cannot open a local camera itself.

DocumentConnectionConfig

FieldTypeDescription
storage_bucketstringBucket holding the documents.
document_typestringFor example “Invoices” or “BOLs”.
filter_prefixstringKey prefix to restrict to.

ObjectStoreConnectionConfig

A customer’s own bucket: GCS, S3 (or any S3-compatible endpoint) or Azure Blob. This message has no credential fields. Credentials go in the credentials map.

FieldTypeDescription
providerstringgcs, s3 or azure. Validated when the connector connects.
bucketstringBucket, or container for Azure.
prefixstringOptional key prefix that scopes the connection to part of the bucket.
regionstringS3 region. Ignored by GCS and Azure.
endpointstringOptional S3-compatible endpoint. Empty means AWS.
accountstringAzure storage account name. Ignored by the other providers.
use_tlsboolWhether the S3-compatible endpoint uses TLS. Defaults to false. Set it for public S3.

D365ConnectionConfig

FieldTypeDescription
base_urlstringEnvironment base URL.
tenant_idstringDirectory tenant id.
client_idstringApplication (client) id.
client_secretstringSecret. Write-only, empty on read.

ServiceNowConnectionConfig

FieldTypeDescription
instance_urlstringInstance URL.
usernamestringUser name.
passwordstringSecret. Write-only, empty on read.
client_idstringOAuth client id.
client_secretstringSecret. Write-only, empty on read.

MQTTConnectionConfig

A sensor bus: the broker that pallet probes, reefer controllers and dock readers publish to. This message has no secret fields. The password goes in credentials["password"].

FieldTypeDescription
broker_urlstringtcp://host:port, tls://host:port or ws(s)://host/mqtt.
topicsrepeated stringTopic filters to subscribe to. The broker honours the MQTT wildcards. Empty is a configuration error, never “everything”.
qosint320, 1 or 2. Defaults to 1 (at-least-once).
client_idstringClient id presented on connect. Empty means a stable id derived from the connection id.
usernamestringUser name.
collect_secondsint32How long a fetch listens before returning. 0 means the server default.
max_messagesint32Cap on messages returned by one fetch. 0 means the server default.
protocol_versionint324 (MQTT 3.1.1, the default) or 5.
use_tlsboolVerify the broker’s certificate. Defaults to false. Set it for anything that crosses a network boundary.
insecure_skip_verifyboolSkip certificate verification.

RFIDConnectionConfig

A pallet or case reader: a dock-door portal, handheld sled or conveyor tunnel.

FieldTypeDescription
protocolstringllrp (default) or http.
endpointstringFor LLRP, host or host:port. For HTTP, the reader’s base URL.
reader_idstringOperator-facing reader identity, carried onto every reading.
antenna_portsrepeated int32Antenna ports to enable. Empty means every antenna the reader reports.
locationstringWhere the reader physically is, for example dock_door_3.
collect_secondsint32Length of an inventory round. 0 means the server default.
max_readsint32Cap on tag reports per fetch. 0 means the server default.
report_duplicatesboolReport every sighting of the same EPC instead of first and last seen. Off by default.
use_tlsboolUse TLS to the reader.

GPSConnectionConfig

Vehicle or trailer position and the sensor channels attached to it.

FieldTypeDescription
providerstringsamsara, geotab, generic_rest or nmea.
endpointstringREST base URL, or host:port for nmea.
asset_idsrepeated stringRestrict the fetch to these assets. Empty means the whole fleet the credential can see.
lookback_minutesint32Only fixes from this many minutes ago onwards. 0 means the server default.
collect_secondsint32For nmea, how long to listen. 0 means the server default.
include_sensorsboolAlso request the reefer and cargo sensor channels where the provider has them.

SensorGatewayConnectionConfig

A fixed probe or camera on a gateway: temperature, infrared, humidity or shock channels.

FieldTypeDescription
transportstringmodbus_tcp (default), http or mqtt.
endpointstringhost:port for modbus_tcp, a base URL for http, or a broker URL for mqtt.
unit_idint32Modbus unit (slave) id.
channelsrepeated SensorChannelThe channels the gateway exposes. A gateway with no channels is a configuration error.
collect_secondsint32Length of a sampling pass for streaming transports. 0 means the server default.
poll_interval_secondsint32Seconds between polls within a pass, for modbus_tcp and http. 0 means the server default. Carried onto every reading as its sampling interval.
use_tlsboolUse TLS to the gateway.

SensorChannel

One physical measurement mapped onto one register or path, with its scaling stated.

FieldTypeDescription
asset_idstringThe asset measured, for example REEFER-12.
device_idstringStable per-channel device identity.
metricstringtemperature, infrared, humidity, shock, door or battery. Written onto the reading as given.
addressstringFor Modbus, the starting register address. For http and mqtt, the JSON pointer or topic suffix.
register_typestringModbus register file: holding (default), input, coil or discrete.
data_typestringModbus encoding: int16 (default), uint16, int32, uint32 or float32. The 32-bit forms read two registers.
scaledoublevalue = raw * scale + offset. A scale of 0 means 1.
offsetdoubleSee scale.
unitstringEngineering unit written onto the reading, for example C, F, %RH or g.
threshold_mindoubleLower bound from the product specification. Meaningful only when threshold_min_stated is true.
threshold_min_statedboolWhether threshold_min was actually stated.
threshold_maxdoubleUpper bound from the product specification. Meaningful only when threshold_max_stated is true.
threshold_max_statedboolWhether threshold_max was actually stated.
threshold_sourcestringWhere the thresholds are stated.

LogisticsAPIConnectionConfig

The shared shape for the OMS, WMS, WHS, YMS, TMS and IMS system-of-record connectors. This message has no secret fields. The API key, bearer token, basic-auth password or OAuth2 client secret goes in credentials.

FieldTypeDescription
systemstringoms, wms, whs, yms, tms or ims. Decides the default resource and the response normaliser.
providerstringVendor dialect: manhattan, blue_yonder, ibm_sterling, netsuite, oracle, project44, fourkites or generic.
base_urlstringAPI base URL.
resourcestringResource to read. Empty uses the system’s default: orders for oms, inventory for ims and wms, shipments for tms, appointments for yms.
site_idstringSite the connection is scoped to (warehouse id, yard id or DC code).
auth_modestringapi_key (default, sent as a header), bearer, basic or oauth2_client_credentials.
api_key_headerstringHeader that carries the API key. Empty means X-API-Key. This is a header name, not a secret.
token_urlstringOAuth2 token endpoint, for oauth2_client_credentials.
scopestringOAuth2 scope.
page_sizeint32Page size requested from the API. 0 means the server default.
max_recordsint32Hard cap on records per fetch. 0 means the server default.
lookback_minutesint32Only records changed within this window. 0 means the system default.

KafkaConnectionConfig

An event bus reached over the Kafka wire protocol. The brokers publish topic names, partitions and replicas but no schema. Field structure comes from a separate Schema Registry, if there is one. This message has no secret fields. The SASL password goes in credentials["password"] and the registry password in credentials["schema_registry_password"].

FieldTypeDescription
bootstrap_serversrepeated stringBroker addresses to bootstrap from. List several, so that one broker being down does not make the connection unusable.
topicsrepeated stringTopic prefix filters over the catalogue read. Empty is normal and means every topic. Enumerating topics reads no records.
client_idstringThe client id sent in every request, as seen in the broker’s logs and quotas. Empty means an id derived from the connection id.
security_protocolstringplaintext (default), ssl, sasl_plaintext or sasl_ssl. This one setting decides whether the wire is encrypted.
sasl_mechanismstringRead only for sasl_* protocols. plain is the only mechanism the connector speaks. scram-sha-256 and scram-sha-512 are refused by name and never downgraded.
usernamestringSASL user name.
schema_registry_urlstringBase URL of a Confluent-compatible Schema Registry. Empty is supported: the topics then have no declared fields, and the connector says so rather than inferring a schema from messages.
schema_registry_usernamestringHTTP basic-auth user for the registry.
insecure_skip_verifyboolSkip verification of the broker and registry certificates.

Runner

A runner definition. Stored runners are returned exactly as they were created.

FieldTypeDescription
statestringFor example PENDING, RUNNING or FAILED. The managed entry reports RUNNING or UNKNOWN, and enrolled runners report RUNNING (see ListRunners). Stored runners return whatever was stored.
namestringRunner name. On create, it defaults to the generated id when empty.
endpointstringAddress used to reach the runner. Empty for self-enrolled runners.
compute_unitsdoubleCompute units. On create, 0 is stored as 1. 0 on the managed entry means unknown.
descriptionstringFree-text description. For managed and enrolled entries, the server writes it to say what liveness was observed.
typestringRunner kind, for example CloudRun for the managed entry or Local for enrolled runners.
portint32Port, stored as given.
cpusint32CPU count, stored as given.
memorystringMemory size, stored as given.
image_repositorystringImage repository, stored as given.
local_configLocalRunnerConfigoneof deployment_config. Set (and empty) on self-enrolled runners.
cloudrun_configCloudRunRunnerConfigoneof deployment_config.
snowflake_configSnowflakeRunnerConfigoneof deployment_config.
databricks_configDatabricksRunnerConfigoneof deployment_config.
legacy_container_configContainerDeploymentConfigoneof deployment_config.

LocalRunnerConfig

FieldTypeDescription
binary_pathstringRunner binary location.
work_dirstringWorking directory.
env_varsmap<string, string>Environment for the runner process. This map is stored and returned as given, so do not put secrets in it.

CloudRunRunnerConfig

FieldTypeDescription
project_idstringGoogle Cloud project id.
regionstringRegion.
service_namestringService name.
image_urlstringContainer image.
service_accountstringService account the service runs as.

SnowflakeRunnerConfig

FieldTypeDescription
compute_poolstringSnowpark Container Services compute pool.
min_nodesint32Minimum nodes.
max_nodesint32Maximum nodes.
image_repositorystringImage repository.

DatabricksRunnerConfig

FieldTypeDescription
cluster_idstringCluster to run on.
notebook_pathstringNotebook to run.
task_keystringJob task key.

ContainerDeploymentConfig

FieldTypeDescription
min_instancesint32Minimum instances.
max_instancesint32Maximum instances.
ttl_secondsint32Instance time-to-live, in seconds.
cidr_blockstringNetwork CIDR block.

Resource

FieldTypeDescription
namestringThe resource’s path within the bundled catalogue.
typestringgrammar or template.
contentstringBase64-encoded content. For a template, this is the extracted system prompt, not the raw file.

Partner

FieldTypeDescription
namestringPartner name.
urlstringPartner link.
descriptionstringDescription.
messagestringMessage shown with the link.

SourceDescription

A source’s answer to “what is behind this connection”. Figures that could be defaulted travel with a *_stated boolean, and figures that claim to measure something travel with a *_basis string. Always read the pair together. No confidences, most-common values, histograms or example rows are ever carried.

FieldTypeDescription
supportedboolFalse when the connector cannot enumerate anything. reason then says why. False is a real answer, not an empty success.
reasonstringSet whenever supported is false. It can also be set alongside a successful description, to state what the description did not cover. Show it as is, and do not match on it.
datasetsrepeated DescribedDatasetWhat the source says it holds. Empty with supported true means the source answered and has nothing visible.
aspectsrepeated DiscoveryAspectWhat was asked of the source and what came back, per aspect. Consult it before saying that anything is absent.

DescribedDataset

One table, object type, topic, sheet, endpoint or stream within a source.

FieldTypeDescription
namestringThe source’s own identifier, verbatim. It never carries a network address.
kindstringWhat the source calls this shape, for example table, view, object, topic, sheet, endpoint or stream. Free-form.
qualifierstringThe namespace (schema, database, bucket or channel). Empty when the source has no such concept.
columnsrepeated DescribedColumnThe dataset’s fields.
row_countint64Meaningful only when row_count_stated is true.
row_count_statedboolWhether the source stated a row count.
row_count_basisstringHow the count was obtained. Always set when row_count_stated is true.
descriptionstringThe dataset’s own comment, verbatim. Empty when the source publishes none. It is never generated.
definitionstringThe source’s text for a derived dataset (a view’s SELECT). It is bounded author-supplied text, not trusted SQL. Empty can also mean the definition is hidden from this principal (see aspects).
definition_truncatedboolTrue when definition is only a prefix.
bytesint64Size. Meaningful only when bytes_stated is true.
bytes_statedboolWhether the source stated a size.
bytes_basisstringWhich size it is (for example active storage as opposed to history).
last_alteredstringThe source’s own last-change timestamp, verbatim. Meaningful only when last_altered_stated is true. It is DDL/DML metadata, not a freshness guarantee.
last_altered_statedboolWhether the source stated last_altered.
relationshipsrepeated DeclaredRelationshipPrimary, unique and foreign keys that the source declares. Empty does not mean there are no keys (see aspects).
sampleDatasetSampleAlways unset in ExploreConnection responses.
tagsmap<string, string>The source’s structured metadata. Keys keep the source’s spelling and case.
row_filterstringThe row-level security function applied, if one is published. Empty does not mean unfiltered unless the matching aspect was read.
partition_keystringThe field that records are distributed by, on an event bus. Empty on sources that do not partition. It is not a declared key.
partition_key_basisstringHow partition_key was learned, for example NAME_MATCH. Always set when partition_key is set.

DescribedColumn

FieldTypeDescription
namestringVerbatim from the source.
declared_typestringThe source’s own type name, for example NUMBER(38,0) or picklist. It is not normalised. Empty when the source declares no type.
nullableboolMeaningful only when nullable_stated is true.
nullable_statedboolWhether the source publishes nullability.
unitstringUnit, set only where the source or the column name states it. It is never inferred.
unit_statedboolWhether a unit was stated.
allowed_valuesrepeated stringThe closed vocabulary that the source publishes. It is never filled from observed values.
allowed_values_completeboolWhether allowed_values is the whole vocabulary.
pii_basisstringHow the column was flagged as personal data: NAME_MATCH, VALUE_PATTERN or SOURCE_DECLARED. Empty when it was not flagged.
distinctint64Distinct count. Meaningful only when distinct_basis is non-empty.
distinct_basisstringWhether distinct is an aggregate computed in the source or an estimate from a sample, with the sample size.
nullsint64Null count. Meaningful only when nulls_basis is non-empty.
nulls_basisstringAs distinct_basis, for nulls.
minstringMinimum, for numeric and temporal columns only, computed in the source. Empty when not stated.
maxstringMaximum, under the same rules as min.
range_basisstringHow min and max were obtained.
descriptionstringThe column’s own comment, verbatim. Empty when the source publishes none.
tagsmap<string, string>The source’s structured metadata for the column. Keys keep the source’s spelling.
maskstringThe masking function applied, if one is published. Empty is not evidence that the values are unredacted.

DiscoveryAspect

One question asked of the source’s catalogue, and what came back.

FieldTypeDescription
namestringWhich question: tables_and_columns, relationships, view_definitions or schemas.
sourcestringThe object consulted, in the source’s own words, for example INFORMATION_SCHEMA.TABLE_CONSTRAINTS.
askedboolFalse when the aspect was skipped. detail then says why.
readableboolMeaningful only when asked is true. False means the source refused. True with rows 0 means none visible to this role.
rowsint32Rows the aspect’s query returned. Meaningful only when readable is true.
detailstringThe source’s own error text when readable is false, or the reason for skipping when asked is false.

DeclaredRelationship

A constraint that the source declares. It says how the schema’s author meant the tables to join. It is not evidence that any row satisfies it.

FieldTypeDescription
kindstringPRIMARY KEY, UNIQUE or FOREIGN KEY, in the source’s own words.
namestringConstraint name, verbatim.
columnsrepeated stringThis dataset’s columns in the constraint, in the source’s order. The order matters.
references_qualifierstringFor a foreign key, the referenced dataset’s qualifier. Empty when the reference did not resolve.
references_namestringFor a foreign key, the referenced dataset’s name.
references_columnsrepeated stringFor a foreign key, the referenced columns, in order.
enforcedboolMeaningful only when enforced_stated is true. Read from the catalogue.
enforced_statedboolWhether the catalogue stated enforcement.
basisstringHow the constraint was learned. Always DECLARED_BY_SOURCE for a catalogue read.

DatasetSample

A bounded read of real rows. This is the only message on this page that carries customer content. Never present it as the dataset.

FieldTypeDescription
columnsrepeated stringSampled column names, in the order of the cells.
rowsrepeated SampleRowOne entry per row. Values are strings, not typed values.
rows_returnedint32The number of rows.
row_limitint32The bound actually applied. Always set. If rows_returned is below row_limit, the dataset holds no more rows. Equality means the bound was hit.
boundedboolTrue when the answer is short because the bound stopped it, not because the source ran out.
methodstringStatistical class: FIRST_ROWS (no randomisation), RANDOM_PERCENT (random, approximate count) or FIXED_SIZE_RANDOM (random, fixed size, not uniform).
method_detailstringThe source’s own sampling clause, for reproducing the read.
basisstringSAMPLED_ROWS(n). Carry it with any figure derived from these rows.
masked_columnsrepeated stringSampled columns that carry a column mask. Meaningful only when governance_checked is true.
row_filterstringThe row filter on the relation. Meaningful only when governance_checked is true.
governance_checkedboolWhether masks and row filters could be looked up. When false, empty masked_columns and row_filter mean “not asked”, not “none”.
truncated_cellsint32Number of cells shortened to cell_limit bytes.
cell_limitint32Per-cell byte bound.
caveatsrepeated stringSentences to show beside the rows. Never empty.

SampleRow

FieldTypeDescription
cellsrepeated SampleCellThe row’s cells, in DatasetSample.columns order.

SampleCell

Keeps NULL distinguishable from the empty string and from the literal text “NULL”. Render is_null in a way that an empty value cannot produce.

FieldTypeDescription
is_nullboolTrue when the cell is NULL.
valuestringThe cell’s value as a string. Empty with is_null false is an empty string.

RunnerHello

FieldTypeDescription
runner_idstringChosen by the runner and kept across reconnects, so that a restart reclaims the same slot. The server sanitises it and namespaces it by the verified tenant.
namestringDisplay name. Defaults to the id when empty. It is never used for routing.
versionstringThe runner’s build. Reported, but not enforced.
capabilitiesrepeated stringWork kinds the runner claims it can execute, for example fetch. These are unverified claims.
load_scoredoubleThe runner’s own 0 to 1 utilisation estimate at connect time. It is used to pick the least-loaded runner.

RunnerHeartbeat

FieldTypeDescription
load_scoredoubleCurrent 0 to 1 utilisation estimate.

RunnerWorkResult

FieldTypeDescription
dispatch_idstringEchoes RunnerWorkAssignment.dispatch_id. A result with an unknown id is dropped.
errorstringRunner-side failure, when no response could be produced. It is mutually exclusive with fetch, and a result carrying neither is a protocol fault.
fetchRunFetchResponseoneof payload. The fetch result. See Fetch.

EnrollmentAccepted

FieldTypeDescription
runner_idstringThe server’s id for this runner, as shown in ListRunners: the sanitised form of the id in the hello, or a generated one.
tenant_idstringThe tenant, read from the verified token claims, never from the hello.
heartbeat_interval_secondsint64Advised heartbeat interval (currently 15). Advisory only: nothing evicts a runner for missing heartbeats.

RunnerWorkAssignment

FieldTypeDescription
dispatch_idstringCorrelates the assignment with its RunnerWorkResult. Unique per in-flight dispatch on the stream.
fetchRunFetchRequestoneof work. The fetch to execute. See Fetch.

Enums

CredentialState

What this instance knows about a connection’s credential bundle, computed without dialling anything. This is a different question from TestConnection, and the two should be shown as separate marks.

ValueMeaning
CREDENTIAL_STATE_UNSPECIFIEDNot computed. This is the value on every RPC except ListConnections. It is neither present nor absent.
CREDENTIAL_STATE_PRESENTA bundle was found on this node and opened. Nothing was dialled, so an expired password still reads as present.
CREDENTIAL_STATE_NONE_NEEDEDThere is no bundle, and this type reads no secret (for example Excel and Document). A normal, complete state. It is not a missing credential.
CREDENTIAL_STATE_ABSENTThere is no bundle for a type that needs one. This cannot tell “the credential was lost” apart from “no credential was ever entered”.
CREDENTIAL_STATE_UNREADABLEA bundle exists but could not be opened: it is sealed with a key this instance does not hold, it is corrupt, or it is unreadable. Re-entering the credential does not repair this.

SourceBacking

What stands behind a connection on this instance. Computed from the connection’s address, never from its name, and without dialling anything. This is a different question from environment.

ValueMeaning
SOURCE_BACKING_UNSPECIFIEDNot computed. This is the value on every RPC except ListConnections.
SOURCE_BACKING_LIVENothing this deployment ships stands in for the connection. This does not mean it is reachable. A connection pointed at a host that does not exist is also LIVE.
SOURCE_BACKING_MOCK_SERVICEThe address is one of the demo estate’s mock services, never a customer system. This says nothing about whether that mock is deployed or reachable.
SOURCE_BACKING_MOCK_SEED_FILEBundled sample rows would be substituted if the connector failed. Current servers never return this value, because no variant substitutes sample rows for a failed connector.

DeleteConnectionOutcome

ValueMeaning
DELETE_CONNECTION_OUTCOME_UNSPECIFIEDNot computed. This is not “deleted” and not “not found”.
DELETE_CONNECTION_OUTCOME_DELETEDThe instance held the connection and no longer does. Its credential bundle was removed first.
DELETE_CONNECTION_OUTCOME_NOT_FOUNDThis instance does not hold that id, and nothing was deleted. This is the normal answer for a stale list or a repeated delete.
DELETE_CONNECTION_OUTCOME_FAILEDThe delete was attempted and failed, or the id was empty. The connection may still exist, and message carries the error.