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.
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
| Service | RPC | Kind | Purpose |
|---|---|---|---|
| ConfigService | ListConnections | Unary | List stored connections, each with its credential state and source backing |
| ConfigService | CreateConnection | Unary | Store a connection together with its credentials |
| ConfigService | DeleteConnection | Unary | Remove a connection and its credential bundle |
| ConfigService | TestConnection | Unary | Live-probe a stored connection where the connector supports it |
| ConfigService | ExploreConnection | Unary | Read a source’s catalogue (datasets, columns, keys, governance) without reading rows |
| ConfigService | SampleConnectionDataset | Unary | Read a bounded sample of real rows from one dataset |
| ConfigService | ListRunners | Unary | List registered, managed and self-enrolled runners |
| ConfigService | CreateRunner | Unary | Register a runner |
| ConfigService | GetRunnerHealth | Unary | Process health of the serving instance, with unmeasured fields named |
| ConfigService | ListResources | Unary | List the agent grammar and prompt-template resources bundled with the deployment |
| ConfigService | CreateDatabricksCluster | Unary | Create a Databricks cluster and wait for it to run |
| ConfigService | RunDatabricksJob | Unary | Create a Databricks notebook job on an existing cluster and run it |
| ConfigService | GetIntegrationConfig | Unary | Read integration settings (secrets reported as configured or not) |
| ConfigService | SetIntegrationConfig | Unary | Save integration settings; secrets are write-only |
| RunnerEnrollmentService | Enroll | Bidirectional streaming | A 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:
INTERNALwhen 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
| Field | Type | Description |
|---|---|---|
connections | repeated Connection | Every stored connection. credential_state and source_backing are filled on each row. |
warnings | repeated string | Conditions 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: falsewithmessage: noconnectionin the request, an id that already exists, an invalid id, a missingtype, 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.idis empty, the server generates one. Either way the id comes back inconnection_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.typeis 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
credentialsmap, 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. Apropertiesentry 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
| Field | Type | Description |
|---|---|---|
connection | Connection | The connection to store. credential_state and source_backing are ignored on input. |
credentials | map<string, string> | Secret values, keyed by the type’s credential key names. Stored in the credential store. Never returned. |
Response: CreateConnectionResponse
| Field | Type | Description |
|---|---|---|
success | bool | True when the connection and its credentials were stored. |
connection_id | string | The connection’s id, which the server generated if the request left it empty. Set on failure as well. |
message | string | The reason on failure. Empty on success. |
warnings | repeated string | Storage-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_FOUNDfor an unknown id,DELETE_CONNECTION_OUTCOME_FAILEDfor 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_FOUNDmeans 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
| Field | Type | Description |
|---|---|---|
connection_id | string | The 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
| Field | Type | Description |
|---|---|---|
success | bool | Exactly outcome == DELETE_CONNECTION_OUTCOME_DELETED. Branch on outcome. |
outcome | DeleteConnectionOutcome | Which of the three results happened. |
connection_id | string | The id that was asked about, echoed back on every path. It is empty when the request id was empty. |
message | string | Human-readable detail. On FAILED it carries the underlying error. Do not branch on it. |
warnings | repeated string | Storage-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: falsewithmessagewhen 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:
success | live_check_performed | Meaning |
|---|---|---|
| true | true | The source answered and accepted the credentials (“Connectivity verified”). |
| true | false | The connector for this type has no live probe. The configuration is stored and nothing was verified. This is not a failure. |
| false | true | The probe ran and failed. message carries the connector’s error. |
| false | false | No 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
| Field | Type | Description |
|---|---|---|
connection_id | string | The stored connection to test. Credentials are read from the credential store. They are never sent on this call. |
Response: TestConnectionResponse
| Field | Type | Description |
|---|---|---|
success | bool | See the table above. |
message | string | Human-readable result or error. Do not branch on it. |
live_check_performed | bool | Whether 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, thendescription.supported,description.reasonanddescription.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_attemptedis false anddescription.supportedis false, withreasonsaying which. - When the connector ran and failed,
discovery_attemptedis true,supportedis false, andreasonquotes 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: falsecan 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
aspectsbefore 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
| Field | Type | Description |
|---|---|---|
connection_id | string | The stored connection to explore. Credentials are read from the credential store by id. |
Response: ExploreConnectionResponse
| Field | Type | Description |
|---|---|---|
description | SourceDescription | What the source said. Always set. datasets[].sample is always unset. |
discovery_attempted | bool | Whether 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: falsewithreasonand nosample.
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:
namemust be non-empty.row_limitmust 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.The connection is resolved, and its connector must support sampling.
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
qualifiermatches any), the sample is still taken andsample.governance_checkedis false.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.basiscarries the sample size, andsample.caveatsis 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_filterandgovernance_checkedbeside the rows. - The sampling methods differ. A
FIRST_ROWSread 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
| Field | Type | Description |
|---|---|---|
connection_id | string | The stored connection. |
qualifier | string | The 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. |
name | string | The dataset’s name as discovery reported it. Required. |
row_limit | int32 | Row bound, 0 to 1000. 0 means the connector’s default. Values outside the range are refused. No value produces an unbounded read. |
Response: SampleConnectionDatasetResponse
| Field | Type | Description |
|---|---|---|
sample | DatasetSample | The rows and everything needed to interpret them. Unset when nothing was sampled. It is never an empty sample. |
sampled | bool | Whether a sampler actually read rows from the source. |
reason | string | Why 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:
- The managed runner. An entry named
Runink Managed Runneris always listed first unless a stored runner already has that name. It hastypeCloudRun. ItsstateisRUNNING, with the forwarding endpoint, only when a live heartbeat from a managed runner is present in the replicated registry. OtherwisestateisUNKNOWN.compute_unitsis 0, which means unknown: provisioned capacity is not metered. - Stored runners, registered with CreateRunner. These are returned exactly
as stored, including their
statestring. - Self-enrolled runners that currently hold an open Enroll stream, scoped to the
caller’s own tenant. Each has
typeLocal, an emptyendpoint(it has no address the control plane can dial),stateRUNNING, an emptylocal_config, and adescriptionthat gives the time the stream opened, the time since the last message and the reported load.RUNNINGhere 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
| Field | Type | Description |
|---|---|---|
runners | repeated Runner | Managed, 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
| Field | Type | Description |
|---|---|---|
runner | Runner | The runner to store. |
Response: CreateRunnerResponse
| Field | Type | Description |
|---|---|---|
success | bool | True when the runner was stored. |
runner_id | string | Server-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
| Field | Type | Description |
|---|---|---|
cpu_usage | double | Host CPU utilisation, as a percentage. It is 0 and listed in unmeasured when the CPU cannot be sampled. |
memory_usage | double | Heap memory currently allocated by the process, in MB. |
active_goroutines | int32 | Number of goroutines in the process. |
request_rate | double | Not measured in this build (always listed in unmeasured). |
latency_p95 | double | Not measured in this build (always listed in unmeasured). |
error_rate | double | Not measured in this build (always listed in unmeasured). |
raft_status | string | Raft role (“Leader”, “Follower”). Not measured in this build: always empty and listed in unmeasured. |
raft_index | int64 | Not measured in this build (always listed in unmeasured). |
active_nodes | int32 | Not measured in this build (always listed in unmeasured). |
unmeasured | repeated string | Names 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_PRECONDITIONwhen the deployment’s bundled agent-resource catalogue is not available, which is a packaging fault and not an empty catalogue.INTERNALwhen 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
| Field | Type | Description |
|---|---|---|
resources | repeated Resource | The bundled resources. |
CreateDatabricksCluster
rpc CreateDatabricksCluster(CreateDatabricksClusterRequest) returns (CreateDatabricksClusterResponse);- Kind: Unary.
- Auth: Bearer session. Service-account tokens are refused. It is refused with
PERMISSION_DENIEDon 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) returnssuccess: falsewitherror_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
| Field | Type | Description |
|---|---|---|
cluster_name | string | Name for the new cluster. |
num_workers | int32 | Worker count. 0 means 1. |
autotermination_minutes | int32 | Idle minutes before the cluster terminates. 0 means 15. |
databricks_host | string | Workspace URL, for example https://<workspace>.cloud.databricks.com. |
databricks_token | string | Personal access token for the workspace. Used for this call only, and never stored or returned. |
spark_version | string | Optional. Empty means the latest LTS runtime. |
node_type_id | string | Optional. Empty means the smallest node type with local disk. |
Response: CreateDatabricksClusterResponse
| Field | Type | Description |
|---|---|---|
success | bool | True when the cluster was created and reached a running state. |
cluster_id | string | The Databricks cluster id. |
cluster_url | string | Link to the cluster’s configuration page in the workspace. |
state | string | The cluster state reported by Databricks, for example RUNNING. |
error_message | string | The 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: falsewitherror_messagewhen 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
| Field | Type | Description |
|---|---|---|
job_name | string | Name of the job to create. |
job_description | string | Description of the job’s task. |
task_key | string | Key of the job’s single task. |
existing_cluster_id | string | The cluster to run the task on. |
notebook_path | string | Workspace path of the notebook to run. |
databricks_host | string | Workspace URL. |
databricks_token | string | Personal access token for the workspace. Used for this call only, and never stored or returned. |
Response: RunDatabricksJobResponse
| Field | Type | Description |
|---|---|---|
success | bool | True when the job was created and run and the run’s status was obtained. |
job_id | int64 | The Databricks job id. |
run_id | int64 | The Databricks run id. |
job_url | string | Link to the job in the workspace. |
run_url | string | Link to the run in the workspace. |
error_message | string | The reason when success is false. |
GetIntegrationConfig
rpc GetIntegrationConfig(GetIntegrationConfigRequest) returns (GetIntegrationConfigResponse);- Kind: Unary.
- Auth: Bearer session. Service-account tokens are refused.
- Errors:
INTERNALwhen 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
| Field | Type | Description |
|---|---|---|
whatsapp_phone_number | string | WhatsApp number used for outbound notifications. Empty when unset. |
carrier_phone_number | string | Number used for carrier calls. Empty when unset. |
sms_phone_number | string | Number used for SMS. Empty when unset. |
google_analytics_id | string | Google Analytics id. |
partners | repeated Partner | Partner links. |
stripe_configured | bool | True 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_configured | bool | True 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: falsewithmessagewhen 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
| Field | Type | Description |
|---|---|---|
stripe_api_key | string | Stripe secret key. Write-only. Empty keeps the stored key. |
whatsapp_phone_number | string | Full replacement. |
carrier_phone_number | string | Full replacement. |
sms_phone_number | string | Full replacement. |
google_credentials | string | Google service-account credentials. Write-only. Empty keeps the stored value. |
google_analytics_id | string | Full replacement. |
partners | repeated Partner | Full replacement of the partner list. |
remove_stripe_api_key | bool | Erase the stored Stripe key. Takes precedence over a non-empty stripe_api_key. |
remove_google_credentials | bool | Erase the stored Google credentials. Takes precedence over a non-empty google_credentials. |
Response: SetIntegrationConfigResponse
| Field | Type | Description |
|---|---|---|
success | bool | True when the settings were saved. |
message | string | Result 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 ahello, a secondhelloarrives on an established stream, or a message of an unrecognised kind arrives.
Protocol:
- The runner opens the stream and sends
EnrollRequest{hello}first. Anything else is refused and nothing is registered. - The server registers the runner under the caller’s verified tenant and answers
EnrollResponse{accepted}. - The runner sends
heartbeatmessages with its current load, and the server may sendassignmentmessages at any time. Each assignment carries adispatch_idand aRunFetchRequest. The runner answers withEnrollRequest{result}, quoting the samedispatch_id. A result whosedispatch_idmatches no in-flight dispatch is dropped. - 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,versionandcapabilitiesare 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/RunFetchruns for a tenant that has enrolled runners, the fetch goes down one of their streams. Arunner_idthat names an enrolled runner selects that runner and is never redirected. With norunner_id, the least-loaded enrolled runner is chosen. With no matching enrolled runner, the platform uses its normal path. If the result carrieserror, the fetch fails withINTERNAL. If it carries neithererrornorfetch, that is a protocol fault and is reported asINTERNAL. If the runner does not answer within 10 minutes, the fetch returnsDEADLINE_EXCEEDED, and the run may still be in progress on the runner. A runner that disconnects before the work is sent causesUNAVAILABLE. See Fetch forRunFetchRequestandRunFetchResponse. - 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
| Field | Type | Description |
|---|---|---|
hello | RunnerHello | oneof message. Must be the first message, and only the first. |
heartbeat | RunnerHeartbeat | oneof message. Updates the runner’s reported load. |
result | RunnerWorkResult | oneof message. The answer to an assignment. |
Response stream: EnrollResponse
| Field | Type | Description |
|---|---|---|
accepted | EnrollmentAccepted | oneof message. Sent once, in answer to the hello. |
assignment | RunnerWorkAssignment | oneof 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.
| Field | Type | Description |
|---|---|---|
name | string | Display name. Not required, and never interpreted. Use source_backing to tell a demo mock from a live system, never the name. |
type | string | Connection type. Required on create. The server normalises it to the canonical type name. |
environment | string | Free-form tier label of the customer’s estate, for example prod, uat or demo. It does not say whether the source is a mock. |
runner | string | The runner this connection is associated with. |
id | string | Connection id. On create, the server generates one when this is empty. |
excel | ExcelConnectionConfig | oneof config. |
sharepoint | SharePointConnectionConfig | oneof config. |
mysql | MySqlConnectionConfig | oneof config. |
postgres | PostgresConnectionConfig | oneof config. |
bigquery | BigQueryConnectionConfig | oneof config. |
databricks | DatabricksConnectionConfig | oneof config. |
snowflake | SnowflakeConnectionConfig | oneof config. |
hubspot | HubspotConnectionConfig | oneof config. |
salesforce | SalesforceConnectionConfig | oneof config. |
guidewire | GuidewireConnectionConfig | oneof config. |
sap | SAPConnectionConfig | oneof config. |
inventory | InventoryConnectionConfig | oneof config. |
oms | OMSConnectionConfig | oneof config. Older per-system shape. New connections use logistics_api. |
whs | WHSConnectionConfig | oneof config. Older per-system shape. New connections use logistics_api. |
document | DocumentConnectionConfig | oneof config. |
d365 | D365ConnectionConfig | oneof config. |
servicenow | ServiceNowConnectionConfig | oneof config. |
tms | TMSConnectionConfig | oneof config. Older per-system shape. New connections use logistics_api. |
yms | YMSConnectionConfig | oneof config. Older per-system shape. New connections use logistics_api. |
ims | InventoryConnectionConfig | oneof config. IMS reuses the inventory shape. |
iot | IoTConnectionConfig | oneof config. |
cctv | CctvConnectionConfig | oneof config. |
object_store | ObjectStoreConnectionConfig | oneof config. |
mqtt | MQTTConnectionConfig | oneof config. |
rfid | RFIDConnectionConfig | oneof config. |
gps | GPSConnectionConfig | oneof config. |
sensor_gateway | SensorGatewayConnectionConfig | oneof config. |
logistics_api | LogisticsAPIConnectionConfig | oneof config. The shared shape for new OMS, WMS, WHS, YMS, TMS and IMS connections. |
kafka | KafkaConnectionConfig | oneof config. |
properties | map<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_state | CredentialState | What this node knows about the connection’s credential bundle. Filled by ListConnections only, and UNSPECIFIED everywhere else. |
source_backing | SourceBacking | What 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.
type | Config member | Credential keys |
|---|---|---|
excel | excel | none |
sharepoint | sharepoint | client_secret |
mysql | mysql | password |
postgres | postgres | password |
bigquery | bigquery | service_account_json |
databricks | databricks | personal_access_token |
snowflake | snowflake | password |
hubspot | hubspot | api_key |
salesforce | salesforce | password, security_token, client_secret |
guidewire | guidewire | password |
sap | sap | password |
inventory | inventory | api_key |
ims | ims | api_key |
oms | oms | api_key |
whs | whs | api_key |
tms | tms | api_key |
yms | yms | api_key |
iot | iot | api_key |
cctv | cctv | password |
document | document | none |
objectstore | object_store | access_key, secret_key, session_token, service_account_json, account_key, sas_token (whichever the provider uses) |
d365 | d365 | client_secret |
servicenow | servicenow | password, client_secret |
mqtt | mqtt | password |
rfid | rfid | token, api_key, password |
gps | gps | token, api_key, password |
sensorgateway | sensor_gateway | token, api_key, password |
logisticsapi | logistics_api | api_key, token, password, client_secret (per auth_mode) |
kafka | kafka | password (SASL), schema_registry_password |
github | none (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
| Field | Type | Description |
|---|---|---|
file_path | string | Location of the workbook. |
has_header | bool | Whether the first row is a header. |
SharePointConnectionConfig
| Field | Type | Description |
|---|---|---|
site_url | string | SharePoint site URL. |
tenant_id | string | Directory tenant id. |
client_id | string | Application (client) id. |
client_secret | string | Secret. Write-only, empty on read. |
MySqlConnectionConfig
| Field | Type | Description |
|---|---|---|
host | string | Server host. |
port | int32 | Server port. |
database | string | Database name. |
username | string | User name. |
password | string | Secret. Write-only, empty on read. |
PostgresConnectionConfig
| Field | Type | Description |
|---|---|---|
host | string | Server host. |
port | int32 | Server port. |
database | string | Database name. |
username | string | User name. |
password | string | Secret. Write-only, empty on read. |
ssl_mode | string | TLS mode. |
BigQueryConnectionConfig
| Field | Type | Description |
|---|---|---|
project_id | string | Google Cloud project id. |
dataset_id | string | BigQuery dataset id. |
service_account_json | string | Secret. 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.
| Field | Type | Description |
|---|---|---|
host | string | Workspace host. |
http_path | string | SQL warehouse or cluster HTTP path. |
personal_access_token | string | Secret. Write-only, empty on read. |
cluster_policy_id | string | Runner deploy: a cluster policy id (letters and digits). |
node_type_id | string | Runner deploy: a node type id, for example i3.xlarge. |
spark_version | string | Runner deploy: a Databricks Runtime version, for example 15.4.x-scala2.12. |
runner_artifact | string | Runner deploy: a Unity Catalog volume path (/Volumes/catalog/schema/volume/...), with no .. segment. Must be set together with runner_artifact_sha256. |
runner_artifact_sha256 | string | Runner deploy: 64 lowercase hex characters. Must be set together with runner_artifact. |
runner_scope | string | Runner deploy: the name of a Databricks secret scope (letters, digits, -, _, @, ., at most 128 characters). It is never a secret. |
service_principal | string | Runner 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.
| Field | Type | Description |
|---|---|---|
account | string | Snowflake account identifier. |
warehouse | string | Virtual warehouse. |
database | string | Database. |
schema | string | Schema. |
user | string | User name. |
password | string | Secret. Write-only, empty on read. |
role | string | Role to use. |
compute_pool | string | Runner deploy: a Snowflake identifier. |
image_repository | string | Runner deploy: an image repository path, /DB/SCHEMA/REPO. |
runner_image | string | Runner deploy: an image pinned by digest (core-runner@sha256:<64 lowercase hex>), never a tag. |
network_rule | string | Runner deploy: a Snowflake identifier, optionally db.schema.rule. |
external_access_integration | string | Runner deploy: a Snowflake identifier. |
HubspotConnectionConfig
| Field | Type | Description |
|---|---|---|
api_key | string | Secret. Write-only, empty on read. |
SalesforceConnectionConfig
| Field | Type | Description |
|---|---|---|
login_url | string | Login endpoint. |
username | string | User name. |
password | string | Secret. Write-only, empty on read. |
security_token | string | Secret. Write-only, empty on read. |
client_id | string | Connected-app client id. |
client_secret | string | Secret. Write-only, empty on read. |
GuidewireConnectionConfig
| Field | Type | Description |
|---|---|---|
base_url | string | API base URL. |
username | string | User name. |
password | string | Secret. Write-only, empty on read. |
tenant_id | string | Tenant id. |
SAPConnectionConfig
| Field | Type | Description |
|---|---|---|
system_id | string | SAP system id. |
client | string | SAP client. |
username | string | User name. |
password | string | Secret. Write-only, empty on read. |
host | string | Application server host. |
system_number | string | SAP system number. |
InventoryConnectionConfig
Used by both inventory and ims.
| Field | Type | Description |
|---|---|---|
base_url | string | API base URL. |
api_key | string | Secret. Write-only, empty on read. |
provider | string | Vendor, for example “Manhattan” or “Oracle”. |
OMSConnectionConfig
| Field | Type | Description |
|---|---|---|
base_url | string | API base URL. |
api_key | string | Secret. Write-only, empty on read. |
system_type | string | Vendor system, for example “IBM Sterling” or “NetSuite”. |
WHSConnectionConfig
| Field | Type | Description |
|---|---|---|
base_url | string | API base URL. |
api_key | string | Secret. Write-only, empty on read. |
warehouse_id | string | Warehouse id. |
TMSConnectionConfig
| Field | Type | Description |
|---|---|---|
base_url | string | API base URL. |
api_key | string | Secret. Write-only, empty on read. |
provider | string | Vendor. |
YMSConnectionConfig
| Field | Type | Description |
|---|---|---|
base_url | string | API base URL. |
api_key | string | Secret. Write-only, empty on read. |
yard_id | string | Yard id. |
IoTConnectionConfig
| Field | Type | Description |
|---|---|---|
endpoint | string | Endpoint address. |
api_key | string | Secret. Write-only, empty on read. |
protocol | string | For example MQTT or AMQP. For a subscription with topics, use MQTTConnectionConfig. |
CctvConnectionConfig
A video feed that the CCTV extractor samples frames from.
| Field | Type | Description |
|---|---|---|
endpoint_url | string | An rtsp:// or http(s):// feed, or a file the server can read. Empty for a device-capture source. |
username | string | Optional RTSP user name. Kept out of the URL so that the credential never sits in a logged or displayed string. |
password | string | Secret. Optional RTSP password. Write-only, empty on read. |
max_frames | int32 | Frames sampled per extraction. 0 means the server default, not “none”. |
transport | string | RTSP transport: tcp (default) or udp. |
device_capture | bool | Marks 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
| Field | Type | Description |
|---|---|---|
storage_bucket | string | Bucket holding the documents. |
document_type | string | For example “Invoices” or “BOLs”. |
filter_prefix | string | Key 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.
| Field | Type | Description |
|---|---|---|
provider | string | gcs, s3 or azure. Validated when the connector connects. |
bucket | string | Bucket, or container for Azure. |
prefix | string | Optional key prefix that scopes the connection to part of the bucket. |
region | string | S3 region. Ignored by GCS and Azure. |
endpoint | string | Optional S3-compatible endpoint. Empty means AWS. |
account | string | Azure storage account name. Ignored by the other providers. |
use_tls | bool | Whether the S3-compatible endpoint uses TLS. Defaults to false. Set it for public S3. |
D365ConnectionConfig
| Field | Type | Description |
|---|---|---|
base_url | string | Environment base URL. |
tenant_id | string | Directory tenant id. |
client_id | string | Application (client) id. |
client_secret | string | Secret. Write-only, empty on read. |
ServiceNowConnectionConfig
| Field | Type | Description |
|---|---|---|
instance_url | string | Instance URL. |
username | string | User name. |
password | string | Secret. Write-only, empty on read. |
client_id | string | OAuth client id. |
client_secret | string | Secret. 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"].
| Field | Type | Description |
|---|---|---|
broker_url | string | tcp://host:port, tls://host:port or ws(s)://host/mqtt. |
topics | repeated string | Topic filters to subscribe to. The broker honours the MQTT wildcards. Empty is a configuration error, never “everything”. |
qos | int32 | 0, 1 or 2. Defaults to 1 (at-least-once). |
client_id | string | Client id presented on connect. Empty means a stable id derived from the connection id. |
username | string | User name. |
collect_seconds | int32 | How long a fetch listens before returning. 0 means the server default. |
max_messages | int32 | Cap on messages returned by one fetch. 0 means the server default. |
protocol_version | int32 | 4 (MQTT 3.1.1, the default) or 5. |
use_tls | bool | Verify the broker’s certificate. Defaults to false. Set it for anything that crosses a network boundary. |
insecure_skip_verify | bool | Skip certificate verification. |
RFIDConnectionConfig
A pallet or case reader: a dock-door portal, handheld sled or conveyor tunnel.
| Field | Type | Description |
|---|---|---|
protocol | string | llrp (default) or http. |
endpoint | string | For LLRP, host or host:port. For HTTP, the reader’s base URL. |
reader_id | string | Operator-facing reader identity, carried onto every reading. |
antenna_ports | repeated int32 | Antenna ports to enable. Empty means every antenna the reader reports. |
location | string | Where the reader physically is, for example dock_door_3. |
collect_seconds | int32 | Length of an inventory round. 0 means the server default. |
max_reads | int32 | Cap on tag reports per fetch. 0 means the server default. |
report_duplicates | bool | Report every sighting of the same EPC instead of first and last seen. Off by default. |
use_tls | bool | Use TLS to the reader. |
GPSConnectionConfig
Vehicle or trailer position and the sensor channels attached to it.
| Field | Type | Description |
|---|---|---|
provider | string | samsara, geotab, generic_rest or nmea. |
endpoint | string | REST base URL, or host:port for nmea. |
asset_ids | repeated string | Restrict the fetch to these assets. Empty means the whole fleet the credential can see. |
lookback_minutes | int32 | Only fixes from this many minutes ago onwards. 0 means the server default. |
collect_seconds | int32 | For nmea, how long to listen. 0 means the server default. |
include_sensors | bool | Also 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.
| Field | Type | Description |
|---|---|---|
transport | string | modbus_tcp (default), http or mqtt. |
endpoint | string | host:port for modbus_tcp, a base URL for http, or a broker URL for mqtt. |
unit_id | int32 | Modbus unit (slave) id. |
channels | repeated SensorChannel | The channels the gateway exposes. A gateway with no channels is a configuration error. |
collect_seconds | int32 | Length of a sampling pass for streaming transports. 0 means the server default. |
poll_interval_seconds | int32 | Seconds between polls within a pass, for modbus_tcp and http. 0 means the server default. Carried onto every reading as its sampling interval. |
use_tls | bool | Use TLS to the gateway. |
SensorChannel
One physical measurement mapped onto one register or path, with its scaling stated.
| Field | Type | Description |
|---|---|---|
asset_id | string | The asset measured, for example REEFER-12. |
device_id | string | Stable per-channel device identity. |
metric | string | temperature, infrared, humidity, shock, door or battery. Written onto the reading as given. |
address | string | For Modbus, the starting register address. For http and mqtt, the JSON pointer or topic suffix. |
register_type | string | Modbus register file: holding (default), input, coil or discrete. |
data_type | string | Modbus encoding: int16 (default), uint16, int32, uint32 or float32. The 32-bit forms read two registers. |
scale | double | value = raw * scale + offset. A scale of 0 means 1. |
offset | double | See scale. |
unit | string | Engineering unit written onto the reading, for example C, F, %RH or g. |
threshold_min | double | Lower bound from the product specification. Meaningful only when threshold_min_stated is true. |
threshold_min_stated | bool | Whether threshold_min was actually stated. |
threshold_max | double | Upper bound from the product specification. Meaningful only when threshold_max_stated is true. |
threshold_max_stated | bool | Whether threshold_max was actually stated. |
threshold_source | string | Where 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.
| Field | Type | Description |
|---|---|---|
system | string | oms, wms, whs, yms, tms or ims. Decides the default resource and the response normaliser. |
provider | string | Vendor dialect: manhattan, blue_yonder, ibm_sterling, netsuite, oracle, project44, fourkites or generic. |
base_url | string | API base URL. |
resource | string | Resource to read. Empty uses the system’s default: orders for oms, inventory for ims and wms, shipments for tms, appointments for yms. |
site_id | string | Site the connection is scoped to (warehouse id, yard id or DC code). |
auth_mode | string | api_key (default, sent as a header), bearer, basic or oauth2_client_credentials. |
api_key_header | string | Header that carries the API key. Empty means X-API-Key. This is a header name, not a secret. |
token_url | string | OAuth2 token endpoint, for oauth2_client_credentials. |
scope | string | OAuth2 scope. |
page_size | int32 | Page size requested from the API. 0 means the server default. |
max_records | int32 | Hard cap on records per fetch. 0 means the server default. |
lookback_minutes | int32 | Only 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"].
| Field | Type | Description |
|---|---|---|
bootstrap_servers | repeated string | Broker addresses to bootstrap from. List several, so that one broker being down does not make the connection unusable. |
topics | repeated string | Topic prefix filters over the catalogue read. Empty is normal and means every topic. Enumerating topics reads no records. |
client_id | string | The 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_protocol | string | plaintext (default), ssl, sasl_plaintext or sasl_ssl. This one setting decides whether the wire is encrypted. |
sasl_mechanism | string | Read 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. |
username | string | SASL user name. |
schema_registry_url | string | Base 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_username | string | HTTP basic-auth user for the registry. |
insecure_skip_verify | bool | Skip verification of the broker and registry certificates. |
Runner
A runner definition. Stored runners are returned exactly as they were created.
| Field | Type | Description |
|---|---|---|
state | string | For 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. |
name | string | Runner name. On create, it defaults to the generated id when empty. |
endpoint | string | Address used to reach the runner. Empty for self-enrolled runners. |
compute_units | double | Compute units. On create, 0 is stored as 1. 0 on the managed entry means unknown. |
description | string | Free-text description. For managed and enrolled entries, the server writes it to say what liveness was observed. |
type | string | Runner kind, for example CloudRun for the managed entry or Local for enrolled runners. |
port | int32 | Port, stored as given. |
cpus | int32 | CPU count, stored as given. |
memory | string | Memory size, stored as given. |
image_repository | string | Image repository, stored as given. |
local_config | LocalRunnerConfig | oneof deployment_config. Set (and empty) on self-enrolled runners. |
cloudrun_config | CloudRunRunnerConfig | oneof deployment_config. |
snowflake_config | SnowflakeRunnerConfig | oneof deployment_config. |
databricks_config | DatabricksRunnerConfig | oneof deployment_config. |
legacy_container_config | ContainerDeploymentConfig | oneof deployment_config. |
LocalRunnerConfig
| Field | Type | Description |
|---|---|---|
binary_path | string | Runner binary location. |
work_dir | string | Working directory. |
env_vars | map<string, string> | Environment for the runner process. This map is stored and returned as given, so do not put secrets in it. |
CloudRunRunnerConfig
| Field | Type | Description |
|---|---|---|
project_id | string | Google Cloud project id. |
region | string | Region. |
service_name | string | Service name. |
image_url | string | Container image. |
service_account | string | Service account the service runs as. |
SnowflakeRunnerConfig
| Field | Type | Description |
|---|---|---|
compute_pool | string | Snowpark Container Services compute pool. |
min_nodes | int32 | Minimum nodes. |
max_nodes | int32 | Maximum nodes. |
image_repository | string | Image repository. |
DatabricksRunnerConfig
| Field | Type | Description |
|---|---|---|
cluster_id | string | Cluster to run on. |
notebook_path | string | Notebook to run. |
task_key | string | Job task key. |
ContainerDeploymentConfig
| Field | Type | Description |
|---|---|---|
min_instances | int32 | Minimum instances. |
max_instances | int32 | Maximum instances. |
ttl_seconds | int32 | Instance time-to-live, in seconds. |
cidr_block | string | Network CIDR block. |
Resource
| Field | Type | Description |
|---|---|---|
name | string | The resource’s path within the bundled catalogue. |
type | string | grammar or template. |
content | string | Base64-encoded content. For a template, this is the extracted system prompt, not the raw file. |
Partner
| Field | Type | Description |
|---|---|---|
name | string | Partner name. |
url | string | Partner link. |
description | string | Description. |
message | string | Message 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.
| Field | Type | Description |
|---|---|---|
supported | bool | False when the connector cannot enumerate anything. reason then says why. False is a real answer, not an empty success. |
reason | string | Set 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. |
datasets | repeated DescribedDataset | What the source says it holds. Empty with supported true means the source answered and has nothing visible. |
aspects | repeated DiscoveryAspect | What 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.
| Field | Type | Description |
|---|---|---|
name | string | The source’s own identifier, verbatim. It never carries a network address. |
kind | string | What the source calls this shape, for example table, view, object, topic, sheet, endpoint or stream. Free-form. |
qualifier | string | The namespace (schema, database, bucket or channel). Empty when the source has no such concept. |
columns | repeated DescribedColumn | The dataset’s fields. |
row_count | int64 | Meaningful only when row_count_stated is true. |
row_count_stated | bool | Whether the source stated a row count. |
row_count_basis | string | How the count was obtained. Always set when row_count_stated is true. |
description | string | The dataset’s own comment, verbatim. Empty when the source publishes none. It is never generated. |
definition | string | The 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_truncated | bool | True when definition is only a prefix. |
bytes | int64 | Size. Meaningful only when bytes_stated is true. |
bytes_stated | bool | Whether the source stated a size. |
bytes_basis | string | Which size it is (for example active storage as opposed to history). |
last_altered | string | The 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_stated | bool | Whether the source stated last_altered. |
relationships | repeated DeclaredRelationship | Primary, unique and foreign keys that the source declares. Empty does not mean there are no keys (see aspects). |
sample | DatasetSample | Always unset in ExploreConnection responses. |
tags | map<string, string> | The source’s structured metadata. Keys keep the source’s spelling and case. |
row_filter | string | The row-level security function applied, if one is published. Empty does not mean unfiltered unless the matching aspect was read. |
partition_key | string | The 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_basis | string | How partition_key was learned, for example NAME_MATCH. Always set when partition_key is set. |
DescribedColumn
| Field | Type | Description |
|---|---|---|
name | string | Verbatim from the source. |
declared_type | string | The source’s own type name, for example NUMBER(38,0) or picklist. It is not normalised. Empty when the source declares no type. |
nullable | bool | Meaningful only when nullable_stated is true. |
nullable_stated | bool | Whether the source publishes nullability. |
unit | string | Unit, set only where the source or the column name states it. It is never inferred. |
unit_stated | bool | Whether a unit was stated. |
allowed_values | repeated string | The closed vocabulary that the source publishes. It is never filled from observed values. |
allowed_values_complete | bool | Whether allowed_values is the whole vocabulary. |
pii_basis | string | How the column was flagged as personal data: NAME_MATCH, VALUE_PATTERN or SOURCE_DECLARED. Empty when it was not flagged. |
distinct | int64 | Distinct count. Meaningful only when distinct_basis is non-empty. |
distinct_basis | string | Whether distinct is an aggregate computed in the source or an estimate from a sample, with the sample size. |
nulls | int64 | Null count. Meaningful only when nulls_basis is non-empty. |
nulls_basis | string | As distinct_basis, for nulls. |
min | string | Minimum, for numeric and temporal columns only, computed in the source. Empty when not stated. |
max | string | Maximum, under the same rules as min. |
range_basis | string | How min and max were obtained. |
description | string | The column’s own comment, verbatim. Empty when the source publishes none. |
tags | map<string, string> | The source’s structured metadata for the column. Keys keep the source’s spelling. |
mask | string | The 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.
| Field | Type | Description |
|---|---|---|
name | string | Which question: tables_and_columns, relationships, view_definitions or schemas. |
source | string | The object consulted, in the source’s own words, for example INFORMATION_SCHEMA.TABLE_CONSTRAINTS. |
asked | bool | False when the aspect was skipped. detail then says why. |
readable | bool | Meaningful only when asked is true. False means the source refused. True with rows 0 means none visible to this role. |
rows | int32 | Rows the aspect’s query returned. Meaningful only when readable is true. |
detail | string | The 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.
| Field | Type | Description |
|---|---|---|
kind | string | PRIMARY KEY, UNIQUE or FOREIGN KEY, in the source’s own words. |
name | string | Constraint name, verbatim. |
columns | repeated string | This dataset’s columns in the constraint, in the source’s order. The order matters. |
references_qualifier | string | For a foreign key, the referenced dataset’s qualifier. Empty when the reference did not resolve. |
references_name | string | For a foreign key, the referenced dataset’s name. |
references_columns | repeated string | For a foreign key, the referenced columns, in order. |
enforced | bool | Meaningful only when enforced_stated is true. Read from the catalogue. |
enforced_stated | bool | Whether the catalogue stated enforcement. |
basis | string | How 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.
| Field | Type | Description |
|---|---|---|
columns | repeated string | Sampled column names, in the order of the cells. |
rows | repeated SampleRow | One entry per row. Values are strings, not typed values. |
rows_returned | int32 | The number of rows. |
row_limit | int32 | The bound actually applied. Always set. If rows_returned is below row_limit, the dataset holds no more rows. Equality means the bound was hit. |
bounded | bool | True when the answer is short because the bound stopped it, not because the source ran out. |
method | string | Statistical class: FIRST_ROWS (no randomisation), RANDOM_PERCENT (random, approximate count) or FIXED_SIZE_RANDOM (random, fixed size, not uniform). |
method_detail | string | The source’s own sampling clause, for reproducing the read. |
basis | string | SAMPLED_ROWS(n). Carry it with any figure derived from these rows. |
masked_columns | repeated string | Sampled columns that carry a column mask. Meaningful only when governance_checked is true. |
row_filter | string | The row filter on the relation. Meaningful only when governance_checked is true. |
governance_checked | bool | Whether masks and row filters could be looked up. When false, empty masked_columns and row_filter mean “not asked”, not “none”. |
truncated_cells | int32 | Number of cells shortened to cell_limit bytes. |
cell_limit | int32 | Per-cell byte bound. |
caveats | repeated string | Sentences to show beside the rows. Never empty. |
SampleRow
| Field | Type | Description |
|---|---|---|
cells | repeated SampleCell | The 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.
| Field | Type | Description |
|---|---|---|
is_null | bool | True when the cell is NULL. |
value | string | The cell’s value as a string. Empty with is_null false is an empty string. |
RunnerHello
| Field | Type | Description |
|---|---|---|
runner_id | string | Chosen 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. |
name | string | Display name. Defaults to the id when empty. It is never used for routing. |
version | string | The runner’s build. Reported, but not enforced. |
capabilities | repeated string | Work kinds the runner claims it can execute, for example fetch. These are unverified claims. |
load_score | double | The runner’s own 0 to 1 utilisation estimate at connect time. It is used to pick the least-loaded runner. |
RunnerHeartbeat
| Field | Type | Description |
|---|---|---|
load_score | double | Current 0 to 1 utilisation estimate. |
RunnerWorkResult
| Field | Type | Description |
|---|---|---|
dispatch_id | string | Echoes RunnerWorkAssignment.dispatch_id. A result with an unknown id is dropped. |
error | string | Runner-side failure, when no response could be produced. It is mutually exclusive with fetch, and a result carrying neither is a protocol fault. |
fetch | RunFetchResponse | oneof payload. The fetch result. See Fetch. |
EnrollmentAccepted
| Field | Type | Description |
|---|---|---|
runner_id | string | The server’s id for this runner, as shown in ListRunners: the sanitised form of the id in the hello, or a generated one. |
tenant_id | string | The tenant, read from the verified token claims, never from the hello. |
heartbeat_interval_seconds | int64 | Advised heartbeat interval (currently 15). Advisory only: nothing evicts a runner for missing heartbeats. |
RunnerWorkAssignment
| Field | Type | Description |
|---|---|---|
dispatch_id | string | Correlates the assignment with its RunnerWorkResult. Unique per in-flight dispatch on the stream. |
fetch | RunFetchRequest | oneof 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.
| Value | Meaning |
|---|---|
CREDENTIAL_STATE_UNSPECIFIED | Not computed. This is the value on every RPC except ListConnections. It is neither present nor absent. |
CREDENTIAL_STATE_PRESENT | A bundle was found on this node and opened. Nothing was dialled, so an expired password still reads as present. |
CREDENTIAL_STATE_NONE_NEEDED | There 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_ABSENT | There 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_UNREADABLE | A 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.
| Value | Meaning |
|---|---|
SOURCE_BACKING_UNSPECIFIED | Not computed. This is the value on every RPC except ListConnections. |
SOURCE_BACKING_LIVE | Nothing 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_SERVICE | The 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_FILE | Bundled 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
| Value | Meaning |
|---|---|
DELETE_CONNECTION_OUTCOME_UNSPECIFIED | Not computed. This is not “deleted” and not “not found”. |
DELETE_CONNECTION_OUTCOME_DELETED | The instance held the connection and no longer does. Its credential bundle was removed first. |
DELETE_CONNECTION_OUTCOME_NOT_FOUND | This 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_FAILED | The delete was attempted and failed, or the id was empty. The connection may still exist, and message carries the error. |