{
"binary": "sylphx",
"generated": "@generated by sylphx-gen. Do not edit.",
"global_flags": [
{
"default": "table",
"flag": "--output",
"summary": "Output format; tables show name, Ready, and age.",
"values": [
"table",
"json",
"yaml",
"name"
]
},
{
"flag": "--from-file",
"summary": "Read the whole request body from a YAML or JSON file.",
"type": "path"
}
],
"services": [
{
"collections": [
{
"collection": "orgs",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*}",
"method": "access.orgs.get",
"permission": "access:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}"
},
"summary": "Gets an org.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable spec fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/orgs",
"method": "access.orgs.list",
"paginates": true,
"permission": "access:read",
"positional": null,
"summary": "Lists orgs the caller can see.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"field": "org.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "org.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "org.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "org.spec.slug",
"flag": "--spec.slug",
"required": true,
"summary": "Globally unique handle, resolved to the id by clients, never the server.",
"type": "string"
},
{
"field": "org.spec.api_version",
"flag": "--spec.api-version",
"summary": "The API version (`YYYY-MM-DD`) requests are served at when neither the request nor the key pins one.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/orgs",
"method": "access.orgs.create",
"permission": "access:admin",
"positional": null,
"resource_field": "org",
"summary": "Creates an org. Access assigns the id.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "org.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "org.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "org.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "org.spec.slug",
"flag": "--spec.slug",
"required": true,
"summary": "Globally unique handle, resolved to the id by clients, never the server.",
"type": "string"
},
{
"field": "org.spec.api_version",
"flag": "--spec.api-version",
"summary": "The API version (`YYYY-MM-DD`) requests are served at when neither the request nor the key pins one.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{org.name=orgs/*}",
"method": "access.orgs.update",
"permission": "access:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "org.name",
"pattern": "orgs/{org}"
},
"resource_field": "org",
"sends_etag": true,
"summary": "Updates an org.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete every child Resource; without it a parent with children fails with FAILED_PRECONDITION.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*}",
"method": "access.orgs.delete",
"permission": "access:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}"
},
"summary": "Deletes an org and everything in it. Deletion cascades through every service, so it returns an Operation.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "orgs",
"resource_type": "access.sylphx.com/Org"
},
{
"collection": "projects",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*}",
"method": "access.projects.get",
"permission": "access:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}"
},
"summary": "Gets a project.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable spec fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*}/projects",
"method": "access.projects.list",
"paginates": true,
"permission": "access:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}"
},
"summary": "Lists projects in an org.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "project.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "project.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "project.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "project.spec.slug",
"flag": "--spec.slug",
"required": true,
"summary": "Unique within the org.",
"type": "string"
},
{
"field": "project.spec.limits.ai_spend.monthly_usd_minor",
"flag": "--spec.limits.ai-spend.monthly-usd-minor",
"summary": "Most spend per calendar month, in USD cents.",
"type": "int"
},
{
"field": "project.spec.limits.ai_spend.daily_usd_minor",
"flag": "--spec.limits.ai-spend.daily-usd-minor",
"summary": "Most spend per calendar day, in USD cents.",
"type": "int"
},
{
"field": "project.spec.limits.requests_per_minute",
"flag": "--spec.limits.requests-per-minute",
"summary": "Requests per minute.",
"type": "int"
},
{
"field": "project.spec.limits.ai_tokens_per_minute",
"flag": "--spec.limits.ai-tokens-per-minute",
"summary": "Sylphx AI tokens per minute, input and output together.",
"type": "int"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*}/projects",
"method": "access.projects.create",
"permission": "access:admin",
"positional": null,
"resource_field": "project",
"summary": "Creates a project. Access assigns the id.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "project.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "project.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "project.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "project.spec.slug",
"flag": "--spec.slug",
"required": true,
"summary": "Unique within the org.",
"type": "string"
},
{
"field": "project.spec.limits.ai_spend.monthly_usd_minor",
"flag": "--spec.limits.ai-spend.monthly-usd-minor",
"summary": "Most spend per calendar month, in USD cents.",
"type": "int"
},
{
"field": "project.spec.limits.ai_spend.daily_usd_minor",
"flag": "--spec.limits.ai-spend.daily-usd-minor",
"summary": "Most spend per calendar day, in USD cents.",
"type": "int"
},
{
"field": "project.spec.limits.requests_per_minute",
"flag": "--spec.limits.requests-per-minute",
"summary": "Requests per minute.",
"type": "int"
},
{
"field": "project.spec.limits.ai_tokens_per_minute",
"flag": "--spec.limits.ai-tokens-per-minute",
"summary": "Sylphx AI tokens per minute, input and output together.",
"type": "int"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{project.name=orgs/*/projects/*}",
"method": "access.projects.update",
"permission": "access:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "project.name",
"pattern": "orgs/{org}/projects/{project}"
},
"resource_field": "project",
"sends_etag": true,
"summary": "Updates a project.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete every child Resource; without it a parent with children fails with FAILED_PRECONDITION.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*}",
"method": "access.projects.delete",
"permission": "access:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}"
},
"summary": "Deletes a project.",
"verb": "delete"
}
],
"noun": "projects",
"resource_type": "access.sylphx.com/Project"
},
{
"collection": "envs",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*}",
"method": "access.envs.get",
"permission": "access:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Gets an environment.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable spec fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*}/envs",
"method": "access.envs.list",
"paginates": true,
"permission": "access:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}"
},
"summary": "Lists environments in a project.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "environment.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "environment.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "environment.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "environment.spec.slug",
"flag": "--spec.slug",
"required": true,
"summary": "Unique within the project, for example `production`.",
"type": "string"
},
{
"field": "environment.spec.mode",
"flag": "--spec.mode",
"required": true,
"summary": "Live or test; a test key never touches a live environment.",
"type": "enum",
"values": [
"live",
"test"
]
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*}/envs",
"method": "access.envs.create",
"permission": "access:admin",
"positional": null,
"resource_field": "environment",
"summary": "Creates an environment. Access assigns the id.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "environment.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "environment.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "environment.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "environment.spec.slug",
"flag": "--spec.slug",
"required": true,
"summary": "Unique within the project, for example `production`.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{environment.name=orgs/*/projects/*/envs/*}",
"method": "access.envs.update",
"permission": "access:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "environment.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"resource_field": "environment",
"sends_etag": true,
"summary": "Updates an environment.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete every child Resource; without it a parent with children fails with FAILED_PRECONDITION.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*}",
"method": "access.envs.delete",
"permission": "access:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Deletes an environment.",
"verb": "delete"
}
],
"noun": "envs",
"resource_type": "access.sylphx.com/Environment"
},
{
"collection": "service_enablements",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/service_enablements/*}",
"method": "access.service_enablements.get",
"permission": "access:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/service_enablements/{service_enablement}"
},
"summary": "Gets a service enablement.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable spec fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*}/service_enablements",
"method": "access.service_enablements.list",
"paginates": true,
"permission": "access:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}"
},
"summary": "Lists the service enablements of a project, one per service.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"field": "service_enablement.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "service_enablement.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "service_enablement.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "service_enablement.spec.enabled",
"flag": "--spec.enabled",
"required": true,
"summary": "Whether the project's keys may reach the service.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{service_enablement.name=orgs/*/projects/*/service_enablements/*}",
"method": "access.service_enablements.update",
"permission": "access:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "service_enablement.name",
"pattern": "orgs/{org}/projects/{project}/service_enablements/{service_enablement}"
},
"resource_field": "service_enablement",
"sends_etag": true,
"summary": "Enables or disables a service on a project (`spec.enabled`).",
"update_mask": "from-flags",
"verb": "update"
}
],
"noun": "service-enablements",
"resource_type": "access.sylphx.com/ServiceEnablement"
},
{
"collection": "api_keys",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/api_keys/*}",
"method": "access.api_keys.get",
"permission": "access:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/api_keys/{api_key}"
},
"summary": "Gets an API key.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable spec fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/api_keys",
"method": "access.api_keys.list",
"paginates": true,
"permission": "access:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists API keys in an environment, or the org-wide keys of an org.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "api_key.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "api_key.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "api_key.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "api_key.spec.kind",
"flag": "--spec.kind",
"required": true,
"summary": "Secret (server-side) or publishable (browser, `publishable_ok` methods only).",
"type": "enum",
"values": [
"secret",
"publishable"
]
},
{
"field": "api_key.spec.scopes",
"flag": "--spec.scopes",
"repeated": true,
"required": true,
"summary": "Scopes `<service>:<action>`, a subset of the creator's effective scopes.",
"type": "string"
},
{
"field": "api_key.spec.label",
"flag": "--spec.label",
"summary": "A free-form label, for example the talent id a key was minted for.",
"type": "string"
},
{
"field": "api_key.spec.expire_time",
"flag": "--spec.expire-time",
"summary": "When the key stops verifying; required in unclaimed projects.",
"type": "timestamp"
},
{
"field": "api_key.spec.limits.ai_spend.monthly_usd_minor",
"flag": "--spec.limits.ai-spend.monthly-usd-minor",
"summary": "Most spend per calendar month, in USD cents.",
"type": "int"
},
{
"field": "api_key.spec.limits.ai_spend.daily_usd_minor",
"flag": "--spec.limits.ai-spend.daily-usd-minor",
"summary": "Most spend per calendar day, in USD cents.",
"type": "int"
},
{
"field": "api_key.spec.limits.requests_per_minute",
"flag": "--spec.limits.requests-per-minute",
"summary": "Requests per minute.",
"type": "int"
},
{
"field": "api_key.spec.limits.ai_tokens_per_minute",
"flag": "--spec.limits.ai-tokens-per-minute",
"summary": "Sylphx AI tokens per minute, input and output together.",
"type": "int"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/api_keys",
"method": "access.api_keys.create",
"permission": "access:keys:write",
"positional": null,
"resource_field": "api_key",
"summary": "Creates an API key. Access assigns the id.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "api_key.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "api_key.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "api_key.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "api_key.spec.label",
"flag": "--spec.label",
"summary": "A free-form label, for example the talent id a key was minted for.",
"type": "string"
},
{
"field": "api_key.spec.limits.ai_spend.monthly_usd_minor",
"flag": "--spec.limits.ai-spend.monthly-usd-minor",
"summary": "Most spend per calendar month, in USD cents.",
"type": "int"
},
{
"field": "api_key.spec.limits.ai_spend.daily_usd_minor",
"flag": "--spec.limits.ai-spend.daily-usd-minor",
"summary": "Most spend per calendar day, in USD cents.",
"type": "int"
},
{
"field": "api_key.spec.limits.requests_per_minute",
"flag": "--spec.limits.requests-per-minute",
"summary": "Requests per minute.",
"type": "int"
},
{
"field": "api_key.spec.limits.ai_tokens_per_minute",
"flag": "--spec.limits.ai-tokens-per-minute",
"summary": "Sylphx AI tokens per minute, input and output together.",
"type": "int"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{api_key.name=orgs/*/projects/*/envs/*/api_keys/*}",
"method": "access.api_keys.update",
"permission": "access:keys:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "api_key.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/api_keys/{api_key}"
},
"resource_field": "api_key",
"sends_etag": true,
"summary": "Updates an API key.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/api_keys/*}",
"method": "access.api_keys.delete",
"permission": "access:keys:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/api_keys/{api_key}"
},
"summary": "Deletes an API key.",
"verb": "delete"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Revoke only if the current etag matches.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/api_keys/*}:revoke",
"method": "access.api_keys.revoke",
"permission": "access:keys:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/api_keys/{api_key}"
},
"summary": "Revokes an API key immediately; revocation propagates on its own fast path, ahead of the bulk key data.",
"verb": "revoke"
},
{
"effect": "write",
"flags": [
{
"field": "grace_period",
"flag": "--grace-period",
"summary": "How long the old key keeps verifying; default 24h.",
"type": "duration"
},
{
"field": "etag",
"flag": "--etag",
"summary": "Roll only if the current etag matches.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/api_keys/*}:roll",
"method": "access.api_keys.roll",
"permission": "access:keys:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/api_keys/{api_key}"
},
"summary": "Rolls an API key: returns a new key with the same spec and revokes the old one after the grace period.",
"verb": "roll"
}
],
"noun": "api-keys",
"resource_type": "access.sylphx.com/ApiKey"
}
],
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/whoami",
"method": "access.whoami",
"permission": "access:whoami",
"positional": null,
"summary": "Returns the caller: the principal and the scope of the key or token that authenticated this request. Clients fill their org, project, and env defaults from it; every valid key may call it, whatever its scopes.",
"verb": "whoami"
}
],
"display_name": "Sylphx Access",
"noun": "access",
"stage": "preview"
},
{
"collections": [
{
"collection": "agents",
"commands": [
{
"effect": "write",
"flags": [
{
"field": "session",
"flag": "--session",
"required": true,
"summary": "The prospective or existing session to bind this handle to.",
"type": "string"
},
{
"field": "turn",
"flag": "--turn",
"required": true,
"summary": "The turn allowed to use the execution credential.",
"type": "int"
},
{
"field": "credential",
"flag": "--credential",
"required": true,
"sensitive": true,
"summary": "The existing caller-owned credential, stored encrypted and never logged.",
"type": "string"
},
{
"field": "expires_at",
"flag": "--expires-at",
"required": true,
"summary": "The issuer-provided expiry of the captured credential.",
"type": "timestamp"
},
{
"field": "allowed_tools",
"flag": "--allowed-tools",
"repeated": true,
"required": true,
"summary": "Pinned tool names allowed to inject this credential.",
"type": "string"
},
{
"field": "purpose",
"flag": "--purpose",
"required": true,
"summary": "execution, completion, or runtime; runtime handles never enter the guest.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/agents:capture-credential",
"method": "agents.agents.capture_credential",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Captures an existing grant for one session and purpose; never issues a key.",
"verb": "capture-credential"
},
{
"effect": "write",
"flags": [
{
"field": "handle",
"flag": "--handle",
"required": true,
"sensitive": true,
"summary": "The opaque handle whose captured credential is being replaced.",
"type": "string"
},
{
"field": "generation",
"flag": "--generation",
"required": true,
"summary": "The current handle generation; stale rotations are refused.",
"type": "int"
},
{
"field": "credential",
"flag": "--credential",
"required": true,
"sensitive": true,
"summary": "The replacement issuer-provided credential, stored encrypted.",
"type": "string"
},
{
"field": "expires_at",
"flag": "--expires-at",
"required": true,
"summary": "The issuer-provided expiry of the replacement credential.",
"type": "timestamp"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/agents:rotate-credential",
"method": "agents.agents.rotate_credential",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Rotates the captured value under the same handle with generation fencing.",
"verb": "rotate-credential"
},
{
"effect": "write",
"flags": [
{
"field": "handle",
"flag": "--handle",
"required": true,
"sensitive": true,
"summary": "The opaque handle to revoke; repeated revocation is harmless.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/agents:revoke-credential",
"method": "agents.agents.revoke_credential",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Revokes one captured handle. Repeating the revocation is harmless.",
"verb": "revoke-credential"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/agents/*}",
"method": "agents.agents.get",
"permission": "agents:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agents/{agent}"
},
"summary": "Gets an agent.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/agents",
"method": "agents.agents.list",
"paginates": true,
"permission": "agents:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists agents.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "agent.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "agent.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "agent.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "agent.spec.model",
"flag": "--spec.model",
"required": true,
"summary": "The exact Sylphx AI catalog id (`ai_models`), set per Agent through the API as runtime state, never code or a deployed file. Agents in the same environment may use different models; the harness never remaps this id.",
"type": "string"
},
{
"field": "agent.spec.instructions",
"flag": "--spec.instructions",
"summary": "The system instructions, at most 256 KiB.",
"type": "string"
},
{
"field": "agent.spec.tools",
"flag": "--spec.tools",
"repeated": true,
"summary": "The tools the agent may call, at most 128, each `name` once.",
"type": "json"
},
{
"field": "agent.spec.mcp_servers",
"flag": "--spec.mcp-servers",
"repeated": true,
"summary": "The MCP servers whose tools the agent may call, at most 32.",
"type": "json"
},
{
"field": "agent.spec.skills",
"flag": "--spec.skills",
"repeated": true,
"summary": "Skills: instruction packs the agent loads when relevant, at most 64.",
"type": "json"
},
{
"field": "agent.spec.memory_stores",
"flag": "--spec.memory-stores",
"repeated": true,
"summary": "The memory stores the agent recalls from and writes to, as MemoryStore names; at most 8.",
"type": "string"
},
{
"field": "agent.spec.tool_policy.default_decision",
"flag": "--spec.tool-policy.default-decision",
"summary": "The decision for a call no rule matches; default allow.",
"type": "enum",
"values": [
"allow",
"deny",
"ask"
]
},
{
"field": "agent.spec.tool_policy.rules",
"flag": "--spec.tool-policy.rules",
"repeated": true,
"summary": "Rules in order; the first match decides. At most 256.",
"type": "json"
},
{
"field": "agent.spec.tool_policy.approval_timeout",
"flag": "--spec.tool-policy.approval-timeout",
"summary": "How long a call waits for a person's answer before it is denied, 1m to 7d; default 24h.",
"type": "duration"
},
{
"field": "agent.spec.tool_policy.egress_allow_hosts",
"flag": "--spec.tool-policy.egress-allow-hosts",
"repeated": true,
"summary": "Hosts every network call of the agent's tools may reach, beyond the tools' own endpoints; `*.example.com` matches subdomains. Private and internal addresses are refused whatever this says.",
"type": "string"
},
{
"field": "agent.spec.budget.max_steps_per_turn",
"flag": "--spec.budget.max-steps-per-turn",
"summary": "Model and tool steps per turn, 1 to 1000; default 100.",
"type": "int"
},
{
"field": "agent.spec.budget.turn_timeout",
"flag": "--spec.budget.turn-timeout",
"summary": "One turn's wall-clock deadline, 10s to 24h; default 30m.",
"type": "duration"
},
{
"field": "agent.spec.budget.max_session_spend_micros",
"flag": "--spec.budget.max-session-spend-micros",
"summary": "Spend per session in micro-USD, models and tools together; 0 is the project's spend limit only.",
"type": "int"
},
{
"field": "agent.spec.end_user_access",
"flag": "--spec.end-user-access",
"summary": "Whether end-user session access is intended for this agent. Reserved until the backend enforces end-user ownership; all contract methods currently require a secret key.",
"type": "bool"
},
{
"field": "agent.spec.environment.shape",
"flag": "--spec.environment.shape",
"summary": "A Sylphx Sandboxes shape; empty gives sessions no environment.",
"type": "string"
},
{
"field": "agent.spec.environment.idle_standby",
"flag": "--spec.environment.idle-standby",
"summary": "Put the environment in standby after this long idle, 1m to 24h; default 10m.",
"type": "duration"
},
{
"field": "agent.spec.environment.template",
"flag": "--spec.environment.template",
"summary": "The Sandboxes image: `template:<name>` or an artifact image by digest, passed unchanged to the lease's `image` field.",
"type": "string"
},
{
"field": "agent.spec.environment.repo.uri",
"flag": "--spec.environment.repo.uri",
"summary": "The repository URI. Access uses the session's bound credential handles.",
"type": "string"
},
{
"field": "agent.spec.environment.repo.revision",
"flag": "--spec.environment.repo.revision",
"summary": "The commit or ref to check out; empty uses the repository's default branch.",
"type": "string"
},
{
"field": "agent.spec.environment.egress.egress",
"flag": "--spec.environment.egress.egress",
"summary": "Default ALLOW.",
"type": "enum",
"values": [
"allow",
"deny",
"allowlist"
]
},
{
"field": "agent.spec.environment.egress.allowed_domains",
"flag": "--spec.environment.egress.allowed-domains",
"repeated": true,
"summary": "Hosts reachable when `egress` is ALLOWLIST: exact names or one leading `*.` wildcard label, for example `api.openai.com`, `*.github.com`.",
"type": "string"
},
{
"field": "agent.spec.environment.egress.allowed_cidrs",
"flag": "--spec.environment.egress.allowed-cidrs",
"repeated": true,
"summary": "Public CIDRs reachable when `egress` is ALLOWLIST.",
"type": "string"
},
{
"field": "agent.spec.environment.budget.max_cpu_seconds",
"flag": "--spec.environment.budget.max-cpu-seconds",
"summary": "End CPU_BUDGET after this many vCPU-seconds of guest CPU time.",
"type": "int"
},
{
"field": "agent.spec.environment.budget.max_cost_micros",
"flag": "--spec.environment.budget.max-cost-micros",
"summary": "End COST_BUDGET once the shape's list price times wall seconds reaches this many millionths of a US dollar.",
"type": "int"
},
{
"field": "agent.spec.environment.ttl",
"flag": "--spec.environment.ttl",
"summary": "The lease's maximum wall time, passed to Sandboxes as `ttl`. The lease is released when the session ends even if this bound has not been reached.",
"type": "duration"
},
{
"field": "agent.spec.harness",
"flag": "--spec.harness",
"summary": "The execution harness, independent of `model`: `runtime` (default), `claude_code` or `codex`. It is part of the immutable version, not an environment-wide setting. An omitted or empty value means `runtime`.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/agents",
"method": "agents.agents.create",
"permission": "agents:write",
"positional": {
"arg": "ID",
"field": "agent_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "agent",
"summary": "Creates an agent and its version 1.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "agent.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "agent.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "agent.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "agent.spec.model",
"flag": "--spec.model",
"required": true,
"summary": "The exact Sylphx AI catalog id (`ai_models`), set per Agent through the API as runtime state, never code or a deployed file. Agents in the same environment may use different models; the harness never remaps this id.",
"type": "string"
},
{
"field": "agent.spec.instructions",
"flag": "--spec.instructions",
"summary": "The system instructions, at most 256 KiB.",
"type": "string"
},
{
"field": "agent.spec.tools",
"flag": "--spec.tools",
"repeated": true,
"summary": "The tools the agent may call, at most 128, each `name` once.",
"type": "json"
},
{
"field": "agent.spec.mcp_servers",
"flag": "--spec.mcp-servers",
"repeated": true,
"summary": "The MCP servers whose tools the agent may call, at most 32.",
"type": "json"
},
{
"field": "agent.spec.skills",
"flag": "--spec.skills",
"repeated": true,
"summary": "Skills: instruction packs the agent loads when relevant, at most 64.",
"type": "json"
},
{
"field": "agent.spec.memory_stores",
"flag": "--spec.memory-stores",
"repeated": true,
"summary": "The memory stores the agent recalls from and writes to, as MemoryStore names; at most 8.",
"type": "string"
},
{
"field": "agent.spec.tool_policy.default_decision",
"flag": "--spec.tool-policy.default-decision",
"summary": "The decision for a call no rule matches; default allow.",
"type": "enum",
"values": [
"allow",
"deny",
"ask"
]
},
{
"field": "agent.spec.tool_policy.rules",
"flag": "--spec.tool-policy.rules",
"repeated": true,
"summary": "Rules in order; the first match decides. At most 256.",
"type": "json"
},
{
"field": "agent.spec.tool_policy.approval_timeout",
"flag": "--spec.tool-policy.approval-timeout",
"summary": "How long a call waits for a person's answer before it is denied, 1m to 7d; default 24h.",
"type": "duration"
},
{
"field": "agent.spec.tool_policy.egress_allow_hosts",
"flag": "--spec.tool-policy.egress-allow-hosts",
"repeated": true,
"summary": "Hosts every network call of the agent's tools may reach, beyond the tools' own endpoints; `*.example.com` matches subdomains. Private and internal addresses are refused whatever this says.",
"type": "string"
},
{
"field": "agent.spec.budget.max_steps_per_turn",
"flag": "--spec.budget.max-steps-per-turn",
"summary": "Model and tool steps per turn, 1 to 1000; default 100.",
"type": "int"
},
{
"field": "agent.spec.budget.turn_timeout",
"flag": "--spec.budget.turn-timeout",
"summary": "One turn's wall-clock deadline, 10s to 24h; default 30m.",
"type": "duration"
},
{
"field": "agent.spec.budget.max_session_spend_micros",
"flag": "--spec.budget.max-session-spend-micros",
"summary": "Spend per session in micro-USD, models and tools together; 0 is the project's spend limit only.",
"type": "int"
},
{
"field": "agent.spec.end_user_access",
"flag": "--spec.end-user-access",
"summary": "Whether end-user session access is intended for this agent. Reserved until the backend enforces end-user ownership; all contract methods currently require a secret key.",
"type": "bool"
},
{
"field": "agent.spec.environment.shape",
"flag": "--spec.environment.shape",
"summary": "A Sylphx Sandboxes shape; empty gives sessions no environment.",
"type": "string"
},
{
"field": "agent.spec.environment.idle_standby",
"flag": "--spec.environment.idle-standby",
"summary": "Put the environment in standby after this long idle, 1m to 24h; default 10m.",
"type": "duration"
},
{
"field": "agent.spec.environment.template",
"flag": "--spec.environment.template",
"summary": "The Sandboxes image: `template:<name>` or an artifact image by digest, passed unchanged to the lease's `image` field.",
"type": "string"
},
{
"field": "agent.spec.environment.repo.uri",
"flag": "--spec.environment.repo.uri",
"summary": "The repository URI. Access uses the session's bound credential handles.",
"type": "string"
},
{
"field": "agent.spec.environment.repo.revision",
"flag": "--spec.environment.repo.revision",
"summary": "The commit or ref to check out; empty uses the repository's default branch.",
"type": "string"
},
{
"field": "agent.spec.environment.egress.egress",
"flag": "--spec.environment.egress.egress",
"summary": "Default ALLOW.",
"type": "enum",
"values": [
"allow",
"deny",
"allowlist"
]
},
{
"field": "agent.spec.environment.egress.allowed_domains",
"flag": "--spec.environment.egress.allowed-domains",
"repeated": true,
"summary": "Hosts reachable when `egress` is ALLOWLIST: exact names or one leading `*.` wildcard label, for example `api.openai.com`, `*.github.com`.",
"type": "string"
},
{
"field": "agent.spec.environment.egress.allowed_cidrs",
"flag": "--spec.environment.egress.allowed-cidrs",
"repeated": true,
"summary": "Public CIDRs reachable when `egress` is ALLOWLIST.",
"type": "string"
},
{
"field": "agent.spec.environment.budget.max_cpu_seconds",
"flag": "--spec.environment.budget.max-cpu-seconds",
"summary": "End CPU_BUDGET after this many vCPU-seconds of guest CPU time.",
"type": "int"
},
{
"field": "agent.spec.environment.budget.max_cost_micros",
"flag": "--spec.environment.budget.max-cost-micros",
"summary": "End COST_BUDGET once the shape's list price times wall seconds reaches this many millionths of a US dollar.",
"type": "int"
},
{
"field": "agent.spec.environment.ttl",
"flag": "--spec.environment.ttl",
"summary": "The lease's maximum wall time, passed to Sandboxes as `ttl`. The lease is released when the session ends even if this bound has not been reached.",
"type": "duration"
},
{
"field": "agent.spec.harness",
"flag": "--spec.harness",
"summary": "The execution harness, independent of `model`: `runtime` (default), `claude_code` or `codex`. It is part of the immutable version, not an environment-wide setting. An omitted or empty value means `runtime`.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the agent when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{agent.name=orgs/*/projects/*/envs/*/agents/*}",
"method": "agents.agents.update",
"permission": "agents:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "agent.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agents/{agent}"
},
"resource_field": "agent",
"sends_etag": true,
"summary": "Updates an agent. A change to `spec` mints the next AgentVersion; sessions already started keep the version they pinned.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the agent does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete the agent's sessions; without it, an agent with sessions is refused with `INVALID_STATE`.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/agents/*}",
"method": "agents.agents.delete",
"permission": "agents:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agents/{agent}"
},
"summary": "Deletes an agent and its versions. An agent with sessions is refused with `INVALID_STATE` unless `force` is set, which deletes them too.",
"verb": "delete"
},
{
"effect": "write",
"flags": [
{
"field": "agent_version",
"flag": "--agent-version",
"required": true,
"summary": "The immutable agent version pinned for this task attempt.",
"type": "string"
},
{
"field": "agent_session_id",
"flag": "--agent-session-id",
"required": true,
"summary": "The stable session identifier; reusing it for another attempt is refused.",
"type": "string"
},
{
"field": "message",
"flag": "--message",
"required": true,
"summary": "The initial task message appended atomically with session acceptance.",
"type": "json"
},
{
"field": "environment",
"flag": "--environment",
"summary": "Optional overrides of the environment in the pinned AgentVersion's frozen spec, never the Agent's current head. Omitted or empty with no mask keeps that default unchanged. Only selected fields are overlaid; see environment_mask. The effective environment must have a supported shape, finite positive TTL and valid repository, network and budget before admission.",
"type": "json"
},
{
"field": "credentials",
"flag": "--credentials",
"repeated": true,
"summary": "Captured credential bindings by alias; credentials never enter context.",
"type": "key=value"
},
{
"field": "profiles",
"flag": "--profiles",
"repeated": true,
"summary": "Granted profile mounts for the fresh session lease.",
"type": "json"
},
{
"field": "completion",
"flag": "--completion",
"required": true,
"summary": "The pinned tool call used by the runtime to deliver the terminal result.",
"type": "json"
},
{
"field": "workspace_knowledge",
"flag": "--workspace-knowledge",
"summary": "Opaque, claim-pinned workspace knowledge, including its rendered instruction.",
"type": "json"
},
{
"field": "task_ref",
"flag": "--task-ref",
"summary": "Caller-owned opaque reference, not interpreted by Agents.",
"type": "string"
},
{
"field": "renewal",
"flag": "--renewal",
"summary": "Optional pinned grant-renewal call, owned by the runtime after acceptance.",
"type": "json"
},
{
"field": "runtime_credential_handle",
"flag": "--runtime-credential-handle",
"required": true,
"sensitive": true,
"summary": "Same-session handle to a caller-owned scoped Access credential. Runtime only, never installed in the guest or sent to the model.",
"type": "string"
},
{
"field": "environment_mask",
"flag": "--environment-mask",
"summary": "Fields of environment to overlay, relative to EnvironmentSpec, using proto snake_case paths such as ttl, repo.uri, repo.revision, egress.allowed_domains and budget.max_cost_micros. The wire value is a comma-separated string; SDK property naming does not change these paths. Omitted or empty infers populated serialized leaf fields recursively, preserving unselected siblings from the pinned version. Proto defaults (including empty lists) need an explicit mask to reset a selected field. Selected lists replace, rather than append to, the inherited list. The sole path \"*\" replaces the whole environment, resetting unpopulated fields. Unknown, invalid and output-only paths are rejected, as is a nonempty mask without environment. Effective validation also applies to explicit resets and whole-environment replacement.",
"type": "json"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/agents/*}:run",
"method": "agents.agents.run",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agents/{agent}"
},
"summary": "Atomically admits a pinned task session, initial event and pending turn.",
"verb": "run"
}
],
"noun": "agents",
"resource_type": "agents.sylphx.com/Agent"
},
{
"collection": "agent_versions",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/agents/*/agent_versions/*}",
"method": "agents.agent_versions.get",
"permission": "agents:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agents/{agent}/agent_versions/{agent_version}"
},
"summary": "Gets an agent version.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter, limited to `version_number`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/agents/*}/agent_versions",
"method": "agents.agent_versions.list",
"paginates": true,
"permission": "agents:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agents/{agent}"
},
"summary": "Lists an agent's versions, newest first.",
"verb": "list"
}
],
"noun": "agent-versions",
"resource_type": "agents.sylphx.com/AgentVersion"
},
{
"collection": "agent_sessions",
"commands": [
{
"effect": "write",
"flags": [
{
"field": "turn",
"flag": "--turn",
"required": true,
"summary": "The live turn whose execution capability authorizes the call.",
"type": "int"
},
{
"field": "tool",
"flag": "--tool",
"required": true,
"summary": "The tool name in the session's pinned agent version.",
"type": "string"
},
{
"field": "arguments",
"flag": "--arguments",
"required": true,
"summary": "The tool input, validated against its pinned input schema.",
"type": "json"
},
{
"field": "op_id",
"flag": "--op-id",
"required": true,
"summary": "The stable operation identifier, reused for idempotent tool-call retries.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*}:invoke-tool",
"method": "agents.agent_sessions.invoke_tool",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}"
},
"summary": "Guest execution capability authentication, not an Access management key. Preserve any JSON tool result, including scalars and arrays.",
"verb": "invoke-tool"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*}:tool-catalog",
"method": "agents.agent_sessions.tool_catalog",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}"
},
"summary": "The immutable pinned HTTP-tool catalog exposed to the guest's MCP bridge.",
"verb": "tool-catalog"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "agent_session.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "agent_session.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "agent_session.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "agent_session.agent",
"flag": "--agent",
"required": true,
"summary": "The Agent the session talks to.",
"type": "string"
},
{
"field": "agent_session.agent_version",
"flag": "--agent-version",
"summary": "The AgentVersion the session pinned; the Agent's current version when unset at create.",
"type": "string"
},
{
"field": "agent_session.title",
"flag": "--title",
"summary": "A short title; set by the caller or summarised by the runtime.",
"type": "string"
},
{
"field": "agent_session.environment.shape",
"flag": "--environment.shape",
"summary": "A Sylphx Sandboxes shape; empty gives sessions no environment.",
"type": "string"
},
{
"field": "agent_session.environment.idle_standby",
"flag": "--environment.idle-standby",
"summary": "Put the environment in standby after this long idle, 1m to 24h; default 10m.",
"type": "duration"
},
{
"field": "agent_session.environment.template",
"flag": "--environment.template",
"summary": "The Sandboxes image: `template:<name>` or an artifact image by digest, passed unchanged to the lease's `image` field.",
"type": "string"
},
{
"field": "agent_session.environment.repo.uri",
"flag": "--environment.repo.uri",
"summary": "The repository URI. Access uses the session's bound credential handles.",
"type": "string"
},
{
"field": "agent_session.environment.repo.revision",
"flag": "--environment.repo.revision",
"summary": "The commit or ref to check out; empty uses the repository's default branch.",
"type": "string"
},
{
"field": "agent_session.environment.egress.egress",
"flag": "--environment.egress.egress",
"summary": "Default ALLOW.",
"type": "enum",
"values": [
"allow",
"deny",
"allowlist"
]
},
{
"field": "agent_session.environment.egress.allowed_domains",
"flag": "--environment.egress.allowed-domains",
"repeated": true,
"summary": "Hosts reachable when `egress` is ALLOWLIST: exact names or one leading `*.` wildcard label, for example `api.openai.com`, `*.github.com`.",
"type": "string"
},
{
"field": "agent_session.environment.egress.allowed_cidrs",
"flag": "--environment.egress.allowed-cidrs",
"repeated": true,
"summary": "Public CIDRs reachable when `egress` is ALLOWLIST.",
"type": "string"
},
{
"field": "agent_session.environment.budget.max_cpu_seconds",
"flag": "--environment.budget.max-cpu-seconds",
"summary": "End CPU_BUDGET after this many vCPU-seconds of guest CPU time.",
"type": "int"
},
{
"field": "agent_session.environment.budget.max_cost_micros",
"flag": "--environment.budget.max-cost-micros",
"summary": "End COST_BUDGET once the shape's list price times wall seconds reaches this many millionths of a US dollar.",
"type": "int"
},
{
"field": "agent_session.environment.ttl",
"flag": "--environment.ttl",
"summary": "The lease's maximum wall time, passed to Sandboxes as `ttl`. The lease is released when the session ends even if this bound has not been reached.",
"type": "duration"
},
{
"field": "agent_session.credentials",
"flag": "--credentials",
"repeated": true,
"summary": "Session-scoped credential bindings, keyed by the tool or MCP credential name. Values are references or opaque handles, never secret values.",
"type": "key=value"
},
{
"field": "agent_session.profiles",
"flag": "--profiles",
"repeated": true,
"summary": "Granted platform Profiles to mount when the session starts, each by resource name and mode. The runtime never puts profile values in events.",
"type": "json"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/agent_sessions",
"method": "agents.agent_sessions.create",
"permission": "agents:sessions",
"positional": {
"arg": "ID",
"field": "agent_session_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "agent_session",
"summary": "Starts a session of an agent, pinned to its current version unless `agent_version` names another. Requires a secret key until end-user ownership is implemented. The session starts idle; `:send` starts its first turn.",
"verb": "create"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*}",
"method": "agents.agent_sessions.get",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}"
},
"summary": "Gets a session.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter, limited to `agent`, `end_user` and `state`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/agent_sessions",
"method": "agents.agent_sessions.list",
"paginates": true,
"permission": "agents:sessions",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists sessions, newest first. With a publishable key, only the caller's end user's sessions.",
"verb": "list"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the session does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Interrupt a running turn and delete; without it, a running session is refused with `INVALID_STATE`.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*}",
"method": "agents.agent_sessions.delete",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}"
},
"summary": "Deletes a session and its events. A session whose turn is running is refused with `INVALID_STATE` unless `force` is set, which interrupts it first.",
"verb": "delete"
},
{
"effect": "write",
"flags": [
{
"field": "message",
"flag": "--message",
"required": true,
"summary": "The message, 1 to 64 parts.",
"type": "json"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*}:send",
"method": "agents.agent_sessions.send",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}"
},
"summary": "Sends a user message. On an idle or failed session it starts a new turn; while a turn runs it is refused with `INVALID_STATE` (use `:steer`). The same `Idempotency-Key` returns the same event.",
"verb": "send"
},
{
"effect": "write",
"flags": [
{
"field": "message",
"flag": "--message",
"required": true,
"summary": "The message, 1 to 64 parts.",
"type": "json"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*}:steer",
"method": "agents.agent_sessions.steer",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}"
},
"summary": "Sends a message into the running turn; the agent reads it at its next step. On an idle session it is the same as `:send`.",
"verb": "steer"
},
{
"effect": "write",
"flags": [
{
"field": "reason",
"flag": "--reason",
"summary": "Why, recorded on the status event; at most 500 characters.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*}:interrupt",
"method": "agents.agent_sessions.interrupt",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}"
},
"summary": "Stops the running turn at its current step. Calls already made keep their results; the session becomes idle. A no-op on an idle session.",
"verb": "interrupt"
},
{
"effect": "write",
"flags": [
{
"field": "call_id",
"flag": "--call-id",
"required": true,
"summary": "The waiting ToolCall's `id`.",
"type": "string"
},
{
"field": "decision",
"flag": "--decision",
"required": true,
"summary": "The answer.",
"type": "enum",
"values": [
"approve",
"reject"
]
},
{
"field": "remember",
"flag": "--remember",
"summary": "Also allow later calls of the same tool in this session without asking (\"always allow\"); only with APPROVE.",
"type": "bool"
},
{
"field": "reason",
"flag": "--reason",
"summary": "Why, at most 500 characters; the agent reads it with a rejection.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*}:decideApproval",
"method": "agents.agent_sessions.decide_approval",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}"
},
"served": false,
"summary": "Answers a tool call waiting for approval; the turn continues.",
"verb": "decide-approval"
},
{
"effect": "write",
"flags": [
{
"field": "call_id",
"flag": "--call-id",
"required": true,
"summary": "The waiting client ToolCall's `id`.",
"type": "string"
},
{
"field": "output",
"flag": "--output",
"required": true,
"summary": "The result, at most 1 MiB of JSON.",
"type": "json"
},
{
"field": "error",
"flag": "--error",
"summary": "Whether the call failed; `output` then holds the error.",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*}:submitToolResult",
"method": "agents.agent_sessions.submit_tool_result",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}"
},
"served": false,
"summary": "Returns the result of a client tool call; the turn continues.",
"verb": "submit-tool-result"
}
],
"noun": "agent-sessions",
"resource_type": "agents.sylphx.com/AgentSession"
},
{
"collection": "session_events",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/agent_sessions/*/session_events/*}",
"method": "agents.session_events.get",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}/session_events/{session_event}"
},
"summary": "Gets a session event.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter, limited to `type` and `sequence`; for example `sequence > 42`.",
"type": "string"
},
{
"field": "wait",
"flag": "--wait",
"summary": "When no event matches the filter, wait up to this long for one, at most 60s; unset answers at once.",
"type": "duration"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/agent_sessions/*}/session_events",
"method": "agents.session_events.list",
"paginates": true,
"permission": "agents:sessions",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/agent_sessions/{agent_session}"
},
"summary": "Lists a session's events in sequence order. To follow a session, call again with the filter `sequence > N`, N the last sequence read; `wait` holds the call open until a newer event is appended or the wait ends.",
"verb": "list"
}
],
"noun": "session-events",
"resource_type": "agents.sylphx.com/SessionEvent"
},
{
"collection": "memory_stores",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/memory_stores/*}",
"method": "agents.memory_stores.get",
"permission": "agents:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/memory_stores/{memory_store}"
},
"served": false,
"summary": "Gets a memory store.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/memory_stores",
"method": "agents.memory_stores.list",
"paginates": true,
"permission": "agents:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"served": false,
"summary": "Lists memory stores.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "memory_store.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "memory_store.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "memory_store.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "memory_store.spec.description",
"flag": "--spec.description",
"summary": "What the store is for, shown to agents; at most 1024 characters.",
"type": "string"
},
{
"field": "memory_store.spec.scope",
"flag": "--spec.scope",
"required": true,
"summary": "Whose memories are kept apart.",
"type": "enum",
"values": [
"project",
"agent",
"end_user"
]
},
{
"field": "memory_store.spec.retention",
"flag": "--spec.retention",
"summary": "Memories older than this since their last update are deleted, 1d to 3650d; unset keeps them until deleted.",
"type": "duration"
},
{
"field": "memory_store.spec.agent_writes",
"flag": "--spec.agent-writes",
"summary": "Whether agents write memories themselves after each turn; otherwise only callers write them.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/memory_stores",
"method": "agents.memory_stores.create",
"permission": "agents:write",
"positional": {
"arg": "ID",
"field": "memory_store_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "memory_store",
"served": false,
"summary": "Creates a memory store.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "memory_store.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "memory_store.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "memory_store.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "memory_store.spec.description",
"flag": "--spec.description",
"summary": "What the store is for, shown to agents; at most 1024 characters.",
"type": "string"
},
{
"field": "memory_store.spec.scope",
"flag": "--spec.scope",
"required": true,
"summary": "Whose memories are kept apart.",
"type": "enum",
"values": [
"project",
"agent",
"end_user"
]
},
{
"field": "memory_store.spec.retention",
"flag": "--spec.retention",
"summary": "Memories older than this since their last update are deleted, 1d to 3650d; unset keeps them until deleted.",
"type": "duration"
},
{
"field": "memory_store.spec.agent_writes",
"flag": "--spec.agent-writes",
"summary": "Whether agents write memories themselves after each turn; otherwise only callers write them.",
"type": "bool"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the memory store when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{memory_store.name=orgs/*/projects/*/envs/*/memory_stores/*}",
"method": "agents.memory_stores.update",
"permission": "agents:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "memory_store.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/memory_stores/{memory_store}"
},
"resource_field": "memory_store",
"sends_etag": true,
"served": false,
"summary": "Updates a memory store.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the memory store does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete the store's memories; without it, a store with memories is refused with `INVALID_STATE`.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/memory_stores/*}",
"method": "agents.memory_stores.delete",
"permission": "agents:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/memory_stores/{memory_store}"
},
"served": false,
"summary": "Deletes a memory store. A store an agent names is refused with `RESOURCE_IN_USE`; a store with memories is refused with `INVALID_STATE` unless `force` is set, which deletes them too.",
"verb": "delete"
}
],
"noun": "memory-stores",
"resource_type": "agents.sylphx.com/MemoryStore"
},
{
"collection": "memories",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/memory_stores/*/memories/*}",
"method": "agents.memories.get",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/memory_stores/{memory_store}/memories/{memory}"
},
"served": false,
"summary": "Gets a memory.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter, limited to `end_user` and `agent`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/memory_stores/*}/memories",
"method": "agents.memories.list",
"paginates": true,
"permission": "agents:sessions",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/memory_stores/{memory_store}"
},
"served": false,
"summary": "Lists a store's memories, newest first. With a publishable key, only the caller's end user's memories.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/memory_stores/{memory_store}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "memory.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "memory.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "memory.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "memory.content",
"flag": "--content",
"required": true,
"summary": "The memory, at most 16 KiB of text.",
"type": "string"
},
{
"field": "memory.end_user",
"flag": "--end-user",
"summary": "The end user it is about, for a store scoped to end users.",
"type": "string"
},
{
"field": "memory.agent",
"flag": "--agent",
"summary": "The agent it belongs to, for a store scoped to agents.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/memory_stores/*}/memories",
"method": "agents.memories.create",
"permission": "agents:write",
"positional": {
"arg": "ID",
"field": "memory_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "memory",
"served": false,
"summary": "Writes a memory.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "memory.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "memory.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "memory.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "memory.content",
"flag": "--content",
"required": true,
"summary": "The memory, at most 16 KiB of text.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{memory.name=orgs/*/projects/*/envs/*/memory_stores/*/memories/*}",
"method": "agents.memories.update",
"permission": "agents:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "memory.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/memory_stores/{memory_store}/memories/{memory}"
},
"resource_field": "memory",
"sends_etag": true,
"served": false,
"summary": "Changes a memory's content.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the memory does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/memory_stores/*/memories/*}",
"method": "agents.memories.delete",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/memory_stores/{memory_store}/memories/{memory}"
},
"served": false,
"summary": "Deletes a memory. An end user may delete their own.",
"verb": "delete"
},
{
"effect": "read",
"flags": [
{
"field": "query",
"flag": "--query",
"required": true,
"summary": "What to recall, 1 to 2000 characters.",
"type": "string"
},
{
"field": "end_user",
"flag": "--end-user",
"summary": "Only memories about this end user.",
"type": "string"
},
{
"field": "agent",
"flag": "--agent",
"summary": "Only memories of this agent.",
"type": "string"
},
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 10, clamped to 100.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/memory_stores/*}/memories:search",
"method": "agents.memories.search",
"permission": "agents:sessions",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/memory_stores/{memory_store}"
},
"served": false,
"summary": "Recalls the memories that best match a query, by hybrid full-text and vector search. With a publishable key, only the caller's end user's memories. A read with a request body, like a query.",
"verb": "search"
}
],
"noun": "memories",
"resource_type": "agents.sylphx.com/Memory"
}
],
"commands": [],
"display_name": "Sylphx Agents",
"noun": "agents",
"stage": "preview"
},
{
"collections": [
{
"collection": "ai_models",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=ai_models/*}",
"method": "ai.ai_models.get",
"permission": "ai:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "ai_models/{ai_model}"
},
"summary": "Gets an AI model.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/ai_models",
"method": "ai.ai_models.list",
"paginates": true,
"permission": "ai:read",
"positional": null,
"summary": "Lists the admitted catalog; filter by `brand`, `modality`, or `model`.",
"verb": "list"
}
],
"noun": "ai-models",
"resource_type": "ai.sylphx.com/AiModel"
}
],
"commands": [],
"display_name": "Sylphx AI",
"noun": "ai",
"stage": "preview"
},
{
"collections": [
{
"collection": "artifacts",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/artifacts/*}",
"method": "artifacts.artifacts.get",
"permission": "artifacts:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/artifacts/{artifact}"
},
"summary": "Gets an artifact.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*}/artifacts",
"method": "artifacts.artifacts.list",
"paginates": true,
"permission": "artifacts:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}"
},
"summary": "Lists a project's artifacts; filter by `digest`, `kind`, or `subject`.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "artifact.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "artifact.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "artifact.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "artifact.digest",
"flag": "--digest",
"required": true,
"summary": "The algorithm-qualified digest of the stored bytes, for example `sha256:4f1c…`.",
"type": "string"
},
{
"field": "artifact.kind",
"flag": "--kind",
"required": true,
"summary": "What the Artifact is.",
"type": "enum",
"values": [
"image",
"sbom",
"provenance",
"signature",
"bundle"
]
},
{
"field": "artifact.media_type",
"flag": "--media-type",
"required": true,
"summary": "The media type, for example `application/vnd.oci.image.manifest.v1+json`.",
"type": "string"
},
{
"field": "artifact.size_bytes",
"flag": "--size-bytes",
"required": true,
"summary": "The size of the stored bytes.",
"type": "int"
},
{
"field": "artifact.subject",
"flag": "--subject",
"summary": "The Artifact this one describes, for an SBOM, provenance, or signature.",
"type": "string"
},
{
"field": "artifact.source_digests",
"flag": "--source-digests",
"repeated": true,
"summary": "Digests of the sources and inputs that produced it.",
"type": "string"
},
{
"field": "artifact.retention",
"flag": "--retention",
"summary": "How long the Artifact is kept.",
"type": "enum",
"values": [
"standard",
"referenced"
]
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*}/artifacts",
"method": "artifacts.artifacts.create",
"permission": "artifacts:write",
"positional": {
"arg": "ID",
"field": "artifact_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "artifact",
"summary": "Registers an artifact whose bytes were pushed by digest; verification runs after.",
"verb": "create"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/artifacts/*}",
"method": "artifacts.artifacts.delete",
"permission": "artifacts:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/artifacts/{artifact}"
},
"summary": "Deletes an artifact; fails while a Release references it or a legal hold is active.",
"verb": "delete"
}
],
"noun": "artifacts",
"resource_type": "artifacts.sylphx.com/Artifact"
}
],
"commands": [],
"display_name": "Sylphx Artifacts",
"noun": "artifacts",
"stage": "preview"
},
{
"collections": [
{
"collection": "assets",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/assets/*}",
"method": "assets.assets.get",
"permission": "assets:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/assets/{asset}"
},
"summary": "Gets an asset.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter, limited to `kind`, `state`, and `review_state`; for example `kind = ASSET_KIND_IMAGE AND state = ASSET_STATE_READY`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/assets",
"method": "assets.assets.list",
"paginates": true,
"permission": "assets:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists assets. The filter is limited to `kind`, `state`, and `review_state`.",
"verb": "list"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many items; default 100, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter, limited to `kind` and `review_state`; for example `kind = ASSET_KIND_IMAGE`. Without a `review_state` term, rejected and retired variants are left out.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/assets:export",
"method": "assets.assets.export",
"permission": "assets:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Exports every servable variant in the environment as one flat, paged manifest, independent of the keys the code declares. Rejected and retired variants are left out unless `filter` asks for their `review_state`. The last page carries a digest a client checks to know it holds the whole set.",
"verb": "export"
},
{
"effect": "write",
"flags": [
{
"field": "recipes",
"flag": "--recipes",
"repeated": true,
"required": true,
"summary": "The recipes the code declares; 1 to 1000.",
"type": "json"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/assets:generate",
"method": "assets.assets.generate",
"permission": "assets:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Records the recipes as assets and generates the variants that are missing. Each call is idempotent and works within a bounded time; call again until `pending` is 0.",
"verb": "generate"
},
{
"effect": "read",
"flags": [
{
"field": "keys",
"flag": "--keys",
"repeated": true,
"required": true,
"summary": "The logical keys the code declares, 1 to 5000, each 16 lowercase hex characters. The lock holds only these, so a removed recipe drops out.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/assets:lock",
"method": "assets.assets.lock",
"permission": "assets:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Returns the `assets.lock` entries and canonical text for the keys the call names, and only those. A read with a request body, like a query.",
"verb": "lock"
},
{
"effect": "write",
"flags": [
{
"field": "content_hash",
"flag": "--content-hash",
"required": true,
"summary": "The content hash of the variant, 64 lowercase hex characters.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/assets/*}:approveVariant",
"method": "assets.assets.approve_variant",
"permission": "assets:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/assets/{asset}"
},
"summary": "Approves one variant and records who approved it.",
"verb": "approve-variant"
},
{
"effect": "write",
"flags": [
{
"field": "content_hash",
"flag": "--content-hash",
"required": true,
"summary": "The content hash of the variant, 64 lowercase hex characters.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/assets/*}:rejectVariant",
"method": "assets.assets.reject_variant",
"permission": "assets:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/assets/{asset}"
},
"summary": "Rejects one variant. Its slot is freed and the next `:generate` fills it; the rejected file keeps serving at its URL.",
"verb": "reject-variant"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "content_hash",
"flag": "--content-hash",
"required": true,
"summary": "The content hash of the variant, 64 lowercase hex characters.",
"type": "string"
},
{
"field": "reason",
"flag": "--reason",
"summary": "Why the variant is retired, at most 500 characters.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/assets/*}:retireVariant",
"method": "assets.assets.retire_variant",
"permission": "assets:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/assets/{asset}"
},
"summary": "Retires one variant. Its URL answers 404 from then on and its slot is freed.",
"verb": "retire-variant"
}
],
"noun": "assets",
"resource_type": "assets.sylphx.com/Asset"
}
],
"commands": [],
"display_name": "Sylphx Generated Assets",
"noun": "assets",
"stage": "preview"
},
{
"collections": [
{
"collection": "auth_configs",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/auth_configs/*}",
"method": "auth.auth_configs.get",
"permission": "auth:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/auth_configs/{auth_config}"
},
"summary": "Gets an auth config.",
"verb": "get"
},
{
"effect": "write",
"flags": [
{
"field": "auth_config.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "auth_config.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "auth_config.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "auth_config.spec.auth_methods",
"flag": "--spec.auth-methods",
"repeated": true,
"summary": "Sign-in methods offered to end users.",
"type": "enum",
"values": [
"password",
"magic_link",
"email_otp",
"passkey",
"totp",
"oidc",
"saml",
"device"
]
},
{
"field": "auth_config.spec.mfa_required",
"flag": "--spec.mfa-required",
"summary": "Require a second factor for every end user.",
"type": "bool"
},
{
"field": "auth_config.spec.passkey_policy.required",
"flag": "--spec.passkey-policy.required",
"summary": "Require a passkey for every end user.",
"type": "bool"
},
{
"field": "auth_config.spec.passkey_policy.device_bound",
"flag": "--spec.passkey-policy.device-bound",
"summary": "Refuse synced (multi-device) passkeys.",
"type": "bool"
},
{
"field": "auth_config.spec.passkey_policy.aaguid_allowlist",
"flag": "--spec.passkey-policy.aaguid-allowlist",
"repeated": true,
"summary": "Allowed authenticator AAGUIDs; empty allows any.",
"type": "string"
},
{
"field": "auth_config.spec.lockout_enabled",
"flag": "--spec.lockout-enabled",
"summary": "Progressive lockout by user and IP.",
"type": "bool"
},
{
"field": "auth_config.spec.session_policy.max_concurrent_sessions",
"flag": "--spec.session-policy.max-concurrent-sessions",
"summary": "Concurrent sessions per end user; excess sessions are revoked, oldest first. 0 is unlimited.",
"type": "int"
},
{
"field": "auth_config.spec.session_policy.idle_timeout",
"flag": "--spec.session-policy.idle-timeout",
"summary": "Revoke after this long without use; default 30d.",
"type": "duration"
},
{
"field": "auth_config.spec.session_policy.absolute_timeout",
"flag": "--spec.session-policy.absolute-timeout",
"summary": "Revoke this long after sign-in regardless of use; default 90d.",
"type": "duration"
},
{
"field": "auth_config.spec.session_policy.fingerprint_binding",
"flag": "--spec.session-policy.fingerprint-binding",
"summary": "Bind sessions to network and agent; a mismatch demands step-up.",
"type": "bool"
},
{
"field": "auth_config.spec.captcha_secret",
"flag": "--spec.captcha-secret",
"summary": "The CAPTCHA verifier secret, held in Sylphx Secrets; unset disables CAPTCHA.",
"type": "string"
},
{
"field": "auth_config.spec.portal.custom_domain",
"flag": "--spec.portal.custom-domain",
"summary": "A verified Network Domain serving the portal; unset uses the default origin.",
"type": "string"
},
{
"field": "auth_config.spec.portal.product_title",
"flag": "--spec.portal.product-title",
"summary": "The product name shown to end users.",
"type": "string"
},
{
"field": "auth_config.spec.portal.logo_uri",
"flag": "--spec.portal.logo-uri",
"summary": "An HTTPS logo URI.",
"type": "string"
},
{
"field": "auth_config.spec.portal.primary_color",
"flag": "--spec.portal.primary-color",
"summary": "The primary color, `#rrggbb`.",
"type": "string"
},
{
"field": "auth_config.spec.portal.sylphx_branding",
"flag": "--spec.portal.sylphx-branding",
"summary": "Show Sylphx branding.",
"type": "bool"
},
{
"field": "auth_config.spec.mail_sending_domain",
"flag": "--spec.mail-sending-domain",
"summary": "The Notify Sending Domain Auth mail is sent from; unset uses the Sylphx default.",
"type": "string"
},
{
"field": "auth_config.spec.user_sync_database",
"flag": "--spec.user-sync-database",
"summary": "A Sylphx Data database end users are synced into; unset disables sync.",
"type": "string"
},
{
"field": "auth_config.spec.social_providers",
"flag": "--spec.social-providers",
"repeated": true,
"summary": "Social sign-in: one entry per provider Sylphx serves (`google`, `github`, `apple`), whether it is on, and whether end users can use it now. An update changes only the providers it lists; the others keep their state. Without any change Google is on through Sylphx's shared client, when Sylphx has one. The provider's credentials (the shared client, or your own client id and secret) are set with the instance's `sign-in-providers:put`: a client secret never passes through this resource.",
"type": "json"
},
{
"field": "auth_config.spec.test_email_pattern",
"flag": "--spec.test-email-pattern",
"summary": "The address pattern of this environment's test accounts (a regular expression over the whole lower-cased address); unset means the environment has none. It must end in `@` and one of the environment's DNS-verified customer-organization domains, escaped (`qa\\+[a-z0-9-]{1,40}@example\\.com`), and must not match `probe@example.com`; it is stored as `^(?:<local part>)@<domain>$`. An end user is a test account (`synthetic_time`) only when it signed up with a matching address and proved that address by a link or code; changing the pattern never makes an existing end user one.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the auth config when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{auth_config.name=orgs/*/projects/*/envs/*/auth_configs/*}",
"method": "auth.auth_configs.update",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "auth_config.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/auth_configs/{auth_config}"
},
"resource_field": "auth_config",
"sends_etag": true,
"summary": "Updates an auth config.",
"update_mask": "from-flags",
"verb": "update"
}
],
"noun": "auth-configs",
"resource_type": "auth.sylphx.com/AuthConfig"
},
{
"collection": "end_users",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/end_users/*}",
"method": "auth.end_users.get",
"permission": "auth:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/end_users/{end_user}"
},
"summary": "Gets an end user.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/end_users",
"method": "auth.end_users.list",
"paginates": true,
"permission": "auth:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists end users.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "end_user.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "end_user.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "end_user.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "end_user.email",
"flag": "--email",
"summary": "The primary email address.",
"type": "string"
},
{
"field": "end_user.password",
"flag": "--password",
"sensitive": true,
"summary": "An initial password; write-only, checked against breached passwords.",
"type": "string"
},
{
"field": "end_user.public_metadata",
"flag": "--public-metadata",
"summary": "App data readable by the end user's own tokens.",
"type": "json"
},
{
"field": "end_user.private_metadata",
"flag": "--private-metadata",
"summary": "App data readable only with an Access key.",
"type": "json"
},
{
"field": "end_user.unsafe_metadata",
"flag": "--unsafe-metadata",
"summary": "App data the end user may write with their own session (preferences a sign-up form collects); never trust it for authorization.",
"type": "json"
},
{
"field": "end_user.external_ids",
"flag": "--external-ids",
"repeated": true,
"summary": "The customer's own ids for this end user, one per namespace (`game_user`, `steam_id`): how an app that signs users in by its own id finds them again. Read on create; never changed through here, because a set namespace's value is never rewritten — `AttachEndUserExternalId` sets an unset one. At most four namespaces. Never an authorization input: scope checks use grant ids.",
"type": "key=value"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/end_users",
"method": "auth.end_users.create",
"permission": "auth:write",
"positional": {
"arg": "ID",
"field": "end_user_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "end_user",
"summary": "Creates an end user.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "end_user.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "end_user.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "end_user.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "end_user.email",
"flag": "--email",
"summary": "The primary email address.",
"type": "string"
},
{
"field": "end_user.password",
"flag": "--password",
"sensitive": true,
"summary": "An initial password; write-only, checked against breached passwords.",
"type": "string"
},
{
"field": "end_user.public_metadata",
"flag": "--public-metadata",
"summary": "App data readable by the end user's own tokens.",
"type": "json"
},
{
"field": "end_user.private_metadata",
"flag": "--private-metadata",
"summary": "App data readable only with an Access key.",
"type": "json"
},
{
"field": "end_user.unsafe_metadata",
"flag": "--unsafe-metadata",
"summary": "App data the end user may write with their own session (preferences a sign-up form collects); never trust it for authorization.",
"type": "json"
},
{
"field": "end_user.external_ids",
"flag": "--external-ids",
"repeated": true,
"summary": "The customer's own ids for this end user, one per namespace (`game_user`, `steam_id`): how an app that signs users in by its own id finds them again. Read on create; never changed through here, because a set namespace's value is never rewritten — `AttachEndUserExternalId` sets an unset one. At most four namespaces. Never an authorization input: scope checks use grant ids.",
"type": "key=value"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{end_user.name=orgs/*/projects/*/envs/*/end_users/*}",
"method": "auth.end_users.update",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "end_user.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/end_users/{end_user}"
},
"resource_field": "end_user",
"sends_etag": true,
"summary": "Updates an end user.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the end user does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete the end user's memberships; sessions are always revoked.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/end_users/*}",
"method": "auth.end_users.delete",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/end_users/{end_user}"
},
"summary": "Deletes an end user.",
"verb": "delete"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "reason",
"flag": "--reason",
"summary": "Why; shown to administrators only.",
"type": "string"
},
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/end_users/*}:suspend",
"method": "auth.end_users.suspend",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/end_users/{end_user}"
},
"summary": "Suspends an end user: sessions are revoked and sign-in is refused.",
"verb": "suspend"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/end_users/*}:reactivate",
"method": "auth.end_users.reactivate",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/end_users/{end_user}"
},
"summary": "Reactivates a suspended end user.",
"verb": "reactivate"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/end_users/*}:unlock",
"method": "auth.end_users.unlock",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/end_users/{end_user}"
},
"summary": "Clears an end user's sign-in lock (repeated failed sign-ins) now.",
"verb": "unlock"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/end_users/*}:revokeSessions",
"method": "auth.end_users.revoke_sessions",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/end_users/{end_user}"
},
"summary": "Revokes every session of an end user.",
"verb": "revoke-sessions"
},
{
"effect": "write",
"flags": [
{
"field": "namespace",
"flag": "--namespace",
"required": true,
"summary": "The customer's namespace for this id: `^[a-z][a-z0-9_]{0,31}$`.",
"type": "string"
},
{
"field": "external_id",
"flag": "--external-id",
"required": true,
"summary": "The id itself, 1 to 128 printable characters, unique in its namespace across the environment's live users.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/end_users/*}:attachExternalId",
"method": "auth.end_users.attach_external_id",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/end_users/{end_user}"
},
"summary": "Sets the customer's own id for an end user, once: an unset namespace is written, a set one is never rewritten, and a different value for a set namespace is refused. A namespace holds one id for the life of the user. Erasure removes the ids and remembers their hashes, so a value that belonged to an erased user is never handed to another one.",
"verb": "attach-external-id"
},
{
"effect": "read",
"flags": [
{
"field": "namespace",
"flag": "--namespace",
"required": true,
"summary": "The customer's namespace of the id.",
"type": "string"
},
{
"field": "external_id",
"flag": "--external-id",
"required": true,
"summary": "The id to find.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/end_users:find",
"method": "auth.end_users.find",
"permission": "auth:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Finds the one end user of one of the customer's own ids. An id that belongs to no live user of this environment is `RESOURCE_NOT_FOUND`, the same answer a value erased with its user gives.",
"verb": "find"
}
],
"noun": "end-users",
"resource_type": "auth.sylphx.com/EndUser"
},
{
"collection": "sessions",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/end_users/*/sessions/*}",
"method": "auth.sessions.get",
"permission": "auth:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/end_users/{end_user}/sessions/{session}"
},
"summary": "Gets a session.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/end_users/*}/sessions",
"method": "auth.sessions.list",
"paginates": true,
"permission": "auth:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/end_users/{end_user}"
},
"summary": "Lists sessions.",
"verb": "list"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/end_users/*/sessions/*}:revoke",
"method": "auth.sessions.revoke",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/end_users/{end_user}/sessions/{session}"
},
"summary": "Revokes a session.",
"verb": "revoke"
}
],
"noun": "sessions",
"resource_type": "auth.sylphx.com/Session"
},
{
"collection": "identities",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/end_users/*/identities/*}",
"method": "auth.identities.get",
"permission": "auth:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/end_users/{end_user}/identities/{identity}"
},
"summary": "Gets an identity of an end user.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/end_users/*}/identities",
"method": "auth.identities.list",
"paginates": true,
"permission": "auth:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/end_users/{end_user}"
},
"summary": "Lists the identities an end user signs in with.",
"verb": "list"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "target_end_user",
"flag": "--target-end-user",
"required": true,
"summary": "The end user that receives the identity.",
"type": "string"
},
{
"field": "reason",
"flag": "--reason",
"required": true,
"summary": "Why the identity moves (1 to 512 characters); recorded in the audit trail.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/end_users/*/identities/*}:move",
"method": "auth.identities.move",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/end_users/{end_user}/identities/{identity}"
},
"summary": "Moves a federated or device identity from one end user to another, to fix a wrongly linked player. One transaction: the identity changes owner, the sessions of both end users are revoked, and nothing else about either moves (profile, memberships, data). Refused when it would leave the source with no sign-in, unless the source is suspended, and when the target already has an identity of the same provider. The reason is audited with the operator, both end users and the identity's fingerprint. An operator action: an end user's own session cannot call it.",
"verb": "move"
}
],
"noun": "identities",
"resource_type": "auth.sylphx.com/Identity"
},
{
"collection": "customer_organizations",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/customer_organizations/*}",
"method": "auth.customer_organizations.get",
"permission": "auth:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}"
},
"summary": "Gets a customer organization.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/customer_organizations",
"method": "auth.customer_organizations.list",
"paginates": true,
"permission": "auth:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists customer organizations.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "customer_organization.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "customer_organization.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "customer_organization.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "customer_organization.slug",
"flag": "--slug",
"summary": "Unique within the environment.",
"type": "string"
},
{
"field": "customer_organization.public_metadata",
"flag": "--public-metadata",
"summary": "App data.",
"type": "json"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "owner_end_user",
"flag": "--owner-end-user",
"summary": "The organization's first owner, an active end user of the same environment. The organization and its `owner` membership are created in one transaction, and the call honours `Idempotency-Key`: a retry returns the organization the first call created. Naming a person is explicit app authority: the app vouches for its own tenant. Empty creates an organization without members; creating then calling `CreateMembership` is not atomic.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/customer_organizations",
"method": "auth.customer_organizations.create",
"permission": "auth:write",
"positional": {
"arg": "ID",
"field": "customer_organization_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "customer_organization",
"summary": "Creates a customer organization.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "customer_organization.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "customer_organization.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "customer_organization.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "customer_organization.slug",
"flag": "--slug",
"summary": "Unique within the environment.",
"type": "string"
},
{
"field": "customer_organization.public_metadata",
"flag": "--public-metadata",
"summary": "App data.",
"type": "json"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the customer organization when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{customer_organization.name=orgs/*/projects/*/envs/*/customer_organizations/*}",
"method": "auth.customer_organizations.update",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "customer_organization.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}"
},
"resource_field": "customer_organization",
"sends_etag": true,
"summary": "Updates a customer organization.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the customer organization does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also close every membership.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/customer_organizations/*}",
"method": "auth.customer_organizations.delete",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}"
},
"summary": "Deletes a customer organization.",
"verb": "delete"
}
],
"noun": "customer-organizations",
"resource_type": "auth.sylphx.com/CustomerOrganization"
},
{
"collection": "memberships",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/customer_organizations/*/memberships/*}",
"method": "auth.memberships.get",
"permission": "auth:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}/memberships/{membership}"
},
"summary": "Gets a membership.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/customer_organizations/*}/memberships",
"method": "auth.memberships.list",
"paginates": true,
"permission": "auth:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}"
},
"summary": "Lists memberships.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "membership.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "membership.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "membership.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "membership.end_user",
"flag": "--end-user",
"required": true,
"summary": "The member.",
"type": "string"
},
{
"field": "membership.roles",
"flag": "--roles",
"repeated": true,
"summary": "App-defined roles, for example `admin`.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/customer_organizations/*}/memberships",
"method": "auth.memberships.create",
"permission": "auth:write",
"positional": {
"arg": "ID",
"field": "membership_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "membership",
"summary": "Creates a membership.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "membership.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "membership.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "membership.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "membership.roles",
"flag": "--roles",
"repeated": true,
"summary": "App-defined roles, for example `admin`.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{membership.name=orgs/*/projects/*/envs/*/customer_organizations/*/memberships/*}",
"method": "auth.memberships.update",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "membership.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}/memberships/{membership}"
},
"resource_field": "membership",
"sends_etag": true,
"summary": "Updates a membership.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the membership does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/customer_organizations/*/memberships/*}",
"method": "auth.memberships.delete",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}/memberships/{membership}"
},
"summary": "Deletes a membership.",
"verb": "delete"
}
],
"noun": "memberships",
"resource_type": "auth.sylphx.com/Membership"
},
{
"collection": "organization_roles",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/organization_roles/*}",
"method": "auth.organization_roles.get",
"permission": "auth:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/organization_roles/{organization_role}"
},
"summary": "Gets an organization role.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/organization_roles",
"method": "auth.organization_roles.list",
"paginates": true,
"permission": "auth:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists organization roles.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "organization_role.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "organization_role.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "organization_role.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "organization_role.permissions",
"flag": "--permissions",
"repeated": true,
"summary": "The app's permission strings `<resource>:<action>`, for example `invoices:read` or `org:payroll:approve`.",
"type": "string"
},
{
"field": "organization_role.auto_assign",
"flag": "--auto-assign",
"summary": "Whether new members and invitations without roles get this role.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/organization_roles",
"method": "auth.organization_roles.create",
"permission": "auth:write",
"positional": {
"arg": "ID",
"field": "organization_role_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "organization_role",
"summary": "Creates an organization role.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "organization_role.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "organization_role.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "organization_role.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "organization_role.permissions",
"flag": "--permissions",
"repeated": true,
"summary": "The app's permission strings `<resource>:<action>`, for example `invoices:read` or `org:payroll:approve`.",
"type": "string"
},
{
"field": "organization_role.auto_assign",
"flag": "--auto-assign",
"summary": "Whether new members and invitations without roles get this role.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{organization_role.name=orgs/*/projects/*/envs/*/organization_roles/*}",
"method": "auth.organization_roles.update",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "organization_role.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/organization_roles/{organization_role}"
},
"resource_field": "organization_role",
"sends_etag": true,
"summary": "Updates an organization role.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the organization role does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/organization_roles/*}",
"method": "auth.organization_roles.delete",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/organization_roles/{organization_role}"
},
"summary": "Deletes an organization role.",
"verb": "delete"
}
],
"noun": "organization-roles",
"resource_type": "auth.sylphx.com/OrganizationRole"
},
{
"collection": "invitations",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/customer_organizations/*/invitations/*}",
"method": "auth.invitations.get",
"permission": "auth:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}/invitations/{invitation}"
},
"summary": "Gets an invitation.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/customer_organizations/*}/invitations",
"method": "auth.invitations.list",
"paginates": true,
"permission": "auth:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}"
},
"summary": "Lists invitations.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "invitation.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "invitation.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "invitation.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "invitation.email",
"flag": "--email",
"required": true,
"summary": "The invited address.",
"type": "string"
},
{
"field": "invitation.roles",
"flag": "--roles",
"repeated": true,
"summary": "Roles the membership gets; empty means the environment's default roles.",
"type": "string"
},
{
"field": "invitation.ttl",
"flag": "--ttl",
"summary": "How long it stays open; default 7 days, at most 30.",
"type": "duration"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/customer_organizations/*}/invitations",
"method": "auth.invitations.create",
"permission": "auth:write",
"positional": {
"arg": "ID",
"field": "invitation_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "invitation",
"summary": "Creates an invitation.",
"verb": "create"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/customer_organizations/*/invitations/*}:revoke",
"method": "auth.invitations.revoke",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}/invitations/{invitation}"
},
"summary": "Revokes a pending invitation.",
"verb": "revoke"
},
{
"effect": "write",
"flags": [
{
"field": "end_user",
"flag": "--end-user",
"required": true,
"summary": "The accepting end user; its verified email must be the invited address.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/customer_organizations/*/invitations/*}:accept",
"method": "auth.invitations.accept",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}/invitations/{invitation}"
},
"summary": "Accepts a pending invitation for an end user whose verified email is the invited address, and creates the membership.",
"verb": "accept"
}
],
"noun": "invitations",
"resource_type": "auth.sylphx.com/Invitation"
},
{
"collection": "email_domains",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/customer_organizations/*/email_domains/*}",
"method": "auth.email_domains.get",
"permission": "auth:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}/email_domains/{email_domain}"
},
"summary": "Gets an email domain.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/customer_organizations/*}/email_domains",
"method": "auth.email_domains.list",
"paginates": true,
"permission": "auth:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}"
},
"summary": "Lists email domains.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "email_domain.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "email_domain.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "email_domain.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "email_domain.domain",
"flag": "--domain",
"required": true,
"summary": "The domain, lowercase, for example `acme.com`.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/customer_organizations/*}/email_domains",
"method": "auth.email_domains.create",
"permission": "auth:write",
"positional": {
"arg": "ID",
"field": "email_domain_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "email_domain",
"summary": "Creates an email domain; the answer names the TXT record to publish.",
"verb": "create"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the email domain does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/customer_organizations/*/email_domains/*}",
"method": "auth.email_domains.delete",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}/email_domains/{email_domain}"
},
"summary": "Deletes an email domain.",
"verb": "delete"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/customer_organizations/*/email_domains/*}:verify",
"method": "auth.email_domains.verify",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_organizations/{customer_organization}/email_domains/{email_domain}"
},
"summary": "Looks up the domain's TXT record now; found, the domain is verified.",
"verb": "verify"
}
],
"noun": "email-domains",
"resource_type": "auth.sylphx.com/EmailDomain"
},
{
"collection": "oauth_clients",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/oauth_clients/*}",
"method": "auth.oauth_clients.get",
"permission": "auth:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/oauth_clients/{oauth_client}"
},
"summary": "Gets an OAuth client.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/oauth_clients",
"method": "auth.oauth_clients.list",
"paginates": true,
"permission": "auth:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists OAuth clients.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "oauth_client.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "oauth_client.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "oauth_client.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "oauth_client.spec.client_type",
"flag": "--spec.client-type",
"required": true,
"summary": "Confidential or public.",
"type": "enum",
"values": [
"confidential",
"public"
]
},
{
"field": "oauth_client.spec.token_endpoint_auth_method",
"flag": "--spec.token-endpoint-auth-method",
"required": true,
"summary": "How the client authenticates at the token endpoint.",
"type": "enum",
"values": [
"none",
"client_secret_basic",
"private_key_jwt"
]
},
{
"field": "oauth_client.spec.redirect_uris",
"flag": "--spec.redirect-uris",
"repeated": true,
"summary": "Exact redirect URIs.",
"type": "string"
},
{
"field": "oauth_client.spec.grant_types",
"flag": "--spec.grant-types",
"repeated": true,
"required": true,
"summary": "Allowed grants.",
"type": "enum",
"values": [
"authorization_code",
"refresh_token",
"device_code",
"client_credentials"
]
},
{
"field": "oauth_client.spec.scopes",
"flag": "--spec.scopes",
"repeated": true,
"summary": "Scopes the client may request.",
"type": "string"
},
{
"field": "oauth_client.spec.jwks_uri",
"flag": "--spec.jwks-uri",
"summary": "The client's JWKS URI, for `private_key_jwt`.",
"type": "string"
},
{
"field": "oauth_client.spec.dpop_required",
"flag": "--spec.dpop-required",
"summary": "Require DPoP-bound tokens (RFC 9449).",
"type": "bool"
},
{
"field": "oauth_client.spec.access_token_ttl",
"flag": "--spec.access-token-ttl",
"summary": "Access token lifetime; default 1h.",
"type": "duration"
},
{
"field": "oauth_client.spec.refresh_token_ttl",
"flag": "--spec.refresh-token-ttl",
"summary": "Refresh token lifetime; default 30d.",
"type": "duration"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/oauth_clients",
"method": "auth.oauth_clients.create",
"permission": "auth:write",
"positional": {
"arg": "ID",
"field": "oauth_client_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "oauth_client",
"summary": "Creates an OAuth client.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "oauth_client.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "oauth_client.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "oauth_client.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "oauth_client.spec.token_endpoint_auth_method",
"flag": "--spec.token-endpoint-auth-method",
"required": true,
"summary": "How the client authenticates at the token endpoint.",
"type": "enum",
"values": [
"none",
"client_secret_basic",
"private_key_jwt"
]
},
{
"field": "oauth_client.spec.redirect_uris",
"flag": "--spec.redirect-uris",
"repeated": true,
"summary": "Exact redirect URIs.",
"type": "string"
},
{
"field": "oauth_client.spec.grant_types",
"flag": "--spec.grant-types",
"repeated": true,
"required": true,
"summary": "Allowed grants.",
"type": "enum",
"values": [
"authorization_code",
"refresh_token",
"device_code",
"client_credentials"
]
},
{
"field": "oauth_client.spec.scopes",
"flag": "--spec.scopes",
"repeated": true,
"summary": "Scopes the client may request.",
"type": "string"
},
{
"field": "oauth_client.spec.jwks_uri",
"flag": "--spec.jwks-uri",
"summary": "The client's JWKS URI, for `private_key_jwt`.",
"type": "string"
},
{
"field": "oauth_client.spec.dpop_required",
"flag": "--spec.dpop-required",
"summary": "Require DPoP-bound tokens (RFC 9449).",
"type": "bool"
},
{
"field": "oauth_client.spec.access_token_ttl",
"flag": "--spec.access-token-ttl",
"summary": "Access token lifetime; default 1h.",
"type": "duration"
},
{
"field": "oauth_client.spec.refresh_token_ttl",
"flag": "--spec.refresh-token-ttl",
"summary": "Refresh token lifetime; default 30d.",
"type": "duration"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the OAuth client when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{oauth_client.name=orgs/*/projects/*/envs/*/oauth_clients/*}",
"method": "auth.oauth_clients.update",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "oauth_client.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/oauth_clients/{oauth_client}"
},
"resource_field": "oauth_client",
"sends_etag": true,
"summary": "Updates an OAuth client.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the OAuth client does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/oauth_clients/*}",
"method": "auth.oauth_clients.delete",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/oauth_clients/{oauth_client}"
},
"summary": "Deletes an OAuth client.",
"verb": "delete"
},
{
"effect": "write",
"flags": [
{
"field": "grace_period",
"flag": "--grace-period",
"summary": "How long the old secret keeps verifying; default 24h.",
"type": "duration"
},
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/oauth_clients/*}:rollSecret",
"method": "auth.oauth_clients.roll_secret",
"permission": "auth:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/oauth_clients/{oauth_client}"
},
"summary": "Issues a new client secret, returned once; the old one verifies until `grace_period` ends.",
"verb": "roll-secret"
}
],
"noun": "oauth-clients",
"resource_type": "auth.sylphx.com/OauthClient"
}
],
"commands": [],
"display_name": "Sylphx Auth",
"noun": "auth",
"stage": "preview"
},
{
"collections": [
{
"collection": "meters",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=meters/*}",
"method": "billing.meters.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "meters/{meter}"
},
"summary": "Gets a meter.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/meters",
"method": "billing.meters.list",
"paginates": true,
"permission": "billing:read",
"positional": null,
"summary": "Lists meters. Anonymous-readable: the pricing page renders from it.",
"verb": "list"
}
],
"noun": "meters",
"resource_type": "billing.sylphx.com/Meter"
},
{
"collection": "plans",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=plans/*}",
"method": "billing.plans.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "plans/{plan}"
},
"summary": "Gets a plan.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/plans",
"method": "billing.plans.list",
"paginates": true,
"permission": "billing:read",
"positional": null,
"summary": "Lists the plans the caller can see. Anonymous-readable: the pricing page renders from it.",
"verb": "list"
}
],
"noun": "plans",
"resource_type": "billing.sylphx.com/Plan"
},
{
"collection": "billing_accounts",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/billing_accounts/*}",
"method": "billing.billing_accounts.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/billing_accounts/{billing_account}"
},
"summary": "Gets a billing account.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*}/billing_accounts",
"method": "billing.billing_accounts.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}"
},
"summary": "Lists an org's billing accounts: exactly one, `default`.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"field": "billing_account.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "billing_account.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "billing_account.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "billing_account.spec.plan",
"flag": "--spec.plan",
"required": true,
"summary": "The public plan, for example `plans/pro`. Card accounts activate Pro by payment; approved invoice accounts may select it without a card.",
"type": "string"
},
{
"field": "billing_account.spec.spend_limit.currency_code",
"flag": "--spec.spend-limit.currency-code",
"summary": "ISO 4217 currency, for example `USD`.",
"type": "string"
},
{
"field": "billing_account.spec.spend_limit.units_minor",
"flag": "--spec.spend-limit.units-minor",
"summary": "The amount in the currency's minor unit (cents for USD).",
"type": "int"
},
{
"field": "billing_account.spec.unlimited_spend",
"flag": "--spec.unlimited-spend",
"summary": "Clears the self spend cap; never lifts a tier or reviewed credit limit.",
"type": "bool"
},
{
"field": "billing_account.spec.billing_email",
"flag": "--spec.billing-email",
"summary": "Where invoices and payment notices are sent.",
"type": "string"
},
{
"field": "billing_account.spec.payment_method",
"flag": "--spec.payment-method",
"summary": "Collection choice: `card` (default), or `invoice` with approved net terms.",
"type": "string"
},
{
"field": "billing_account.spec.invoice_terms_days",
"flag": "--spec.invoice-terms-days",
"summary": "Net days from finalization, 1..365. Changes require billing:terms:approve and affect only newly finalized invoices, never frozen history.",
"type": "int"
},
{
"field": "billing_account.spec.invoice_terms_approved",
"flag": "--spec.invoice-terms-approved",
"summary": "Credit approval is an ordinary account setting, not a company flag. Writing this field requires billing:terms:approve in addition to admin.",
"type": "bool"
},
{
"field": "billing_account.spec.credit_limit.currency_code",
"flag": "--spec.credit-limit.currency-code",
"summary": "ISO 4217 currency, for example `USD`.",
"type": "string"
},
{
"field": "billing_account.spec.credit_limit.units_minor",
"flag": "--spec.credit-limit.units-minor",
"summary": "The amount in the currency's minor unit (cents for USD).",
"type": "int"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{billing_account.name=orgs/*/billing_accounts/*}",
"method": "billing.billing_accounts.update",
"permission": "billing:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "billing_account.name",
"pattern": "orgs/{org}/billing_accounts/{billing_account}"
},
"resource_field": "billing_account",
"sends_etag": true,
"summary": "Updates a billing account: changes plan, spend limit, or billing email.",
"update_mask": "from-flags",
"verb": "update"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/billing_accounts/*}:setupPaymentMethod",
"method": "billing.billing_accounts.setup_payment_method",
"permission": "billing:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/billing_accounts/{billing_account}"
},
"summary": "Starts saving a payment method for the org: returns a client secret the console confirms with Stripe.js, so card data never reaches Sylphx. The saved method becomes the account's default and is charged off-session for each finalized invoice.",
"verb": "setup-payment-method"
}
],
"noun": "billing-accounts",
"resource_type": "billing.sylphx.com/BillingAccount"
},
{
"collection": "invoices",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/invoices/*}",
"method": "billing.invoices.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/invoices/{invoice}"
},
"summary": "Gets an invoice.",
"verb": "get"
},
{
"effect": "write",
"flags": [
{
"field": "payment_method",
"flag": "--payment-method",
"required": true,
"summary": "card or invoice debits cash; internal_settlement debits a dedicated noncash journal account, never cash or promotional/customer credit.",
"type": "string"
},
{
"field": "settlement_reference",
"flag": "--settlement-reference",
"required": true,
"summary": "Bank/provider/journal reference, 1..200 bytes, unique per org and method.",
"type": "string"
},
{
"field": "amount",
"flag": "--amount",
"required": true,
"summary": "Positive exact full outstanding balance in USD integer minor units.",
"type": "json"
}
],
"http": "POST /v1/{name=orgs/*/invoices/*}:recordPayment",
"method": "billing.invoices.record_payment",
"permission": "billing:payments:record",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/invoices/{invoice}"
},
"summary": "A seller operator records an externally verified full invoice payment. The platform-only scope cannot be granted by customer owners/admins. The invoice name identifies the customer, not the seller. References are immutable and idempotent per org and method; conflicting reuse is refused.",
"verb": "record-payment"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*}/invoices",
"method": "billing.invoices.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}"
},
"summary": "Lists an org's invoices.",
"verb": "list"
}
],
"noun": "invoices",
"resource_type": "billing.sylphx.com/Invoice"
},
{
"collection": "usage_reports",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/usage_reports/*}",
"method": "billing.usage_reports.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/usage_reports/{usage_report}"
},
"summary": "Gets an usage report.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*}/usage_reports",
"method": "billing.usage_reports.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}"
},
"summary": "Lists an org's usage reports, one per billing period.",
"verb": "list"
},
{
"effect": "read",
"flags": [
{
"field": "start_time",
"flag": "--start-time",
"required": true,
"summary": "The start of the range, inclusive.",
"type": "timestamp"
},
{
"field": "end_time",
"flag": "--end-time",
"required": true,
"summary": "The end of the range, exclusive; at most 400 days after `start_time`.",
"type": "timestamp"
},
{
"field": "granularity",
"flag": "--granularity",
"required": true,
"summary": "The bucket width.",
"type": "enum",
"values": [
"hour",
"day",
"period"
]
},
{
"field": "projects",
"flag": "--projects",
"repeated": true,
"summary": "Only these projects; empty means every project.",
"type": "string"
},
{
"field": "meters",
"flag": "--meters",
"repeated": true,
"summary": "Only these meter ids; empty means every meter.",
"type": "string"
},
{
"field": "group_projects",
"flag": "--group-projects",
"summary": "Group by project in addition to meter.",
"type": "bool"
},
{
"field": "group_dimensions",
"flag": "--group-dimensions",
"repeated": true,
"summary": "Dimension keys to group by, for example `model`.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*}/usage_reports:query",
"method": "billing.usage_reports.query",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}"
},
"summary": "Queries usage over any time range, bucketed and grouped: the usage summary the console charts. Reads rollups; never raw events.",
"verb": "query"
}
],
"noun": "usage-reports",
"resource_type": "billing.sylphx.com/UsageReport"
},
{
"collection": "budget_leases",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/budget_leases/*}",
"method": "billing.budget_leases.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/budget_leases/{budget_lease}"
},
"summary": "Gets a budget lease.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*}/budget_leases",
"method": "billing.budget_leases.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}"
},
"summary": "Lists an org's budget leases.",
"verb": "list"
}
],
"noun": "budget-leases",
"resource_type": "billing.sylphx.com/BudgetLease"
}
],
"commands": [],
"display_name": "Sylphx Billing",
"noun": "billing",
"served": false,
"stage": "preview"
},
{
"collections": [
{
"collection": "trust_policies",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/trust_policies/*}",
"method": "broker.trust_policies.get",
"permission": "broker:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/trust_policies/{trust_policy}"
},
"summary": "Gets a trust policy.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*}/trust_policies",
"method": "broker.trust_policies.list",
"paginates": true,
"permission": "broker:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}"
},
"summary": "Lists an org's trust policies.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "trust_policy.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "trust_policy.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "trust_policy.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "trust_policy.spec.connection",
"flag": "--spec.connection",
"required": true,
"summary": "The Connection credentials are issued on.",
"type": "string"
},
{
"field": "trust_policy.spec.subjects",
"flag": "--spec.subjects",
"repeated": true,
"required": true,
"summary": "The identities allowed to exchange: SPIFFE ids (`spiffe://<trust-domain>/cell/<cell>/role/<role>`, `*` matching one segment) or Sylphx Access principal names. The cell segment is never stripped.",
"type": "string"
},
{
"field": "trust_policy.spec.permissions",
"flag": "--spec.permissions",
"repeated": true,
"required": true,
"summary": "The most a credential may carry, in the provider's permission names, for example `{\"contents\": \"read\", \"checks\": \"write\"}`.",
"type": "key=value"
},
{
"field": "trust_policy.spec.repositories",
"flag": "--spec.repositories",
"repeated": true,
"summary": "The most repositories a credential may cover; empty means every repository the Connection covers.",
"type": "string"
},
{
"field": "trust_policy.spec.credential_kind",
"flag": "--spec.credential-kind",
"required": true,
"summary": "What the credential service issues.",
"type": "enum",
"values": [
"access_token",
"runner_registration"
]
},
{
"field": "trust_policy.spec.max_ttl",
"flag": "--spec.max-ttl",
"summary": "The longest a credential lives; default and maximum 1 hour.",
"type": "duration"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*}/trust_policies",
"method": "broker.trust_policies.create",
"permission": "broker:admin",
"positional": {
"arg": "ID",
"field": "trust_policy_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "trust_policy",
"summary": "Creates a trust policy.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "trust_policy.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "trust_policy.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "trust_policy.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "trust_policy.spec.connection",
"flag": "--spec.connection",
"required": true,
"summary": "The Connection credentials are issued on.",
"type": "string"
},
{
"field": "trust_policy.spec.subjects",
"flag": "--spec.subjects",
"repeated": true,
"required": true,
"summary": "The identities allowed to exchange: SPIFFE ids (`spiffe://<trust-domain>/cell/<cell>/role/<role>`, `*` matching one segment) or Sylphx Access principal names. The cell segment is never stripped.",
"type": "string"
},
{
"field": "trust_policy.spec.permissions",
"flag": "--spec.permissions",
"repeated": true,
"required": true,
"summary": "The most a credential may carry, in the provider's permission names, for example `{\"contents\": \"read\", \"checks\": \"write\"}`.",
"type": "key=value"
},
{
"field": "trust_policy.spec.repositories",
"flag": "--spec.repositories",
"repeated": true,
"summary": "The most repositories a credential may cover; empty means every repository the Connection covers.",
"type": "string"
},
{
"field": "trust_policy.spec.credential_kind",
"flag": "--spec.credential-kind",
"required": true,
"summary": "What the credential service issues.",
"type": "enum",
"values": [
"access_token",
"runner_registration"
]
},
{
"field": "trust_policy.spec.max_ttl",
"flag": "--spec.max-ttl",
"summary": "The longest a credential lives; default and maximum 1 hour.",
"type": "duration"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{trust_policy.name=orgs/*/trust_policies/*}",
"method": "broker.trust_policies.update",
"permission": "broker:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "trust_policy.name",
"pattern": "orgs/{org}/trust_policies/{trust_policy}"
},
"resource_field": "trust_policy",
"sends_etag": true,
"summary": "Updates a trust policy.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/trust_policies/*}",
"method": "broker.trust_policies.delete",
"permission": "broker:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/trust_policies/{trust_policy}"
},
"summary": "Deletes a trust policy.",
"verb": "delete"
},
{
"effect": "write",
"flags": [
{
"field": "subject_token",
"flag": "--subject-token",
"required": true,
"sensitive": true,
"summary": "The caller's identity: a SPIFFE JWT-SVID or an Access-issued workload OIDC token, with audience `broker.sylphx.com`.",
"type": "string"
},
{
"field": "permissions",
"flag": "--permissions",
"repeated": true,
"summary": "The permissions this call needs, at most the policy's; empty means the policy's.",
"type": "key=value"
},
{
"field": "repositories",
"flag": "--repositories",
"repeated": true,
"summary": "The repositories this call needs, at most the policy's; empty means the policy's.",
"type": "string"
},
{
"field": "ttl",
"flag": "--ttl",
"summary": "How long the credential should live, at most the policy's `max_ttl`.",
"type": "duration"
}
],
"http": "POST /v1/{name=orgs/*/trust_policies/*}:exchangeToken",
"method": "broker.trust_policies.exchange_token",
"permission": "broker:exchange",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/trust_policies/{trust_policy}"
},
"summary": "Exchanges the caller's workload identity for a short-lived provider credential under a trust policy (RFC 8693 token exchange). The credential is narrowed to the request and cached per installation and permission set; a permission the Connection lacks is PERMISSION_DENIED with reason `CapabilityMissing`, never an outage.",
"verb": "exchange-token"
}
],
"noun": "trust-policies",
"resource_type": "broker.sylphx.com/TrustPolicy"
}
],
"commands": [],
"display_name": "Sylphx Broker",
"noun": "broker",
"served": false,
"stage": "preview"
},
{
"collections": [
{
"collection": "builds",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/builds/*}",
"method": "build.builds.get",
"permission": "build:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/builds/{build}"
},
"summary": "Gets a build.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*}/builds",
"method": "build.builds.list",
"paginates": true,
"permission": "build:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}"
},
"summary": "Lists builds in a project.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "build.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "build.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "build.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "build.spec.source.source_link",
"flag": "--spec.source.source-link",
"summary": "The Hosting SourceLink naming the repository and its Connection.",
"type": "string"
},
{
"field": "build.spec.source.commit",
"flag": "--spec.source.commit",
"summary": "The full commit SHA to build.",
"type": "string"
},
{
"field": "build.spec.source.root_directory",
"flag": "--spec.source.root-directory",
"summary": "The directory inside the repository to build; default the root.",
"type": "string"
},
{
"field": "build.spec.cache",
"flag": "--spec.cache",
"summary": "The BuildCache to read and write; default the project's `default` cache.",
"type": "string"
},
{
"field": "build.spec.tree.root_digest",
"flag": "--spec.tree.root-digest",
"summary": "The root `Directory` digest, `<sha256 hex>/<size in bytes>`.",
"type": "string"
},
{
"field": "build.spec.image.service",
"flag": "--spec.image.service",
"summary": "The `sylphx.toml` service whose `dockerfile` and `context` apply; unset reads the fields below or lets the zero-config frontend detect the stack.",
"type": "string"
},
{
"field": "build.spec.image.dockerfile",
"flag": "--spec.image.dockerfile",
"summary": "A Dockerfile path relative to the input root; unset lets the zero-config frontend detect the stack.",
"type": "string"
},
{
"field": "build.spec.image.target",
"flag": "--spec.image.target",
"summary": "The Dockerfile stage to build.",
"type": "string"
},
{
"field": "build.spec.image.build_args",
"flag": "--spec.image.build-args",
"repeated": true,
"summary": "Build arguments. Secret values bind through `[build.secrets]`, never here.",
"type": "key=value"
},
{
"field": "build.spec.command.argv",
"flag": "--spec.command.argv",
"repeated": true,
"summary": "The program and its arguments. Use `[\"bash\", \"-lc\", \"…\"]` for a shell.",
"type": "string"
},
{
"field": "build.spec.command.artifacts",
"flag": "--spec.command.artifacts",
"repeated": true,
"summary": "Globs, relative to the input root, of files kept after the command ends, whatever its exit code (test reports, coverage).",
"type": "string"
},
{
"field": "build.spec.size",
"flag": "--spec.size",
"summary": "The machine size; default `[build] size`, else STANDARD.",
"type": "enum",
"values": [
"standard",
"large",
"xlarge"
]
},
{
"field": "build.spec.timeout",
"flag": "--spec.timeout",
"summary": "The time limit; default 1 hour, at most 6 hours. A command that reaches it is killed and the Build ends with BUILD_FAILURE_TIMEOUT.",
"type": "duration"
},
{
"field": "build.spec.allow_hosts",
"flag": "--spec.allow-hosts",
"repeated": true,
"summary": "Internet hosts the build may reach. Empty means in-cell only: the mirrors and the store. Default `[build] allow_hosts`.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*}/builds",
"method": "build.builds.create",
"permission": "build:run",
"positional": {
"arg": "ID",
"field": "build_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "build",
"summary": "Creates a build: one command or one image over a commit or a tree. The Operation is done when the build reaches a final state. `run` and `image` are the short forms.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/builds/*}:cancel",
"method": "build.builds.cancel",
"permission": "build:run",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/builds/{build}"
},
"summary": "Cancels a queued or running Build; its lease is released and nothing is published.",
"verb": "cancel",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "tree",
"flag": "--tree",
"required": true,
"summary": "The uploaded tree to run over.",
"type": "json"
},
{
"field": "command",
"flag": "--command",
"repeated": true,
"required": true,
"summary": "The program and its arguments.",
"type": "string"
},
{
"field": "artifacts",
"flag": "--artifacts",
"repeated": true,
"summary": "Globs of files kept after the command ends, whatever its exit code.",
"type": "string"
},
{
"field": "size",
"flag": "--size",
"summary": "The machine size; default `[build] size`, else STANDARD.",
"type": "enum",
"values": [
"standard",
"large",
"xlarge"
]
},
{
"field": "timeout",
"flag": "--timeout",
"summary": "The time limit; default 1 hour.",
"type": "duration"
},
{
"field": "allow_hosts",
"flag": "--allow-hosts",
"repeated": true,
"summary": "Internet hosts the command may reach; empty means in-cell only.",
"type": "string"
},
{
"field": "cache",
"flag": "--cache",
"summary": "The BuildCache to use; default the project's `default` cache.",
"type": "string"
},
{
"field": "build_id",
"flag": "--build-id",
"summary": "The id segment of the Build's name; the server assigns one when unset.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*}/builds:run",
"method": "build.builds.run",
"permission": "build:run",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}"
},
"summary": "Runs one command over an uploaded tree and settles with its exit code, like the local command. A caller that gets a failure before the command started (BUILD_FAILURE_SETUP_FAILED, NO_CAPACITY) may build locally.",
"verb": "run",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "source",
"flag": "--source",
"summary": "A commit, read through the Broker at that exact commit.",
"type": "json"
},
{
"field": "tree",
"flag": "--tree",
"summary": "An uploaded tree.",
"type": "json"
},
{
"field": "image",
"flag": "--image",
"summary": "The image to build.",
"type": "json"
},
{
"field": "size",
"flag": "--size",
"summary": "The machine size; default `[build] size`, else STANDARD.",
"type": "enum",
"values": [
"standard",
"large",
"xlarge"
]
},
{
"field": "timeout",
"flag": "--timeout",
"summary": "The time limit; default 1 hour.",
"type": "duration"
},
{
"field": "allow_hosts",
"flag": "--allow-hosts",
"repeated": true,
"summary": "Internet hosts the build may reach; empty means in-cell only.",
"type": "string"
},
{
"field": "cache",
"flag": "--cache",
"summary": "The BuildCache to use; default the project's `default` cache.",
"type": "string"
},
{
"field": "build_id",
"flag": "--build-id",
"summary": "The id segment of the Build's name; the server assigns one when unset.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*}/builds:buildImage",
"method": "build.builds.build_image",
"permission": "build:run",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}"
},
"summary": "Builds an image, with an SBOM and signed provenance, from a commit or an uploaded tree.",
"verb": "build-image",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many lines; default 500, clamped to 5000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "wait",
"flag": "--wait",
"summary": "On a running build, wait up to this long (at most 30s) for new lines before returning an empty page.",
"type": "duration"
}
],
"http": "GET /v1/{name=orgs/*/projects/*/builds/*}:readLogs",
"method": "build.builds.read_logs",
"permission": "build:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/builds/{build}"
},
"summary": "Reads a page of a build's log lines, oldest first. With `wait`, an empty page on a running build waits up to that long for new lines, so a client follows the log by passing each `next_page_token` back.",
"verb": "read-logs"
}
],
"noun": "builds",
"resource_type": "build.sylphx.com/Build"
},
{
"collection": "build_caches",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/build_caches/*}",
"method": "build.build_caches.get",
"permission": "build:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/build_caches/{build_cache}"
},
"summary": "Gets a build cache.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*}/build_caches",
"method": "build.build_caches.list",
"paginates": true,
"permission": "build:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}"
},
"summary": "Lists build caches in a project.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"field": "build_cache.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "build_cache.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "build_cache.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "build_cache.spec.retention",
"flag": "--spec.retention",
"summary": "Entries unused this long are evicted; default 7 days.",
"type": "duration"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the Resource when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{build_cache.name=orgs/*/projects/*/build_caches/*}",
"method": "build.build_caches.update",
"permission": "build:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "build_cache.name",
"pattern": "orgs/{org}/projects/{project}/build_caches/{build_cache}"
},
"resource_field": "build_cache",
"sends_etag": true,
"summary": "Updates a build cache.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/build_caches/*}",
"method": "build.build_caches.delete",
"permission": "build:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/build_caches/{build_cache}"
},
"summary": "Deletes a build cache.",
"verb": "delete"
},
{
"effect": "write",
"flags": [
{
"field": "access",
"flag": "--access",
"summary": "What the token may do; default READ.",
"type": "enum",
"values": [
"read",
"read_write"
]
}
],
"http": "POST /v1/{name=orgs/*/projects/*/build_caches/*}:mintEnv",
"method": "build.build_caches.mint_env",
"permission": "build:run",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/build_caches/{build_cache}"
},
"summary": "Mints the settings a build that runs elsewhere (a laptop, a CI runner) uses to reach the cache: the sccache, Turbo and crates mirror doors and a short-lived token, as environment variables.",
"verb": "mint-env"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Purge only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/build_caches/*}:purge",
"method": "build.build_caches.purge",
"permission": "build:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/build_caches/{build_cache}"
},
"summary": "Empties a build cache and keeps the cache. The undo is that the next build refills it.",
"verb": "purge",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "build-caches",
"resource_type": "build.sylphx.com/BuildCache"
}
],
"commands": [],
"display_name": "Sylphx Build",
"noun": "build",
"porcelain": [
{
"effect": "write",
"flags": [
{
"field": "tree",
"flag": "--tree",
"required": true,
"summary": "The uploaded tree to run over.",
"type": "json"
},
{
"field": "command",
"flag": "--command",
"repeated": true,
"required": true,
"summary": "The program and its arguments.",
"type": "string"
},
{
"field": "artifacts",
"flag": "--artifacts",
"repeated": true,
"summary": "Globs of files kept after the command ends, whatever its exit code.",
"type": "string"
},
{
"field": "size",
"flag": "--size",
"summary": "The machine size; default `[build] size`, else STANDARD.",
"type": "enum",
"values": [
"standard",
"large",
"xlarge"
]
},
{
"field": "timeout",
"flag": "--timeout",
"summary": "The time limit; default 1 hour.",
"type": "duration"
},
{
"field": "allow_hosts",
"flag": "--allow-hosts",
"repeated": true,
"summary": "Internet hosts the command may reach; empty means in-cell only.",
"type": "string"
},
{
"field": "cache",
"flag": "--cache",
"summary": "The BuildCache to use; default the project's `default` cache.",
"type": "string"
},
{
"field": "build_id",
"flag": "--build-id",
"summary": "The id segment of the Build's name; the server assigns one when unset.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*}/builds:run",
"method": "build.builds.run",
"path": [],
"permission": "build:run",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}"
},
"summary": "Runs one command over an uploaded tree and settles with its exit code, like the local command. A caller that gets a failure before the command started (BUILD_FAILURE_SETUP_FAILED, NO_CAPACITY) may build locally.",
"verb": "run",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "source",
"flag": "--source",
"summary": "A commit, read through the Broker at that exact commit.",
"type": "json"
},
{
"field": "tree",
"flag": "--tree",
"summary": "An uploaded tree.",
"type": "json"
},
{
"field": "image",
"flag": "--image",
"summary": "The image to build.",
"type": "json"
},
{
"field": "size",
"flag": "--size",
"summary": "The machine size; default `[build] size`, else STANDARD.",
"type": "enum",
"values": [
"standard",
"large",
"xlarge"
]
},
{
"field": "timeout",
"flag": "--timeout",
"summary": "The time limit; default 1 hour.",
"type": "duration"
},
{
"field": "allow_hosts",
"flag": "--allow-hosts",
"repeated": true,
"summary": "Internet hosts the build may reach; empty means in-cell only.",
"type": "string"
},
{
"field": "cache",
"flag": "--cache",
"summary": "The BuildCache to use; default the project's `default` cache.",
"type": "string"
},
{
"field": "build_id",
"flag": "--build-id",
"summary": "The id segment of the Build's name; the server assigns one when unset.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*}/builds:buildImage",
"method": "build.builds.build_image",
"path": [],
"permission": "build:run",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}"
},
"summary": "Builds an image, with an SBOM and signed provenance, from a commit or an uploaded tree.",
"verb": "image",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many lines; default 500, clamped to 5000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "wait",
"flag": "--wait",
"summary": "On a running build, wait up to this long (at most 30s) for new lines before returning an empty page.",
"type": "duration"
}
],
"http": "GET /v1/{name=orgs/*/projects/*/builds/*}:readLogs",
"method": "build.builds.read_logs",
"path": [
"logs"
],
"permission": "build:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/builds/{build}"
},
"summary": "Reads a page of a build's log lines, oldest first. With `wait`, an empty page on a running build waits up to that long for new lines, so a client follows the log by passing each `next_page_token` back.",
"verb": "read"
},
{
"effect": "write",
"flags": [
{
"field": "access",
"flag": "--access",
"summary": "What the token may do; default READ.",
"type": "enum",
"values": [
"read",
"read_write"
]
}
],
"http": "POST /v1/{name=orgs/*/projects/*/build_caches/*}:mintEnv",
"method": "build.build_caches.mint_env",
"path": [
"cache"
],
"permission": "build:run",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/build_caches/{build_cache}"
},
"summary": "Mints the settings a build that runs elsewhere (a laptop, a CI runner) uses to reach the cache: the sccache, Turbo and crates mirror doors and a short-lived token, as environment variables.",
"verb": "env"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Purge only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/build_caches/*}:purge",
"method": "build.build_caches.purge",
"path": [
"caches"
],
"permission": "build:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/build_caches/{build_cache}"
},
"summary": "Empties a build cache and keeps the cache. The undo is that the next build refills it.",
"verb": "purge",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"stage": "preview"
},
{
"collections": [
{
"collection": "config_flags",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/config_flags/*}",
"method": "config.config_flags.get",
"permission": "config:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/config_flags/{config_flag}"
},
"summary": "Gets a config flag.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/config_flags",
"method": "config.config_flags.list",
"paginates": true,
"permission": "config:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists config flags in an environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "config_flag.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "config_flag.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "config_flag.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "config_flag.spec.value_type",
"flag": "--spec.value-type",
"required": true,
"summary": "The type every value of the flag has.",
"type": "enum",
"values": [
"bool",
"string",
"int64",
"double",
"json"
]
},
{
"field": "config_flag.spec.default_value",
"flag": "--spec.default-value",
"required": true,
"summary": "The value when no rule matches, or when the flag is disabled.",
"type": "json"
},
{
"field": "config_flag.spec.enabled",
"flag": "--spec.enabled",
"summary": "When false, every evaluation returns `default_value` and the rules are skipped: a kill switch. Default true.",
"type": "bool"
},
{
"field": "config_flag.spec.rules",
"flag": "--spec.rules",
"repeated": true,
"summary": "Targeting rules, first match wins.",
"type": "json"
},
{
"field": "config_flag.spec.description",
"flag": "--spec.description",
"summary": "What the flag is for.",
"type": "string"
},
{
"field": "config_flag.spec.client_visible",
"flag": "--spec.client-visible",
"summary": "Publishable keys (browsers, mobile apps) may evaluate it with `config_flags:evaluate`; default false, so a server-only flag's value never reaches a device. Secret keys evaluate every flag.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/config_flags",
"method": "config.config_flags.create",
"permission": "config:write",
"positional": {
"arg": "ID",
"field": "config_flag_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "config_flag",
"summary": "Creates a config flag; the Operation is done when every cell serves it.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "config_flag.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "config_flag.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "config_flag.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "config_flag.spec.default_value",
"flag": "--spec.default-value",
"required": true,
"summary": "The value when no rule matches, or when the flag is disabled.",
"type": "json"
},
{
"field": "config_flag.spec.enabled",
"flag": "--spec.enabled",
"summary": "When false, every evaluation returns `default_value` and the rules are skipped: a kill switch. Default true.",
"type": "bool"
},
{
"field": "config_flag.spec.rules",
"flag": "--spec.rules",
"repeated": true,
"summary": "Targeting rules, first match wins.",
"type": "json"
},
{
"field": "config_flag.spec.description",
"flag": "--spec.description",
"summary": "What the flag is for.",
"type": "string"
},
{
"field": "config_flag.spec.client_visible",
"flag": "--spec.client-visible",
"summary": "Publishable keys (browsers, mobile apps) may evaluate it with `config_flags:evaluate`; default false, so a server-only flag's value never reaches a device. Secret keys evaluate every flag.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{config_flag.name=orgs/*/projects/*/envs/*/config_flags/*}",
"method": "config.config_flags.update",
"permission": "config:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "config_flag.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/config_flags/{config_flag}"
},
"resource_field": "config_flag",
"sends_etag": true,
"summary": "Updates a config flag; the change rolls out in waves and the Operation is done when every cell serves it.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/config_flags/*}",
"method": "config.config_flags.delete",
"permission": "config:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/config_flags/{config_flag}"
},
"summary": "Deletes a config flag; evaluators then get their compiled-in fallback.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "read",
"flags": [
{
"field": "context",
"flag": "--context",
"summary": "Who and what the evaluation is for.",
"type": "json"
},
{
"field": "config_flags",
"flag": "--config-flags",
"repeated": true,
"summary": "The ids of the flags to evaluate; empty evaluates every flag of the environment. An unknown id answers reason NOT_FOUND.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/config_flags:evaluate",
"method": "config.config_flags.evaluate",
"permission": "config:evaluate",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Evaluates config flags of an environment for one evaluation context: each flag's value, and why. Browsers and mobile apps call it with a publishable key holding `config:evaluate`, which reads values, never rules.",
"verb": "evaluate"
},
{
"effect": "read",
"flags": [
{
"field": "if_none_match",
"flag": "--if-none-match",
"summary": "The `etag` of the snapshot the caller holds; unchanged answers `not_modified`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/config_flags:snapshot",
"method": "config.config_flags.snapshot",
"permission": "config:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "The environment's flags and segments in one read, for SDKs that evaluate locally. Poll it with `if_none_match` set to the last `etag`: an unchanged ruleset answers `not_modified` and nothing else.",
"verb": "snapshot"
}
],
"noun": "config-flags",
"resource_type": "config.sylphx.com/ConfigFlag"
},
{
"collection": "config_segments",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/config_segments/*}",
"method": "config.config_segments.get",
"permission": "config:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/config_segments/{config_segment}"
},
"summary": "Gets a config segment.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/config_segments",
"method": "config.config_segments.list",
"paginates": true,
"permission": "config:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists config segments in an environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "config_segment.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "config_segment.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "config_segment.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "config_segment.spec.included",
"flag": "--spec.included",
"repeated": true,
"summary": "Subjects always in the segment, by `user_id` or `anonymous_id`.",
"type": "string"
},
{
"field": "config_segment.spec.excluded",
"flag": "--spec.excluded",
"repeated": true,
"summary": "Subjects never in the segment, whatever else holds.",
"type": "string"
},
{
"field": "config_segment.spec.conditions",
"flag": "--spec.conditions",
"repeated": true,
"summary": "Conditions over the evaluation context; all must hold.",
"type": "json"
},
{
"field": "config_segment.spec.description",
"flag": "--spec.description",
"summary": "Who the segment is.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/config_segments",
"method": "config.config_segments.create",
"permission": "config:write",
"positional": {
"arg": "ID",
"field": "config_segment_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "config_segment",
"summary": "Creates a config segment.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "config_segment.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "config_segment.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "config_segment.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "config_segment.spec.included",
"flag": "--spec.included",
"repeated": true,
"summary": "Subjects always in the segment, by `user_id` or `anonymous_id`.",
"type": "string"
},
{
"field": "config_segment.spec.excluded",
"flag": "--spec.excluded",
"repeated": true,
"summary": "Subjects never in the segment, whatever else holds.",
"type": "string"
},
{
"field": "config_segment.spec.conditions",
"flag": "--spec.conditions",
"repeated": true,
"summary": "Conditions over the evaluation context; all must hold.",
"type": "json"
},
{
"field": "config_segment.spec.description",
"flag": "--spec.description",
"summary": "Who the segment is.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{config_segment.name=orgs/*/projects/*/envs/*/config_segments/*}",
"method": "config.config_segments.update",
"permission": "config:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "config_segment.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/config_segments/{config_segment}"
},
"resource_field": "config_segment",
"sends_etag": true,
"summary": "Updates a config segment; every flag naming it follows.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/config_segments/*}",
"method": "config.config_segments.delete",
"permission": "config:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/config_segments/{config_segment}"
},
"summary": "Deletes a config segment; refused while a flag names it.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "config-segments",
"resource_type": "config.sylphx.com/ConfigSegment"
},
{
"collection": "config_changes",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/config_changes/*}",
"method": "config.config_changes.get",
"permission": "config:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/config_changes/{config_change}"
},
"summary": "Gets a config change.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter; `target = \"<flag or segment name>\"` is supported.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/config_changes",
"method": "config.config_changes.list",
"paginates": true,
"permission": "config:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists config changes in an environment.",
"verb": "list"
}
],
"noun": "config-changes",
"resource_type": "config.sylphx.com/ConfigChange"
}
],
"commands": [],
"display_name": "Sylphx Config",
"noun": "config",
"stage": "preview"
},
{
"collections": [
{
"collection": "connection_providers",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/connection_providers/*}",
"method": "connections.connection_providers.get",
"permission": "connections:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/connection_providers/{connection_provider}"
},
"summary": "Gets a connection provider.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*}/connection_providers",
"method": "connections.connection_providers.list",
"paginates": true,
"permission": "connections:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}"
},
"summary": "Lists an org's connection providers.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "connection_provider.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "connection_provider.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "connection_provider.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "connection_provider.spec.github_app.app_id",
"flag": "--spec.github-app.app-id",
"summary": "The App's numeric id.",
"type": "int"
},
{
"field": "connection_provider.spec.github_app.slug",
"flag": "--spec.github-app.slug",
"summary": "The App's slug, for example `sylphx`.",
"type": "string"
},
{
"field": "connection_provider.spec.github_app.client_id",
"flag": "--spec.github-app.client-id",
"summary": "The App's OAuth client id.",
"type": "string"
},
{
"field": "connection_provider.spec.github_app.signing_key",
"flag": "--spec.github-app.signing-key",
"summary": "The imported, non-exportable SIGN Key (RS256) that signs App assertions; only the credential service may use it.",
"type": "string"
},
{
"field": "connection_provider.spec.github_app.webhook_secret",
"flag": "--spec.github-app.webhook-secret",
"summary": "The Secret holding the webhook secret that verifies deliveries.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*}/connection_providers",
"method": "connections.connection_providers.create",
"permission": "connections:admin",
"positional": {
"arg": "ID",
"field": "connection_provider_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "connection_provider",
"summary": "Creates a connection provider.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "connection_provider.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "connection_provider.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "connection_provider.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "connection_provider.spec.github_app.slug",
"flag": "--spec.github-app.slug",
"summary": "The App's slug, for example `sylphx`.",
"type": "string"
},
{
"field": "connection_provider.spec.github_app.client_id",
"flag": "--spec.github-app.client-id",
"summary": "The App's OAuth client id.",
"type": "string"
},
{
"field": "connection_provider.spec.github_app.signing_key",
"flag": "--spec.github-app.signing-key",
"summary": "The imported, non-exportable SIGN Key (RS256) that signs App assertions; only the credential service may use it.",
"type": "string"
},
{
"field": "connection_provider.spec.github_app.webhook_secret",
"flag": "--spec.github-app.webhook-secret",
"summary": "The Secret holding the webhook secret that verifies deliveries.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{connection_provider.name=orgs/*/connection_providers/*}",
"method": "connections.connection_providers.update",
"permission": "connections:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "connection_provider.name",
"pattern": "orgs/{org}/connection_providers/{connection_provider}"
},
"resource_field": "connection_provider",
"sends_etag": true,
"summary": "Updates a connection provider.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete every child Resource; without it a parent with children fails with FAILED_PRECONDITION.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/connection_providers/*}",
"method": "connections.connection_providers.delete",
"permission": "connections:admin",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/connection_providers/{connection_provider}"
},
"summary": "Deletes a connection provider; it must have no connections.",
"verb": "delete"
}
],
"noun": "connection-providers",
"resource_type": "connections.sylphx.com/ConnectionProvider"
},
{
"collection": "connections",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/connections/*}",
"method": "connections.connections.get",
"permission": "connections:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/connections/{connection}"
},
"summary": "Gets a connection.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*}/connections",
"method": "connections.connections.list",
"paginates": true,
"permission": "connections:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}"
},
"summary": "Lists an org's connections.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "connection.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "connection.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "connection.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "connection.spec.provider",
"flag": "--spec.provider",
"required": true,
"summary": "The provider this is an installation of.",
"type": "string"
},
{
"field": "connection.spec.external_id",
"flag": "--spec.external-id",
"required": true,
"summary": "The provider's id of the installation, for example a GitHub App installation id.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*}/connections",
"method": "connections.connections.create",
"permission": "connections:write",
"positional": {
"arg": "ID",
"field": "connection_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "connection",
"summary": "Records an installation; the controller confirms it with the provider.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "connection.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "connection.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "connection.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{connection.name=orgs/*/connections/*}",
"method": "connections.connections.update",
"permission": "connections:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "connection.name",
"pattern": "orgs/{org}/connections/{connection}"
},
"resource_field": "connection",
"sends_etag": true,
"summary": "Updates a connection's metadata.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/connections/*}",
"method": "connections.connections.delete",
"permission": "connections:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/connections/{connection}"
},
"summary": "Forgets a connection. The installation itself is removed at the provider.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "connections",
"resource_type": "connections.sylphx.com/Connection"
}
],
"commands": [],
"display_name": "Sylphx Connections",
"noun": "connections",
"served": false,
"stage": "preview"
},
{
"collections": [
{
"collection": "databases",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/databases/*}",
"method": "data.databases.get",
"permission": "data:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/databases/{database}"
},
"summary": "Gets a database.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/databases",
"method": "data.databases.list",
"paginates": true,
"permission": "data:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists databases in a environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "database.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "database.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "database.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "database.spec.postgres_version",
"flag": "--spec.postgres-version",
"summary": "The Postgres major version, for example `17`; default the newest supported.",
"type": "string"
},
{
"field": "database.spec.compute_units",
"flag": "--spec.compute-units",
"summary": "Compute size in units; default the plan's. `max_connections` derives from it.",
"type": "number"
},
{
"field": "database.spec.region",
"flag": "--spec.region",
"summary": "The region; default the project's home region. Changing it moves the data by signed export and import.",
"type": "string"
},
{
"field": "database.spec.deletion_protection",
"flag": "--spec.deletion-protection",
"summary": "While set, Delete fails with DELETION_PROTECTED.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/databases",
"method": "data.databases.create",
"permission": "data:write",
"positional": {
"arg": "ID",
"field": "database_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "database",
"summary": "Creates a database. The Operation is done when the controller settles it.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "database.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "database.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "database.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "database.spec.compute_units",
"flag": "--spec.compute-units",
"summary": "Compute size in units; default the plan's. `max_connections` derives from it.",
"type": "number"
},
{
"field": "database.spec.region",
"flag": "--spec.region",
"summary": "The region; default the project's home region. Changing it moves the data by signed export and import.",
"type": "string"
},
{
"field": "database.spec.deletion_protection",
"flag": "--spec.deletion-protection",
"summary": "While set, Delete fails with DELETION_PROTECTED.",
"type": "bool"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the Resource when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{database.name=orgs/*/projects/*/envs/*/databases/*}",
"method": "data.databases.update",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "database.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/databases/{database}"
},
"resource_field": "database",
"sends_etag": true,
"summary": "Updates a database.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/databases/*}",
"method": "data.databases.delete",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/databases/{database}"
},
"summary": "Deletes a database. Fails while `spec.deletion_protection` is set.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "read",
"flags": [
{
"field": "profile",
"flag": "--profile",
"summary": "POOLED (default) or DIRECT.",
"type": "enum",
"values": [
"pooled",
"direct"
]
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/databases/*}:connect",
"method": "data.databases.connect",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/databases/{database}"
},
"summary": "Returns how to connect to the database: its endpoint and its own engine credentials. The credentials are not API keys and are returned only here.",
"verb": "connect"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/databases/*}:rotateCredentials",
"method": "data.databases.rotate_credentials",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/databases/{database}"
},
"summary": "Replaces the database's engine credentials; the old ones stop working once the new ones are served.",
"verb": "rotate-credentials",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "restore_time",
"flag": "--restore-time",
"required": true,
"summary": "The point in time to restore to.",
"type": "timestamp"
},
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/databases/*}:restore",
"method": "data.databases.restore",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/databases/{database}"
},
"summary": "Restores the database in place to a point in time inside its retention window; the database is unavailable while it restores.",
"verb": "restore",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "databases",
"resource_type": "data.sylphx.com/Database"
},
{
"collection": "kv_namespaces",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/kv_namespaces/*}",
"method": "data.kv_namespaces.get",
"permission": "data:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/kv_namespaces/{kv_namespace}"
},
"summary": "Gets a kv namespace.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/kv_namespaces",
"method": "data.kv_namespaces.list",
"paginates": true,
"permission": "data:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists kv namespaces in a environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "kv_namespace.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "kv_namespace.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "kv_namespace.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "kv_namespace.spec.default_ttl",
"flag": "--spec.default-ttl",
"summary": "The TTL of a value written without one; unset keeps values until deleted.",
"type": "duration"
},
{
"field": "kv_namespace.spec.region",
"flag": "--spec.region",
"summary": "The region; default the project's home region. Changing it moves the data by signed export and import.",
"type": "string"
},
{
"field": "kv_namespace.spec.deletion_protection",
"flag": "--spec.deletion-protection",
"summary": "While set, Delete fails with DELETION_PROTECTED.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/kv_namespaces",
"method": "data.kv_namespaces.create",
"permission": "data:write",
"positional": {
"arg": "ID",
"field": "kv_namespace_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "kv_namespace",
"summary": "Creates a kv namespace. The Operation is done when the controller settles it.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "kv_namespace.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "kv_namespace.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "kv_namespace.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "kv_namespace.spec.default_ttl",
"flag": "--spec.default-ttl",
"summary": "The TTL of a value written without one; unset keeps values until deleted.",
"type": "duration"
},
{
"field": "kv_namespace.spec.region",
"flag": "--spec.region",
"summary": "The region; default the project's home region. Changing it moves the data by signed export and import.",
"type": "string"
},
{
"field": "kv_namespace.spec.deletion_protection",
"flag": "--spec.deletion-protection",
"summary": "While set, Delete fails with DELETION_PROTECTED.",
"type": "bool"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the Resource when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{kv_namespace.name=orgs/*/projects/*/envs/*/kv_namespaces/*}",
"method": "data.kv_namespaces.update",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "kv_namespace.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/kv_namespaces/{kv_namespace}"
},
"resource_field": "kv_namespace",
"sends_etag": true,
"summary": "Updates a kv namespace.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/kv_namespaces/*}",
"method": "data.kv_namespaces.delete",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/kv_namespaces/{kv_namespace}"
},
"summary": "Deletes a kv namespace. Fails while `spec.deletion_protection` is set.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "read",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/kv_namespaces/*}:connect",
"method": "data.kv_namespaces.connect",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/kv_namespaces/{kv_namespace}"
},
"summary": "Returns how to connect to the KV namespace: its endpoint and its own engine credentials. The credentials are not API keys and are returned only here.",
"verb": "connect"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/kv_namespaces/*}:rotateCredentials",
"method": "data.kv_namespaces.rotate_credentials",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/kv_namespaces/{kv_namespace}"
},
"summary": "Replaces the KV namespace's engine credentials; the old ones stop working once the new ones are served.",
"verb": "rotate-credentials",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "kv-namespaces",
"resource_type": "data.sylphx.com/KvNamespace"
},
{
"collection": "buckets",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/buckets/*}",
"method": "data.buckets.get",
"permission": "data:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/buckets/{bucket}"
},
"summary": "Gets a bucket.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/buckets",
"method": "data.buckets.list",
"paginates": true,
"permission": "data:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists buckets in a environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "bucket.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "bucket.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "bucket.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "bucket.spec.versioning_enabled",
"flag": "--spec.versioning-enabled",
"summary": "Keep every version and write delete markers.",
"type": "bool"
},
{
"field": "bucket.spec.retention",
"flag": "--spec.retention",
"summary": "Versions are kept at least this long; unset keeps no minimum.",
"type": "duration"
},
{
"field": "bucket.spec.region",
"flag": "--spec.region",
"summary": "The region; default the project's home region. Changing it moves the data by signed export and import.",
"type": "string"
},
{
"field": "bucket.spec.deletion_protection",
"flag": "--spec.deletion-protection",
"summary": "While set, Delete fails with DELETION_PROTECTED.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/buckets",
"method": "data.buckets.create",
"permission": "data:write",
"positional": {
"arg": "ID",
"field": "bucket_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "bucket",
"summary": "Creates a bucket. The Operation is done when the controller settles it.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "bucket.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "bucket.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "bucket.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "bucket.spec.versioning_enabled",
"flag": "--spec.versioning-enabled",
"summary": "Keep every version and write delete markers.",
"type": "bool"
},
{
"field": "bucket.spec.retention",
"flag": "--spec.retention",
"summary": "Versions are kept at least this long; unset keeps no minimum.",
"type": "duration"
},
{
"field": "bucket.spec.region",
"flag": "--spec.region",
"summary": "The region; default the project's home region. Changing it moves the data by signed export and import.",
"type": "string"
},
{
"field": "bucket.spec.deletion_protection",
"flag": "--spec.deletion-protection",
"summary": "While set, Delete fails with DELETION_PROTECTED.",
"type": "bool"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the Resource when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{bucket.name=orgs/*/projects/*/envs/*/buckets/*}",
"method": "data.buckets.update",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "bucket.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/buckets/{bucket}"
},
"resource_field": "bucket",
"sends_etag": true,
"summary": "Updates a bucket.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/buckets/*}",
"method": "data.buckets.delete",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/buckets/{bucket}"
},
"summary": "Deletes a bucket. Fails while `spec.deletion_protection` is set.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "read",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/buckets/*}:connect",
"method": "data.buckets.connect",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/buckets/{bucket}"
},
"summary": "Returns how to connect to the bucket: its endpoint and its own engine credentials. The credentials are not API keys and are returned only here.",
"verb": "connect"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/buckets/*}:rotateCredentials",
"method": "data.buckets.rotate_credentials",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/buckets/{bucket}"
},
"summary": "Replaces the bucket's engine credentials; the old ones stop working once the new ones are served.",
"verb": "rotate-credentials",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "buckets",
"resource_type": "data.sylphx.com/Bucket"
},
{
"collection": "search_indexes",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/search_indexes/*}",
"method": "data.search_indexes.get",
"permission": "data:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/search_indexes/{search_index}"
},
"summary": "Gets a search index.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/search_indexes",
"method": "data.search_indexes.list",
"paginates": true,
"permission": "data:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists search indexs in a environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "search_index.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "search_index.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "search_index.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "search_index.spec.vector_dimensions",
"flag": "--spec.vector-dimensions",
"summary": "The vector dimension; 0 for lexical only.",
"type": "int"
},
{
"field": "search_index.spec.region",
"flag": "--spec.region",
"summary": "The region; default the project's home region. Changing it moves the data by signed export and import.",
"type": "string"
},
{
"field": "search_index.spec.deletion_protection",
"flag": "--spec.deletion-protection",
"summary": "While set, Delete fails with DELETION_PROTECTED.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/search_indexes",
"method": "data.search_indexes.create",
"permission": "data:write",
"positional": {
"arg": "ID",
"field": "search_index_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "search_index",
"summary": "Creates a search index. The Operation is done when the controller settles it.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "search_index.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "search_index.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "search_index.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "search_index.spec.region",
"flag": "--spec.region",
"summary": "The region; default the project's home region. Changing it moves the data by signed export and import.",
"type": "string"
},
{
"field": "search_index.spec.deletion_protection",
"flag": "--spec.deletion-protection",
"summary": "While set, Delete fails with DELETION_PROTECTED.",
"type": "bool"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the Resource when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{search_index.name=orgs/*/projects/*/envs/*/search_indexes/*}",
"method": "data.search_indexes.update",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "search_index.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/search_indexes/{search_index}"
},
"resource_field": "search_index",
"sends_etag": true,
"summary": "Updates a search index.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/search_indexes/*}",
"method": "data.search_indexes.delete",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/search_indexes/{search_index}"
},
"summary": "Deletes a search index. Fails while `spec.deletion_protection` is set.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "read",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/search_indexes/*}:connect",
"method": "data.search_indexes.connect",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/search_indexes/{search_index}"
},
"summary": "Returns how to connect to the search index: its endpoint and its own engine credentials. The credentials are not API keys and are returned only here.",
"verb": "connect"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/search_indexes/*}:rotateCredentials",
"method": "data.search_indexes.rotate_credentials",
"permission": "data:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/search_indexes/{search_index}"
},
"summary": "Replaces the search index's engine credentials; the old ones stop working once the new ones are served.",
"verb": "rotate-credentials",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "search-indexes",
"resource_type": "data.sylphx.com/SearchIndex"
}
],
"commands": [],
"display_name": "Sylphx Data",
"noun": "data",
"stage": "preview"
},
{
"collections": [
{
"collection": "entitlements",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/entitlements/*}",
"method": "entitlement.entitlements.get",
"permission": "entitlement:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/entitlements/{entitlement}"
},
"summary": "Gets an org's entitlement.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable spec fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*}/entitlements",
"method": "entitlement.entitlements.list",
"paginates": true,
"permission": "entitlement:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}"
},
"summary": "Lists an org's entitlements: exactly one, `default`.",
"verb": "list"
}
],
"noun": "entitlements",
"resource_type": "entitlement.sylphx.com/Entitlement"
}
],
"commands": [],
"display_name": "Sylphx Entitlement",
"noun": "entitlement",
"served": false,
"stage": "preview"
},
{
"collections": [
{
"collection": "topics",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/topics/*}",
"method": "events.topics.get",
"permission": "events:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/topics/{topic}"
},
"summary": "Gets a topic.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/topics",
"method": "events.topics.list",
"paginates": true,
"permission": "events:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists topics.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "topic.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "topic.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "topic.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "topic.spec.retention",
"flag": "--spec.retention",
"summary": "How long published events stay readable and replayable; default 7d, at most 30d.",
"type": "duration"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/topics",
"method": "events.topics.create",
"permission": "events:write",
"positional": {
"arg": "ID",
"field": "topic_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "topic",
"summary": "Creates a topic.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "topic.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "topic.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "topic.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "topic.spec.retention",
"flag": "--spec.retention",
"summary": "How long published events stay readable and replayable; default 7d, at most 30d.",
"type": "duration"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the topic when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{topic.name=orgs/*/projects/*/envs/*/topics/*}",
"method": "events.topics.update",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "topic.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/topics/{topic}"
},
"resource_field": "topic",
"sends_etag": true,
"summary": "Updates a topic.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the topic does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete the Topic's Subscriptions; without it a Topic with Subscriptions fails with INVALID_STATE.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/topics/*}",
"method": "events.topics.delete",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/topics/{topic}"
},
"summary": "Deletes a topic.",
"verb": "delete"
},
{
"effect": "write",
"flags": [
{
"field": "events",
"flag": "--events",
"repeated": true,
"required": true,
"summary": "The events, at most 100.",
"type": "json"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/topics/*}:publish",
"method": "events.topics.publish",
"permission": "events:publish",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/topics/{topic}"
},
"summary": "Publishes CloudEvents into a Topic, atomically. Replaying the same `source` + `id` with the same payload returns the stored event; a different payload fails with RESOURCE_ALREADY_EXISTS.",
"verb": "publish"
}
],
"noun": "topics",
"resource_type": "events.sylphx.com/Topic"
},
{
"collection": "events",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/events/*}",
"method": "events.events.get",
"permission": "events:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/events/{event}"
},
"summary": "Gets an event.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/events",
"method": "events.events.list",
"paginates": true,
"permission": "events:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists events.",
"verb": "list"
}
],
"noun": "events",
"resource_type": "events.sylphx.com/Event"
},
{
"collection": "connectors",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/connectors/*}",
"method": "events.connectors.get",
"permission": "events:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/connectors/{connector}"
},
"summary": "Gets a connector.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over filterable fields: `kind = email`, `state = active`.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/connectors",
"method": "events.connectors.list",
"paginates": true,
"permission": "events:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists connectors.",
"verb": "list"
}
],
"noun": "connectors",
"resource_type": "events.sylphx.com/Connector"
},
{
"collection": "subscriptions",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/subscriptions/*}",
"method": "events.subscriptions.get",
"permission": "events:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/subscriptions/{subscription}"
},
"summary": "Gets a subscription.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/subscriptions",
"method": "events.subscriptions.list",
"paginates": true,
"permission": "events:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists subscriptions.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "subscription.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "subscription.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "subscription.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "subscription.spec.topic",
"flag": "--spec.topic",
"required": true,
"summary": "The Topic to read.",
"type": "string"
},
{
"field": "subscription.spec.types",
"flag": "--spec.types",
"repeated": true,
"summary": "Match these CloudEvents types; empty matches all. A trailing `*` matches a prefix.",
"type": "string"
},
{
"field": "subscription.spec.sources",
"flag": "--spec.sources",
"repeated": true,
"summary": "Match these sources; empty matches all.",
"type": "string"
},
{
"field": "subscription.spec.queue",
"flag": "--spec.queue",
"summary": "A Queue.",
"type": "string"
},
{
"field": "subscription.spec.webhook_endpoint",
"flag": "--spec.webhook-endpoint",
"summary": "A Webhook Endpoint.",
"type": "string"
},
{
"field": "subscription.spec.realtime_channel",
"flag": "--spec.realtime-channel",
"summary": "A Realtime Channel.",
"type": "string"
},
{
"field": "subscription.spec.paused",
"flag": "--spec.paused",
"summary": "Whether matching is paused; events published while paused are not delivered.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/subscriptions",
"method": "events.subscriptions.create",
"permission": "events:write",
"positional": {
"arg": "ID",
"field": "subscription_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "subscription",
"summary": "Creates a subscription.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "subscription.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "subscription.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "subscription.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "subscription.spec.types",
"flag": "--spec.types",
"repeated": true,
"summary": "Match these CloudEvents types; empty matches all. A trailing `*` matches a prefix.",
"type": "string"
},
{
"field": "subscription.spec.sources",
"flag": "--spec.sources",
"repeated": true,
"summary": "Match these sources; empty matches all.",
"type": "string"
},
{
"field": "subscription.spec.queue",
"flag": "--spec.queue",
"summary": "A Queue.",
"type": "string"
},
{
"field": "subscription.spec.webhook_endpoint",
"flag": "--spec.webhook-endpoint",
"summary": "A Webhook Endpoint.",
"type": "string"
},
{
"field": "subscription.spec.realtime_channel",
"flag": "--spec.realtime-channel",
"summary": "A Realtime Channel.",
"type": "string"
},
{
"field": "subscription.spec.paused",
"flag": "--spec.paused",
"summary": "Whether matching is paused; events published while paused are not delivered.",
"type": "bool"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the subscription when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{subscription.name=orgs/*/projects/*/envs/*/subscriptions/*}",
"method": "events.subscriptions.update",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "subscription.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/subscriptions/{subscription}"
},
"resource_field": "subscription",
"sends_etag": true,
"summary": "Updates a subscription.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the subscription does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/subscriptions/*}",
"method": "events.subscriptions.delete",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/subscriptions/{subscription}"
},
"summary": "Deletes a subscription.",
"verb": "delete"
}
],
"noun": "subscriptions",
"resource_type": "events.sylphx.com/Subscription"
},
{
"collection": "queues",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/queues/*}",
"method": "events.queues.get",
"permission": "events:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/queues/{queue}"
},
"summary": "Gets a queue.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/queues",
"method": "events.queues.list",
"paginates": true,
"permission": "events:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists queues.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "queue.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "queue.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "queue.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "queue.spec.visibility_timeout",
"flag": "--spec.visibility-timeout",
"summary": "How long a lease hides a message; default 30s, 1s to 12h.",
"type": "duration"
},
{
"field": "queue.spec.max_deliveries",
"flag": "--spec.max-deliveries",
"summary": "Deliveries before a message dead-letters; default 5, 1 to 100.",
"type": "int"
},
{
"field": "queue.spec.dead_letter_queue",
"flag": "--spec.dead-letter-queue",
"summary": "The dead-letter Queue; unset keeps exhausted messages in this Queue's own dead-letter set.",
"type": "string"
},
{
"field": "queue.spec.retention",
"flag": "--spec.retention",
"summary": "How long an unacked message is kept; default 4d, at most 14d.",
"type": "duration"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/queues",
"method": "events.queues.create",
"permission": "events:write",
"positional": {
"arg": "ID",
"field": "queue_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "queue",
"summary": "Creates a queue.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "queue.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "queue.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "queue.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "queue.spec.visibility_timeout",
"flag": "--spec.visibility-timeout",
"summary": "How long a lease hides a message; default 30s, 1s to 12h.",
"type": "duration"
},
{
"field": "queue.spec.max_deliveries",
"flag": "--spec.max-deliveries",
"summary": "Deliveries before a message dead-letters; default 5, 1 to 100.",
"type": "int"
},
{
"field": "queue.spec.dead_letter_queue",
"flag": "--spec.dead-letter-queue",
"summary": "The dead-letter Queue; unset keeps exhausted messages in this Queue's own dead-letter set.",
"type": "string"
},
{
"field": "queue.spec.retention",
"flag": "--spec.retention",
"summary": "How long an unacked message is kept; default 4d, at most 14d.",
"type": "duration"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the queue when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{queue.name=orgs/*/projects/*/envs/*/queues/*}",
"method": "events.queues.update",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "queue.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/queues/{queue}"
},
"resource_field": "queue",
"sends_etag": true,
"summary": "Updates a queue.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the queue does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/queues/*}",
"method": "events.queues.delete",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/queues/{queue}"
},
"summary": "Deletes a queue.",
"verb": "delete"
},
{
"effect": "write",
"flags": [
{
"field": "events",
"flag": "--events",
"repeated": true,
"required": true,
"summary": "The messages, at most 100.",
"type": "json"
},
{
"field": "delay",
"flag": "--delay",
"summary": "Hide the messages this long before their first lease.",
"type": "duration"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/queues/*}:send",
"method": "events.queues.send",
"permission": "events:publish",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/queues/{queue}"
},
"summary": "Enqueues messages directly, without a Subscription.",
"verb": "send"
},
{
"effect": "write",
"flags": [
{
"field": "max_messages",
"flag": "--max-messages",
"summary": "At most this many; default 1, at most 100.",
"type": "int"
},
{
"field": "visibility_timeout",
"flag": "--visibility-timeout",
"summary": "Override the Queue's visibility timeout for this lease.",
"type": "duration"
},
{
"field": "wait",
"flag": "--wait",
"summary": "Wait up to this long (at most 20s) for a message when none is ready.",
"type": "duration"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/queues/*}:lease",
"method": "events.queues.lease",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/queues/{queue}"
},
"summary": "Leases up to `max_messages` ready messages for the visibility timeout.",
"verb": "lease"
},
{
"effect": "write",
"flags": [
{
"field": "leases",
"flag": "--leases",
"repeated": true,
"required": true,
"summary": "The leases to ack, at most 100.",
"type": "json"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/queues/*}:ack",
"method": "events.queues.ack",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/queues/{queue}"
},
"summary": "Acknowledges leased messages; each is removed. A lease that is stale (expired or superseded) is reported, not applied.",
"verb": "ack"
},
{
"effect": "write",
"flags": [
{
"field": "leases",
"flag": "--leases",
"repeated": true,
"required": true,
"summary": "The leases to nack, at most 100.",
"type": "json"
},
{
"field": "delay",
"flag": "--delay",
"summary": "Hide the messages this long before the next lease.",
"type": "duration"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/queues/*}:nack",
"method": "events.queues.nack",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/queues/{queue}"
},
"summary": "Returns leased messages to the Queue after `delay`; each nack counts as a delivery.",
"verb": "nack"
},
{
"effect": "write",
"flags": [
{
"field": "start_time",
"flag": "--start-time",
"summary": "Replay messages dead-lettered at or after this time.",
"type": "timestamp"
},
{
"field": "end_time",
"flag": "--end-time",
"summary": "Replay messages dead-lettered before this time.",
"type": "timestamp"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/queues/*}:replay",
"method": "events.queues.replay",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/queues/{queue}"
},
"summary": "Moves dead-lettered messages, optionally bounded by dead-letter time, back to ready.",
"verb": "replay"
}
],
"noun": "queues",
"resource_type": "events.sylphx.com/Queue"
},
{
"collection": "webhook_endpoints",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/webhook_endpoints/*}",
"method": "events.webhook_endpoints.get",
"permission": "events:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/webhook_endpoints/{webhook_endpoint}"
},
"summary": "Gets a webhook endpoint.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/webhook_endpoints",
"method": "events.webhook_endpoints.list",
"paginates": true,
"permission": "events:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists webhook endpoints.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "webhook_endpoint.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "webhook_endpoint.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "webhook_endpoint.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "webhook_endpoint.spec.uri",
"flag": "--spec.uri",
"required": true,
"summary": "The HTTPS URI deliveries are POSTed to; its host resolves to a public address.",
"type": "string"
},
{
"field": "webhook_endpoint.spec.disabled",
"flag": "--spec.disabled",
"summary": "Stop delivering; deliveries queue until enabled.",
"type": "bool"
},
{
"field": "webhook_endpoint.spec.max_concurrent_deliveries",
"flag": "--spec.max-concurrent-deliveries",
"summary": "At most this many deliveries in flight; default 10.",
"type": "int"
},
{
"field": "webhook_endpoint.spec.event_types",
"flag": "--spec.event-types",
"repeated": true,
"summary": "Which event types the endpoint receives: an exact type (`order.paid`), a prefix ending in `.*` (`order.*`), or `*` for every type; default `[\"*\"]`.",
"type": "string"
},
{
"field": "webhook_endpoint.spec.rate_limit_per_second",
"flag": "--spec.rate-limit-per-second",
"summary": "At most this many attempts start per second; 0 is no limit. Deliveries over the limit wait their turn; none is dropped.",
"type": "int"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/webhook_endpoints",
"method": "events.webhook_endpoints.create",
"permission": "events:write",
"positional": {
"arg": "ID",
"field": "webhook_endpoint_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "webhook_endpoint",
"summary": "Creates a webhook endpoint.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "webhook_endpoint.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "webhook_endpoint.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "webhook_endpoint.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "webhook_endpoint.spec.uri",
"flag": "--spec.uri",
"required": true,
"summary": "The HTTPS URI deliveries are POSTed to; its host resolves to a public address.",
"type": "string"
},
{
"field": "webhook_endpoint.spec.disabled",
"flag": "--spec.disabled",
"summary": "Stop delivering; deliveries queue until enabled.",
"type": "bool"
},
{
"field": "webhook_endpoint.spec.max_concurrent_deliveries",
"flag": "--spec.max-concurrent-deliveries",
"summary": "At most this many deliveries in flight; default 10.",
"type": "int"
},
{
"field": "webhook_endpoint.spec.event_types",
"flag": "--spec.event-types",
"repeated": true,
"summary": "Which event types the endpoint receives: an exact type (`order.paid`), a prefix ending in `.*` (`order.*`), or `*` for every type; default `[\"*\"]`.",
"type": "string"
},
{
"field": "webhook_endpoint.spec.rate_limit_per_second",
"flag": "--spec.rate-limit-per-second",
"summary": "At most this many attempts start per second; 0 is no limit. Deliveries over the limit wait their turn; none is dropped.",
"type": "int"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the webhook endpoint when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{webhook_endpoint.name=orgs/*/projects/*/envs/*/webhook_endpoints/*}",
"method": "events.webhook_endpoints.update",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "webhook_endpoint.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/webhook_endpoints/{webhook_endpoint}"
},
"resource_field": "webhook_endpoint",
"sends_etag": true,
"summary": "Updates a webhook endpoint.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the webhook endpoint does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete the endpoint's delivery records and the Subscriptions that target it.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/webhook_endpoints/*}",
"method": "events.webhook_endpoints.delete",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/webhook_endpoints/{webhook_endpoint}"
},
"summary": "Deletes a webhook endpoint.",
"verb": "delete"
},
{
"effect": "write",
"flags": [
{
"field": "start_time",
"flag": "--start-time",
"required": true,
"summary": "Replay deliveries created at or after this time.",
"type": "timestamp"
},
{
"field": "end_time",
"flag": "--end-time",
"summary": "Replay deliveries created before this time; default now.",
"type": "timestamp"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/webhook_endpoints/*}:replay",
"method": "events.webhook_endpoints.replay",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/webhook_endpoints/{webhook_endpoint}"
},
"summary": "Redelivers every dead-lettered delivery to the endpoint created in a time range, each as a new attempt.",
"verb": "replay"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Rotate only if the current etag matches.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/webhook_endpoints/*}:rotateSecret",
"method": "events.webhook_endpoints.rotate_secret",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/webhook_endpoints/{webhook_endpoint}"
},
"summary": "Replaces the endpoint's signing secret and returns the new one, once (`status.signing_secret`). For 24 hours deliveries carry a signature with each secret, so a receiver can switch without dropping one.",
"verb": "rotate-secret"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/webhook_endpoints/*}:test",
"method": "events.webhook_endpoints.test",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/webhook_endpoints/{webhook_endpoint}"
},
"summary": "Sends a test event (`type` `sylphx.webhook.test`) to the endpoint alone, through the same signing, retries, and delivery log as any other event.",
"verb": "test"
}
],
"noun": "webhook-endpoints",
"resource_type": "events.sylphx.com/WebhookEndpoint"
},
{
"collection": "webhook_deliveries",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/webhook_endpoints/*/webhook_deliveries/*}",
"method": "events.webhook_deliveries.get",
"permission": "events:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/webhook_endpoints/{webhook_endpoint}/webhook_deliveries/{webhook_delivery}"
},
"summary": "Gets a webhook delivery.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/webhook_endpoints/*}/webhook_deliveries",
"method": "events.webhook_deliveries.list",
"paginates": true,
"permission": "events:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/webhook_endpoints/{webhook_endpoint}"
},
"summary": "Lists webhook deliveries.",
"verb": "list"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/webhook_endpoints/*/webhook_deliveries/*}:replay",
"method": "events.webhook_deliveries.replay",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/webhook_endpoints/{webhook_endpoint}/webhook_deliveries/{webhook_delivery}"
},
"summary": "Redelivers one delivery now, as a new attempt.",
"verb": "replay"
}
],
"noun": "webhook-deliveries",
"resource_type": "events.sylphx.com/WebhookDelivery"
},
{
"collection": "inbound_endpoints",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/inbound_endpoints/*}",
"method": "events.inbound_endpoints.get",
"permission": "events:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/inbound_endpoints/{inbound_endpoint}"
},
"summary": "Gets an inbound endpoint.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/inbound_endpoints",
"method": "events.inbound_endpoints.list",
"paginates": true,
"permission": "events:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists inbound endpoints.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "inbound_endpoint.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "inbound_endpoint.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "inbound_endpoint.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "inbound_endpoint.spec.signature_scheme",
"flag": "--spec.signature-scheme",
"required": true,
"summary": "The sender's signature scheme.",
"type": "enum",
"values": [
"standard_webhooks",
"stripe",
"shopify",
"github"
]
},
{
"field": "inbound_endpoint.spec.verification_secret",
"flag": "--spec.verification-secret",
"required": true,
"summary": "The provider's verification secret, held in Sylphx Secrets.",
"type": "string"
},
{
"field": "inbound_endpoint.spec.topic",
"flag": "--spec.topic",
"required": true,
"summary": "The Topic verified requests are published to.",
"type": "string"
},
{
"field": "inbound_endpoint.spec.source",
"flag": "--spec.source",
"summary": "The CloudEvents `source` of published events; default the endpoint name.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/inbound_endpoints",
"method": "events.inbound_endpoints.create",
"permission": "events:write",
"positional": {
"arg": "ID",
"field": "inbound_endpoint_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "inbound_endpoint",
"summary": "Creates an inbound endpoint.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "inbound_endpoint.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "inbound_endpoint.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "inbound_endpoint.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "inbound_endpoint.spec.signature_scheme",
"flag": "--spec.signature-scheme",
"required": true,
"summary": "The sender's signature scheme.",
"type": "enum",
"values": [
"standard_webhooks",
"stripe",
"shopify",
"github"
]
},
{
"field": "inbound_endpoint.spec.verification_secret",
"flag": "--spec.verification-secret",
"required": true,
"summary": "The provider's verification secret, held in Sylphx Secrets.",
"type": "string"
},
{
"field": "inbound_endpoint.spec.topic",
"flag": "--spec.topic",
"required": true,
"summary": "The Topic verified requests are published to.",
"type": "string"
},
{
"field": "inbound_endpoint.spec.source",
"flag": "--spec.source",
"summary": "The CloudEvents `source` of published events; default the endpoint name.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the inbound endpoint when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{inbound_endpoint.name=orgs/*/projects/*/envs/*/inbound_endpoints/*}",
"method": "events.inbound_endpoints.update",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "inbound_endpoint.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/inbound_endpoints/{inbound_endpoint}"
},
"resource_field": "inbound_endpoint",
"sends_etag": true,
"summary": "Updates an inbound endpoint.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the inbound endpoint does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/inbound_endpoints/*}",
"method": "events.inbound_endpoints.delete",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/inbound_endpoints/{inbound_endpoint}"
},
"summary": "Deletes an inbound endpoint.",
"verb": "delete"
}
],
"noun": "inbound-endpoints",
"resource_type": "events.sylphx.com/InboundEndpoint"
},
{
"collection": "realtime_channels",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/realtime_channels/*}",
"method": "events.realtime_channels.get",
"permission": "events:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/realtime_channels/{realtime_channel}"
},
"summary": "Gets a realtime channel.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/realtime_channels",
"method": "events.realtime_channels.list",
"paginates": true,
"permission": "events:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists realtime channels.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "realtime_channel.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "realtime_channel.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "realtime_channel.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "realtime_channel.spec.publishable_ok",
"flag": "--spec.publishable-ok",
"summary": "Allow clients holding a publishable key (`events:realtime:subscribe`) to connect.",
"type": "bool"
},
{
"field": "realtime_channel.spec.history_retention",
"flag": "--spec.history-retention",
"summary": "How far back a cursor may resume; default 24h, at most 7d.",
"type": "duration"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/realtime_channels",
"method": "events.realtime_channels.create",
"permission": "events:write",
"positional": {
"arg": "ID",
"field": "realtime_channel_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "realtime_channel",
"summary": "Creates a realtime channel.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "realtime_channel.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "realtime_channel.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "realtime_channel.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "realtime_channel.spec.publishable_ok",
"flag": "--spec.publishable-ok",
"summary": "Allow clients holding a publishable key (`events:realtime:subscribe`) to connect.",
"type": "bool"
},
{
"field": "realtime_channel.spec.history_retention",
"flag": "--spec.history-retention",
"summary": "How far back a cursor may resume; default 24h, at most 7d.",
"type": "duration"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the realtime channel when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{realtime_channel.name=orgs/*/projects/*/envs/*/realtime_channels/*}",
"method": "events.realtime_channels.update",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "realtime_channel.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/realtime_channels/{realtime_channel}"
},
"resource_field": "realtime_channel",
"sends_etag": true,
"summary": "Updates a realtime channel.",
"update_mask": "from-flags",
"verb": "update"
},
{
"effect": "write",
"flags": [
{
"field": "message_type",
"flag": "--message-type",
"required": true,
"summary": "The message name, 1 to 255 of `[A-Za-z0-9._:-]`.",
"type": "string"
},
{
"field": "data",
"flag": "--data",
"summary": "The payload; at most 64 KiB as JSON.",
"type": "json"
},
{
"field": "client_id",
"flag": "--client-id",
"summary": "The publisher's client id, shown to subscribers.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/realtime_channels/*}:publish",
"method": "events.realtime_channels.publish",
"permission": "events:publish",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/realtime_channels/{realtime_channel}"
},
"summary": "Publishes one message to the channel: it is appended to the channel's history and pushed to every connected client. A retry with the same Idempotency-Key returns the first message.",
"verb": "publish"
},
{
"effect": "write",
"flags": [
{
"field": "ttl",
"flag": "--ttl",
"summary": "How long the token lives; default and at most 1 hour, at least 1 minute.",
"type": "duration"
},
{
"field": "client_id",
"flag": "--client-id",
"summary": "The client this token is for; with it, the connection enters presence.",
"type": "string"
},
{
"field": "client_data",
"flag": "--client-data",
"summary": "The client's presence data, at most 4 KiB as JSON.",
"type": "json"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/realtime_channels/*}:issueToken",
"method": "events.realtime_channels.issue_token",
"permission": "events:publish",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/realtime_channels/{realtime_channel}"
},
"summary": "Mints a subscribe token (`rtt_…`) for this channel alone, at most an hour long, for a browser or device that holds no key. A token that names a client id enters the channel's presence while it is connected.",
"verb": "issue-token"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the realtime channel does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete the channel's history. Without it, a channel with retained messages is still deleted and its history stops being readable.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/realtime_channels/*}",
"method": "events.realtime_channels.delete",
"permission": "events:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/realtime_channels/{realtime_channel}"
},
"summary": "Deletes a realtime channel.",
"verb": "delete"
}
],
"noun": "realtime-channels",
"resource_type": "events.sylphx.com/RealtimeChannel"
},
{
"collection": "realtime_messages",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/realtime_channels/*/realtime_messages/*}",
"method": "events.realtime_messages.get",
"permission": "events:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/realtime_channels/{realtime_channel}/realtime_messages/{realtime_message}"
},
"summary": "Gets one retained message of a channel.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "Empty, or `sequence > N` to start after message N (resume).",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/realtime_channels/*}/realtime_messages",
"method": "events.realtime_messages.list",
"paginates": true,
"permission": "events:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/realtime_channels/{realtime_channel}"
},
"summary": "Lists a channel's retained messages, oldest first.",
"verb": "list"
}
],
"noun": "realtime-messages",
"resource_type": "events.sylphx.com/RealtimeMessage"
},
{
"collection": "realtime_members",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/realtime_channels/*/realtime_members/*}",
"method": "events.realtime_members.get",
"permission": "events:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/realtime_channels/{realtime_channel}/realtime_members/{realtime_member}"
},
"summary": "Gets one client present in a channel.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/realtime_channels/*}/realtime_members",
"method": "events.realtime_members.list",
"paginates": true,
"permission": "events:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/realtime_channels/{realtime_channel}"
},
"summary": "Lists the clients present in a channel now.",
"verb": "list"
}
],
"noun": "realtime-members",
"resource_type": "events.sylphx.com/RealtimeMember"
}
],
"commands": [],
"display_name": "Sylphx Events",
"noun": "events",
"stage": "preview"
},
{
"collections": [
{
"collection": "services",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/services/*}",
"method": "hosting.services.get",
"permission": "hosting:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/services/{service}"
},
"summary": "Gets a service.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/services",
"method": "hosting.services.list",
"paginates": true,
"permission": "hosting:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists services in a environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "service.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "service.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "service.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "service.spec.source.source_link",
"flag": "--spec.source.source-link",
"summary": "Build from this SourceLink's repository on every push to `branch`.",
"type": "string"
},
{
"field": "service.spec.source.image",
"flag": "--spec.source.image",
"summary": "Run this Artifact, by digest: `registry.sylphx.net/<path>@sha256:<hex>`.",
"type": "string"
},
{
"field": "service.spec.source.branch",
"flag": "--spec.source.branch",
"summary": "The branch that ships to this Service; default the SourceLink's production branch. Ignored for `image`.",
"type": "string"
},
{
"field": "service.spec.source.build.root_directory",
"flag": "--spec.source.build.root-directory",
"summary": "The directory inside the repository to build; default the root.",
"type": "string"
},
{
"field": "service.spec.source.build.dockerfile",
"flag": "--spec.source.build.dockerfile",
"summary": "A Dockerfile path relative to `root_directory`; unset lets the zero-config frontend detect the stack.",
"type": "string"
},
{
"field": "service.spec.source.build.build_class",
"flag": "--spec.source.build.build-class",
"summary": "The Build class, `sylphx-<os>-<size>`; default `sylphx-linux-standard`.",
"type": "string"
},
{
"field": "service.spec.command",
"flag": "--spec.command",
"summary": "Overrides the image's command.",
"type": "string"
},
{
"field": "service.spec.port",
"flag": "--spec.port",
"summary": "The port the application listens on; the public edge stays 443.",
"type": "int"
},
{
"field": "service.spec.exposure",
"flag": "--spec.exposure",
"summary": "Who can reach the Service; default PUBLIC.",
"type": "enum",
"values": [
"public",
"internal"
]
},
{
"field": "service.spec.size",
"flag": "--spec.size",
"summary": "The size of each instance; default the plan's.",
"type": "enum",
"values": [
"nano",
"micro",
"small",
"standard",
"large",
"xlarge",
"xxlarge"
]
},
{
"field": "service.spec.scaling.min_instances",
"flag": "--spec.scaling.min-instances",
"summary": "Instances kept running with no traffic; 0 idles to zero and wakes on request.",
"type": "int"
},
{
"field": "service.spec.scaling.max_instances",
"flag": "--spec.scaling.max-instances",
"summary": "Instances at most; 0 means the plan's limit.",
"type": "int"
},
{
"field": "service.spec.health.protocol",
"flag": "--spec.health.protocol",
"summary": "How to probe.",
"type": "enum",
"values": [
"http",
"tcp"
]
},
{
"field": "service.spec.health.path",
"flag": "--spec.health.path",
"summary": "The HTTP path to probe when `protocol` is HTTP.",
"type": "string"
},
{
"field": "service.spec.health.startup_timeout",
"flag": "--spec.health.startup-timeout",
"summary": "How long a new instance may take to pass its first probe.",
"type": "duration"
},
{
"field": "service.spec.env",
"flag": "--spec.env",
"repeated": true,
"summary": "Plain environment variables. Secret values bind through `secret_env`, never here.",
"type": "key=value"
},
{
"field": "service.spec.secret_env",
"flag": "--spec.secret-env",
"repeated": true,
"summary": "Environment variables bound to Sylphx Secrets: variable name to Secret name. The value never enters the spec.",
"type": "key=value"
},
{
"field": "service.spec.regions",
"flag": "--spec.regions",
"repeated": true,
"summary": "Regions to run in; default the project's home region.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/services",
"method": "hosting.services.create",
"permission": "hosting:write",
"positional": {
"arg": "ID",
"field": "service_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "service",
"summary": "Creates a service. The Operation is done when the controller settles it.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "service.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "service.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "service.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "service.spec.source.source_link",
"flag": "--spec.source.source-link",
"summary": "Build from this SourceLink's repository on every push to `branch`.",
"type": "string"
},
{
"field": "service.spec.source.image",
"flag": "--spec.source.image",
"summary": "Run this Artifact, by digest: `registry.sylphx.net/<path>@sha256:<hex>`.",
"type": "string"
},
{
"field": "service.spec.source.branch",
"flag": "--spec.source.branch",
"summary": "The branch that ships to this Service; default the SourceLink's production branch. Ignored for `image`.",
"type": "string"
},
{
"field": "service.spec.source.build.root_directory",
"flag": "--spec.source.build.root-directory",
"summary": "The directory inside the repository to build; default the root.",
"type": "string"
},
{
"field": "service.spec.source.build.dockerfile",
"flag": "--spec.source.build.dockerfile",
"summary": "A Dockerfile path relative to `root_directory`; unset lets the zero-config frontend detect the stack.",
"type": "string"
},
{
"field": "service.spec.source.build.build_class",
"flag": "--spec.source.build.build-class",
"summary": "The Build class, `sylphx-<os>-<size>`; default `sylphx-linux-standard`.",
"type": "string"
},
{
"field": "service.spec.command",
"flag": "--spec.command",
"summary": "Overrides the image's command.",
"type": "string"
},
{
"field": "service.spec.port",
"flag": "--spec.port",
"summary": "The port the application listens on; the public edge stays 443.",
"type": "int"
},
{
"field": "service.spec.exposure",
"flag": "--spec.exposure",
"summary": "Who can reach the Service; default PUBLIC.",
"type": "enum",
"values": [
"public",
"internal"
]
},
{
"field": "service.spec.size",
"flag": "--spec.size",
"summary": "The size of each instance; default the plan's.",
"type": "enum",
"values": [
"nano",
"micro",
"small",
"standard",
"large",
"xlarge",
"xxlarge"
]
},
{
"field": "service.spec.scaling.min_instances",
"flag": "--spec.scaling.min-instances",
"summary": "Instances kept running with no traffic; 0 idles to zero and wakes on request.",
"type": "int"
},
{
"field": "service.spec.scaling.max_instances",
"flag": "--spec.scaling.max-instances",
"summary": "Instances at most; 0 means the plan's limit.",
"type": "int"
},
{
"field": "service.spec.health.protocol",
"flag": "--spec.health.protocol",
"summary": "How to probe.",
"type": "enum",
"values": [
"http",
"tcp"
]
},
{
"field": "service.spec.health.path",
"flag": "--spec.health.path",
"summary": "The HTTP path to probe when `protocol` is HTTP.",
"type": "string"
},
{
"field": "service.spec.health.startup_timeout",
"flag": "--spec.health.startup-timeout",
"summary": "How long a new instance may take to pass its first probe.",
"type": "duration"
},
{
"field": "service.spec.env",
"flag": "--spec.env",
"repeated": true,
"summary": "Plain environment variables. Secret values bind through `secret_env`, never here.",
"type": "key=value"
},
{
"field": "service.spec.secret_env",
"flag": "--spec.secret-env",
"repeated": true,
"summary": "Environment variables bound to Sylphx Secrets: variable name to Secret name. The value never enters the spec.",
"type": "key=value"
},
{
"field": "service.spec.regions",
"flag": "--spec.regions",
"repeated": true,
"summary": "Regions to run in; default the project's home region.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the Resource when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{service.name=orgs/*/projects/*/envs/*/services/*}",
"method": "hosting.services.update",
"permission": "hosting:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "service.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/services/{service}"
},
"resource_field": "service",
"sends_etag": true,
"summary": "Updates a service.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete every child Resource; without it a parent with children fails with FAILED_PRECONDITION.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/services/*}",
"method": "hosting.services.delete",
"permission": "hosting:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/services/{service}"
},
"summary": "Deletes a service.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "services",
"resource_type": "hosting.sylphx.com/Service"
},
{
"collection": "service_rollouts",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/services/*/service_rollouts/*}",
"method": "hosting.service_rollouts.get",
"permission": "hosting:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/services/{service}/service_rollouts/{rollout}"
},
"summary": "Gets a rollout.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/services/*}/service_rollouts",
"method": "hosting.service_rollouts.list",
"paginates": true,
"permission": "hosting:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/services/{service}"
},
"summary": "Lists rollouts in a service.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/services/{service}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "rollout.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "rollout.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "rollout.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "rollout.spec.release",
"flag": "--spec.release",
"summary": "The Release to roll out. Unset rolls out the Service's current generation; a previous Release rolls back.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/services/*}/service_rollouts",
"method": "hosting.service_rollouts.create",
"permission": "hosting:write",
"positional": {
"arg": "ID",
"field": "rollout_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "rollout",
"summary": "Creates a rollout.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/services/*/service_rollouts/*}:pause",
"method": "hosting.service_rollouts.pause",
"permission": "hosting:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/services/{service}/service_rollouts/{rollout}"
},
"summary": "Holds a Rollout at its current wave.",
"verb": "pause"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/services/*/service_rollouts/*}:resume",
"method": "hosting.service_rollouts.resume",
"permission": "hosting:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/services/{service}/service_rollouts/{rollout}"
},
"summary": "Resumes a paused Rollout.",
"verb": "resume"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/services/*/service_rollouts/*}:abort",
"method": "hosting.service_rollouts.abort",
"permission": "hosting:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/services/{service}/service_rollouts/{rollout}"
},
"summary": "Stops a Rollout; the cells it reached return to the previous Release.",
"verb": "abort"
}
],
"noun": "service-rollouts",
"resource_type": "hosting.sylphx.com/Rollout"
},
{
"collection": "previews",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/previews/*}",
"method": "hosting.previews.get",
"permission": "hosting:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/previews/{preview}"
},
"summary": "Gets a preview.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/previews",
"method": "hosting.previews.list",
"paginates": true,
"permission": "hosting:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists previews in a environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "preview.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "preview.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "preview.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "preview.spec.service",
"flag": "--spec.service",
"required": true,
"summary": "The Service previewed.",
"type": "string"
},
{
"field": "preview.spec.pull_request",
"flag": "--spec.pull-request",
"required": true,
"summary": "The pull request number in the Service's SourceLink repository.",
"type": "int"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/previews",
"method": "hosting.previews.create",
"permission": "hosting:write",
"positional": {
"arg": "ID",
"field": "preview_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "preview",
"summary": "Creates a preview. The Operation is done when the controller settles it.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/previews/*}",
"method": "hosting.previews.delete",
"permission": "hosting:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/previews/{preview}"
},
"summary": "Deletes a preview.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "previews",
"resource_type": "hosting.sylphx.com/Preview"
},
{
"collection": "source_links",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/source_links/*}",
"method": "hosting.source_links.get",
"permission": "hosting:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/source_links/{source_link}"
},
"summary": "Gets a source link.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*}/source_links",
"method": "hosting.source_links.list",
"paginates": true,
"permission": "hosting:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}"
},
"summary": "Lists source links in a project.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "source_link.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "source_link.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "source_link.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "source_link.spec.connection",
"flag": "--spec.connection",
"required": true,
"summary": "The forge Connection (the Sylphx App installation).",
"type": "string"
},
{
"field": "source_link.spec.repository",
"flag": "--spec.repository",
"required": true,
"summary": "The repository, `<owner>/<name>`.",
"type": "string"
},
{
"field": "source_link.spec.production_branch",
"flag": "--spec.production-branch",
"summary": "The branch production Services ship from; default the repository's default branch.",
"type": "string"
},
{
"field": "source_link.spec.previews_enabled",
"flag": "--spec.previews-enabled",
"summary": "Build a Preview for every pull request.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*}/source_links",
"method": "hosting.source_links.create",
"permission": "hosting:write",
"positional": {
"arg": "ID",
"field": "source_link_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "source_link",
"summary": "Creates a source link. The Operation is done when the controller settles it.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "source_link.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "source_link.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "source_link.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "source_link.spec.production_branch",
"flag": "--spec.production-branch",
"summary": "The branch production Services ship from; default the repository's default branch.",
"type": "string"
},
{
"field": "source_link.spec.previews_enabled",
"flag": "--spec.previews-enabled",
"summary": "Build a Preview for every pull request.",
"type": "bool"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the Resource when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{source_link.name=orgs/*/projects/*/source_links/*}",
"method": "hosting.source_links.update",
"permission": "hosting:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "source_link.name",
"pattern": "orgs/{org}/projects/{project}/source_links/{source_link}"
},
"resource_field": "source_link",
"sends_etag": true,
"summary": "Updates a source link.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/source_links/*}",
"method": "hosting.source_links.delete",
"permission": "hosting:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/source_links/{source_link}"
},
"summary": "Deletes a source link.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "source-links",
"resource_type": "hosting.sylphx.com/SourceLink"
}
],
"commands": [],
"display_name": "Sylphx Hosting",
"noun": "hosting",
"served": false,
"stage": "preview"
},
{
"collections": [
{
"collection": "keys",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/keys/*}",
"method": "keys.keys.get",
"permission": "keys:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/keys/{key}"
},
"summary": "Gets a key.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/keys",
"method": "keys.keys.list",
"paginates": true,
"permission": "keys:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists keys in an environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "key.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "key.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "key.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "key.spec.purpose",
"flag": "--spec.purpose",
"required": true,
"summary": "What the key does.",
"type": "enum",
"values": [
"sign",
"encrypt",
"mac"
]
},
{
"field": "key.spec.algorithm",
"flag": "--spec.algorithm",
"required": true,
"summary": "The algorithm; it must suit the purpose.",
"type": "enum",
"values": [
"ed25519",
"ec_p256_sha256",
"rsa_pkcs1_2048_sha256",
"rsa_pss_3072_sha256",
"aes_256_gcm",
"hmac_sha256"
]
},
{
"field": "key.spec.rotation_period",
"flag": "--spec.rotation-period",
"summary": "Rotate automatically this often; unset means rotate only on request.",
"type": "duration"
},
{
"field": "key.spec.deletion_protection",
"flag": "--spec.deletion-protection",
"summary": "While true, Delete fails with DELETION_PROTECTED. Default true.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/keys",
"method": "keys.keys.create",
"permission": "keys:write",
"positional": {
"arg": "ID",
"field": "key_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "key",
"summary": "Creates a key; the signer generates its first version.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "key.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "key.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "key.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "key.spec.rotation_period",
"flag": "--spec.rotation-period",
"summary": "Rotate automatically this often; unset means rotate only on request.",
"type": "duration"
},
{
"field": "key.spec.deletion_protection",
"flag": "--spec.deletion-protection",
"summary": "While true, Delete fails with DELETION_PROTECTED. Default true.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{key.name=orgs/*/projects/*/envs/*/keys/*}",
"method": "keys.keys.update",
"permission": "keys:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "key.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/keys/{key}"
},
"resource_field": "key",
"sends_etag": true,
"summary": "Updates a key's rotation period, deletion protection, or metadata.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete every child Resource; without it a parent with children fails with FAILED_PRECONDITION.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/keys/*}",
"method": "keys.keys.delete",
"permission": "keys:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/keys/{key}"
},
"summary": "Deletes a key and schedules every version's destruction.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Rotate only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/keys/*}:rotate",
"method": "keys.keys.rotate",
"permission": "keys:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/keys/{key}"
},
"summary": "Rotates a key: adds a version and makes it primary. Older versions keep verifying and decrypting until destroyed.",
"verb": "rotate",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "read",
"flags": [
{
"field": "key_version",
"flag": "--key-version",
"summary": "The version to use; default the primary version.",
"type": "string"
},
{
"field": "data",
"flag": "--data",
"summary": "The message to sign, at most 64 KiB. Set exactly one of `data` and `digest`.",
"type": "string"
},
{
"field": "digest",
"flag": "--digest",
"summary": "The digest of the message under the algorithm's hash.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/keys/*}:sign",
"method": "keys.keys.sign",
"permission": "keys:sign",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/keys/{key}"
},
"summary": "Signs data or a digest with a SIGN key. Every use is audited.",
"verb": "sign"
},
{
"effect": "read",
"flags": [
{
"field": "key_version",
"flag": "--key-version",
"summary": "The version to use; default the primary version; the signature names none.",
"type": "string"
},
{
"field": "data",
"flag": "--data",
"summary": "The signed message. Set exactly one of `data` and `digest`.",
"type": "string"
},
{
"field": "digest",
"flag": "--digest",
"summary": "The digest of the signed message.",
"type": "string"
},
{
"field": "signature",
"flag": "--signature",
"required": true,
"summary": "The signature to check.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/keys/*}:verify",
"method": "keys.keys.verify",
"permission": "keys:verify",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/keys/{key}"
},
"summary": "Verifies a signature made by a SIGN key.",
"verb": "verify"
},
{
"effect": "read",
"flags": [
{
"field": "plaintext",
"flag": "--plaintext",
"required": true,
"sensitive": true,
"summary": "The plaintext, at most 64 KiB.",
"type": "string"
},
{
"field": "additional_authenticated_data",
"flag": "--additional-authenticated-data",
"summary": "Data bound to the ciphertext and required again to decrypt it.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/keys/*}:encrypt",
"method": "keys.keys.encrypt",
"permission": "keys:encrypt",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/keys/{key}"
},
"summary": "Encrypts data with an ENCRYPT key.",
"verb": "encrypt"
},
{
"effect": "read",
"flags": [
{
"field": "ciphertext",
"flag": "--ciphertext",
"required": true,
"summary": "The ciphertext from Encrypt.",
"type": "string"
},
{
"field": "additional_authenticated_data",
"flag": "--additional-authenticated-data",
"summary": "The additional authenticated data given to Encrypt.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/keys/*}:decrypt",
"method": "keys.keys.decrypt",
"permission": "keys:decrypt",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/keys/{key}"
},
"summary": "Decrypts a ciphertext made by Encrypt with this key.",
"verb": "decrypt"
},
{
"effect": "read",
"flags": [
{
"field": "key_version",
"flag": "--key-version",
"summary": "The version to use; default the primary version.",
"type": "string"
},
{
"field": "data",
"flag": "--data",
"required": true,
"summary": "The message, at most 64 KiB.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/keys/*}:macSign",
"method": "keys.keys.mac_sign",
"permission": "keys:sign",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/keys/{key}"
},
"summary": "Computes a MAC of data with a MAC key.",
"verb": "mac-sign"
},
{
"effect": "read",
"flags": [
{
"field": "key_version",
"flag": "--key-version",
"summary": "The version to use; default the primary version.",
"type": "string"
},
{
"field": "data",
"flag": "--data",
"required": true,
"summary": "The message.",
"type": "string"
},
{
"field": "mac",
"flag": "--mac",
"required": true,
"summary": "The MAC to check.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/keys/*}:macVerify",
"method": "keys.keys.mac_verify",
"permission": "keys:verify",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/keys/{key}"
},
"summary": "Verifies a MAC made by a MAC key, in constant time.",
"verb": "mac-verify"
}
],
"noun": "keys",
"resource_type": "keys.sylphx.com/Key"
},
{
"collection": "key_versions",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/keys/*/key_versions/*}",
"method": "keys.key_versions.get",
"permission": "keys:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/keys/{key}/key_versions/{key_version}"
},
"summary": "Gets a key version.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/keys/*}/key_versions",
"method": "keys.key_versions.list",
"paginates": true,
"permission": "keys:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/keys/{key}"
},
"summary": "Lists a key's versions.",
"verb": "list"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Destroy only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/keys/*/key_versions/*}:destroy",
"method": "keys.key_versions.destroy",
"permission": "keys:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/keys/{key}/key_versions/{key_version}"
},
"summary": "Schedules a key version's destruction after a 24-hour grace; the primary version cannot be destroyed.",
"verb": "destroy"
}
],
"noun": "key-versions",
"resource_type": "keys.sylphx.com/KeyVersion"
}
],
"commands": [],
"display_name": "Sylphx Keys",
"noun": "keys",
"stage": "preview"
},
{
"collections": [
{
"collection": "spaces",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/spaces/*}",
"method": "knowledge.spaces.get",
"permission": "knowledge:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}"
},
"summary": "Gets a space.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/spaces",
"method": "knowledge.spaces.list",
"paginates": true,
"permission": "knowledge:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists spaces.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "space.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "space.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "space.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "space.spec.kind",
"flag": "--spec.kind",
"required": true,
"summary": "What the space holds.",
"type": "enum",
"values": [
"workspace",
"project",
"team",
"end_user",
"agent",
"shared"
]
},
{
"field": "space.spec.parent",
"flag": "--spec.parent",
"summary": "The space this one inherits grants from, for example a project space under its workspace space. A reader of the parent reads this space.",
"type": "string"
},
{
"field": "space.spec.owner",
"flag": "--spec.owner",
"summary": "The principal a private space belongs to, as a share subject: `end_user:<id>` for `SPACE_KIND_END_USER`, `agent:<id>` or `agent:<id>/end_user:<id>` for `SPACE_KIND_AGENT`. Empty for a shared space. The owner is granted `owner` on the space.",
"type": "string"
},
{
"field": "space.spec.grants",
"flag": "--spec.grants",
"repeated": true,
"summary": "Who may read and write the space, beyond `owner` and what `parent` grants; at most 200. A repeated grant is stored once.",
"type": "json"
},
{
"field": "space.spec.sensitive",
"flag": "--spec.sensitive",
"summary": "The space holds customer personal data. Its records are never sent in embeddings outside the cell's model routes, and enter a context pack or an answer that spans spaces only for a reader that holds `reader` on this space directly. Only deterministic entity matches apply to it.",
"type": "bool"
},
{
"field": "space.spec.schemas",
"flag": "--spec.schemas",
"repeated": true,
"summary": "The Knowledge Schemas whose types the space accepts, as resource names; the core schema is always accepted. At most 20.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/spaces",
"method": "knowledge.spaces.create",
"permission": "knowledge:write",
"positional": {
"arg": "ID",
"field": "space_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "space",
"summary": "Creates a space.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "space.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "space.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "space.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "space.spec.kind",
"flag": "--spec.kind",
"required": true,
"summary": "What the space holds.",
"type": "enum",
"values": [
"workspace",
"project",
"team",
"end_user",
"agent",
"shared"
]
},
{
"field": "space.spec.parent",
"flag": "--spec.parent",
"summary": "The space this one inherits grants from, for example a project space under its workspace space. A reader of the parent reads this space.",
"type": "string"
},
{
"field": "space.spec.owner",
"flag": "--spec.owner",
"summary": "The principal a private space belongs to, as a share subject: `end_user:<id>` for `SPACE_KIND_END_USER`, `agent:<id>` or `agent:<id>/end_user:<id>` for `SPACE_KIND_AGENT`. Empty for a shared space. The owner is granted `owner` on the space.",
"type": "string"
},
{
"field": "space.spec.grants",
"flag": "--spec.grants",
"repeated": true,
"summary": "Who may read and write the space, beyond `owner` and what `parent` grants; at most 200. A repeated grant is stored once.",
"type": "json"
},
{
"field": "space.spec.sensitive",
"flag": "--spec.sensitive",
"summary": "The space holds customer personal data. Its records are never sent in embeddings outside the cell's model routes, and enter a context pack or an answer that spans spaces only for a reader that holds `reader` on this space directly. Only deterministic entity matches apply to it.",
"type": "bool"
},
{
"field": "space.spec.schemas",
"flag": "--spec.schemas",
"repeated": true,
"summary": "The Knowledge Schemas whose types the space accepts, as resource names; the core schema is always accepted. At most 20.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the space when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{space.name=orgs/*/projects/*/envs/*/spaces/*}",
"method": "knowledge.spaces.update",
"permission": "knowledge:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "space.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}"
},
"resource_field": "space",
"sends_etag": true,
"summary": "Updates a space.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the space does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete the space's episodes and facts; without it, a space that holds records is refused with `INVALID_STATE`.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/spaces/*}",
"method": "knowledge.spaces.delete",
"permission": "knowledge:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}"
},
"summary": "Deletes a space. A space that still holds records is refused with `INVALID_STATE` unless `force` is set, which deletes its episodes and facts too.",
"verb": "delete"
}
],
"noun": "spaces",
"resource_type": "knowledge.sylphx.com/Space"
},
{
"collection": "knowledge_schemas",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/knowledge_schemas/*}",
"method": "knowledge.knowledge_schemas.get",
"permission": "knowledge:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/knowledge_schemas/{knowledge_schema}"
},
"summary": "Gets a knowledge schema.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/knowledge_schemas",
"method": "knowledge.knowledge_schemas.list",
"paginates": true,
"permission": "knowledge:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists knowledge schemas.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "knowledge_schema.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "knowledge_schema.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "knowledge_schema.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "knowledge_schema.spec.entity_types",
"flag": "--spec.entity-types",
"repeated": true,
"summary": "The entity types; at most 200.",
"type": "json"
},
{
"field": "knowledge_schema.spec.relation_types",
"flag": "--spec.relation-types",
"repeated": true,
"summary": "The relation types; at most 500.",
"type": "json"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/knowledge_schemas",
"method": "knowledge.knowledge_schemas.create",
"permission": "knowledge:write",
"positional": {
"arg": "ID",
"field": "knowledge_schema_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "knowledge_schema",
"summary": "Creates a knowledge schema.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "knowledge_schema.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "knowledge_schema.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "knowledge_schema.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "knowledge_schema.spec.entity_types",
"flag": "--spec.entity-types",
"repeated": true,
"summary": "The entity types; at most 200.",
"type": "json"
},
{
"field": "knowledge_schema.spec.relation_types",
"flag": "--spec.relation-types",
"repeated": true,
"summary": "The relation types; at most 500.",
"type": "json"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the knowledge schema when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{knowledge_schema.name=orgs/*/projects/*/envs/*/knowledge_schemas/*}",
"method": "knowledge.knowledge_schemas.update",
"permission": "knowledge:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "knowledge_schema.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/knowledge_schemas/{knowledge_schema}"
},
"resource_field": "knowledge_schema",
"sends_etag": true,
"summary": "Updates a knowledge schema. An accepted update publishes a new revision; a change that would invalidate existing records is refused with `INVALID_FIELD`.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the knowledge schema does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/knowledge_schemas/*}",
"method": "knowledge.knowledge_schemas.delete",
"permission": "knowledge:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/knowledge_schemas/{knowledge_schema}"
},
"summary": "Deletes a knowledge schema. A schema a space still accepts is refused with `RESOURCE_IN_USE`.",
"verb": "delete"
}
],
"noun": "knowledge-schemas",
"resource_type": "knowledge.sylphx.com/KnowledgeSchema"
},
{
"collection": "episodes",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/spaces/*/episodes/*}",
"method": "knowledge.episodes.get",
"permission": "knowledge:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}/episodes/{episode}"
},
"summary": "Gets an episode.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter, limited to `kind` and `extraction`; for example `kind = EPISODE_KIND_NOTE AND extraction = EXTRACTION_DONE`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/spaces/*}/episodes",
"method": "knowledge.episodes.list",
"paginates": true,
"permission": "knowledge:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}"
},
"summary": "Lists a space's episodes, newest first. The filter is limited to `kind` and `extraction`.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "episode.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "episode.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "episode.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "episode.kind",
"flag": "--kind",
"required": true,
"summary": "What the episode is.",
"type": "enum",
"values": [
"note",
"message",
"step_result",
"document_chunk",
"imported_row",
"structured"
]
},
{
"field": "episode.text",
"flag": "--text",
"summary": "The text as written, at most 64 KiB. An episode has `text`, `data`, or both.",
"type": "string"
},
{
"field": "episode.data",
"flag": "--data",
"summary": "Structured content, for a caller that already knows the shape (an imported row, a form).",
"type": "json"
},
{
"field": "episode.occur_time",
"flag": "--occur-time",
"summary": "When it happened in the world; default the time it was recorded.",
"type": "timestamp"
},
{
"field": "episode.provenance.method",
"flag": "--provenance.method",
"summary": "How the content was produced; default `SOURCE_METHOD_STATED`. Only the service writes `SOURCE_METHOD_EXTRACTED`.",
"type": "enum",
"values": [
"stated",
"extracted",
"imported"
]
},
{
"field": "episode.provenance.references",
"flag": "--provenance.references",
"repeated": true,
"summary": "References to where the content came from: a run and step, a work item, a message, a URL. At most 20.",
"type": "json"
},
{
"field": "episode.entities",
"flag": "--entities",
"repeated": true,
"summary": "The entities the caller says the episode is about, as resource names; extraction adds the ones it finds. At most 50.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "skip_extraction",
"flag": "--skip-extraction",
"summary": "Record the episode without extraction, for content that is already structured or must not be read by a model.",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/spaces/*}/episodes",
"method": "knowledge.episodes.create",
"permission": "knowledge:write",
"positional": {
"arg": "ID",
"field": "episode_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "episode",
"summary": "Records an episode and returns at once (`remember`); extraction reads it afterwards.",
"verb": "create"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the episode does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/spaces/*/episodes/*}",
"method": "knowledge.episodes.delete",
"permission": "knowledge:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}/episodes/{episode}"
},
"summary": "Deletes an episode, the facts that cite only it, and its search and embedding entries; facts that also cite other episodes are re-scored.",
"verb": "delete"
}
],
"noun": "episodes",
"resource_type": "knowledge.sylphx.com/Episode"
},
{
"collection": "entities",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/entities/*}",
"method": "knowledge.entities.get",
"permission": "knowledge:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/entities/{entity}"
},
"summary": "Gets an entity.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter, limited to `entity_type` and `lifecycle`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/entities",
"method": "knowledge.entities.list",
"paginates": true,
"permission": "knowledge:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists the entities the caller may see. The filter is limited to `entity_type` and `lifecycle`.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "entity.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "entity.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "entity.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "entity.entity_type",
"flag": "--entity-type",
"required": true,
"summary": "The type: a core type (`person`, `organisation`, `customer`, `contact`, `product`, `project`, `document`, `decision`, `playbook`, `case`, `topic`) or a type of an accepted Knowledge Schema, `<schema>.<type>`.",
"type": "string"
},
{
"field": "entity.title",
"flag": "--title",
"required": true,
"summary": "The name people use for it.",
"type": "string"
},
{
"field": "entity.aliases",
"flag": "--aliases",
"repeated": true,
"summary": "Other names it is known by; at most 50.",
"type": "string"
},
{
"field": "entity.properties",
"flag": "--properties",
"summary": "Properties, valid against the type's JSON Schema.",
"type": "json"
},
{
"field": "entity.external_ids",
"flag": "--external-ids",
"repeated": true,
"summary": "Identifiers in other systems. Two writes with the same external id in one graph are the same entity (deterministic resolution). At most 50.",
"type": "json"
},
{
"field": "entity.space",
"flag": "--space",
"required": true,
"summary": "The space the entity was first stated in.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/entities",
"method": "knowledge.entities.create",
"permission": "knowledge:write",
"positional": {
"arg": "ID",
"field": "entity_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "entity",
"summary": "Creates an entity in a space. An entity whose external id already names one in the graph is refused with `RESOURCE_ALREADY_EXISTS`, which names it; use Update with `allow_missing` to upsert.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "entity.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "entity.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "entity.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "entity.entity_type",
"flag": "--entity-type",
"required": true,
"summary": "The type: a core type (`person`, `organisation`, `customer`, `contact`, `product`, `project`, `document`, `decision`, `playbook`, `case`, `topic`) or a type of an accepted Knowledge Schema, `<schema>.<type>`.",
"type": "string"
},
{
"field": "entity.title",
"flag": "--title",
"required": true,
"summary": "The name people use for it.",
"type": "string"
},
{
"field": "entity.aliases",
"flag": "--aliases",
"repeated": true,
"summary": "Other names it is known by; at most 50.",
"type": "string"
},
{
"field": "entity.properties",
"flag": "--properties",
"summary": "Properties, valid against the type's JSON Schema.",
"type": "json"
},
{
"field": "entity.external_ids",
"flag": "--external-ids",
"repeated": true,
"summary": "Identifiers in other systems. Two writes with the same external id in one graph are the same entity (deterministic resolution). At most 50.",
"type": "json"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the entity when no entity matches (`upsert_entity`): the name, or else `external_ids`, identifies it.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{entity.name=orgs/*/projects/*/envs/*/entities/*}",
"method": "knowledge.entities.update",
"permission": "knowledge:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "entity.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/entities/{entity}"
},
"resource_field": "entity",
"sends_etag": true,
"summary": "Updates an entity. With `allow_missing` it is the structured upsert (`upsert_entity`): an entity matched by `external_ids` is updated, otherwise one is created.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the entity does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete the episodes this person wrote (a data-rights erasure).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/entities/*}",
"method": "knowledge.entities.delete",
"permission": "knowledge:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/entities/{entity}"
},
"summary": "Deletes an entity and every fact about it. With `force` it is a data-rights erasure: the episodes the person wrote are deleted too, with their search and embedding entries.",
"verb": "delete"
},
{
"effect": "write",
"flags": [
{
"field": "entities",
"flag": "--entities",
"repeated": true,
"required": true,
"summary": "The entities to merge into it; 1 to 20.",
"type": "string"
},
{
"field": "reason",
"flag": "--reason",
"summary": "Why they are the same, recorded with the merge; at most 1000 characters.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/entities/*}:merge",
"method": "knowledge.entities.merge",
"permission": "knowledge:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/entities/{entity}"
},
"summary": "Merges other entities into this one: their facts and external ids resolve to it. The merge is recorded and reversible with `:split`; it is never a silent rewrite.",
"verb": "merge"
},
{
"effect": "write",
"flags": [
{
"field": "entity",
"flag": "--entity",
"required": true,
"summary": "The merged entity to restore.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/entities/*}:split",
"method": "knowledge.entities.split",
"permission": "knowledge:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/entities/{entity}"
},
"summary": "Splits a merged entity back out of this one, with the facts and external ids it brought.",
"verb": "split"
},
{
"effect": "read",
"flags": [
{
"field": "valid_time",
"flag": "--valid-time",
"summary": "The profile as it was valid at this time; default now.",
"type": "timestamp"
},
{
"field": "max_episodes",
"flag": "--max-episodes",
"summary": "At most this many recent episodes; default 20, clamped to 100.",
"type": "int"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/entities/*}:profile",
"method": "knowledge.entities.profile",
"permission": "knowledge:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/entities/{entity}"
},
"summary": "Returns one entity's profile in one call (`entity`): the entity, its current facts in both directions, the entities they name and the recent episodes about it, trimmed to what the caller may see. A read with a request body.",
"verb": "profile"
},
{
"effect": "read",
"flags": [
{
"field": "query",
"flag": "--query",
"required": true,
"summary": "What to recall, in natural language; 1 to 4000 characters.",
"type": "string"
},
{
"field": "spaces",
"flag": "--spaces",
"repeated": true,
"summary": "The spaces to search, as resource names; default every space the caller may read. At most 50.",
"type": "string"
},
{
"field": "entity_types",
"flag": "--entity-types",
"repeated": true,
"summary": "Only entities of these types; default every type.",
"type": "string"
},
{
"field": "valid_time",
"flag": "--valid-time",
"summary": "Recall the graph as it was valid at this time; default now.",
"type": "timestamp"
},
{
"field": "max_hops",
"flag": "--max-hops",
"summary": "How many hops to expand from the top entities, 0 to 2; default 2.",
"type": "int"
},
{
"field": "max_facts",
"flag": "--max-facts",
"summary": "At most this many facts in the pack; default 30, clamped to 200.",
"type": "int"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/entities:recall",
"method": "knowledge.entities.recall",
"permission": "knowledge:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Searches the graph (`recall`): hybrid lexical and semantic search over episodes and facts, fused by reciprocal rank, then at most two hops of expansion from the top entities. Returns a context pack with citations, built only from records the caller may see.",
"verb": "recall"
},
{
"effect": "read",
"flags": [
{
"field": "question",
"flag": "--question",
"required": true,
"summary": "The question, in natural language; 1 to 4000 characters.",
"type": "string"
},
{
"field": "spaces",
"flag": "--spaces",
"repeated": true,
"summary": "The spaces to answer from, as resource names; default every space the caller may read. At most 50.",
"type": "string"
},
{
"field": "valid_time",
"flag": "--valid-time",
"summary": "Answer about the graph as it was valid at this time; default now.",
"type": "timestamp"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/entities:ask",
"method": "knowledge.entities.ask",
"permission": "knowledge:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Answers a question through Sylphx AI (`ask`), from a context pack built only from records the caller may see, with citations to its episodes.",
"verb": "ask"
}
],
"noun": "entities",
"resource_type": "knowledge.sylphx.com/Entity"
},
{
"collection": "relations",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/spaces/*/relations/*}",
"method": "knowledge.relations.get",
"permission": "knowledge:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}/relations/{relation}"
},
"summary": "Gets a relation.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter, limited to `subject`, `predicate`, `object` and `provenance.channel`.",
"type": "string"
},
{
"field": "valid_time",
"flag": "--valid-time",
"summary": "List facts as they were valid at this time, including facts closed since; default now.",
"type": "timestamp"
},
{
"field": "show_superseded",
"flag": "--show-superseded",
"summary": "Also list facts that a newer record replaced.",
"type": "bool"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/spaces/*}/relations",
"method": "knowledge.relations.list",
"paginates": true,
"permission": "knowledge:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}"
},
"summary": "Lists a space's facts. The filter is limited to `subject`, `predicate`, `object` and `provenance.channel`; superseded facts are listed only with `show_superseded`.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "relation.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "relation.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "relation.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "relation.subject",
"flag": "--subject",
"required": true,
"summary": "The entity the fact is about.",
"type": "string"
},
{
"field": "relation.predicate",
"flag": "--predicate",
"required": true,
"summary": "The relation type, snake_case, for example `works_at` or `prefers`; a core predicate or one of an accepted Knowledge Schema.",
"type": "string"
},
{
"field": "relation.object",
"flag": "--object",
"summary": "The other entity, for an edge. A fact has `object`, `value`, or both.",
"type": "string"
},
{
"field": "relation.value",
"flag": "--value",
"summary": "The value, for a fact about one entity.",
"type": "json"
},
{
"field": "relation.statement",
"flag": "--statement",
"summary": "The fact as one sentence, used for search and shown with citations.",
"type": "string"
},
{
"field": "relation.valid_start_time",
"flag": "--valid-start-time",
"summary": "When the fact starts to hold in the world; default when it was recorded.",
"type": "timestamp"
},
{
"field": "relation.valid_end_time",
"flag": "--valid-end-time",
"summary": "When the fact stopped holding in the world; unset while it holds.",
"type": "timestamp"
},
{
"field": "relation.episodes",
"flag": "--episodes",
"repeated": true,
"summary": "The episodes the fact comes from. A structured write with none records its own episode and cites it; an extracted fact cites the episodes it was read from.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/spaces/*}/relations",
"method": "knowledge.relations.create",
"permission": "knowledge:write",
"positional": {
"arg": "ID",
"field": "relation_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "relation",
"summary": "Records a fact in a space (`relate`). A fact that contradicts a current one with the same subject and a single-valued predicate closes the older fact; nothing is overwritten.",
"verb": "create"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the relation does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/spaces/*/relations/*}",
"method": "knowledge.relations.delete",
"permission": "knowledge:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}/relations/{relation}"
},
"summary": "Deletes a fact. Deletion is for data that must go; a fact that stopped being true is closed with `:close`.",
"verb": "delete"
},
{
"effect": "write",
"flags": [
{
"field": "valid_end_time",
"flag": "--valid-end-time",
"summary": "When the fact stopped holding in the world; default now.",
"type": "timestamp"
},
{
"field": "etag",
"flag": "--etag",
"summary": "Close only if the current etag matches.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/spaces/*/relations/*}:close",
"method": "knowledge.relations.close",
"permission": "knowledge:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}/relations/{relation}"
},
"summary": "Closes a fact (`close_fact`): it stopped holding in the world at `valid_end_time`. The fact stays readable for questions about the time before the close.",
"verb": "close"
}
],
"noun": "relations",
"resource_type": "knowledge.sylphx.com/Relation"
}
],
"commands": [],
"display_name": "Sylphx Knowledge",
"noun": "knowledge",
"porcelain": [
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "episode.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "episode.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "episode.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "episode.kind",
"flag": "--kind",
"required": true,
"summary": "What the episode is.",
"type": "enum",
"values": [
"note",
"message",
"step_result",
"document_chunk",
"imported_row",
"structured"
]
},
{
"field": "episode.text",
"flag": "--text",
"summary": "The text as written, at most 64 KiB. An episode has `text`, `data`, or both.",
"type": "string"
},
{
"field": "episode.data",
"flag": "--data",
"summary": "Structured content, for a caller that already knows the shape (an imported row, a form).",
"type": "json"
},
{
"field": "episode.occur_time",
"flag": "--occur-time",
"summary": "When it happened in the world; default the time it was recorded.",
"type": "timestamp"
},
{
"field": "episode.provenance.method",
"flag": "--provenance.method",
"summary": "How the content was produced; default `SOURCE_METHOD_STATED`. Only the service writes `SOURCE_METHOD_EXTRACTED`.",
"type": "enum",
"values": [
"stated",
"extracted",
"imported"
]
},
{
"field": "episode.provenance.references",
"flag": "--provenance.references",
"repeated": true,
"summary": "References to where the content came from: a run and step, a work item, a message, a URL. At most 20.",
"type": "json"
},
{
"field": "episode.entities",
"flag": "--entities",
"repeated": true,
"summary": "The entities the caller says the episode is about, as resource names; extraction adds the ones it finds. At most 50.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "skip_extraction",
"flag": "--skip-extraction",
"summary": "Record the episode without extraction, for content that is already structured or must not be read by a model.",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/spaces/*}/episodes",
"method": "knowledge.episodes.create",
"path": [],
"permission": "knowledge:write",
"positional": {
"arg": "ID",
"field": "episode_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "episode",
"summary": "Records an episode and returns at once (`remember`); extraction reads it afterwards.",
"verb": "remember"
},
{
"effect": "read",
"flags": [
{
"field": "valid_time",
"flag": "--valid-time",
"summary": "The profile as it was valid at this time; default now.",
"type": "timestamp"
},
{
"field": "max_episodes",
"flag": "--max-episodes",
"summary": "At most this many recent episodes; default 20, clamped to 100.",
"type": "int"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/entities/*}:profile",
"method": "knowledge.entities.profile",
"path": [],
"permission": "knowledge:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/entities/{entity}"
},
"summary": "Returns one entity's profile in one call (`entity`): the entity, its current facts in both directions, the entities they name and the recent episodes about it, trimmed to what the caller may see. A read with a request body.",
"verb": "entity"
},
{
"effect": "read",
"flags": [
{
"field": "query",
"flag": "--query",
"required": true,
"summary": "What to recall, in natural language; 1 to 4000 characters.",
"type": "string"
},
{
"field": "spaces",
"flag": "--spaces",
"repeated": true,
"summary": "The spaces to search, as resource names; default every space the caller may read. At most 50.",
"type": "string"
},
{
"field": "entity_types",
"flag": "--entity-types",
"repeated": true,
"summary": "Only entities of these types; default every type.",
"type": "string"
},
{
"field": "valid_time",
"flag": "--valid-time",
"summary": "Recall the graph as it was valid at this time; default now.",
"type": "timestamp"
},
{
"field": "max_hops",
"flag": "--max-hops",
"summary": "How many hops to expand from the top entities, 0 to 2; default 2.",
"type": "int"
},
{
"field": "max_facts",
"flag": "--max-facts",
"summary": "At most this many facts in the pack; default 30, clamped to 200.",
"type": "int"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/entities:recall",
"method": "knowledge.entities.recall",
"path": [],
"permission": "knowledge:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Searches the graph (`recall`): hybrid lexical and semantic search over episodes and facts, fused by reciprocal rank, then at most two hops of expansion from the top entities. Returns a context pack with citations, built only from records the caller may see.",
"verb": "recall"
},
{
"effect": "read",
"flags": [
{
"field": "question",
"flag": "--question",
"required": true,
"summary": "The question, in natural language; 1 to 4000 characters.",
"type": "string"
},
{
"field": "spaces",
"flag": "--spaces",
"repeated": true,
"summary": "The spaces to answer from, as resource names; default every space the caller may read. At most 50.",
"type": "string"
},
{
"field": "valid_time",
"flag": "--valid-time",
"summary": "Answer about the graph as it was valid at this time; default now.",
"type": "timestamp"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/entities:ask",
"method": "knowledge.entities.ask",
"path": [],
"permission": "knowledge:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Answers a question through Sylphx AI (`ask`), from a context pack built only from records the caller may see, with citations to its episodes.",
"verb": "ask"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "relation.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "relation.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "relation.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "relation.subject",
"flag": "--subject",
"required": true,
"summary": "The entity the fact is about.",
"type": "string"
},
{
"field": "relation.predicate",
"flag": "--predicate",
"required": true,
"summary": "The relation type, snake_case, for example `works_at` or `prefers`; a core predicate or one of an accepted Knowledge Schema.",
"type": "string"
},
{
"field": "relation.object",
"flag": "--object",
"summary": "The other entity, for an edge. A fact has `object`, `value`, or both.",
"type": "string"
},
{
"field": "relation.value",
"flag": "--value",
"summary": "The value, for a fact about one entity.",
"type": "json"
},
{
"field": "relation.statement",
"flag": "--statement",
"summary": "The fact as one sentence, used for search and shown with citations.",
"type": "string"
},
{
"field": "relation.valid_start_time",
"flag": "--valid-start-time",
"summary": "When the fact starts to hold in the world; default when it was recorded.",
"type": "timestamp"
},
{
"field": "relation.valid_end_time",
"flag": "--valid-end-time",
"summary": "When the fact stopped holding in the world; unset while it holds.",
"type": "timestamp"
},
{
"field": "relation.episodes",
"flag": "--episodes",
"repeated": true,
"summary": "The episodes the fact comes from. A structured write with none records its own episode and cites it; an extracted fact cites the episodes it was read from.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/spaces/*}/relations",
"method": "knowledge.relations.create",
"path": [],
"permission": "knowledge:write",
"positional": {
"arg": "ID",
"field": "relation_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "relation",
"summary": "Records a fact in a space (`relate`). A fact that contradicts a current one with the same subject and a single-valued predicate closes the older fact; nothing is overwritten.",
"verb": "relate"
},
{
"effect": "write",
"flags": [
{
"field": "valid_end_time",
"flag": "--valid-end-time",
"summary": "When the fact stopped holding in the world; default now.",
"type": "timestamp"
},
{
"field": "etag",
"flag": "--etag",
"summary": "Close only if the current etag matches.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/spaces/*/relations/*}:close",
"method": "knowledge.relations.close",
"path": [],
"permission": "knowledge:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/spaces/{space}/relations/{relation}"
},
"summary": "Closes a fact (`close_fact`): it stopped holding in the world at `valid_end_time`. The fact stays readable for questions about the time before the close.",
"verb": "close-fact"
}
],
"served": false,
"stage": "preview"
},
{
"collections": [
{
"collection": "catalogs",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/catalogs/*}",
"method": "localization.catalogs.get",
"permission": "localization:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/catalogs/{catalog}"
},
"summary": "Gets a catalog.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/catalogs",
"method": "localization.catalogs.list",
"paginates": true,
"permission": "localization:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists catalogs.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "catalog.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "catalog.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "catalog.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "catalog.spec.source_locale",
"flag": "--spec.source-locale",
"required": true,
"summary": "The locale the source texts are written in, a BCP 47 tag such as `en`.",
"type": "string"
},
{
"field": "catalog.spec.target_locales",
"flag": "--spec.target-locales",
"repeated": true,
"summary": "The locales to translate into, BCP 47 tags. `zh-Hant-HK` and `zh-Hant-TW` are separate locales. At most 60, each once.",
"type": "string"
},
{
"field": "catalog.spec.pseudo_locales",
"flag": "--spec.pseudo-locales",
"repeated": true,
"summary": "Pseudo-locales to generate at export. They are never stored or translated.",
"type": "enum",
"values": [
"accented",
"bidi",
"wide"
]
},
{
"field": "catalog.spec.tone",
"flag": "--spec.tone",
"summary": "The brand voice every translation follows, at most 2000 characters.",
"type": "string"
},
{
"field": "catalog.spec.locale_guidance",
"flag": "--spec.locale-guidance",
"repeated": true,
"summary": "Extra instructions per target locale, for example the vocabulary of a region. Keys are target locales; at most 60 entries, each at most 2000 characters.",
"type": "key=value"
},
{
"field": "catalog.spec.glossaries",
"flag": "--spec.glossaries",
"repeated": true,
"summary": "The glossaries this catalog applies, as Glossary names; at most 10.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/catalogs",
"method": "localization.catalogs.create",
"permission": "localization:write",
"positional": {
"arg": "ID",
"field": "catalog_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "catalog",
"summary": "Creates a catalog.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "catalog.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "catalog.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "catalog.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "catalog.spec.source_locale",
"flag": "--spec.source-locale",
"required": true,
"summary": "The locale the source texts are written in, a BCP 47 tag such as `en`.",
"type": "string"
},
{
"field": "catalog.spec.target_locales",
"flag": "--spec.target-locales",
"repeated": true,
"summary": "The locales to translate into, BCP 47 tags. `zh-Hant-HK` and `zh-Hant-TW` are separate locales. At most 60, each once.",
"type": "string"
},
{
"field": "catalog.spec.pseudo_locales",
"flag": "--spec.pseudo-locales",
"repeated": true,
"summary": "Pseudo-locales to generate at export. They are never stored or translated.",
"type": "enum",
"values": [
"accented",
"bidi",
"wide"
]
},
{
"field": "catalog.spec.tone",
"flag": "--spec.tone",
"summary": "The brand voice every translation follows, at most 2000 characters.",
"type": "string"
},
{
"field": "catalog.spec.locale_guidance",
"flag": "--spec.locale-guidance",
"repeated": true,
"summary": "Extra instructions per target locale, for example the vocabulary of a region. Keys are target locales; at most 60 entries, each at most 2000 characters.",
"type": "key=value"
},
{
"field": "catalog.spec.glossaries",
"flag": "--spec.glossaries",
"repeated": true,
"summary": "The glossaries this catalog applies, as Glossary names; at most 10.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the catalog when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{catalog.name=orgs/*/projects/*/envs/*/catalogs/*}",
"method": "localization.catalogs.update",
"permission": "localization:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "catalog.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/catalogs/{catalog}"
},
"resource_field": "catalog",
"sends_etag": true,
"summary": "Updates a catalog.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the catalog does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete the catalog's entries; without it, a catalog that has entries is refused with `INVALID_STATE`.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/catalogs/*}",
"method": "localization.catalogs.delete",
"permission": "localization:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/catalogs/{catalog}"
},
"summary": "Deletes a catalog.",
"verb": "delete"
},
{
"effect": "write",
"flags": [
{
"field": "format",
"flag": "--format",
"required": true,
"summary": "The format of the files.",
"type": "enum",
"values": [
"sylphx_json",
"icu_json",
"gettext_po",
"xliff2"
]
},
{
"field": "sources",
"flag": "--sources",
"repeated": true,
"required": true,
"summary": "The source-locale files; 1 to 500.",
"type": "json"
},
{
"field": "translations",
"flag": "--translations",
"repeated": true,
"summary": "The committed target-locale files; at most 10000. A text that differs from the service's last export is recorded as a pinned human override.",
"type": "json"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/catalogs/*}:sync",
"method": "localization.catalogs.sync",
"permission": "localization:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/catalogs/{catalog}"
},
"summary": "Reads the source files and the committed translations into the catalog, then translates what is new or stale. Each call is idempotent and works within a bounded time; call again until `pending` is 0.",
"verb": "sync"
},
{
"effect": "read",
"flags": [
{
"field": "format",
"flag": "--format",
"required": true,
"summary": "The format of the files.",
"type": "enum",
"values": [
"sylphx_json",
"icu_json",
"gettext_po",
"xliff2"
]
},
{
"field": "locales",
"flag": "--locales",
"repeated": true,
"summary": "The locales to export; default every target locale and the pseudo-locales.",
"type": "string"
},
{
"field": "source_fallback",
"flag": "--source-fallback",
"summary": "Emit the source text for keys that have no passing translation, for runtimes that do not fall back to the source themselves.",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/catalogs/*}:export",
"method": "localization.catalogs.export",
"permission": "localization:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/catalogs/{catalog}"
},
"summary": "Returns the catalog's files per locale in the requested format, with the QA report. A read with a request body, like a query.",
"verb": "export"
}
],
"noun": "catalogs",
"resource_type": "localization.sylphx.com/Catalog"
},
{
"collection": "entries",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/catalogs/*/entries/*}",
"method": "localization.entries.get",
"permission": "localization:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/catalogs/{catalog}/entries/{entry}"
},
"summary": "Gets a catalog entry.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter, limited to `state`, `locale`, and `qa_state`; for example `state = ENTRY_STATE_ACTIVE AND locale = \"ja\" AND qa_state = QA_STATE_FAILED`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/catalogs/*}/entries",
"method": "localization.entries.list",
"paginates": true,
"permission": "localization:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/catalogs/{catalog}"
},
"summary": "Lists catalog entries. The filter is limited to `state`, `locale`, and `qa_state`.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"field": "locale",
"flag": "--locale",
"required": true,
"summary": "The target locale.",
"type": "string"
},
{
"field": "text",
"flag": "--text",
"required": true,
"summary": "The translated message, a Unicode MessageFormat 2 pattern.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/catalogs/*/entries/*}:pinTranslation",
"method": "localization.entries.pin_translation",
"permission": "localization:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/catalogs/{catalog}/entries/{entry}"
},
"summary": "Sets the text of one locale as a human override that AI never overwrites. QA runs on the text first; a text with a QA error is rejected with `INVALID_FIELD`, and the problem lists the findings.",
"verb": "pin-translation"
},
{
"effect": "write",
"flags": [
{
"field": "locale",
"flag": "--locale",
"required": true,
"summary": "The target locale.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/catalogs/*/entries/*}:unpinTranslation",
"method": "localization.entries.unpin_translation",
"permission": "localization:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/catalogs/{catalog}/entries/{entry}"
},
"summary": "Removes the human override of one locale; the next sync may translate it again.",
"verb": "unpin-translation"
}
],
"noun": "entries",
"resource_type": "localization.sylphx.com/CatalogEntry"
},
{
"collection": "glossaries",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/glossaries/*}",
"method": "localization.glossaries.get",
"permission": "localization:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/glossaries/{glossary}"
},
"summary": "Gets a glossary.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/glossaries",
"method": "localization.glossaries.list",
"paginates": true,
"permission": "localization:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists glossarys.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "glossary.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "glossary.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "glossary.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "glossary.spec.terms",
"flag": "--spec.terms",
"repeated": true,
"summary": "The terms; at most 5000.",
"type": "json"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/glossaries",
"method": "localization.glossaries.create",
"permission": "localization:write",
"positional": {
"arg": "ID",
"field": "glossary_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "glossary",
"summary": "Creates a glossary.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "glossary.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "glossary.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "glossary.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "glossary.spec.terms",
"flag": "--spec.terms",
"repeated": true,
"summary": "The terms; at most 5000.",
"type": "json"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the glossary when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{glossary.name=orgs/*/projects/*/envs/*/glossaries/*}",
"method": "localization.glossaries.update",
"permission": "localization:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "glossary.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/glossaries/{glossary}"
},
"resource_field": "glossary",
"sends_etag": true,
"summary": "Updates a glossary.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the glossary does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/glossaries/*}",
"method": "localization.glossaries.delete",
"permission": "localization:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/glossaries/{glossary}"
},
"summary": "Deletes a glossary.",
"verb": "delete"
}
],
"noun": "glossaries",
"resource_type": "localization.sylphx.com/Glossary"
}
],
"commands": [],
"display_name": "Sylphx Localization",
"noun": "localization",
"stage": "preview"
},
{
"collections": [
{
"collection": "price_catalogs",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/price_catalogs/*}",
"method": "money.price_catalogs.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/price_catalogs/{price_catalog}"
},
"summary": "Gets the environment's catalog.",
"verb": "get"
},
{
"effect": "write",
"flags": [
{
"field": "catalog.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "catalog.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "catalog.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "catalog.spec.features",
"flag": "--spec.features",
"repeated": true,
"summary": "What an entitlement can grant.",
"type": "json"
},
{
"field": "catalog.spec.products",
"flag": "--spec.products",
"repeated": true,
"summary": "What is sold.",
"type": "json"
},
{
"field": "catalog.spec.client_grant_ttl",
"flag": "--spec.client-grant-ttl",
"summary": "How long a signed store-purchase grant is valid, from the moment it is issued; a client re-verifies to renew it. Default 7 days, 1 hour to 30 days.",
"type": "duration"
},
{
"field": "catalog.spec.refund_claw_back",
"flag": "--spec.refund-claw-back",
"summary": "Whether a delivered one-time purchase whose money the store or processor takes back (a refund, a void, a chargeback) gives back its goods: its entitlements end, and the refund event asks the app to take back the assets it granted, up to what the subject still holds. Applies once the project is enabled for take-backs, to refunds dated from then on; unset then means on.",
"type": "bool"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the catalog when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{catalog.name=orgs/*/projects/*/envs/*/price_catalogs/*}",
"method": "money.price_catalogs.update",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "catalog.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/price_catalogs/{price_catalog}"
},
"resource_field": "catalog",
"sends_etag": true,
"summary": "Updates the environment's catalog: its features and products, whole.",
"update_mask": "from-flags",
"verb": "update"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/price_catalogs/*}:sync",
"method": "money.price_catalogs.sync",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/price_catalogs/{price_catalog}"
},
"summary": "Pushes the catalog to the merchant account's processor now: products and prices by lookup key; an amount change makes a new price.",
"verb": "sync"
}
],
"noun": "price-catalogs",
"resource_type": "money.sylphx.com/PriceCatalog"
},
{
"collection": "checkout_policies",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/checkout_policies/*}",
"method": "money.checkout_policies.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/checkout_policies/{checkout_policy}"
},
"summary": "Gets the environment's checkout policy: which buyer countries consumer checkout refuses. An environment that never wrote one refuses none.",
"verb": "get"
},
{
"effect": "write",
"flags": [
{
"field": "checkout_policy.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "checkout_policy.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "checkout_policy.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "checkout_policy.spec.denied_country_codes",
"flag": "--spec.denied-country-codes",
"repeated": true,
"summary": "Buyer countries consumer checkout refuses: ISO 3166-1 alpha-2 codes (`DE`), or the group `EU` (the 27 member states). At most 300 entries. Empty refuses nobody.",
"type": "string"
},
{
"field": "checkout_policy.spec.allow_tax_id_buyers",
"flag": "--spec.allow-tax-id-buyers",
"summary": "Whether a buyer from a denied country who gives a tax id (a business) may still buy. Checkout then asks for the tax id; default false.",
"type": "bool"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the policy when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{checkout_policy.name=orgs/*/projects/*/envs/*/checkout_policies/*}",
"method": "money.checkout_policies.update",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "checkout_policy.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/checkout_policies/{checkout_policy}"
},
"resource_field": "checkout_policy",
"sends_etag": true,
"summary": "Updates the environment's checkout policy, whole.",
"update_mask": "from-flags",
"verb": "update"
}
],
"noun": "checkout-policies",
"resource_type": "money.sylphx.com/CheckoutPolicy"
},
{
"collection": "store_connections",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/store_connections/*}",
"method": "money.store_connections.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/store_connections/{store_connection}"
},
"summary": "Gets a store connection.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/store_connections",
"method": "money.store_connections.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists store connections.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "store_connection.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "store_connection.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "store_connection.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "store_connection.spec.app_store.bundle_ids",
"flag": "--spec.app-store.bundle-ids",
"repeated": true,
"summary": "The apps' bundle ids.",
"type": "string"
},
{
"field": "store_connection.spec.app_store.issuer_id",
"flag": "--spec.app-store.issuer-id",
"summary": "The App Store Connect issuer id.",
"type": "string"
},
{
"field": "store_connection.spec.app_store.key_id",
"flag": "--spec.app-store.key-id",
"summary": "The In-App Purchase key id.",
"type": "string"
},
{
"field": "store_connection.spec.app_store.private_key",
"flag": "--spec.app-store.private-key",
"sensitive": true,
"summary": "The In-App Purchase key (`.p8` PEM). Write-only: sealed on write, never returned; omit it on update to keep the stored key.",
"type": "string"
},
{
"field": "store_connection.spec.app_store.app_apple_id",
"flag": "--spec.app-store.app-apple-id",
"summary": "The app's Apple id: when set, production notifications must carry it.",
"type": "int"
},
{
"field": "store_connection.spec.app_store.account_token_prefix",
"flag": "--spec.app-store.account-token-prefix",
"summary": "An earlier `appAccountToken` scheme the app's shipped builds use: the token is UUIDv5 in the URL namespace of this prefix followed by the subject id (for example `https://accounts.example.com/v2/`). Tokens in Money's own scheme are always accepted as well.",
"type": "string"
},
{
"field": "store_connection.spec.app_store.environment",
"flag": "--spec.app-store.environment",
"summary": "The store environment this connection serves: `production` or `sandbox`. Only purchases signed for that environment are accepted (plus sandbox ones on a production connection with `allow_sandbox`), and each is read back from its own environment's App Store Server API. Xcode and local-testing signatures are refused either way. A connection created before this field existed serves `production`.",
"type": "string"
},
{
"field": "store_connection.spec.google_play.package_names",
"flag": "--spec.google-play.package-names",
"repeated": true,
"summary": "The apps' package names.",
"type": "string"
},
{
"field": "store_connection.spec.google_play.service_account_json",
"flag": "--spec.google-play.service-account-json",
"sensitive": true,
"summary": "The service account's JSON key. Write-only: sealed on write, never returned; omit it on update to keep the stored key.",
"type": "string"
},
{
"field": "store_connection.spec.google_play.notification_audience",
"flag": "--spec.google-play.notification-audience",
"summary": "The audience Play's Pub/Sub push token must carry for real-time developer notifications; unset refuses them.",
"type": "string"
},
{
"field": "store_connection.spec.google_play.notification_service_account",
"flag": "--spec.google-play.notification-service-account",
"summary": "The service account Pub/Sub pushes as.",
"type": "string"
},
{
"field": "store_connection.spec.allow_sandbox",
"flag": "--spec.allow-sandbox",
"summary": "Accept purchases the store marks as sandbox or license-test. Off: a sandbox purchase is refused. On a `production` App Store connection it also takes App Review and TestFlight purchases, read back from the sandbox and recorded and granted as `sandbox`, never as production.",
"type": "bool"
},
{
"field": "store_connection.spec.require_account_token",
"flag": "--spec.require-account-token",
"summary": "Refuse a purchase that does not carry the subject's account token (App Store `appAccountToken`, Play `obfuscatedAccountId`).",
"type": "bool"
},
{
"field": "store_connection.spec.client_verify",
"flag": "--spec.client-verify",
"summary": "Let an app with no server verify its own purchases against this connection (`store_purchases:clientVerify`, callable with a publishable key). Off by default, including for every connection created before this field existed; only a secret key holding `billing:write` can turn it on.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/store_connections",
"method": "money.store_connections.create",
"permission": "billing:write",
"positional": {
"arg": "ID",
"field": "store_connection_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "store_connection",
"summary": "Creates a store connection; its credential is sealed and never returned.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "store_connection.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "store_connection.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "store_connection.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "store_connection.spec.app_store.bundle_ids",
"flag": "--spec.app-store.bundle-ids",
"repeated": true,
"summary": "The apps' bundle ids.",
"type": "string"
},
{
"field": "store_connection.spec.app_store.issuer_id",
"flag": "--spec.app-store.issuer-id",
"summary": "The App Store Connect issuer id.",
"type": "string"
},
{
"field": "store_connection.spec.app_store.key_id",
"flag": "--spec.app-store.key-id",
"summary": "The In-App Purchase key id.",
"type": "string"
},
{
"field": "store_connection.spec.app_store.private_key",
"flag": "--spec.app-store.private-key",
"sensitive": true,
"summary": "The In-App Purchase key (`.p8` PEM). Write-only: sealed on write, never returned; omit it on update to keep the stored key.",
"type": "string"
},
{
"field": "store_connection.spec.app_store.app_apple_id",
"flag": "--spec.app-store.app-apple-id",
"summary": "The app's Apple id: when set, production notifications must carry it.",
"type": "int"
},
{
"field": "store_connection.spec.app_store.account_token_prefix",
"flag": "--spec.app-store.account-token-prefix",
"summary": "An earlier `appAccountToken` scheme the app's shipped builds use: the token is UUIDv5 in the URL namespace of this prefix followed by the subject id (for example `https://accounts.example.com/v2/`). Tokens in Money's own scheme are always accepted as well.",
"type": "string"
},
{
"field": "store_connection.spec.app_store.environment",
"flag": "--spec.app-store.environment",
"summary": "The store environment this connection serves: `production` or `sandbox`. Only purchases signed for that environment are accepted (plus sandbox ones on a production connection with `allow_sandbox`), and each is read back from its own environment's App Store Server API. Xcode and local-testing signatures are refused either way. A connection created before this field existed serves `production`.",
"type": "string"
},
{
"field": "store_connection.spec.google_play.package_names",
"flag": "--spec.google-play.package-names",
"repeated": true,
"summary": "The apps' package names.",
"type": "string"
},
{
"field": "store_connection.spec.google_play.service_account_json",
"flag": "--spec.google-play.service-account-json",
"sensitive": true,
"summary": "The service account's JSON key. Write-only: sealed on write, never returned; omit it on update to keep the stored key.",
"type": "string"
},
{
"field": "store_connection.spec.google_play.notification_audience",
"flag": "--spec.google-play.notification-audience",
"summary": "The audience Play's Pub/Sub push token must carry for real-time developer notifications; unset refuses them.",
"type": "string"
},
{
"field": "store_connection.spec.google_play.notification_service_account",
"flag": "--spec.google-play.notification-service-account",
"summary": "The service account Pub/Sub pushes as.",
"type": "string"
},
{
"field": "store_connection.spec.allow_sandbox",
"flag": "--spec.allow-sandbox",
"summary": "Accept purchases the store marks as sandbox or license-test. Off: a sandbox purchase is refused. On a `production` App Store connection it also takes App Review and TestFlight purchases, read back from the sandbox and recorded and granted as `sandbox`, never as production.",
"type": "bool"
},
{
"field": "store_connection.spec.require_account_token",
"flag": "--spec.require-account-token",
"summary": "Refuse a purchase that does not carry the subject's account token (App Store `appAccountToken`, Play `obfuscatedAccountId`).",
"type": "bool"
},
{
"field": "store_connection.spec.client_verify",
"flag": "--spec.client-verify",
"summary": "Let an app with no server verify its own purchases against this connection (`store_purchases:clientVerify`, callable with a publishable key). Off by default, including for every connection created before this field existed; only a secret key holding `billing:write` can turn it on.",
"type": "bool"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the store connection when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{store_connection.name=orgs/*/projects/*/envs/*/store_connections/*}",
"method": "money.store_connections.update",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "store_connection.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/store_connections/{store_connection}"
},
"resource_field": "store_connection",
"sends_etag": true,
"summary": "Updates a store connection; a new credential replaces the stored one.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "The ETag the caller read; the delete fails if it changed.",
"type": "string"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/store_connections/*}",
"method": "money.store_connections.delete",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/store_connections/{store_connection}"
},
"summary": "Deletes a store connection and its sealed credential.",
"verb": "delete"
}
],
"noun": "store-connections",
"resource_type": "money.sylphx.com/StoreConnection"
},
{
"collection": "store_purchases",
"commands": [
{
"effect": "write",
"flags": [
{
"field": "subject",
"flag": "--subject",
"required": true,
"summary": "Who bought it.",
"type": "json"
},
{
"field": "store",
"flag": "--store",
"required": true,
"summary": "`app_store` or `google_play`.",
"type": "string"
},
{
"field": "signed_transaction",
"flag": "--signed-transaction",
"summary": "App Store: the StoreKit 2 signed transaction (`jwsRepresentation`).",
"type": "string"
},
{
"field": "purchase_token",
"flag": "--purchase-token",
"summary": "Google Play: the purchase token.",
"type": "string"
},
{
"field": "product_id",
"flag": "--product-id",
"summary": "Google Play: the store product id (for a subscription, its id).",
"type": "string"
},
{
"field": "package_name",
"flag": "--package-name",
"summary": "Google Play: the package name, when the connection covers several.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "transaction_id",
"flag": "--transaction-id",
"summary": "App Store, instead of `signed_transaction`: the transaction id, for apps on original StoreKit whose receipts carry no signed transaction. Money reads the transaction from Apple with the connection's key; Apple's signed answer is the proof.",
"type": "string"
},
{
"field": "bundle_id",
"flag": "--bundle-id",
"summary": "App Store, with `transaction_id`: the app's bundle id.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/store_purchases:verify",
"method": "money.store_purchases.verify",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Verifies a store purchase with the store, binds it to the subject, and returns its record and a signed grant. Re-verifying returns the same record and grant. Called from the app's server with a secret key that holds `billing:write`; a publishable key cannot call it.",
"verb": "verify"
},
{
"effect": "write",
"flags": [
{
"field": "subject",
"flag": "--subject",
"required": true,
"summary": "Who bought it: `end_user` of `inst_` and a lower-case UUID.",
"type": "json"
},
{
"field": "store",
"flag": "--store",
"required": true,
"summary": "`app_store` or `google_play`.",
"type": "string"
},
{
"field": "signed_transaction",
"flag": "--signed-transaction",
"summary": "App Store: the StoreKit 2 signed transaction (`jwsRepresentation`).",
"type": "string"
},
{
"field": "purchase_token",
"flag": "--purchase-token",
"summary": "Google Play: the purchase token.",
"type": "string"
},
{
"field": "product_id",
"flag": "--product-id",
"summary": "Google Play: the store product id (for a subscription, its id).",
"type": "string"
},
{
"field": "package_name",
"flag": "--package-name",
"summary": "Google Play: the package name, when the connection covers several.",
"type": "string"
},
{
"field": "account_token",
"flag": "--account-token",
"summary": "The account token the app set at purchase (Play `obfuscatedAccountId`, App Store `appAccountToken`). A consistency check only: it must match the subject's derivation and the store's copy.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/store_purchases:clientVerify",
"method": "money.store_purchases.client_verify",
"permission": "billing:client",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Verifies a store purchase for an app with no server: called with the environment's publishable key (`billing:client`), the subject is an install id (`inst_` and a UUID), and Money completes the purchase with the store (acknowledges or consumes it) so the app never calls the store's server API. Works only on store connections that set `client_verify`. Re-calling returns the same record and grant.",
"verb": "client-verify"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/store_purchases/*}",
"method": "money.store_purchases.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/store_purchases/{store_purchase}"
},
"summary": "Gets a store purchase.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over filterable fields, for example `transaction_id = \"…\"`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/store_purchases",
"method": "money.store_purchases.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists store purchases, newest first.",
"verb": "list"
}
],
"noun": "store-purchases",
"resource_type": "money.sylphx.com/StorePurchase"
},
{
"collection": "customer_subscriptions",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/customer_subscriptions/*}",
"method": "money.customer_subscriptions.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_subscriptions/{customer_subscription}"
},
"summary": "Gets a customer subscription.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/customer_subscriptions",
"method": "money.customer_subscriptions.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists customer subscriptions, newest first.",
"verb": "list"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "at_period_end",
"flag": "--at-period-end",
"summary": "End it at the period end (true) or now (false).",
"type": "bool"
},
{
"field": "refund_last_payment",
"flag": "--refund-last-payment",
"summary": "Refund the last payment in full; only with `at_period_end` false.",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/customer_subscriptions/*}:cancel",
"method": "money.customer_subscriptions.cancel",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_subscriptions/{customer_subscription}"
},
"summary": "Cancels a web subscription, now or at the period end, and optionally refunds its last payment (for example a statutory cancellation window).",
"verb": "cancel"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/customer_subscriptions/*}:resume",
"method": "money.customer_subscriptions.resume",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_subscriptions/{customer_subscription}"
},
"summary": "Resumes a web subscription set to cancel at its period end.",
"verb": "resume"
},
{
"effect": "write",
"flags": [
{
"field": "quantity",
"flag": "--quantity",
"required": true,
"summary": "The new quantity (seats) of the subscription's one item; at least 1. To end the subscription, cancel it.",
"type": "int"
},
{
"field": "proration_behavior",
"flag": "--proration-behavior",
"summary": "How the change is billed; unspecified is `create_prorations`.",
"type": "enum",
"values": [
"create_prorations",
"none",
"always_invoice"
]
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/customer_subscriptions/*}:updateQuantity",
"method": "money.customer_subscriptions.update_quantity",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_subscriptions/{customer_subscription}"
},
"summary": "Changes the seat quantity of a web subscription, now, and syncs the processor's subscription item to it. A retry with the same `Idempotency-Key` (required) and the same request changes nothing twice.",
"verb": "update-quantity"
},
{
"effect": "write",
"flags": [
{
"field": "product",
"flag": "--product",
"required": true,
"summary": "The key of the catalog product to move to.",
"type": "string"
},
{
"field": "price",
"flag": "--price",
"summary": "The key of the product's recurring price (for example monthly or yearly). Optional when the product has one recurring price.",
"type": "string"
},
{
"field": "proration_behavior",
"flag": "--proration-behavior",
"summary": "How the change is billed; unspecified is `create_prorations`.",
"type": "enum",
"values": [
"create_prorations",
"none",
"always_invoice"
]
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/customer_subscriptions/*}:changePlan",
"method": "money.customer_subscriptions.change_plan",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/customer_subscriptions/{customer_subscription}"
},
"summary": "Move a web subscription onto another recurring catalog plan.",
"verb": "change-plan"
}
],
"noun": "customer-subscriptions",
"resource_type": "money.sylphx.com/CustomerSubscription"
},
{
"collection": "entitlement_grants",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/entitlement_grants/*}",
"method": "money.entitlement_grants.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/entitlement_grants/{entitlement_grant}"
},
"summary": "Gets an entitlement grant.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over filterable fields, for example `feature = \"plus\"`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/entitlement_grants",
"method": "money.entitlement_grants.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists entitlement grants.",
"verb": "list"
},
{
"effect": "read",
"flags": [
{
"field": "subject",
"flag": "--subject",
"required": true,
"summary": "Who.",
"type": "json"
},
{
"field": "feature",
"flag": "--feature",
"required": true,
"summary": "The feature key.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/entitlement_grants:check",
"method": "money.entitlement_grants.check",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Answers whether a subject holds a feature now, and how much of it.",
"verb": "check"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "entitlement_grant.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "entitlement_grant.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "entitlement_grant.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "entitlement_grant.subject.end_user",
"flag": "--subject.end-user",
"summary": "An end user's id (Sylphx Auth, or the app's own OIDC issuer).",
"type": "string"
},
{
"field": "entitlement_grant.subject.customer_organization",
"flag": "--subject.customer-organization",
"summary": "A customer organization's id.",
"type": "string"
},
{
"field": "entitlement_grant.feature",
"flag": "--feature",
"summary": "The feature key.",
"type": "string"
},
{
"field": "entitlement_grant.expire_time",
"flag": "--expire-time",
"summary": "When it ends; unset for no end.",
"type": "timestamp"
},
{
"field": "entitlement_grant.campaign",
"flag": "--campaign",
"summary": "A manual grant's campaign (input on create, up to 64 characters).",
"type": "string"
},
{
"field": "entitlement_grant.reason",
"flag": "--reason",
"summary": "A manual grant's reason (input on create, up to 500 characters).",
"type": "string"
},
{
"field": "entitlement_grant.approval_ref",
"flag": "--approval-ref",
"summary": "A free-text reference to the approval, for example `CEO 2026-10-02` (input on create, up to 200 characters).",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/entitlement_grants",
"method": "money.entitlement_grants.create",
"permission": "billing:credits.approve",
"positional": {
"arg": "ID",
"field": "entitlement_grant_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "entitlement_grant",
"summary": "Creates a manual entitlement grant (support, comp, grace). Append-only; needs the approval-class scope. The approver recorded is the key's principal.",
"verb": "create"
}
],
"noun": "entitlement-grants",
"resource_type": "money.sylphx.com/EntitlementGrant"
},
{
"collection": "merchant_accounts",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/merchant_accounts/*}",
"method": "money.merchant_accounts.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/merchant_accounts/{merchant_account}"
},
"summary": "Gets a merchant account.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/merchant_accounts",
"method": "money.merchant_accounts.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists merchant accounts.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"field": "merchant_account_id",
"flag": "--merchant-account-id",
"summary": "The merchant account id; default `default`.",
"type": "string"
},
{
"field": "return_url",
"flag": "--return-url",
"summary": "Where the browser returns after the processor, with `status` and, on success, `merchant_account` in the query. HTTPS only. Required for the OAuth connection; unused, and so optional, with `restricted_key`.",
"type": "string"
},
{
"field": "restricted_key",
"flag": "--restricted-key",
"sensitive": true,
"summary": "A Stripe restricted key (`rk_test_…` or `rk_live_…`); when set, no OAuth happens: the account is read and connected at once. Write-only: sealed on write, never returned, never logged. A secret key (`sk_…`) is refused, because a restricted key can be limited to what payments need.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/merchant_accounts:connect",
"method": "money.merchant_accounts.connect",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Starts connecting a Stripe account: returns the processor's authorisation URL for an org owner to open, which the processor's redirect completes. With a restricted key in the request the account connects at once instead, and the connected merchant account comes back in the response.",
"verb": "connect"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/merchant_accounts/*}:refresh",
"method": "money.merchant_accounts.refresh",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/merchant_accounts/{merchant_account}"
},
"summary": "Reads the connected account back from the processor.",
"verb": "refresh"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/merchant_accounts/*}:disconnect",
"method": "money.merchant_accounts.disconnect",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/merchant_accounts/{merchant_account}"
},
"summary": "Disconnects the account: Sylphx loses access; checkout is refused.",
"verb": "disconnect"
},
{
"effect": "write",
"flags": [
{
"field": "merchant_account.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "merchant_account.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "merchant_account.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "merchant_account.automatic_tax",
"flag": "--automatic-tax",
"summary": "Whether Stripe computes tax on this merchant's checkouts and usage invoices (its own cost decision: Stripe Tax charges per transaction). Off by default. Writable through `UpdateMerchantAccount` (`update_mask = \"automatic_tax\"`). Turning it on is refused while a live `post_tax_settlement` credit grant exists.",
"type": "bool"
}
],
"http": "PATCH /v1/{merchant_account.name=orgs/*/projects/*/envs/*/merchant_accounts/*}",
"method": "money.merchant_accounts.update",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "merchant_account.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/merchant_accounts/{merchant_account}"
},
"resource_field": "merchant_account",
"sends_etag": true,
"summary": "Updates the merchant account's own settings: the fields named in `update_mask`.",
"update_mask": "from-flags",
"verb": "update"
}
],
"noun": "merchant-accounts",
"resource_type": "money.sylphx.com/MerchantAccount"
},
{
"collection": "checkout_sessions",
"commands": [
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "checkout_session.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "checkout_session.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "checkout_session.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "checkout_session.subject.end_user",
"flag": "--subject.end-user",
"summary": "An end user's id (Sylphx Auth, or the app's own OIDC issuer).",
"type": "string"
},
{
"field": "checkout_session.subject.customer_organization",
"flag": "--subject.customer-organization",
"summary": "A customer organization's id.",
"type": "string"
},
{
"field": "checkout_session.line_items",
"flag": "--line-items",
"repeated": true,
"required": true,
"summary": "What is bought: catalog prices by lookup key. One recurring price makes a subscription; one-time prices make an order.",
"type": "json"
},
{
"field": "checkout_session.success_url",
"flag": "--success-url",
"required": true,
"summary": "Where the buyer lands after paying; `{CHECKOUT_SESSION_ID}` is replaced by the processor's session id. HTTPS only.",
"type": "string"
},
{
"field": "checkout_session.cancel_url",
"flag": "--cancel-url",
"summary": "Where the buyer lands on cancel. HTTPS only.",
"type": "string"
},
{
"field": "checkout_session.currency_code",
"flag": "--currency-code",
"summary": "The currency to charge in, upper-case ISO 4217; default the processor's choice for the buyer among the prices' currencies.",
"type": "string"
},
{
"field": "checkout_session.locale",
"flag": "--locale",
"summary": "The page language, for example `en` or `zh-HK`; default automatic.",
"type": "string"
},
{
"field": "checkout_session.metadata",
"flag": "--metadata",
"repeated": true,
"summary": "Copied to the subscription or order, for example attribution (`utm_source`, `ref`). At most 20 keys.",
"type": "key=value"
},
{
"field": "checkout_session.allow_promotion_codes",
"flag": "--allow-promotion-codes",
"summary": "Whether the buyer may enter a promotion code.",
"type": "bool"
},
{
"field": "checkout_session.buyer_country_code",
"flag": "--buyer-country-code",
"summary": "Where the buyer is, upper-case ISO 3166-1 alpha-2, when the caller knows it (for example from the request's IP address). A country the environment's checkout policy denies is refused here, before any page is made, unless the policy lets a business buy. Not trusted for anything else: the billing address the buyer gives is checked again when the payment completes.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/checkout_sessions",
"method": "money.checkout_sessions.create",
"permission": "billing:write",
"positional": {
"arg": "ID",
"field": "checkout_session_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "checkout_session",
"summary": "Creates a hosted checkout for a subject.",
"verb": "create"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/checkout_sessions/*}",
"method": "money.checkout_sessions.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/checkout_sessions/{checkout_session}"
},
"summary": "Gets a checkout session.",
"verb": "get"
}
],
"noun": "checkout-sessions",
"resource_type": "money.sylphx.com/CheckoutSession"
},
{
"collection": "tax_threshold_statuses",
"commands": [
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/tax_threshold_statuses",
"method": "money.tax_threshold_statuses.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists where the environment's consumer sales stand against each jurisdiction's digital-services tax registration threshold, per its own window. EU and UK have no threshold and are not tracked.",
"verb": "list"
}
],
"noun": "tax-threshold-statuses",
"resource_type": "money.sylphx.com/TaxThresholdStatus"
},
{
"collection": "portal_sessions",
"commands": [
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "portal_session.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "portal_session.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "portal_session.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "portal_session.subject.end_user",
"flag": "--subject.end-user",
"summary": "An end user's id (Sylphx Auth, or the app's own OIDC issuer).",
"type": "string"
},
{
"field": "portal_session.subject.customer_organization",
"flag": "--subject.customer-organization",
"summary": "A customer organization's id.",
"type": "string"
},
{
"field": "portal_session.return_url",
"flag": "--return-url",
"required": true,
"summary": "Where the portal's back link goes. HTTPS only.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/portal_sessions",
"method": "money.portal_sessions.create",
"permission": "billing:write",
"positional": {
"arg": "ID",
"field": "portal_session_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "portal_session",
"summary": "Creates a customer portal session for a subject.",
"verb": "create"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/portal_sessions/*}",
"method": "money.portal_sessions.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/portal_sessions/{portal_session}"
},
"summary": "Gets a portal session.",
"verb": "get"
}
],
"noun": "portal-sessions",
"resource_type": "money.sylphx.com/PortalSession"
},
{
"collection": "licence_keys",
"commands": [
{
"effect": "write",
"flags": [
{
"field": "licence_key_id",
"flag": "--licence-key-id",
"summary": "The key's id; `^[a-z]([a-z0-9_-]{0,61}[a-z0-9])?$`. Empty: Money assigns one.",
"type": "string"
},
{
"field": "spec",
"flag": "--spec",
"summary": "Shown to operators.",
"type": "json"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/licence_keys:generate",
"method": "money.licence_keys.generate",
"permission": "billing:licence_keys.approve",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Generates a licence key: Money creates the Ed25519 key, seals it, and never returns the private half. Needs the approval-class scope, which the developer role does not hold.",
"verb": "generate"
},
{
"effect": "write",
"flags": [
{
"field": "licence_key_id",
"flag": "--licence-key-id",
"required": true,
"summary": "The key's id; as on GenerateLicenceKeyRequest. Required.",
"type": "string"
},
{
"field": "private_key_pkcs8",
"flag": "--private-key-pkcs8",
"required": true,
"sensitive": true,
"summary": "The Ed25519 private key as PKCS8 DER in standard base64. Write-only: sealed on import, never returned.",
"type": "string"
},
{
"field": "expected_public_key",
"flag": "--expected-public-key",
"required": true,
"summary": "The public key shipped clients pin, raw base64url without padding. The import is refused unless it is the public half of the imported key.",
"type": "string"
},
{
"field": "spec",
"flag": "--spec",
"summary": "Shown to operators.",
"type": "json"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/licence_keys:import",
"method": "money.licence_keys.import",
"permission": "billing:licence_keys.approve",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Imports an existing Ed25519 key (PKCS8), for a key already pinned in shipped clients. Refused unless the expected public key is the imported key's public half.",
"verb": "import"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/licence_keys/*}:retire",
"method": "money.licence_keys.retire",
"permission": "billing:licence_keys.approve",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/licence_keys/{licence_key}"
},
"summary": "Retires a licence key: it stops signing new terms and stays exported for verification.",
"verb": "retire"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/licence_keys/*}",
"method": "money.licence_keys.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/licence_keys/{licence_key}"
},
"summary": "Gets a licence key (its public half, never the private).",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/licence_keys",
"method": "money.licence_keys.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists licence keys, newest first.",
"verb": "list"
}
],
"noun": "licence-keys",
"resource_type": "money.sylphx.com/LicenceKey"
},
{
"collection": "licence_tokens",
"commands": [
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter. It must name whose tokens (else `INVALID_FIELD`): `end_user = \"…\"` or `customer_organization = \"…\"`; `token_product = \"…\"` (joined with `AND`) keeps only that product, and no `token_product` lists every product.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/licence_tokens",
"method": "money.licence_tokens.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists a subject's unexpired offline licence tokens of paid orders, for support. Re-derived from the frozen terms: the same bytes as at purchase.",
"verb": "list"
}
],
"noun": "licence-tokens",
"resource_type": "money.sylphx.com/LicenceToken"
},
{
"collection": "usage_settings",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/usage_settings/*}",
"method": "money.usage_settings.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/usage_settings/{usage_settings}"
},
"summary": "Gets the environment's usage settings.",
"verb": "get"
},
{
"effect": "write",
"flags": [
{
"field": "usage_settings.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "usage_settings.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "usage_settings.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "usage_settings.currency_code",
"flag": "--currency-code",
"required": true,
"summary": "The currency usage is rated and invoiced in (ISO 4217, upper case).",
"type": "string"
},
{
"field": "usage_settings.enforcement_enabled",
"flag": "--enforcement-enabled",
"summary": "While false a reservation is always granted and a would-be refusal is only recorded. Off until the merchant's admin turns it on.",
"type": "bool"
},
{
"field": "usage_settings.free_allowance_nano",
"flag": "--free-allowance-nano",
"summary": "What a subject with no payment method may use each month, nano-minor, as a decimal string.",
"type": "string"
},
{
"field": "usage_settings.past_due_grace_days",
"flag": "--past-due-grace-days",
"summary": "Days after an invoice's due time before the subject is past due.",
"type": "int"
},
{
"field": "usage_settings.suspend_grace_days",
"flag": "--suspend-grace-days",
"summary": "Days after an invoice's due time before the subject is suspended.",
"type": "int"
},
{
"field": "usage_settings.extra_issuer",
"flag": "--extra-issuer",
"summary": "A further token issuer (the merchant's own OIDC provider) besides Sylphx Auth; empty for Sylphx Auth only. It needs `extra_issuer_jwks_url`.",
"type": "string"
},
{
"field": "usage_settings.extra_issuer_jwks_url",
"flag": "--extra-issuer-jwks-url",
"summary": "The issuer's HTTPS JWKS URL.",
"type": "string"
},
{
"field": "usage_settings.extra_issuer_audience",
"flag": "--extra-issuer-audience",
"summary": "The audience that issuer's tokens must carry; required with `extra_issuer`.",
"type": "string"
},
{
"field": "usage_settings.extra_issuer_org_claim",
"flag": "--extra-issuer-org-claim",
"summary": "The claim that names a customer organization in that issuer's tokens; empty means the issuer proves no organization subject.",
"type": "string"
}
],
"http": "PATCH /v1/{usage_settings.name=orgs/*/projects/*/envs/*/usage_settings/*}",
"method": "money.usage_settings.update",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "usage_settings.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/usage_settings/{usage_settings}"
},
"resource_field": "usage_settings",
"sends_etag": true,
"summary": "Updates the usage settings, the enforcement switch included. A change is recorded with who made it.",
"update_mask": "from-flags",
"verb": "update"
}
],
"noun": "usage-settings",
"resource_type": "money.sylphx.com/UsageSettings"
},
{
"collection": "usage_tiers",
"commands": [
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter, for example `subject = \"…\"`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/usage_tiers",
"method": "money.usage_tiers.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists usage tiers.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"field": "usage_tier.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "usage_tier.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "usage_tier.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "usage_tier.rank",
"flag": "--rank",
"required": true,
"summary": "Order of tiers; 0 is the base tier.",
"type": "int"
},
{
"field": "usage_tier.daily_limit_minor",
"flag": "--daily-limit-minor",
"summary": "Daily exposure limit in minor units, a decimal string; empty for none.",
"type": "string"
},
{
"field": "usage_tier.monthly_limit_minor",
"flag": "--monthly-limit-minor",
"summary": "Monthly exposure limit in minor units, a decimal string; empty for none.",
"type": "string"
},
{
"field": "usage_tier.threshold_minor",
"flag": "--threshold-minor",
"required": true,
"summary": "The amount an invoice would make due at which a threshold invoice is cut.",
"type": "string"
},
{
"field": "usage_tier.requires_paid_invoices",
"flag": "--requires-paid-invoices",
"summary": "Paid invoices needed to reach this tier.",
"type": "int"
},
{
"field": "usage_tier.requires_paid_minor",
"flag": "--requires-paid-minor",
"summary": "Paid total, minor units, needed to reach this tier.",
"type": "string"
}
],
"http": "PATCH /v1/{usage_tier.name=orgs/*/projects/*/envs/*/usage_tiers/*}",
"method": "money.usage_tiers.update",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "usage_tier.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/usage_tiers/{usage_tier}"
},
"resource_field": "usage_tier",
"sends_etag": true,
"summary": "Creates or updates a usage tier.",
"update_mask": "from-flags",
"verb": "update"
}
],
"noun": "usage-tiers",
"resource_type": "money.sylphx.com/UsageTier"
},
{
"collection": "usage_reservations",
"commands": [
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "usage_reservation.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "usage_reservation.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "usage_reservation.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "usage_reservation.subject.end_user",
"flag": "--subject.end-user",
"summary": "An end user's id (Sylphx Auth, or the app's own OIDC issuer).",
"type": "string"
},
{
"field": "usage_reservation.subject.customer_organization",
"flag": "--subject.customer-organization",
"summary": "A customer organization's id.",
"type": "string"
},
{
"field": "usage_reservation.subject_proof",
"flag": "--subject-proof",
"required": true,
"summary": "The acting end user's access token, required on every reserve: Money proves the subject itself, fresh, with the caller's own key (`auth:sessions:verify`) or the merchant's configured issuer. Never stored. A raw id is refused with PERMISSION_DENIED (reason `subject_unverified`).",
"type": "string"
},
{
"field": "usage_reservation.actor_proof",
"flag": "--actor-proof",
"summary": "For a customer organization: the token of the acting user, whose membership of the organization is checked fresh. The subject is Sylphx Auth's bare organization id (`acme`), never a resource name. Never stored.",
"type": "string"
},
{
"field": "usage_reservation.meter",
"flag": "--meter",
"required": true,
"summary": "The meter's lookup key.",
"type": "string"
},
{
"field": "usage_reservation.max_quantity",
"flag": "--max-quantity",
"required": true,
"summary": "The most the work may use, in the meter's base unit.",
"type": "int"
},
{
"field": "usage_reservation.ttl",
"flag": "--ttl",
"summary": "How long the hold lasts, at most `600s`; default `600s`.",
"type": "duration"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/usage_reservations",
"method": "money.usage_reservations.create",
"permission": "billing:metering:write",
"positional": null,
"resource_field": "usage_reservation",
"summary": "Reserves usage before the work starts. Refused with PLAN_LIMIT_REACHED (spend limit, no payment method) or INVALID_STATE (suspended) only while enforcement is on; while it is dark the reservation is granted and the refusal is recorded.",
"verb": "create"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/usage_reservations/*}",
"method": "money.usage_reservations.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/usage_reservations/{usage_reservation}"
},
"summary": "Gets a usage reservation.",
"verb": "get"
},
{
"effect": "write",
"flags": [
{
"field": "quantity_used",
"flag": "--quantity-used",
"required": true,
"summary": "What was used, in the meter's base unit; 0 to the granted quantity, or more after expiry (the work happened).",
"type": "int"
},
{
"field": "occurred_time",
"flag": "--occurred-time",
"summary": "When the work happened; now when absent.",
"type": "timestamp"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/usage_reservations/*}:settle",
"method": "money.usage_reservations.settle",
"permission": "billing:metering:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/usage_reservations/{usage_reservation}"
},
"summary": "Settles a reservation with what was used; the unused part returns to headroom. A settle after expiry still records the usage.",
"verb": "settle"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/usage_reservations/*}:release",
"method": "money.usage_reservations.release",
"permission": "billing:metering:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/usage_reservations/{usage_reservation}"
},
"summary": "Releases a reservation that used nothing.",
"verb": "release"
}
],
"noun": "usage-reservations",
"resource_type": "money.sylphx.com/UsageReservation"
},
{
"collection": "usage_events",
"commands": [
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "usage_event.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "usage_event.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "usage_event.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "usage_event.subject.end_user",
"flag": "--subject.end-user",
"summary": "An end user's id (Sylphx Auth, or the app's own OIDC issuer).",
"type": "string"
},
{
"field": "usage_event.subject.customer_organization",
"flag": "--subject.customer-organization",
"summary": "A customer organization's id.",
"type": "string"
},
{
"field": "usage_event.subject_proof",
"flag": "--subject-proof",
"required": true,
"summary": "As on UsageReservation.",
"type": "string"
},
{
"field": "usage_event.actor_proof",
"flag": "--actor-proof",
"summary": "As on UsageReservation.",
"type": "string"
},
{
"field": "usage_event.meter",
"flag": "--meter",
"required": true,
"summary": "The meter's lookup key.",
"type": "string"
},
{
"field": "usage_event.quantity",
"flag": "--quantity",
"required": true,
"summary": "How much, in the meter's base unit.",
"type": "int"
},
{
"field": "usage_event.occurred_time",
"flag": "--occurred-time",
"required": true,
"summary": "When the work happened.",
"type": "timestamp"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/usage_events",
"method": "money.usage_events.create",
"permission": "billing:metering:write",
"positional": null,
"resource_field": "usage_event",
"summary": "Records usage directly, only for a meter the merchant marked reservation-optional.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "usage_events",
"flag": "--usage-events",
"repeated": true,
"required": true,
"summary": "1 to 500 events.",
"type": "json"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/usage_events:batchIngest",
"method": "money.usage_events.batch_ingest",
"permission": "billing:metering:ingest",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Records a batch of already-incurred usage from the merchant's own servers (Stripe's meter-event model): the caller is a key of the merchant's own org holding the exact grant `billing:metering:ingest`, which no wildcard covers, and each event names its subject with no subject proof. Each event is keyed by its project, meter, meter version and event id: a replay is a no-op (`duplicate`), and the same key with different content is a `conflict` and never counted. One result per event, in request order.",
"verb": "batch-ingest"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter, for example `subject = \"…\"`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/usage_events",
"method": "money.usage_events.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists usage events, newest first.",
"verb": "list"
},
{
"effect": "read",
"flags": [
{
"field": "subject",
"flag": "--subject",
"required": true,
"summary": "Whose standing.",
"type": "json"
},
{
"field": "subject_proof",
"flag": "--subject-proof",
"required": true,
"summary": "As on UsageReservation: a verified token for the subject.",
"type": "string"
},
{
"field": "actor_proof",
"flag": "--actor-proof",
"summary": "For a customer organization: the acting user's token.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/usage_events:checkStanding",
"method": "money.usage_events.check_standing",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Reads a subject's standing: active, past due or suspended, whether a payment method is on file, headroom and the threshold.",
"verb": "check-standing"
}
],
"noun": "usage-events",
"resource_type": "money.sylphx.com/UsageEvent"
},
{
"collection": "credit_grants",
"commands": [
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "credit_grant.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "credit_grant.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "credit_grant.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "credit_grant.subject.end_user",
"flag": "--subject.end-user",
"summary": "An end user's id (Sylphx Auth, or the app's own OIDC issuer).",
"type": "string"
},
{
"field": "credit_grant.subject.customer_organization",
"flag": "--subject.customer-organization",
"summary": "A customer organization's id.",
"type": "string"
},
{
"field": "credit_grant.kind",
"flag": "--kind",
"required": true,
"summary": "`amount` (a total) or `monthly_cap` (up to the amount in each month).",
"type": "string"
},
{
"field": "credit_grant.amount_minor",
"flag": "--amount-minor",
"required": true,
"summary": "Minor units, a decimal string.",
"type": "string"
},
{
"field": "credit_grant.start_time",
"flag": "--start-time",
"required": true,
"summary": "When it starts applying.",
"type": "timestamp"
},
{
"field": "credit_grant.expire_time",
"flag": "--expire-time",
"required": true,
"summary": "When it stops applying; required. Not renewing is how charging starts.",
"type": "timestamp"
},
{
"field": "credit_grant.approver",
"flag": "--approver",
"required": true,
"summary": "Who approved it.",
"type": "string"
},
{
"field": "credit_grant.reason",
"flag": "--reason",
"required": true,
"summary": "Why.",
"type": "string"
},
{
"field": "credit_grant.supersedes",
"flag": "--supersedes",
"summary": "The grant this one replaces.",
"type": "string"
},
{
"field": "credit_grant.tax_treatment",
"flag": "--tax-treatment",
"required": true,
"summary": "`undecided`, `price_reduction`, or `post_tax_settlement`; no default. `post_tax_settlement` is refused while the merchant has automatic tax on.",
"type": "string"
},
{
"field": "credit_grant.collection_mode",
"flag": "--collection-mode",
"required": true,
"summary": "`standard` or `hold`; no default. Over the credit, a held invoice stays due but is not collected until an explicit audited release.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/credit_grants",
"method": "money.credit_grants.create",
"permission": "billing:credits.approve",
"positional": null,
"resource_field": "credit_grant",
"summary": "Gives a subject credit. Append-only: a change is a new grant that supersedes the old. Refused with INVALID_STATE (`tax_treatment_unsupported`) for `post_tax_settlement` while the merchant has automatic tax on.",
"verb": "create"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/credit_grants/*}",
"method": "money.credit_grants.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/credit_grants/{credit_grant}"
},
"summary": "Gets a credit grant.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter, for example `subject = \"…\"`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/credit_grants",
"method": "money.credit_grants.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists credit grants.",
"verb": "list"
}
],
"noun": "credit-grants",
"resource_type": "money.sylphx.com/CreditGrant"
},
{
"collection": "usage_invoices",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/usage_invoices/*}",
"method": "money.usage_invoices.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/usage_invoices/{usage_invoice}"
},
"summary": "Gets a usage invoice.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter, for example `subject = \"…\"`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/usage_invoices",
"method": "money.usage_invoices.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists usage invoices, newest first.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"field": "reason",
"flag": "--reason",
"required": true,
"summary": "Who releases it, and why: both are kept.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/usage_invoices/*}:releaseCollection",
"method": "money.usage_invoices.release_collection",
"permission": "billing:credits.approve",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/usage_invoices/{usage_invoice}"
},
"summary": "Releases a held invoice for collection, audited with who and why. Grant expiry or replacement never does.",
"verb": "release-collection"
}
],
"noun": "usage-invoices",
"resource_type": "money.sylphx.com/UsageInvoice"
},
{
"collection": "usage_meters",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/usage_meters/*}",
"method": "money.usage_meters.get",
"permission": "billing:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/usage_meters/{usage_meter}"
},
"summary": "Gets a usage meter.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/usage_meters",
"method": "money.usage_meters.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists usage meters.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"field": "usage_meter.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "usage_meter.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "usage_meter.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "usage_meter.unit",
"flag": "--unit",
"required": true,
"summary": "The unit of one quantity, for example `token`. It cannot change once the meter has recorded usage.",
"type": "string"
},
{
"field": "usage_meter.display_name",
"flag": "--display-name",
"summary": "A name for people.",
"type": "string"
},
{
"field": "usage_meter.reservation_optional",
"flag": "--reservation-optional",
"summary": "Whether usage may be recorded without a reservation.",
"type": "bool"
},
{
"field": "usage_meter.active",
"flag": "--active",
"summary": "A retired meter (false) refuses new usage; its history stays.",
"type": "bool"
}
],
"http": "PATCH /v1/{usage_meter.name=orgs/*/projects/*/envs/*/usage_meters/*}",
"method": "money.usage_meters.update",
"permission": "billing:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "usage_meter.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/usage_meters/{usage_meter}"
},
"resource_field": "usage_meter",
"sends_etag": true,
"summary": "Creates or updates a usage meter. The unit cannot change once it has recorded usage.",
"update_mask": "from-flags",
"verb": "update"
}
],
"noun": "usage-meters",
"resource_type": "money.sylphx.com/UsageMeter"
},
{
"collection": "usage_meter_prices",
"commands": [
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "usage_meter_price.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "usage_meter_price.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "usage_meter_price.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "usage_meter_price.meter",
"flag": "--meter",
"required": true,
"summary": "The meter's key.",
"type": "string"
},
{
"field": "usage_meter_price.currency_code",
"flag": "--currency-code",
"required": true,
"summary": "ISO 4217; it must be the environment's currency.",
"type": "string"
},
{
"field": "usage_meter_price.unit_price_nano",
"flag": "--unit-price-nano",
"required": true,
"summary": "List price of one unit, nano-minor (a billionth of a minor unit), a decimal string.",
"type": "string"
},
{
"field": "usage_meter_price.effective_time",
"flag": "--effective-time",
"summary": "When it starts applying; now when absent. Not in the past, and after the meter's latest price.",
"type": "timestamp"
},
{
"field": "usage_meter_price.tax_code",
"flag": "--tax-code",
"summary": "The processor's tax code for the usage line; empty for the merchant's default.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/usage_meter_prices",
"method": "money.usage_meter_prices.create",
"permission": "billing:write",
"positional": null,
"resource_field": "usage_meter_price",
"summary": "Appends a price to a meter's history. It applies from its effective time on and never rewrites usage already rated.",
"verb": "create"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter, for example `meter = \"tokens\"`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/usage_meter_prices",
"method": "money.usage_meter_prices.list",
"paginates": true,
"permission": "billing:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists meter prices, newest first; filter by `meter`.",
"verb": "list"
}
],
"noun": "usage-meter-prices",
"resource_type": "money.sylphx.com/UsageMeterPrice"
},
{
"collection": "revenue_sources",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/revenue_sources/*}",
"method": "money.revenue_sources.get",
"permission": "revenue:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/revenue_sources/{revenue_source}"
},
"summary": "Gets a revenue source, with its freshness. Revenue reporting (docs/adr/ADR-01M40HRQT0VSXZ1WANP8M318F2) is org-wide: `revenue:read` or `revenue:write`, held by an org-wide key or an org owner's or admin's session only; a project or environment key is refused.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*}/revenue_sources",
"method": "money.revenue_sources.list",
"paginates": true,
"permission": "revenue:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}"
},
"summary": "Lists the org's revenue sources, with their freshness.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "revenue_source.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "revenue_source.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "revenue_source.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "revenue_source.spec.kind",
"flag": "--spec.kind",
"required": true,
"summary": "`money`, `stripe`, `google_play`, `app_store`, `ad_network`, `file` or `manual`. Set on create and never changed; `money` is never created.",
"type": "string"
},
{
"field": "revenue_source.spec.display_name",
"flag": "--spec.display-name",
"summary": "Shown on summaries and in the console.",
"type": "string"
},
{
"field": "revenue_source.spec.paused",
"flag": "--spec.paused",
"summary": "A paused source is not synced and cannot be run; its facts still count.",
"type": "bool"
},
{
"field": "revenue_source.spec.config",
"flag": "--spec.config",
"repeated": true,
"summary": "The connector's settings (an account id, a bucket, a column mapping), never a credential. At most 32 entries.",
"type": "key=value"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*}/revenue_sources",
"method": "money.revenue_sources.create",
"permission": "revenue:write",
"positional": {
"arg": "ID",
"field": "revenue_source_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "revenue_source",
"summary": "Registers a revenue source. The `money` source is implicit and never created here.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "revenue_source.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "revenue_source.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "revenue_source.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "revenue_source.spec.display_name",
"flag": "--spec.display-name",
"summary": "Shown on summaries and in the console.",
"type": "string"
},
{
"field": "revenue_source.spec.paused",
"flag": "--spec.paused",
"summary": "A paused source is not synced and cannot be run; its facts still count.",
"type": "bool"
},
{
"field": "revenue_source.spec.config",
"flag": "--spec.config",
"repeated": true,
"summary": "The connector's settings (an account id, a bucket, a column mapping), never a credential. At most 32 entries.",
"type": "key=value"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{revenue_source.name=orgs/*/revenue_sources/*}",
"method": "money.revenue_sources.update",
"permission": "revenue:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "revenue_source.name",
"pattern": "orgs/{org}/revenue_sources/{revenue_source}"
},
"resource_field": "revenue_source",
"sends_etag": true,
"summary": "Renames, pauses or resumes a revenue source, or changes its settings.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "The current etag; when set, the delete happens only if it matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/revenue_sources/*}",
"method": "money.revenue_sources.delete",
"permission": "revenue:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/revenue_sources/{revenue_source}"
},
"summary": "Deletes a revenue source and the facts it reported. The `money` source cannot be deleted; pause it instead.",
"verb": "delete"
},
{
"effect": "write",
"flags": [
{
"field": "mode",
"flag": "--mode",
"summary": "`sync` (default) reads what is new; `backfill` re-reads the period `start_day` to `end_day`.",
"type": "string"
},
{
"field": "start_day",
"flag": "--start-day",
"summary": "The first day of a backfill, `YYYY-MM-DD`.",
"type": "string"
},
{
"field": "end_day",
"flag": "--end-day",
"summary": "The last day of a backfill, `YYYY-MM-DD`, inclusive.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/revenue_sources/*}:run",
"method": "money.revenue_sources.run",
"permission": "revenue:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/revenue_sources/{revenue_source}"
},
"summary": "Syncs a revenue source now, or backfills a period. A `money` source fills any booked fact its environment's ledger holds and the facts lack; a paused source, or one whose connector has not shipped yet, is refused (`INVALID_STATE`).",
"verb": "run"
}
],
"noun": "revenue-sources",
"resource_type": "money.sylphx.com/RevenueSource"
},
{
"collection": "revenue",
"commands": [
{
"effect": "read",
"flags": [
{
"field": "period",
"flag": "--period",
"summary": "`today`, `mtd` (month to date, the default), `month` (with `month`), or `range` (with `start_day` and `end_day`). Days are UTC.",
"type": "string"
},
{
"field": "month",
"flag": "--month",
"summary": "The month of a `month` period, `YYYY-MM`.",
"type": "string"
},
{
"field": "start_day",
"flag": "--start-day",
"summary": "The first day of a `range`, `YYYY-MM-DD`.",
"type": "string"
},
{
"field": "end_day",
"flag": "--end-day",
"summary": "The last day of a `range`, inclusive; at most 400 days after the first.",
"type": "string"
},
{
"field": "group_by",
"flag": "--group-by",
"summary": "`day` (the default) or `month`.",
"type": "string"
},
{
"field": "split",
"flag": "--by",
"summary": "`none` (the default), `source` or `product`.",
"type": "string"
},
{
"field": "amount",
"flag": "--amount",
"summary": "`net` (the default) or `gross`.",
"type": "string"
},
{
"field": "currency_code",
"flag": "--currency",
"summary": "The reporting currency, ISO 4217; default `USD`.",
"type": "string"
}
],
"http": "GET /v1/{name=orgs/*/revenue}",
"method": "money.revenue.get",
"permission": "revenue:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "name",
"optional": true,
"pattern": "orgs/{org}",
"suffix": "revenue"
},
"summary": "Gets the org's revenue over a period: totals by day or month, split by source or product, gross or net, in one reporting currency, with the basis of each bucket, the sources that report late, and what has no rate yet. Reads only the daily roll-up, bounded by a 5 second statement timeout. For example `sylphx money revenue summary --period mtd --split source`.",
"verb": "summary"
}
],
"noun": "revenue",
"resource_type": "money.sylphx.com/RevenueSummary"
},
{
"collection": "revenue_facts",
"commands": [
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter, comparisons joined with `AND`: `source = \"…\"` (a source id or name), `basis`, `store_kind`, `product_ref` (each `=`), and `day >= \"YYYY-MM-DD\"`, `day <= \"YYYY-MM-DD\"`. The days default to the 31 days to today (UTC), and span at most 400 days.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*}/revenue_facts",
"method": "money.revenue_facts.list",
"paginates": true,
"permission": "revenue:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}"
},
"summary": "Lists the org's revenue facts, newest day first, for audit and export.",
"verb": "list"
}
],
"noun": "revenue-facts",
"resource_type": "money.sylphx.com/RevenueFact"
},
{
"collection": "exchange_rates",
"commands": [
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter, comparisons joined with `AND`: `currency_code = \"EUR\"`, `day >= \"YYYY-MM-DD\"`, `day <= \"YYYY-MM-DD\"`. The days default to the 31 days to today (UTC), and span at most 400 days.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*}/exchange_rates",
"method": "money.exchange_rates.list",
"paginates": true,
"permission": "revenue:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}"
},
"summary": "Lists the exchange rates Money converts at (units per US dollar by day), for any reader that converts revenue.",
"verb": "list"
}
],
"noun": "exchange-rates",
"resource_type": "money.sylphx.com/ExchangeRate"
}
],
"commands": [],
"display_name": "Sylphx Money",
"noun": "money",
"stage": "preview"
},
{
"collections": [
{
"collection": "domains",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/domains/*}",
"method": "network.domains.get",
"permission": "network:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/domains/{domain}"
},
"summary": "Gets a domain.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*}/domains",
"method": "network.domains.list",
"paginates": true,
"permission": "network:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}"
},
"summary": "Lists domains in a project.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "domain.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "domain.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "domain.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "domain.spec.domain_name",
"flag": "--spec.domain-name",
"required": true,
"summary": "The fully qualified name, for example `example.com`. Wildcards are refused.",
"type": "string"
},
{
"field": "domain.spec.verification_method",
"flag": "--spec.verification-method",
"summary": "How control is proven; default TXT.",
"type": "enum",
"values": [
"txt",
"cname"
]
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*}/domains",
"method": "network.domains.create",
"permission": "network:write",
"positional": {
"arg": "ID",
"field": "domain_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "domain",
"summary": "Creates a domain. The Operation is done when the controller settles it.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "domain.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "domain.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "domain.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "domain.spec.verification_method",
"flag": "--spec.verification-method",
"summary": "How control is proven; default TXT.",
"type": "enum",
"values": [
"txt",
"cname"
]
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the Resource when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{domain.name=orgs/*/projects/*/domains/*}",
"method": "network.domains.update",
"permission": "network:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "domain.name",
"pattern": "orgs/{org}/projects/{project}/domains/{domain}"
},
"resource_field": "domain",
"sends_etag": true,
"summary": "Updates a domain.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/domains/*}",
"method": "network.domains.delete",
"permission": "network:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/domains/{domain}"
},
"summary": "Deletes a domain.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/domains/*}:verify",
"method": "network.domains.verify",
"permission": "network:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/domains/{domain}"
},
"summary": "Checks the verification record now instead of at the next sweep.",
"verb": "verify",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "domains",
"resource_type": "network.sylphx.com/Domain"
},
{
"collection": "certificates",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/certificates/*}",
"method": "network.certificates.get",
"permission": "network:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/certificates/{certificate}"
},
"summary": "Gets a certificate.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*}/certificates",
"method": "network.certificates.list",
"paginates": true,
"permission": "network:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}"
},
"summary": "Lists certificates in a project.",
"verb": "list"
}
],
"noun": "certificates",
"resource_type": "network.sylphx.com/Certificate"
},
{
"collection": "routes",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/routes/*}",
"method": "network.routes.get",
"permission": "network:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/routes/{route}"
},
"summary": "Gets a route.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/routes",
"method": "network.routes.list",
"paginates": true,
"permission": "network:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists routes in a environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "route.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "route.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "route.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "route.spec.host",
"flag": "--spec.host",
"required": true,
"summary": "The exact host: a verified Domain or a subdomain of one.",
"type": "string"
},
{
"field": "route.spec.path_prefix",
"flag": "--spec.path-prefix",
"summary": "The path prefix; default `/`.",
"type": "string"
},
{
"field": "route.spec.service",
"flag": "--spec.service",
"summary": "A Hosting Service.",
"type": "string"
},
{
"field": "route.spec.redirect.target_uri",
"flag": "--spec.redirect.target-uri",
"summary": "The absolute URL to redirect to.",
"type": "string"
},
{
"field": "route.spec.redirect.status_code",
"flag": "--spec.redirect.status-code",
"summary": "301, 302, 307, or 308; default 308.",
"type": "int"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/routes",
"method": "network.routes.create",
"permission": "network:write",
"positional": {
"arg": "ID",
"field": "route_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "route",
"summary": "Creates a route. The Operation is done when the controller settles it.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "route.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "route.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "route.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "route.spec.host",
"flag": "--spec.host",
"required": true,
"summary": "The exact host: a verified Domain or a subdomain of one.",
"type": "string"
},
{
"field": "route.spec.path_prefix",
"flag": "--spec.path-prefix",
"summary": "The path prefix; default `/`.",
"type": "string"
},
{
"field": "route.spec.service",
"flag": "--spec.service",
"summary": "A Hosting Service.",
"type": "string"
},
{
"field": "route.spec.redirect.target_uri",
"flag": "--spec.redirect.target-uri",
"summary": "The absolute URL to redirect to.",
"type": "string"
},
{
"field": "route.spec.redirect.status_code",
"flag": "--spec.redirect.status-code",
"summary": "301, 302, 307, or 308; default 308.",
"type": "int"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the Resource when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{route.name=orgs/*/projects/*/envs/*/routes/*}",
"method": "network.routes.update",
"permission": "network:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "route.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/routes/{route}"
},
"resource_field": "route",
"sends_etag": true,
"summary": "Updates a route.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/routes/*}",
"method": "network.routes.delete",
"permission": "network:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/routes/{route}"
},
"summary": "Deletes a route.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "routes",
"resource_type": "network.sylphx.com/Route"
},
{
"collection": "egress_identities",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/egress_identities/*}",
"method": "network.egress_identities.get",
"permission": "network:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/egress_identities/{egress_identity}"
},
"summary": "Gets an egress identity.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*}/egress_identities",
"method": "network.egress_identities.list",
"paginates": true,
"permission": "network:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}"
},
"summary": "Lists egress identitys in a project.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "egress_identity.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "egress_identity.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "egress_identity.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "egress_identity.spec.region",
"flag": "--spec.region",
"required": true,
"summary": "The region the addresses live in.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*}/egress_identities",
"method": "network.egress_identities.create",
"permission": "network:write",
"positional": {
"arg": "ID",
"field": "egress_identity_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "egress_identity",
"summary": "Creates an egress identity. The Operation is done when the controller settles it.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "egress_identity.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "egress_identity.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "egress_identity.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the Resource when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{egress_identity.name=orgs/*/projects/*/egress_identities/*}",
"method": "network.egress_identities.update",
"permission": "network:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "egress_identity.name",
"pattern": "orgs/{org}/projects/{project}/egress_identities/{egress_identity}"
},
"resource_field": "egress_identity",
"sends_etag": true,
"summary": "Updates an egress identity.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/egress_identities/*}",
"method": "network.egress_identities.delete",
"permission": "network:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/egress_identities/{egress_identity}"
},
"summary": "Deletes an egress identity.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "egress-identities",
"resource_type": "network.sylphx.com/EgressIdentity"
},
{
"collection": "private_links",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/private_links/*}",
"method": "network.private_links.get",
"permission": "network:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/private_links/{private_link}"
},
"summary": "Gets a private link.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/private_links",
"method": "network.private_links.list",
"paginates": true,
"permission": "network:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists private links in a environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "private_link.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "private_link.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "private_link.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "private_link.spec.service",
"flag": "--spec.service",
"required": true,
"summary": "The Hosting Service exposed.",
"type": "string"
},
{
"field": "private_link.spec.region",
"flag": "--spec.region",
"required": true,
"summary": "The region of the link.",
"type": "string"
},
{
"field": "private_link.spec.allowed_consumers",
"flag": "--spec.allowed-consumers",
"repeated": true,
"required": true,
"summary": "The customer network accounts allowed to connect.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/private_links",
"method": "network.private_links.create",
"permission": "network:write",
"positional": {
"arg": "ID",
"field": "private_link_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "private_link",
"summary": "Creates a private link. The Operation is done when the controller settles it.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "private_link.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "private_link.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "private_link.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "private_link.spec.allowed_consumers",
"flag": "--spec.allowed-consumers",
"repeated": true,
"required": true,
"summary": "The customer network accounts allowed to connect.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the Resource when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{private_link.name=orgs/*/projects/*/envs/*/private_links/*}",
"method": "network.private_links.update",
"permission": "network:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "private_link.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/private_links/{private_link}"
},
"resource_field": "private_link",
"sends_etag": true,
"summary": "Updates a private link.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/private_links/*}",
"method": "network.private_links.delete",
"permission": "network:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/private_links/{private_link}"
},
"summary": "Deletes a private link.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "private-links",
"resource_type": "network.sylphx.com/PrivateLink"
}
],
"commands": [],
"display_name": "Sylphx Network",
"noun": "network",
"served": false,
"stage": "preview"
},
{
"collections": [
{
"collection": "mail_domains",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/mail_domains/*}",
"method": "notify.mail_domains.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mail_domains/{mail_domain}"
},
"summary": "Gets an email domain.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/mail_domains",
"method": "notify.mail_domains.list",
"paginates": true,
"permission": "notify:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists email domains.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "email_domain.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "email_domain.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "email_domain.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "email_domain.spec.domain",
"flag": "--spec.domain",
"required": true,
"summary": "The domain, for example `mail.example.com`.",
"type": "string"
},
{
"field": "email_domain.spec.return_path_label",
"flag": "--spec.return-path-label",
"summary": "The return-path (bounce) subdomain label; default `bounces`.",
"type": "string"
},
{
"field": "email_domain.spec.sending.enabled",
"flag": "--spec.sending.enabled",
"summary": "Send from the domain. Default true.",
"type": "bool"
},
{
"field": "email_domain.spec.receiving.enabled",
"flag": "--spec.receiving.enabled",
"summary": "Receive mail for the domain; needs every MX record at the platform.",
"type": "bool"
},
{
"field": "email_domain.spec.receiving.mode",
"flag": "--spec.receiving.mode",
"summary": "How the domain's mail reaches the platform; `ALL` when unset.",
"type": "enum",
"values": [
"all"
]
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/mail_domains",
"method": "notify.mail_domains.create",
"permission": "notify:write",
"positional": {
"arg": "ID",
"field": "email_domain_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "email_domain",
"summary": "Creates an email domain.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "email_domain.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "email_domain.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "email_domain.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "email_domain.spec.return_path_label",
"flag": "--spec.return-path-label",
"summary": "The return-path (bounce) subdomain label; default `bounces`.",
"type": "string"
},
{
"field": "email_domain.spec.sending.enabled",
"flag": "--spec.sending.enabled",
"summary": "Send from the domain. Default true.",
"type": "bool"
},
{
"field": "email_domain.spec.receiving.enabled",
"flag": "--spec.receiving.enabled",
"summary": "Receive mail for the domain; needs every MX record at the platform.",
"type": "bool"
},
{
"field": "email_domain.spec.receiving.mode",
"flag": "--spec.receiving.mode",
"summary": "How the domain's mail reaches the platform; `ALL` when unset.",
"type": "enum",
"values": [
"all"
]
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the email domain when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{email_domain.name=orgs/*/projects/*/envs/*/mail_domains/*}",
"method": "notify.mail_domains.update",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "email_domain.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mail_domains/{mail_domain}"
},
"resource_field": "email_domain",
"sends_etag": true,
"summary": "Updates an email domain.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the email domain does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete the domain's routes.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/mail_domains/*}",
"method": "notify.mail_domains.delete",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mail_domains/{mail_domain}"
},
"summary": "Deletes an email domain.",
"verb": "delete"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/mail_domains/*}:verify",
"method": "notify.mail_domains.verify",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mail_domains/{mail_domain}"
},
"summary": "Checks the domain's DNS records now instead of on the next sweep.",
"verb": "verify"
}
],
"noun": "mail-domains",
"resource_type": "notify.sylphx.com/EmailDomain"
},
{
"collection": "mail_routes",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/mail_domains/*/mail_routes/*}",
"method": "notify.mail_routes.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mail_domains/{mail_domain}/mail_routes/{mail_route}"
},
"summary": "Gets a route.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/mail_domains/*}/mail_routes",
"method": "notify.mail_routes.list",
"paginates": true,
"permission": "notify:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mail_domains/{mail_domain}"
},
"summary": "Lists an email domain's routes.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mail_domains/{mail_domain}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "route.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "route.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "route.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "route.spec.match.address",
"flag": "--spec.match.address",
"summary": "A local part, for example `support`. A local part with a `+tag` also matches its route.",
"type": "string"
},
{
"field": "route.spec.match.pattern",
"flag": "--spec.match.pattern",
"summary": "A glob on the local part, for example `billing-*`.",
"type": "string"
},
{
"field": "route.spec.match.catch_all",
"flag": "--spec.match.catch-all",
"summary": "Every local part no other route matches.",
"type": "bool"
},
{
"field": "route.spec.actions",
"flag": "--spec.actions",
"repeated": true,
"required": true,
"summary": "What happens to the mail: one or more mailbox and forward actions, or one reject.",
"type": "json"
},
{
"field": "route.spec.spam",
"flag": "--spec.spam",
"summary": "What happens to mail the spam filter judges spam; `DELIVER` when unset.",
"type": "enum",
"values": [
"deliver",
"drop",
"reject"
]
},
{
"field": "route.spec.enabled",
"flag": "--spec.enabled",
"summary": "A disabled route matches nothing.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/mail_domains/*}/mail_routes",
"method": "notify.mail_routes.create",
"permission": "notify:write",
"positional": {
"arg": "ID",
"field": "route_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "route",
"summary": "Creates a route.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "route.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "route.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "route.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "route.spec.match.address",
"flag": "--spec.match.address",
"summary": "A local part, for example `support`. A local part with a `+tag` also matches its route.",
"type": "string"
},
{
"field": "route.spec.match.pattern",
"flag": "--spec.match.pattern",
"summary": "A glob on the local part, for example `billing-*`.",
"type": "string"
},
{
"field": "route.spec.match.catch_all",
"flag": "--spec.match.catch-all",
"summary": "Every local part no other route matches.",
"type": "bool"
},
{
"field": "route.spec.actions",
"flag": "--spec.actions",
"repeated": true,
"required": true,
"summary": "What happens to the mail: one or more mailbox and forward actions, or one reject.",
"type": "json"
},
{
"field": "route.spec.spam",
"flag": "--spec.spam",
"summary": "What happens to mail the spam filter judges spam; `DELIVER` when unset.",
"type": "enum",
"values": [
"deliver",
"drop",
"reject"
]
},
{
"field": "route.spec.enabled",
"flag": "--spec.enabled",
"summary": "A disabled route matches nothing.",
"type": "bool"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the route when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{route.name=orgs/*/projects/*/envs/*/mail_domains/*/mail_routes/*}",
"method": "notify.mail_routes.update",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "route.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mail_domains/{mail_domain}/mail_routes/{mail_route}"
},
"resource_field": "route",
"sends_etag": true,
"summary": "Updates a route.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the route does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/mail_domains/*/mail_routes/*}",
"method": "notify.mail_routes.delete",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mail_domains/{mail_domain}/mail_routes/{mail_route}"
},
"summary": "Deletes a route.",
"verb": "delete"
}
],
"noun": "mail-routes",
"resource_type": "notify.sylphx.com/Route"
},
{
"collection": "senders",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/senders/*}",
"method": "notify.senders.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/senders/{sender}"
},
"summary": "Gets a sender.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/senders",
"method": "notify.senders.list",
"paginates": true,
"permission": "notify:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists senders.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "sender.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "sender.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "sender.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "sender.spec.sms.phone_number",
"flag": "--spec.sms.phone-number",
"summary": "An E.164 number.",
"type": "string"
},
{
"field": "sender.spec.sms.sender_key",
"flag": "--spec.sms.sender-key",
"summary": "An alphanumeric sender id, where the region allows one.",
"type": "string"
},
{
"field": "sender.spec.sms.region_codes",
"flag": "--spec.sms.region-codes",
"repeated": true,
"summary": "CLDR region codes the origin is registered for.",
"type": "string"
},
{
"field": "sender.spec.push.platform",
"flag": "--spec.push.platform",
"summary": "The push platform.",
"type": "enum",
"values": [
"apns",
"fcm",
"web_push"
]
},
{
"field": "sender.spec.push.connection",
"flag": "--spec.push.connection",
"summary": "The Connection holding the APNs, FCM, or VAPID credentials.",
"type": "string"
},
{
"field": "sender.spec.push.app_key",
"flag": "--spec.push.app-key",
"summary": "The bundle id, package name, or web origin.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/senders",
"method": "notify.senders.create",
"permission": "notify:write",
"positional": {
"arg": "ID",
"field": "sender_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "sender",
"summary": "Creates a sender.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "sender.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "sender.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "sender.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "sender.spec.sms.phone_number",
"flag": "--spec.sms.phone-number",
"summary": "An E.164 number.",
"type": "string"
},
{
"field": "sender.spec.sms.sender_key",
"flag": "--spec.sms.sender-key",
"summary": "An alphanumeric sender id, where the region allows one.",
"type": "string"
},
{
"field": "sender.spec.sms.region_codes",
"flag": "--spec.sms.region-codes",
"repeated": true,
"summary": "CLDR region codes the origin is registered for.",
"type": "string"
},
{
"field": "sender.spec.push.platform",
"flag": "--spec.push.platform",
"summary": "The push platform.",
"type": "enum",
"values": [
"apns",
"fcm",
"web_push"
]
},
{
"field": "sender.spec.push.connection",
"flag": "--spec.push.connection",
"summary": "The Connection holding the APNs, FCM, or VAPID credentials.",
"type": "string"
},
{
"field": "sender.spec.push.app_key",
"flag": "--spec.push.app-key",
"summary": "The bundle id, package name, or web origin.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the sender when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{sender.name=orgs/*/projects/*/envs/*/senders/*}",
"method": "notify.senders.update",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "sender.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/senders/{sender}"
},
"resource_field": "sender",
"sends_etag": true,
"summary": "Updates a sender.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the sender does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/senders/*}",
"method": "notify.senders.delete",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/senders/{sender}"
},
"summary": "Deletes a sender.",
"verb": "delete"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/senders/*}:verify",
"method": "notify.senders.verify",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/senders/{sender}"
},
"summary": "Re-checks the sender's registration or credentials now.",
"verb": "verify"
}
],
"noun": "senders",
"resource_type": "notify.sylphx.com/Sender"
},
{
"collection": "recipients",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/recipients/*}",
"method": "notify.recipients.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/recipients/{recipient}"
},
"summary": "Gets a recipient.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/recipients",
"method": "notify.recipients.list",
"paginates": true,
"permission": "notify:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists recipients.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "recipient.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "recipient.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "recipient.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "recipient.external_key",
"flag": "--external-key",
"summary": "The customer's own id for this user, for example an Auth end user name.",
"type": "string"
},
{
"field": "recipient.email_addresses",
"flag": "--email-addresses",
"repeated": true,
"summary": "Email addresses, first is preferred.",
"type": "string"
},
{
"field": "recipient.phone_numbers",
"flag": "--phone-numbers",
"repeated": true,
"summary": "E.164 phone numbers, first is preferred.",
"type": "string"
},
{
"field": "recipient.devices",
"flag": "--devices",
"repeated": true,
"summary": "Push devices.",
"type": "json"
},
{
"field": "recipient.language_code",
"flag": "--language-code",
"summary": "BCP 47 language for templates; default the environment's.",
"type": "string"
},
{
"field": "recipient.time_zone",
"flag": "--time-zone",
"summary": "IANA time zone for quiet hours and digests.",
"type": "string"
},
{
"field": "recipient.test",
"flag": "--test",
"summary": "A test recipient: its messages are rendered and captured on the Message, never delivered. An email address whose local part carries `+sylphx_test` is a test address whatever this says.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/recipients",
"method": "notify.recipients.create",
"permission": "notify:write",
"positional": {
"arg": "ID",
"field": "recipient_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "recipient",
"summary": "Creates a recipient.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "recipient.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "recipient.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "recipient.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "recipient.external_key",
"flag": "--external-key",
"summary": "The customer's own id for this user, for example an Auth end user name.",
"type": "string"
},
{
"field": "recipient.email_addresses",
"flag": "--email-addresses",
"repeated": true,
"summary": "Email addresses, first is preferred.",
"type": "string"
},
{
"field": "recipient.phone_numbers",
"flag": "--phone-numbers",
"repeated": true,
"summary": "E.164 phone numbers, first is preferred.",
"type": "string"
},
{
"field": "recipient.devices",
"flag": "--devices",
"repeated": true,
"summary": "Push devices.",
"type": "json"
},
{
"field": "recipient.language_code",
"flag": "--language-code",
"summary": "BCP 47 language for templates; default the environment's.",
"type": "string"
},
{
"field": "recipient.time_zone",
"flag": "--time-zone",
"summary": "IANA time zone for quiet hours and digests.",
"type": "string"
},
{
"field": "recipient.test",
"flag": "--test",
"summary": "A test recipient: its messages are rendered and captured on the Message, never delivered. An email address whose local part carries `+sylphx_test` is a test address whatever this says.",
"type": "bool"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the recipient when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{recipient.name=orgs/*/projects/*/envs/*/recipients/*}",
"method": "notify.recipients.update",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "recipient.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/recipients/{recipient}"
},
"resource_field": "recipient",
"sends_etag": true,
"summary": "Updates a recipient.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the recipient does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete the recipient's preferences and inbox items.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/recipients/*}",
"method": "notify.recipients.delete",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/recipients/{recipient}"
},
"summary": "Deletes a recipient.",
"verb": "delete"
}
],
"noun": "recipients",
"resource_type": "notify.sylphx.com/Recipient"
},
{
"collection": "preferences",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/recipients/*/preferences/*}",
"method": "notify.preferences.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/recipients/{recipient}/preferences/{preference}"
},
"summary": "Gets a preference.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/recipients/*}/preferences",
"method": "notify.preferences.list",
"paginates": true,
"permission": "notify:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/recipients/{recipient}"
},
"summary": "Lists preferences.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"field": "preference.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "preference.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "preference.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "preference.channels",
"flag": "--channels",
"repeated": true,
"summary": "Channels the topic may use; empty mutes the topic.",
"type": "enum",
"values": [
"email",
"sms",
"push",
"inbox"
]
},
{
"field": "preference.digest_interval",
"flag": "--digest-interval",
"summary": "Batch this topic into a digest at most this often; unset sends each message.",
"type": "duration"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the preference when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{preference.name=orgs/*/projects/*/envs/*/recipients/*/preferences/*}",
"method": "notify.preferences.update",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "preference.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/recipients/{recipient}/preferences/{preference}"
},
"resource_field": "preference",
"sends_etag": true,
"summary": "Updates a preference.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the preference does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/recipients/*/preferences/*}",
"method": "notify.preferences.delete",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/recipients/{recipient}/preferences/{preference}"
},
"summary": "Deletes a preference.",
"verb": "delete"
}
],
"noun": "preferences",
"resource_type": "notify.sylphx.com/Preference"
},
{
"collection": "suppressions",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/suppressions/*}",
"method": "notify.suppressions.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/suppressions/{suppression}"
},
"summary": "Gets a suppression.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/suppressions",
"method": "notify.suppressions.list",
"paginates": true,
"permission": "notify:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists suppressions.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "suppression.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "suppression.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "suppression.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "suppression.channel",
"flag": "--channel",
"required": true,
"summary": "The channel.",
"type": "enum",
"values": [
"email",
"sms",
"push",
"inbox"
]
},
{
"field": "suppression.address",
"flag": "--address",
"required": true,
"summary": "The suppressed address, number, or device token.",
"type": "string"
},
{
"field": "suppression.reason",
"flag": "--reason",
"required": true,
"summary": "Why.",
"type": "enum",
"values": [
"bounce",
"complaint",
"carrier_opt_out",
"unsubscribe",
"uninstalled",
"manual"
]
},
{
"field": "suppression.topic",
"flag": "--topic",
"summary": "Limit the suppression to one topic; unset suppresses every topic.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/suppressions",
"method": "notify.suppressions.create",
"permission": "notify:write",
"positional": {
"arg": "ID",
"field": "suppression_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "suppression",
"summary": "Creates a suppression.",
"verb": "create"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the suppression does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/suppressions/*}",
"method": "notify.suppressions.delete",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/suppressions/{suppression}"
},
"summary": "Deletes a suppression.",
"verb": "delete"
}
],
"noun": "suppressions",
"resource_type": "notify.sylphx.com/Suppression"
},
{
"collection": "templates",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/templates/*}",
"method": "notify.templates.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/templates/{template}"
},
"summary": "Gets a template.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/templates",
"method": "notify.templates.list",
"paginates": true,
"permission": "notify:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists templates.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "template.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "template.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "template.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "template.spec.email.sender_address",
"flag": "--spec.email.sender-address",
"summary": "The From address; its domain is a verified Email Domain.",
"type": "string"
},
{
"field": "template.spec.email.subject",
"flag": "--spec.email.subject",
"summary": "The subject.",
"type": "string"
},
{
"field": "template.spec.email.html_body",
"flag": "--spec.email.html-body",
"summary": "The HTML body.",
"type": "string"
},
{
"field": "template.spec.email.text_body",
"flag": "--spec.email.text-body",
"summary": "The plain-text body.",
"type": "string"
},
{
"field": "template.spec.email.sender_name",
"flag": "--spec.email.sender-name",
"summary": "The From display name, for example the app's name.",
"type": "string"
},
{
"field": "template.spec.sms.sender",
"flag": "--spec.sms.sender",
"summary": "The SMS Sender.",
"type": "string"
},
{
"field": "template.spec.sms.body",
"flag": "--spec.sms.body",
"summary": "The body.",
"type": "string"
},
{
"field": "template.spec.push.title",
"flag": "--spec.push.title",
"summary": "The title.",
"type": "string"
},
{
"field": "template.spec.push.body",
"flag": "--spec.push.body",
"summary": "The body.",
"type": "string"
},
{
"field": "template.spec.push.data",
"flag": "--spec.push.data",
"summary": "Data delivered with the notification.",
"type": "json"
},
{
"field": "template.spec.inbox.title",
"flag": "--spec.inbox.title",
"summary": "The title.",
"type": "string"
},
{
"field": "template.spec.inbox.body",
"flag": "--spec.inbox.body",
"summary": "The body.",
"type": "string"
},
{
"field": "template.spec.inbox.action_uri",
"flag": "--spec.inbox.action-uri",
"summary": "Where the item links.",
"type": "string"
},
{
"field": "template.spec.send_limit.min_interval",
"flag": "--spec.send-limit.min-interval",
"summary": "At least this long between two messages to one recipient.",
"type": "duration"
},
{
"field": "template.spec.send_limit.max_per_hour",
"flag": "--spec.send-limit.max-per-hour",
"summary": "At most this many messages to one recipient in any hour; 0 is no limit.",
"type": "int"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/templates",
"method": "notify.templates.create",
"permission": "notify:write",
"positional": {
"arg": "ID",
"field": "template_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "template",
"summary": "Creates a template.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "template.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "template.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "template.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "template.spec.email.sender_address",
"flag": "--spec.email.sender-address",
"summary": "The From address; its domain is a verified Email Domain.",
"type": "string"
},
{
"field": "template.spec.email.subject",
"flag": "--spec.email.subject",
"summary": "The subject.",
"type": "string"
},
{
"field": "template.spec.email.html_body",
"flag": "--spec.email.html-body",
"summary": "The HTML body.",
"type": "string"
},
{
"field": "template.spec.email.text_body",
"flag": "--spec.email.text-body",
"summary": "The plain-text body.",
"type": "string"
},
{
"field": "template.spec.email.sender_name",
"flag": "--spec.email.sender-name",
"summary": "The From display name, for example the app's name.",
"type": "string"
},
{
"field": "template.spec.sms.sender",
"flag": "--spec.sms.sender",
"summary": "The SMS Sender.",
"type": "string"
},
{
"field": "template.spec.sms.body",
"flag": "--spec.sms.body",
"summary": "The body.",
"type": "string"
},
{
"field": "template.spec.push.title",
"flag": "--spec.push.title",
"summary": "The title.",
"type": "string"
},
{
"field": "template.spec.push.body",
"flag": "--spec.push.body",
"summary": "The body.",
"type": "string"
},
{
"field": "template.spec.push.data",
"flag": "--spec.push.data",
"summary": "Data delivered with the notification.",
"type": "json"
},
{
"field": "template.spec.inbox.title",
"flag": "--spec.inbox.title",
"summary": "The title.",
"type": "string"
},
{
"field": "template.spec.inbox.body",
"flag": "--spec.inbox.body",
"summary": "The body.",
"type": "string"
},
{
"field": "template.spec.inbox.action_uri",
"flag": "--spec.inbox.action-uri",
"summary": "Where the item links.",
"type": "string"
},
{
"field": "template.spec.send_limit.min_interval",
"flag": "--spec.send-limit.min-interval",
"summary": "At least this long between two messages to one recipient.",
"type": "duration"
},
{
"field": "template.spec.send_limit.max_per_hour",
"flag": "--spec.send-limit.max-per-hour",
"summary": "At most this many messages to one recipient in any hour; 0 is no limit.",
"type": "int"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the template when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{template.name=orgs/*/projects/*/envs/*/templates/*}",
"method": "notify.templates.update",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "template.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/templates/{template}"
},
"resource_field": "template",
"sends_etag": true,
"summary": "Updates a template.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the template does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/templates/*}",
"method": "notify.templates.delete",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/templates/{template}"
},
"summary": "Deletes a template.",
"verb": "delete"
}
],
"noun": "templates",
"resource_type": "notify.sylphx.com/Template"
},
{
"collection": "messages",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/messages/*}",
"method": "notify.messages.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/messages/{message}"
},
"summary": "Gets a message.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/messages",
"method": "notify.messages.list",
"paginates": true,
"permission": "notify:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists messages.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "message.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "message.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "message.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "message.recipient",
"flag": "--recipient",
"required": true,
"summary": "The recipient.",
"type": "string"
},
{
"field": "message.topic",
"flag": "--topic",
"required": true,
"summary": "The topic preferences are checked against, for example `billing`.",
"type": "string"
},
{
"field": "message.template",
"flag": "--template",
"summary": "The template to render; required unless `mailbox` and `content` are set.",
"type": "string"
},
{
"field": "message.data",
"flag": "--data",
"summary": "Template variables.",
"type": "json"
},
{
"field": "message.channels",
"flag": "--channels",
"repeated": true,
"summary": "Restrict to these channels, in fallback order; empty uses the recipient's preferences.",
"type": "enum",
"values": [
"email",
"sms",
"push",
"inbox"
]
},
{
"field": "message.send_time",
"flag": "--send-time",
"summary": "Send no earlier than this.",
"type": "timestamp"
},
{
"field": "message.delivery_deadline_time",
"flag": "--delivery-deadline-time",
"summary": "Deliver no later than this; a delivery still open then fails with `expired`. Unset retries for up to a day. The message record is kept.",
"type": "timestamp"
},
{
"field": "message.mailbox",
"flag": "--mailbox",
"summary": "Send as this mailbox (its address, display name and, for a connected mailbox, its own SMTP) instead of a verified Email Domain.",
"type": "string"
},
{
"field": "message.content.subject",
"flag": "--content.subject",
"summary": "The subject.",
"type": "string"
},
{
"field": "message.content.text_body",
"flag": "--content.text-body",
"summary": "The plain-text body.",
"type": "string"
},
{
"field": "message.content.html_body",
"flag": "--content.html-body",
"summary": "The HTML body.",
"type": "string"
},
{
"field": "message.parent_message_id",
"flag": "--parent-message-id",
"summary": "In-Reply-To: the Message-ID this answers, without angle brackets.",
"type": "string"
},
{
"field": "message.references",
"flag": "--references",
"repeated": true,
"summary": "The thread's Message-IDs, oldest first, without angle brackets.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/messages",
"method": "notify.messages.create",
"permission": "notify:send",
"positional": {
"arg": "ID",
"field": "message_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "message",
"summary": "Sends a Message.",
"verb": "send"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/messages/*}:cancel",
"method": "notify.messages.cancel",
"permission": "notify:send",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/messages/{message}"
},
"summary": "Cancels a Message whose deliveries have not been handed off.",
"verb": "cancel"
}
],
"noun": "messages",
"resource_type": "notify.sylphx.com/Message"
},
{
"collection": "mailboxes",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/mailboxes/*}",
"method": "notify.mailboxes.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mailboxes/{mailbox}"
},
"summary": "Gets a mailbox.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/mailboxes",
"method": "notify.mailboxes.list",
"paginates": true,
"permission": "notify:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists mailboxes.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "mailbox.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "mailbox.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "mailbox.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "mailbox.spec.kind",
"flag": "--spec.kind",
"required": true,
"summary": "Connected or hosted.",
"type": "enum",
"values": [
"connected",
"hosted"
]
},
{
"field": "mailbox.spec.address",
"flag": "--spec.address",
"required": true,
"summary": "The address, for example `support@example.com`.",
"type": "string"
},
{
"field": "mailbox.spec.display_name",
"flag": "--spec.display-name",
"summary": "The From display name of mail sent as this mailbox.",
"type": "string"
},
{
"field": "mailbox.spec.imap.host",
"flag": "--spec.imap.host",
"summary": "The host name.",
"type": "string"
},
{
"field": "mailbox.spec.imap.port",
"flag": "--spec.imap.port",
"summary": "The port; IMAP 993 and SMTP 465 when unset.",
"type": "int"
},
{
"field": "mailbox.spec.imap.username",
"flag": "--spec.imap.username",
"summary": "The login user; the mailbox address when unset.",
"type": "string"
},
{
"field": "mailbox.spec.imap.security",
"flag": "--spec.imap.security",
"summary": "How the connection is secured.",
"type": "enum",
"values": [
"tls",
"starttls"
]
},
{
"field": "mailbox.spec.smtp.host",
"flag": "--spec.smtp.host",
"summary": "The host name.",
"type": "string"
},
{
"field": "mailbox.spec.smtp.port",
"flag": "--spec.smtp.port",
"summary": "The port; IMAP 993 and SMTP 465 when unset.",
"type": "int"
},
{
"field": "mailbox.spec.smtp.username",
"flag": "--spec.smtp.username",
"summary": "The login user; the mailbox address when unset.",
"type": "string"
},
{
"field": "mailbox.spec.smtp.security",
"flag": "--spec.smtp.security",
"summary": "How the connection is secured.",
"type": "enum",
"values": [
"tls",
"starttls"
]
},
{
"field": "mailbox.spec.password",
"flag": "--spec.password",
"sensitive": true,
"summary": "The login password of both servers; write-only, sealed at rest.",
"type": "string"
},
{
"field": "mailbox.spec.append_sent",
"flag": "--spec.append-sent",
"summary": "Save a copy of mail sent as this mailbox to its Sent folder (IMAP APPEND); off when the provider saves one itself.",
"type": "bool"
},
{
"field": "mailbox.spec.backfill_start_time",
"flag": "--spec.backfill-start-time",
"summary": "Read mail received on or after this day on the first poll.",
"type": "timestamp"
},
{
"field": "mailbox.spec.enabled",
"flag": "--spec.enabled",
"summary": "Poll and send; a disabled mailbox keeps its records.",
"type": "bool"
},
{
"field": "mailbox.spec.auth_kind",
"flag": "--spec.auth-kind",
"summary": "How a connected mailbox logs in to both servers; unset means `PASSWORD`.",
"type": "enum",
"values": [
"password",
"oauth"
]
},
{
"field": "mailbox.spec.oauth_provider",
"flag": "--spec.oauth-provider",
"summary": "The OAuth provider, for `OAUTH`; the environment's Mailbox OAuth App of this provider is the client the grant belongs to. With `imap` or `smtp` unset the provider's own servers are used: Google `imap.gmail.com:993` and `smtp.gmail.com:465`, Microsoft `outlook.office365.com:993` and `smtp.office365.com:587` (STARTTLS).",
"type": "enum",
"values": [
"google",
"microsoft"
]
},
{
"field": "mailbox.spec.oauth_refresh_token",
"flag": "--spec.oauth-refresh-token",
"sensitive": true,
"summary": "The OAuth refresh token, for `OAUTH`; write-only, sealed at rest like the password, never returned. A connect link sets it without the caller ever holding it; a caller that ran its own consent may set it directly, when the token was issued to the environment's Mailbox OAuth App.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/mailboxes",
"method": "notify.mailboxes.create",
"permission": "notify:write",
"positional": {
"arg": "ID",
"field": "mailbox_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "mailbox",
"summary": "Creates a mailbox.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "mailbox.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "mailbox.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "mailbox.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "mailbox.spec.display_name",
"flag": "--spec.display-name",
"summary": "The From display name of mail sent as this mailbox.",
"type": "string"
},
{
"field": "mailbox.spec.imap.host",
"flag": "--spec.imap.host",
"summary": "The host name.",
"type": "string"
},
{
"field": "mailbox.spec.imap.port",
"flag": "--spec.imap.port",
"summary": "The port; IMAP 993 and SMTP 465 when unset.",
"type": "int"
},
{
"field": "mailbox.spec.imap.username",
"flag": "--spec.imap.username",
"summary": "The login user; the mailbox address when unset.",
"type": "string"
},
{
"field": "mailbox.spec.imap.security",
"flag": "--spec.imap.security",
"summary": "How the connection is secured.",
"type": "enum",
"values": [
"tls",
"starttls"
]
},
{
"field": "mailbox.spec.smtp.host",
"flag": "--spec.smtp.host",
"summary": "The host name.",
"type": "string"
},
{
"field": "mailbox.spec.smtp.port",
"flag": "--spec.smtp.port",
"summary": "The port; IMAP 993 and SMTP 465 when unset.",
"type": "int"
},
{
"field": "mailbox.spec.smtp.username",
"flag": "--spec.smtp.username",
"summary": "The login user; the mailbox address when unset.",
"type": "string"
},
{
"field": "mailbox.spec.smtp.security",
"flag": "--spec.smtp.security",
"summary": "How the connection is secured.",
"type": "enum",
"values": [
"tls",
"starttls"
]
},
{
"field": "mailbox.spec.password",
"flag": "--spec.password",
"sensitive": true,
"summary": "The login password of both servers; write-only, sealed at rest.",
"type": "string"
},
{
"field": "mailbox.spec.append_sent",
"flag": "--spec.append-sent",
"summary": "Save a copy of mail sent as this mailbox to its Sent folder (IMAP APPEND); off when the provider saves one itself.",
"type": "bool"
},
{
"field": "mailbox.spec.backfill_start_time",
"flag": "--spec.backfill-start-time",
"summary": "Read mail received on or after this day on the first poll.",
"type": "timestamp"
},
{
"field": "mailbox.spec.enabled",
"flag": "--spec.enabled",
"summary": "Poll and send; a disabled mailbox keeps its records.",
"type": "bool"
},
{
"field": "mailbox.spec.auth_kind",
"flag": "--spec.auth-kind",
"summary": "How a connected mailbox logs in to both servers; unset means `PASSWORD`.",
"type": "enum",
"values": [
"password",
"oauth"
]
},
{
"field": "mailbox.spec.oauth_provider",
"flag": "--spec.oauth-provider",
"summary": "The OAuth provider, for `OAUTH`; the environment's Mailbox OAuth App of this provider is the client the grant belongs to. With `imap` or `smtp` unset the provider's own servers are used: Google `imap.gmail.com:993` and `smtp.gmail.com:465`, Microsoft `outlook.office365.com:993` and `smtp.office365.com:587` (STARTTLS).",
"type": "enum",
"values": [
"google",
"microsoft"
]
},
{
"field": "mailbox.spec.oauth_refresh_token",
"flag": "--spec.oauth-refresh-token",
"sensitive": true,
"summary": "The OAuth refresh token, for `OAUTH`; write-only, sealed at rest like the password, never returned. A connect link sets it without the caller ever holding it; a caller that ran its own consent may set it directly, when the token was issued to the environment's Mailbox OAuth App.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the mailbox when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{mailbox.name=orgs/*/projects/*/envs/*/mailboxes/*}",
"method": "notify.mailboxes.update",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "mailbox.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mailboxes/{mailbox}"
},
"resource_field": "mailbox",
"sends_etag": true,
"summary": "Updates a mailbox.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the mailbox does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Delete its inbound email with it; a mailbox holding inbound email is not deleted without it.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/mailboxes/*}",
"method": "notify.mailboxes.delete",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mailboxes/{mailbox}"
},
"summary": "Deletes a mailbox and its inbound email.",
"verb": "delete"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "address",
"flag": "--address",
"required": true,
"summary": "The email address whose data is removed.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/mailboxes/*}:eraseAddress",
"method": "notify.mailboxes.erase_address",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mailboxes/{mailbox}"
},
"summary": "Removes an address's personal data from every inbound email of the mailbox that it sent or that names it, keeping the dedupe keys so a poll never brings the mail back.",
"verb": "erase-address"
}
],
"noun": "mailboxes",
"resource_type": "notify.sylphx.com/Mailbox"
},
{
"collection": "mailbox_oauth_apps",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/mailbox_oauth_apps/*}",
"method": "notify.mailbox_oauth_apps.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mailbox_oauth_apps/{mailbox_oauth_app}"
},
"summary": "Gets a mailbox OAuth app.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/mailbox_oauth_apps",
"method": "notify.mailbox_oauth_apps.list",
"paginates": true,
"permission": "notify:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists mailbox OAuth apps.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "mailbox_oauth_app.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "mailbox_oauth_app.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "mailbox_oauth_app.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "mailbox_oauth_app.spec.provider",
"flag": "--spec.provider",
"required": true,
"summary": "The provider.",
"type": "enum",
"values": [
"google",
"microsoft"
]
},
{
"field": "mailbox_oauth_app.spec.client_id",
"flag": "--spec.client-id",
"required": true,
"summary": "The client id the provider issued.",
"type": "string"
},
{
"field": "mailbox_oauth_app.spec.client_secret",
"flag": "--spec.client-secret",
"sensitive": true,
"summary": "The client secret; write-only, sealed at rest, never returned.",
"type": "string"
},
{
"field": "mailbox_oauth_app.spec.tenant",
"flag": "--spec.tenant",
"summary": "Microsoft only: who may consent, `common` (the default: any work, school or personal account), `organizations`, `consumers`, or one tenant id.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/mailbox_oauth_apps",
"method": "notify.mailbox_oauth_apps.create",
"permission": "notify:write",
"positional": {
"arg": "ID",
"field": "mailbox_oauth_app_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "mailbox_oauth_app",
"summary": "Creates a mailbox OAuth app.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "mailbox_oauth_app.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "mailbox_oauth_app.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "mailbox_oauth_app.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "mailbox_oauth_app.spec.client_id",
"flag": "--spec.client-id",
"required": true,
"summary": "The client id the provider issued.",
"type": "string"
},
{
"field": "mailbox_oauth_app.spec.client_secret",
"flag": "--spec.client-secret",
"sensitive": true,
"summary": "The client secret; write-only, sealed at rest, never returned.",
"type": "string"
},
{
"field": "mailbox_oauth_app.spec.tenant",
"flag": "--spec.tenant",
"summary": "Microsoft only: who may consent, `common` (the default: any work, school or personal account), `organizations`, `consumers`, or one tenant id.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the mailbox OAuth app when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{mailbox_oauth_app.name=orgs/*/projects/*/envs/*/mailbox_oauth_apps/*}",
"method": "notify.mailbox_oauth_apps.update",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "mailbox_oauth_app.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mailbox_oauth_apps/{mailbox_oauth_app}"
},
"resource_field": "mailbox_oauth_app",
"sends_etag": true,
"summary": "Updates a mailbox OAuth app.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the mailbox OAuth app does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/mailbox_oauth_apps/*}",
"method": "notify.mailbox_oauth_apps.delete",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mailbox_oauth_apps/{mailbox_oauth_app}"
},
"summary": "Deletes a mailbox OAuth app; refused while a mailbox uses it.",
"verb": "delete"
}
],
"noun": "mailbox-oauth-apps",
"resource_type": "notify.sylphx.com/MailboxOauthApp"
},
{
"collection": "mailbox_connect_links",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/mailbox_connect_links/*}",
"method": "notify.mailbox_connect_links.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mailbox_connect_links/{mailbox_connect_link}"
},
"summary": "Gets a mailbox connect link.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/mailbox_connect_links",
"method": "notify.mailbox_connect_links.list",
"paginates": true,
"permission": "notify:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists mailbox connect links.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "mailbox_connect_link.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "mailbox_connect_link.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "mailbox_connect_link.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "mailbox_connect_link.provider",
"flag": "--provider",
"required": true,
"summary": "The provider whose consent the page opens; the environment needs that provider's Mailbox OAuth App.",
"type": "enum",
"values": [
"google",
"microsoft"
]
},
{
"field": "mailbox_connect_link.mailbox",
"flag": "--mailbox",
"summary": "The mailbox to reconnect, keeping its id and feed; it must be signed in as the same address. Empty creates a new connected mailbox.",
"type": "string"
},
{
"field": "mailbox_connect_link.mailbox_id",
"flag": "--mailbox-id",
"summary": "The id of the new mailbox; the server assigns one when empty.",
"type": "string"
},
{
"field": "mailbox_connect_link.display_name",
"flag": "--display-name",
"summary": "The From display name of the new mailbox.",
"type": "string"
},
{
"field": "mailbox_connect_link.backfill_start_time",
"flag": "--backfill-start-time",
"summary": "The new mailbox reads mail received on or after this day on its first poll.",
"type": "timestamp"
},
{
"field": "mailbox_connect_link.login_hint",
"flag": "--login-hint",
"summary": "The address to suggest on the consent screen (`login_hint`); the mailbox takes the address the provider confirms, whatever this says.",
"type": "string"
},
{
"field": "mailbox_connect_link.return_url",
"flag": "--return-url",
"required": true,
"summary": "Where the end user lands when done, HTTPS, with `connect_link={id}` and `result=connected` or `result=failed` added to the query. The query proves nothing: read the link back with your key for the outcome.",
"type": "string"
},
{
"field": "mailbox_connect_link.refresh_url",
"flag": "--refresh-url",
"summary": "Where a claimed or expired link sends the end user, HTTPS; your server mints a new link there. Empty shows a page saying the link has expired.",
"type": "string"
},
{
"field": "mailbox_connect_link.ttl",
"flag": "--ttl",
"summary": "How long the link stays open; default 1 hour, at most 7 days.",
"type": "duration"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/mailbox_connect_links",
"method": "notify.mailbox_connect_links.create",
"permission": "notify:write",
"positional": {
"arg": "ID",
"field": "mailbox_connect_link_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "mailbox_connect_link",
"summary": "Mints a mailbox connect link for one end user; the response carries its `url`, which no later call returns.",
"verb": "create"
}
],
"noun": "mailbox-connect-links",
"resource_type": "notify.sylphx.com/MailboxConnectLink"
},
{
"collection": "inbound_emails",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/mailboxes/*/inbound_emails/*}",
"method": "notify.inbound_emails.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mailboxes/{mailbox}/inbound_emails/{inbound_email}"
},
"summary": "Gets an inbound email.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/mailboxes/*}/inbound_emails",
"method": "notify.inbound_emails.list",
"paginates": true,
"permission": "notify:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/mailboxes/{mailbox}"
},
"summary": "Lists a mailbox's inbound email in feed order, oldest first.",
"verb": "list"
}
],
"noun": "inbound-emails",
"resource_type": "notify.sylphx.com/InboundEmail"
},
{
"collection": "inbox_items",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/recipients/*/inbox_items/*}",
"method": "notify.inbox_items.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/recipients/{recipient}/inbox_items/{inbox_item}"
},
"summary": "Gets an inbox item.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/recipients/*}/inbox_items",
"method": "notify.inbox_items.list",
"paginates": true,
"permission": "notify:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/recipients/{recipient}"
},
"summary": "Lists inbox items.",
"verb": "list"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/recipients/*/inbox_items/*}:markRead",
"method": "notify.inbox_items.mark_read",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/recipients/{recipient}/inbox_items/{inbox_item}"
},
"summary": "Marks an inbox item read.",
"verb": "mark-read"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/recipients/*/inbox_items/*}:markUnread",
"method": "notify.inbox_items.mark_unread",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/recipients/{recipient}/inbox_items/{inbox_item}"
},
"summary": "Marks an inbox item unread.",
"verb": "mark-unread"
},
{
"effect": "write",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/recipients/*/inbox_items/*}:archive",
"method": "notify.inbox_items.archive",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/recipients/{recipient}/inbox_items/{inbox_item}"
},
"summary": "Archives an inbox item.",
"verb": "archive"
}
],
"noun": "inbox-items",
"resource_type": "notify.sylphx.com/InboxItem"
},
{
"collection": "broadcasts",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/broadcasts/*}",
"method": "notify.broadcasts.get",
"permission": "notify:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/broadcasts/{broadcast}"
},
"summary": "Gets a broadcast.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/broadcasts",
"method": "notify.broadcasts.list",
"paginates": true,
"permission": "notify:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists broadcasts.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "broadcast.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "broadcast.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "broadcast.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "broadcast.spec.topic",
"flag": "--spec.topic",
"required": true,
"summary": "The topic every message carries.",
"type": "string"
},
{
"field": "broadcast.spec.template",
"flag": "--spec.template",
"required": true,
"summary": "The template to render.",
"type": "string"
},
{
"field": "broadcast.spec.segment_filter",
"flag": "--spec.segment-filter",
"required": true,
"summary": "AIP-160 filter over recipient labels and fields selecting the segment.",
"type": "string"
},
{
"field": "broadcast.spec.data",
"flag": "--spec.data",
"summary": "Template variables shared by every message.",
"type": "json"
},
{
"field": "broadcast.spec.send_time",
"flag": "--spec.send-time",
"summary": "When to send; unset sends only on `:send`.",
"type": "timestamp"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/broadcasts",
"method": "notify.broadcasts.create",
"permission": "notify:write",
"positional": {
"arg": "ID",
"field": "broadcast_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "broadcast",
"summary": "Creates a broadcast.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "broadcast.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "broadcast.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "broadcast.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "broadcast.spec.topic",
"flag": "--spec.topic",
"required": true,
"summary": "The topic every message carries.",
"type": "string"
},
{
"field": "broadcast.spec.template",
"flag": "--spec.template",
"required": true,
"summary": "The template to render.",
"type": "string"
},
{
"field": "broadcast.spec.segment_filter",
"flag": "--spec.segment-filter",
"required": true,
"summary": "AIP-160 filter over recipient labels and fields selecting the segment.",
"type": "string"
},
{
"field": "broadcast.spec.data",
"flag": "--spec.data",
"summary": "Template variables shared by every message.",
"type": "json"
},
{
"field": "broadcast.spec.send_time",
"flag": "--spec.send-time",
"summary": "When to send; unset sends only on `:send`.",
"type": "timestamp"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the broadcast when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{broadcast.name=orgs/*/projects/*/envs/*/broadcasts/*}",
"method": "notify.broadcasts.update",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "broadcast.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/broadcasts/{broadcast}"
},
"resource_field": "broadcast",
"sends_etag": true,
"summary": "Updates a broadcast.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the broadcast does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/broadcasts/*}",
"method": "notify.broadcasts.delete",
"permission": "notify:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/broadcasts/{broadcast}"
},
"summary": "Deletes a broadcast.",
"verb": "delete"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/broadcasts/*}:send",
"method": "notify.broadcasts.send",
"permission": "notify:send",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/broadcasts/{broadcast}"
},
"summary": "Sends a Broadcast now.",
"verb": "send"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/broadcasts/*}:cancel",
"method": "notify.broadcasts.cancel",
"permission": "notify:send",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/broadcasts/{broadcast}"
},
"summary": "Cancels a Broadcast; messages already admitted still deliver.",
"verb": "cancel"
}
],
"noun": "broadcasts",
"resource_type": "notify.sylphx.com/Broadcast"
}
],
"commands": [],
"display_name": "Sylphx Notify",
"noun": "notify",
"stage": "preview"
},
{
"collections": [
{
"collection": "log_entries",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/log_entries/*}",
"method": "observability.log_entries.get",
"permission": "observability:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/log_entries/{log_entry}"
},
"summary": "Gets a log entry.",
"verb": "get"
},
{
"effect": "write",
"flags": [
{
"field": "log_entries",
"flag": "--log-entries",
"repeated": true,
"required": true,
"summary": "The entries, at most 1000; only record fields are read.",
"type": "json"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/log_entries:write",
"method": "observability.log_entries.write",
"permission": "observability:ingest",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Ingests a batch of log entries atomically. The same `Idempotency-Key` and digest replays the same batch; a different digest under the key conflicts.",
"verb": "write"
},
{
"effect": "read",
"flags": [
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over the typed, allowlisted fields.",
"type": "string"
},
{
"field": "start_time",
"flag": "--start-time",
"required": true,
"summary": "The interval start; required, at most 31 days before `end_time`.",
"type": "timestamp"
},
{
"field": "end_time",
"flag": "--end-time",
"summary": "The interval end; default now.",
"type": "timestamp"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "`time desc` (default) or `time asc`.",
"type": "string"
},
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 100, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page; bound to tenant, interval, filter, and order.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/log_entries:query",
"method": "observability.log_entries.query",
"permission": "observability:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Queries the environment's log entries over a bounded interval; follow a trace with `trace_id = \"...\"`.",
"verb": "query"
}
],
"noun": "log-entries",
"resource_type": "observability.sylphx.com/LogEntry"
},
{
"collection": "traces",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/traces/*}",
"method": "observability.traces.get",
"permission": "observability:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/traces/{trace}"
},
"summary": "Gets a trace.",
"verb": "get"
},
{
"effect": "write",
"flags": [
{
"field": "spans",
"flag": "--spans",
"repeated": true,
"required": true,
"summary": "The spans, at most 1000.",
"type": "json"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/traces:writeSpans",
"method": "observability.traces.write_spans",
"permission": "observability:ingest",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Ingests a batch of spans atomically; a span's parent and time invariants are validated. Replay rules are those of WriteLogEntries.",
"verb": "write-spans"
},
{
"effect": "read",
"flags": [
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over the typed, allowlisted fields.",
"type": "string"
},
{
"field": "start_time",
"flag": "--start-time",
"required": true,
"summary": "The interval start; required, at most 31 days before `end_time`.",
"type": "timestamp"
},
{
"field": "end_time",
"flag": "--end-time",
"summary": "The interval end; default now.",
"type": "timestamp"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "`time desc` (default) or `time asc`.",
"type": "string"
},
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 100, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page; bound to tenant, interval, filter, and order.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/traces:query",
"method": "observability.traces.query",
"permission": "observability:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Queries the environment's traces over a bounded interval, returning summaries without spans.",
"verb": "query"
}
],
"noun": "traces",
"resource_type": "observability.sylphx.com/Trace"
},
{
"collection": "generations",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/generations/*}",
"method": "observability.generations.get",
"permission": "observability:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/generations/{generation}"
},
"summary": "Gets a generation: one Sylphx AI call.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields and `tags.<key>`.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields; default `start_time desc`.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/generations",
"method": "observability.generations.list",
"paginates": true,
"permission": "observability:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists the environment's Sylphx AI calls, newest first, within the trace retention; filter by `request_model`, `outcome`, `api_key`, `start_time`, `tags.<key>` and the other filterable fields.",
"verb": "list"
}
],
"noun": "generations",
"resource_type": "observability.sylphx.com/Generation"
},
{
"collection": "error_groups",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/error_groups/*}",
"method": "observability.error_groups.get",
"permission": "observability:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/error_groups/{error_group}"
},
"summary": "Gets an error group.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/error_groups",
"method": "observability.error_groups.list",
"paginates": true,
"permission": "observability:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists error groups; filter by `state`, `service_name`, and `last_seen_time`.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"field": "error_event",
"flag": "--error-event",
"required": true,
"summary": "The occurrence; only record fields are read.",
"type": "json"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/error_groups:capture",
"method": "observability.error_groups.capture",
"permission": "observability:ingest",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Captures one error occurrence. It is grouped by `fingerprint` when the caller sets one, else by exception type and the symbolicated in-app stack; release is never part of the group. A new occurrence reopens a resolved group. Secrets and personal data are scrubbed by the environment's Scrubbing Policy before storage. A fingerprint-equal replay bills no second new-error unit. Under quota pressure the response says what to sample. Browsers call it with a publishable key that holds `observability:ingest` (CORS allowed, rate-limited per environment).",
"verb": "capture"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/error_groups/*}:acknowledge",
"method": "observability.error_groups.acknowledge",
"permission": "observability:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/error_groups/{error_group}"
},
"summary": "Acknowledges an error group.",
"verb": "acknowledge"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/error_groups/*}:resolve",
"method": "observability.error_groups.resolve",
"permission": "observability:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/error_groups/{error_group}"
},
"summary": "Resolves an error group; a new occurrence reopens it.",
"verb": "resolve"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/error_groups/*}:reopen",
"method": "observability.error_groups.reopen",
"permission": "observability:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/error_groups/{error_group}"
},
"summary": "Reopens a resolved or acknowledged error group.",
"verb": "reopen"
}
],
"noun": "error-groups",
"resource_type": "observability.sylphx.com/ErrorGroup"
},
{
"collection": "error_events",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/error_groups/*/error_events/*}",
"method": "observability.error_events.get",
"permission": "observability:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/error_groups/{error_group}/error_events/{error_event}"
},
"summary": "Gets an error event.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/error_groups/*}/error_events",
"method": "observability.error_events.list",
"paginates": true,
"permission": "observability:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/error_groups/{error_group}"
},
"summary": "Lists error events.",
"verb": "list"
}
],
"noun": "error-events",
"resource_type": "observability.sylphx.com/ErrorEvent"
},
{
"collection": "source_maps",
"commands": [
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "source_map.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "source_map.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "source_map.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "source_map.release",
"flag": "--release",
"required": true,
"summary": "The release the map belongs to, as sent in `ErrorEvent.release`.",
"type": "string"
},
{
"field": "source_map.file_url",
"flag": "--file-url",
"required": true,
"summary": "The minified file the map describes: its URL (`https://app.example.com/assets/index-3f2a.js`) or its path (`/assets/index-3f2a.js`). A frame matches on the URL path.",
"type": "string"
},
{
"field": "source_map.content",
"flag": "--content",
"required": true,
"summary": "The source map JSON (revision 3), at most 16 MiB. Written, never read back.",
"type": "string"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/source_maps",
"method": "observability.source_maps.create",
"permission": "observability:write",
"positional": null,
"resource_field": "source_map",
"summary": "Uploads a source map for one release and minified file. Uploading the same release and file again replaces it.",
"verb": "create"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/source_maps/*}",
"method": "observability.source_maps.get",
"permission": "observability:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/source_maps/{source_map}"
},
"summary": "Gets a source map (without its content).",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many, up to 100.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "The `next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter; `release = \"…\"` only.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/source_maps",
"method": "observability.source_maps.list",
"paginates": true,
"permission": "observability:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists source maps, newest first; filter by `release`.",
"verb": "list"
}
],
"noun": "source-maps",
"resource_type": "observability.sylphx.com/SourceMap"
},
{
"collection": "scrubbing_policies",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/scrubbing_policies/*}",
"method": "observability.scrubbing_policies.get",
"permission": "observability:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/scrubbing_policies/{scrubbing_policy}"
},
"summary": "Gets the environment's scrubbing policy (`scrubbing_policies/default`).",
"verb": "get"
},
{
"effect": "write",
"flags": [
{
"field": "scrubbing_policy.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "scrubbing_policy.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "scrubbing_policy.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "scrubbing_policy.denied_fields",
"flag": "--denied-fields",
"repeated": true,
"summary": "More field names to replace with `[Filtered]` wherever they appear in tags, extra data, request data, or breadcrumb data (case-insensitive, matched as a substring), at most 64.",
"type": "string"
},
{
"field": "scrubbing_policy.keep_emails",
"flag": "--keep-emails",
"summary": "Keep email addresses instead of replacing them with `[email]`.",
"type": "bool"
}
],
"http": "PATCH /v1/{scrubbing_policy.name=orgs/*/projects/*/envs/*/scrubbing_policies/*}",
"method": "observability.scrubbing_policies.update",
"permission": "observability:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "scrubbing_policy.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/scrubbing_policies/{scrubbing_policy}"
},
"resource_field": "scrubbing_policy",
"sends_etag": true,
"summary": "Updates the environment's scrubbing policy.",
"update_mask": "from-flags",
"verb": "update"
}
],
"noun": "scrubbing-policies",
"resource_type": "observability.sylphx.com/ScrubbingPolicy"
}
],
"commands": [],
"display_name": "Sylphx Observability",
"noun": "observability",
"stage": "preview"
},
{
"collections": [],
"commands": [],
"display_name": "Sylphx Realtime",
"noun": "realtime",
"served": false,
"stage": "preview"
},
{
"collections": [
{
"collection": "releases",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/releases/*}",
"method": "release.releases.get",
"permission": "release:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/releases/{release}"
},
"summary": "Gets a release.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/releases",
"method": "release.releases.list",
"paginates": true,
"permission": "release:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists releases in an environment, newest first by default.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "release.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "release.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "release.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "release.spec.members",
"flag": "--spec.members",
"repeated": true,
"required": true,
"summary": "The workloads, each by artifact digest. A member that names a tag or an unverified Artifact is refused.",
"type": "json"
},
{
"field": "release.spec.rollout_policy.bake_duration",
"flag": "--spec.rollout-policy.bake-duration",
"summary": "How long each wave bakes, healthy, before the next starts; default 10 minutes.",
"type": "duration"
},
{
"field": "release.spec.rollout_policy.halt_on_failure",
"flag": "--spec.rollout-policy.halt-on-failure",
"summary": "Halt the rollout when a wave's health gate fails; default true.",
"type": "bool"
},
{
"field": "release.spec.rollout_policy.skip_waves",
"flag": "--spec.rollout-policy.skip-waves",
"summary": "Skip the waves and apply to every cell together: break-glass only, and refused for any other principal.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/releases",
"method": "release.releases.create",
"permission": "release:write",
"positional": {
"arg": "ID",
"field": "release_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "release",
"summary": "Creates a release: admits it and rolls it out in waves. The Operation is done when the release is live or halted.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "releases",
"resource_type": "release.sylphx.com/Release"
},
{
"collection": "rollouts",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/rollouts/*}",
"method": "release.rollouts.get",
"permission": "release:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/rollouts/{rollout}"
},
"summary": "Gets a rollout.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/rollouts",
"method": "release.rollouts.list",
"paginates": true,
"permission": "release:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists rollouts in an environment.",
"verb": "list"
}
],
"noun": "rollouts",
"resource_type": "release.sylphx.com/Rollout"
}
],
"commands": [],
"display_name": "Sylphx Release",
"noun": "release",
"served": false,
"stage": "preview"
},
{
"collections": [
{
"collection": "scale_sets",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/scale_sets/*}",
"method": "runners.scale_sets.get",
"permission": "runners:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/scale_sets/{scale_set}"
},
"summary": "Gets a scale set.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*}/scale_sets",
"method": "runners.scale_sets.list",
"paginates": true,
"permission": "runners:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}"
},
"summary": "Lists scale sets in a org.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "scale_set.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "scale_set.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "scale_set.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "scale_set.spec.connection",
"flag": "--spec.connection",
"required": true,
"summary": "The Sylphx Runners installation Connection.",
"type": "string"
},
{
"field": "scale_set.spec.runner_class",
"flag": "--spec.runner-class",
"required": true,
"summary": "The class, `sylphx-<os>-<size>`, for example `sylphx-linux-standard`. It is the label workflows ask for.",
"type": "string"
},
{
"field": "scale_set.spec.runner_group",
"flag": "--spec.runner-group",
"summary": "The forge runner group to register in; default the installation's default group.",
"type": "string"
},
{
"field": "scale_set.spec.max_runners",
"flag": "--spec.max-runners",
"summary": "Concurrent runners at most; 0 means the plan's limit.",
"type": "int"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*}/scale_sets",
"method": "runners.scale_sets.create",
"permission": "runners:write",
"positional": {
"arg": "ID",
"field": "scale_set_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "scale_set",
"summary": "Creates a scale set. The Operation is done when the controller settles it.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "scale_set.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "scale_set.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "scale_set.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "scale_set.spec.runner_group",
"flag": "--spec.runner-group",
"summary": "The forge runner group to register in; default the installation's default group.",
"type": "string"
},
{
"field": "scale_set.spec.max_runners",
"flag": "--spec.max-runners",
"summary": "Concurrent runners at most; 0 means the plan's limit.",
"type": "int"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the Resource when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{scale_set.name=orgs/*/scale_sets/*}",
"method": "runners.scale_sets.update",
"permission": "runners:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "scale_set.name",
"pattern": "orgs/{org}/scale_sets/{scale_set}"
},
"resource_field": "scale_set",
"sends_etag": true,
"summary": "Updates a scale set.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete every child Resource; without it a parent with children fails with FAILED_PRECONDITION.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/scale_sets/*}",
"method": "runners.scale_sets.delete",
"permission": "runners:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/scale_sets/{scale_set}"
},
"summary": "Deletes a scale set.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "scale-sets",
"resource_type": "runners.sylphx.com/ScaleSet"
},
{
"collection": "runners",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/scale_sets/*/runners/*}",
"method": "runners.runners.get",
"permission": "runners:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/scale_sets/{scale_set}/runners/{runner}"
},
"summary": "Gets a runner.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/scale_sets/*}/runners",
"method": "runners.runners.list",
"paginates": true,
"permission": "runners:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/scale_sets/{scale_set}"
},
"summary": "Lists runners in a scale set.",
"verb": "list"
}
],
"noun": "runners",
"resource_type": "runners.sylphx.com/Runner"
}
],
"commands": [],
"display_name": "Sylphx Runners",
"noun": "runners",
"served": false,
"stage": "preview"
},
{
"collections": [
{
"collection": "sandbox_shapes",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=sandbox_shapes/*}",
"method": "sandboxes.sandbox_shapes.get",
"permission": "sandboxes:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "sandbox_shapes/{shape}"
},
"summary": "Gets a shape.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/sandbox_shapes",
"method": "sandboxes.sandbox_shapes.list",
"paginates": true,
"permission": "sandboxes:read",
"positional": null,
"summary": "Lists shapes.",
"verb": "list"
}
],
"noun": "sandbox-shapes",
"resource_type": "sandboxes.sylphx.com/Shape"
},
{
"collection": "pools",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/pools/*}",
"method": "sandboxes.pools.get",
"permission": "sandboxes:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/pools/{pool}"
},
"summary": "Gets a pool.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/pools",
"method": "sandboxes.pools.list",
"paginates": true,
"permission": "sandboxes:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists pools in a environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "pool.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "pool.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "pool.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "pool.spec.shape",
"flag": "--spec.shape",
"required": true,
"summary": "The shape.",
"type": "string"
},
{
"field": "pool.spec.image",
"flag": "--spec.image",
"required": true,
"summary": "The image: an artifact in Sylphx Artifacts, by digest, or `template:<name>`.",
"type": "string"
},
{
"field": "pool.spec.warm.min",
"flag": "--spec.warm.min",
"summary": "Warm machines kept booted.",
"type": "int"
},
{
"field": "pool.spec.warm.max",
"flag": "--spec.warm.max",
"summary": "Warm machines at most; at most 10 on free and 100 on Pro.",
"type": "int"
},
{
"field": "pool.spec.max_age",
"flag": "--spec.max-age",
"summary": "Warm machines older than this are recycled; 5 minutes to 2 hours.",
"type": "duration"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/pools",
"method": "sandboxes.pools.create",
"permission": "sandboxes:write",
"positional": {
"arg": "ID",
"field": "pool_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "pool",
"summary": "Creates a pool. The Operation is done when the controller settles it.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "pool.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "pool.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "pool.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "pool.spec.image",
"flag": "--spec.image",
"required": true,
"summary": "The image: an artifact in Sylphx Artifacts, by digest, or `template:<name>`.",
"type": "string"
},
{
"field": "pool.spec.warm.min",
"flag": "--spec.warm.min",
"summary": "Warm machines kept booted.",
"type": "int"
},
{
"field": "pool.spec.warm.max",
"flag": "--spec.warm.max",
"summary": "Warm machines at most; at most 10 on free and 100 on Pro.",
"type": "int"
},
{
"field": "pool.spec.max_age",
"flag": "--spec.max-age",
"summary": "Warm machines older than this are recycled; 5 minutes to 2 hours.",
"type": "duration"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the Resource when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{pool.name=orgs/*/projects/*/envs/*/pools/*}",
"method": "sandboxes.pools.update",
"permission": "sandboxes:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "pool.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/pools/{pool}"
},
"resource_field": "pool",
"sends_etag": true,
"summary": "Updates a pool.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/pools/*}",
"method": "sandboxes.pools.delete",
"permission": "sandboxes:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/pools/{pool}"
},
"summary": "Deletes a pool.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "pools",
"resource_type": "sandboxes.sylphx.com/Pool"
},
{
"collection": "leases",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/leases/*}",
"method": "sandboxes.leases.get",
"permission": "sandboxes:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Gets a lease.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/leases",
"method": "sandboxes.leases.list",
"paginates": true,
"permission": "sandboxes:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists leases in a environment. Filter on `meta.labels` (for example `labels.agent = \"a_123\"`), `status.state`, and `spec.kind`.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "lease.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "lease.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "lease.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "lease.spec.shape",
"flag": "--spec.shape",
"required": true,
"summary": "The shape.",
"type": "string"
},
{
"field": "lease.spec.image",
"flag": "--spec.image",
"summary": "The image: an artifact in Sylphx Artifacts, by digest, or `template:<name>` (`base`, `desktop`, `browser`, `android`). Ignored when `source_snapshot` is set.",
"type": "string"
},
{
"field": "lease.spec.kind",
"flag": "--spec.kind",
"summary": "What the machine serves; default GENERAL.",
"type": "enum",
"values": [
"general",
"browser",
"desktop",
"android"
]
},
{
"field": "lease.spec.region",
"flag": "--spec.region",
"summary": "The region; default the project's home region.",
"type": "string"
},
{
"field": "lease.spec.pool",
"flag": "--spec.pool",
"summary": "The Pool to take a warm machine from; default the platform pool for the shape and image.",
"type": "string"
},
{
"field": "lease.spec.ttl",
"flag": "--spec.ttl",
"required": true,
"summary": "The maximum wall time from grant: 1 minute to 24 hours for microVMs, 24 hours to 30 days for macOS. `:renew` extends it within the shape's bound. Reaching it ends the lease EXPIRED.",
"type": "duration"
},
{
"field": "lease.spec.idle_timeout",
"flag": "--spec.idle-timeout",
"summary": "End the lease IDLE after no data-plane call, stream input, or exec for this long; unset never idles out.",
"type": "duration"
},
{
"field": "lease.spec.network.egress",
"flag": "--spec.network.egress",
"summary": "Default ALLOW.",
"type": "enum",
"values": [
"allow",
"deny",
"allowlist"
]
},
{
"field": "lease.spec.network.allowed_domains",
"flag": "--spec.network.allowed-domains",
"repeated": true,
"summary": "Hosts reachable when `egress` is ALLOWLIST: exact names or one leading `*.` wildcard label, for example `api.openai.com`, `*.github.com`.",
"type": "string"
},
{
"field": "lease.spec.network.allowed_cidrs",
"flag": "--spec.network.allowed-cidrs",
"repeated": true,
"summary": "Public CIDRs reachable when `egress` is ALLOWLIST.",
"type": "string"
},
{
"field": "lease.spec.ports",
"flag": "--spec.ports",
"repeated": true,
"summary": "Guest ports to expose.",
"type": "json"
},
{
"field": "lease.spec.env",
"flag": "--spec.env",
"repeated": true,
"summary": "Plain environment variables. Secrets bind through Sylphx Secrets, never here.",
"type": "key=value"
},
{
"field": "lease.spec.volumes",
"flag": "--spec.volumes",
"repeated": true,
"summary": "Volumes attached at grant, each by name. A volume is attached to at most one lease at a time; a volume already attached refuses the lease with RESOURCE_IN_USE.",
"type": "json"
},
{
"field": "lease.spec.budget.max_cpu_seconds",
"flag": "--spec.budget.max-cpu-seconds",
"summary": "End CPU_BUDGET after this many vCPU-seconds of guest CPU time.",
"type": "int"
},
{
"field": "lease.spec.budget.max_cost_micros",
"flag": "--spec.budget.max-cost-micros",
"summary": "End COST_BUDGET once the shape's list price times wall seconds reaches this many millionths of a US dollar.",
"type": "int"
},
{
"field": "lease.spec.display.width",
"flag": "--spec.display.width",
"summary": "Logical width in pixels; default 1280.",
"type": "int"
},
{
"field": "lease.spec.display.height",
"flag": "--spec.display.height",
"summary": "Logical height in pixels; default 800.",
"type": "int"
},
{
"field": "lease.spec.display.dpi",
"flag": "--spec.display.dpi",
"summary": "Dots per inch; default 96.",
"type": "int"
},
{
"field": "lease.spec.browser.headless",
"flag": "--spec.browser.headless",
"summary": "Run headless instead of on the display. A headless browser has no stream and no computer actions; CDP only.",
"type": "bool"
},
{
"field": "lease.spec.browser.user_data_dir",
"flag": "--spec.browser.user-data-dir",
"summary": "The profile directory; put it on a volume to keep cookies and storage across leases. Default a fresh profile.",
"type": "string"
},
{
"field": "lease.spec.browser.start_url",
"flag": "--spec.browser.start-url",
"summary": "The page opened at start; default `about:blank`.",
"type": "string"
},
{
"field": "lease.spec.source_snapshot",
"flag": "--spec.source-snapshot",
"summary": "Boot from this Snapshot's disk and image instead of `image`.",
"type": "string"
},
{
"field": "lease.spec.webhook.uri",
"flag": "--spec.webhook.uri",
"summary": "The HTTPS URL that receives the POSTs.",
"type": "string"
},
{
"field": "lease.spec.webhook.kinds",
"flag": "--spec.webhook.kinds",
"repeated": true,
"summary": "Deliver only these kinds; default every kind.",
"type": "enum",
"values": [
"granted",
"ready",
"refused",
"ended",
"renewed",
"network_changed",
"control_acquired",
"control_released",
"control_expired",
"budget_warning",
"paused",
"resumed"
]
},
{
"field": "lease.spec.device.model",
"flag": "--spec.device.model",
"summary": "A model id from the device catalog, e.g. `pixel_7`; default `pixel_7`.",
"type": "string"
},
{
"field": "lease.spec.device.os_version",
"flag": "--spec.device.os-version",
"summary": "The OS version, e.g. `14`; default the newest offered.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "skip_wait_ready",
"flag": "--skip-wait-ready",
"summary": "Return as soon as the machine is granted instead of when the guest is ready. Default false: wait for READY, at most 60 seconds.",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/leases",
"method": "sandboxes.leases.create",
"permission": "sandboxes:write",
"positional": {
"arg": "ID",
"field": "lease_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "lease",
"summary": "Creates a lease: granted now and returned READY (or GRANTED when `wait_ready` is false), or refused with a typed error. There is no queue.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "ttl",
"flag": "--ttl",
"required": true,
"summary": "The new time to live from now.",
"type": "duration"
},
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:renew",
"method": "sandboxes.leases.renew",
"permission": "sandboxes:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Extends `expire_time`, never past the shape's longest lease. Does not change the generation.",
"verb": "renew"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:release",
"method": "sandboxes.leases.release",
"permission": "sandboxes:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Ends a lease with END_REASON_RELEASED; the machine is destroyed and never leased again, and attached volumes are detached.",
"verb": "release"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:pause",
"method": "sandboxes.leases.pause",
"permission": "sandboxes:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Pauses a lease: its disk is kept and its machine destroyed; the generation increases. Process memory is not kept.",
"verb": "pause"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:resume",
"method": "sandboxes.leases.resume",
"permission": "sandboxes:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Resumes a paused lease on a machine granted now, or refuses it; the generation increases.",
"verb": "resume"
},
{
"effect": "write",
"flags": [
{
"field": "network",
"flag": "--network",
"required": true,
"summary": "The new outbound policy; replaces the old one whole.",
"type": "json"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:setNetwork",
"method": "sandboxes.leases.set_network",
"permission": "sandboxes:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Replaces a running lease's outbound policy. The generation does not change; the new policy applies before the call returns.",
"verb": "set-network"
},
{
"effect": "write",
"flags": [
{
"field": "scopes",
"flag": "--scopes",
"repeated": true,
"required": true,
"summary": "What the token admits.",
"type": "enum",
"values": [
"guest",
"ports",
"cdp",
"computer"
]
},
{
"field": "ttl",
"flag": "--ttl",
"summary": "At most 1 hour and never past the lease's `expire_time`.",
"type": "duration"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:mintToken",
"method": "sandboxes.leases.mint_token",
"permission": "sandboxes:exec",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Mints a lease token for the data plane, bound to the current generation. Hand it to a process that must not hold the Access key.",
"verb": "mint-token"
},
{
"effect": "write",
"flags": [
{
"field": "command",
"flag": "--command",
"repeated": true,
"required": true,
"summary": "The program and its arguments. Use `[\"bash\", \"-lc\", \"…\"]` for a shell.",
"type": "string"
},
{
"field": "working_directory",
"flag": "--working-directory",
"summary": "The working directory; default the user's home.",
"type": "string"
},
{
"field": "env",
"flag": "--env",
"repeated": true,
"summary": "Extra environment variables.",
"type": "key=value"
},
{
"field": "stdin",
"flag": "--stdin",
"summary": "Bytes written to standard input.",
"type": "string"
},
{
"field": "timeout",
"flag": "--timeout",
"summary": "Kill the process after this long; default 60 seconds, at most 10 minutes.",
"type": "duration"
},
{
"field": "user",
"flag": "--user",
"summary": "The guest user; default `user`. `root` is allowed: the whole machine belongs to the lessee.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:exec",
"method": "sandboxes.leases.exec",
"permission": "sandboxes:exec",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Runs one command in the lease to completion and returns its output, capped at 1 MiB per stream. Long-running or interactive processes use the guest protocol at `status.endpoints.guest_uri`.",
"verb": "exec"
},
{
"effect": "read",
"flags": [
{
"field": "path",
"flag": "--path",
"required": true,
"summary": "The absolute path in the guest.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:readFile",
"method": "sandboxes.leases.read_file",
"permission": "sandboxes:exec",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Reads one file from the lease, at most 16 MiB; larger files use the guest's `/files`.",
"verb": "read-file"
},
{
"effect": "write",
"flags": [
{
"field": "path",
"flag": "--path",
"required": true,
"summary": "The absolute path in the guest.",
"type": "string"
},
{
"field": "content",
"flag": "--content",
"required": true,
"summary": "The file's bytes.",
"type": "string"
},
{
"field": "mode",
"flag": "--mode",
"summary": "The file mode bits; default 0644.",
"type": "int"
},
{
"field": "append",
"flag": "--append",
"summary": "Append `content` to the file (created when absent) instead of replacing it, so a file larger than one call uploads in chunks.",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:writeFile",
"method": "sandboxes.leases.write_file",
"permission": "sandboxes:exec",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Writes one file in the lease, at most 16 MiB, creating parent directories.",
"verb": "write-file"
},
{
"effect": "read",
"flags": [
{
"field": "path",
"flag": "--path",
"required": true,
"summary": "The absolute directory path in the guest.",
"type": "string"
},
{
"field": "depth",
"flag": "--depth",
"summary": "Descend this many levels; default 1.",
"type": "int"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:listFiles",
"method": "sandboxes.leases.list_files",
"permission": "sandboxes:exec",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Lists one directory in the lease.",
"verb": "list-files"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "path",
"flag": "--path",
"required": true,
"summary": "The absolute path in the guest.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:removeFile",
"method": "sandboxes.leases.remove_file",
"permission": "sandboxes:exec",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Removes one file or directory tree in the lease.",
"verb": "remove-file"
},
{
"effect": "write",
"flags": [
{
"field": "port",
"flag": "--port",
"required": true,
"summary": "The port to expose.",
"type": "json"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:openPort",
"method": "sandboxes.leases.open_port",
"permission": "sandboxes:exec",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Exposes a guest port.",
"verb": "open-port"
},
{
"effect": "write",
"flags": [
{
"field": "port",
"flag": "--port",
"required": true,
"summary": "The guest port.",
"type": "int"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:closePort",
"method": "sandboxes.leases.close_port",
"permission": "sandboxes:exec",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Stops exposing a guest port.",
"verb": "close-port"
},
{
"effect": "write",
"flags": [
{
"field": "actions",
"flag": "--actions",
"repeated": true,
"summary": "The actions, performed in order; at most 64. An empty list with `screenshot` set only takes a screenshot.",
"type": "json"
},
{
"field": "screenshot",
"flag": "--screenshot",
"summary": "Take a screenshot after the last action and return it.",
"type": "json"
},
{
"field": "lease_generation",
"flag": "--lease-generation",
"summary": "Refuse STALE_GENERATION unless the lease is at this generation; 0 skips the check.",
"type": "int"
},
{
"field": "control_epoch",
"flag": "--control-epoch",
"summary": "Act under this AGENT control epoch; 0 acts only while nobody holds control.",
"type": "int"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:act",
"method": "sandboxes.leases.act",
"permission": "sandboxes:exec",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Performs computer actions on a DESKTOP, BROWSER, or ANDROID lease, in order, and returns each action's result and, when `screenshot` is set, the screenshot taken after the last action. The actions are the Anthropic computer tool's and OpenAI computer use's, one-to-one (docs/services/sandboxes/computer-use.md). Refused CONTROL_HELD_BY_HUMAN while a human holds control.",
"verb": "act"
},
{
"effect": "write",
"flags": [
{
"field": "ttl",
"flag": "--ttl",
"summary": "How long the token admits a new connection; at most and default 5 minutes. A connected stream ends when the lease generation changes or the token is revoked.",
"type": "duration"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:openStream",
"method": "sandboxes.leases.open_stream",
"permission": "sandboxes:exec",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Opens a read-only live view of a lease's display: a short-lived viewer token bound to the lease and its generation, an embeddable URL, and the WebRTC signaling endpoint with ICE servers. Input needs control (AcquireLeaseControl).",
"verb": "open-stream"
},
{
"effect": "write",
"flags": [
{
"field": "holder",
"flag": "--holder",
"required": true,
"summary": "HUMAN or AGENT.",
"type": "enum",
"values": [
"agent",
"human"
]
},
{
"field": "ttl",
"flag": "--ttl",
"summary": "How long; default 10 minutes, capped at 30 minutes.",
"type": "duration"
},
{
"field": "holder_label",
"flag": "--holder-label",
"summary": "A label for the holder, for example the person's user id; recorded in the audit events.",
"type": "string"
},
{
"field": "preempt",
"flag": "--preempt",
"summary": "For HUMAN: take control from another human.",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:acquireControl",
"method": "sandboxes.leases.acquire_control",
"permission": "sandboxes:exec",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Takes exclusive input control of a lease's display. A HUMAN acquire preempts an AGENT holder and returns a controller stream; an AGENT acquire is refused CONTROL_HELD_BY_HUMAN while a human holds control. Control lapses at `ttl`, which the platform caps at 30 minutes.",
"verb": "acquire-control"
},
{
"effect": "write",
"flags": [
{
"field": "epoch",
"flag": "--epoch",
"required": true,
"summary": "The epoch AcquireLeaseControl returned.",
"type": "int"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:releaseControl",
"method": "sandboxes.leases.release_control",
"permission": "sandboxes:exec",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Releases control held under `epoch`; its controller tokens stop working.",
"verb": "release-control"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/leases/*}:getControl",
"method": "sandboxes.leases.get_control",
"permission": "sandboxes:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Gets who holds control of a lease's display.",
"verb": "get-control"
},
{
"effect": "write",
"flags": [
{
"field": "apk_path",
"flag": "--apk-path",
"required": true,
"summary": "The APK's path in the lease (write it with WriteLeaseFile first).",
"type": "string"
},
{
"field": "grant_permissions",
"flag": "--grant-permissions",
"summary": "Grant every runtime permission the app declares.",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/leases/*}:installApp",
"method": "sandboxes.leases.install_app",
"permission": "sandboxes:exec",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Installs an Android app (APK) on an ANDROID lease.",
"verb": "install-app"
}
],
"noun": "leases",
"resource_type": "sandboxes.sylphx.com/Lease"
},
{
"collection": "lease_events",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/leases/*/lease_events/*}",
"method": "sandboxes.lease_events.get",
"permission": "sandboxes:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}/lease_events/{lease_event}"
},
"summary": "Gets one lease event.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over `kind`.",
"type": "string"
},
{
"field": "wait",
"flag": "--wait",
"summary": "Block up to this long (at most 60 seconds) when there is no event after `page_token`.",
"type": "duration"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/leases/*}/lease_events",
"method": "sandboxes.lease_events.list",
"paginates": true,
"permission": "sandboxes:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/leases/{lease}"
},
"summary": "Lists a lease's events in order. With `wait`, blocks up to that long for an event after `page_token` (long poll).",
"verb": "list"
}
],
"noun": "lease-events",
"resource_type": "sandboxes.sylphx.com/LeaseEvent"
},
{
"collection": "volumes",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/volumes/*}",
"method": "sandboxes.volumes.get",
"permission": "sandboxes:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/volumes/{volume}"
},
"summary": "Gets a volume.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/volumes",
"method": "sandboxes.volumes.list",
"paginates": true,
"permission": "sandboxes:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists volumes in a environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "volume.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "volume.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "volume.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "volume.spec.size_gib",
"flag": "--spec.size-gib",
"required": true,
"summary": "Size in GiB, 1 to 1024; it may grow and never shrink. A `local` volume never grows.",
"type": "int"
},
{
"field": "volume.spec.storage_class",
"flag": "--spec.storage-class",
"summary": "The storage class; unset means `standard`. `standard`: replicated network storage, encrypted at rest with its own key, attachable on any node. `local`: fast node-local storage, not replicated, for warm build workspaces. The guest gets it as an ext4 filesystem it formats on first use. It pins every lease that attaches it to its node, is not encrypted at rest, cannot grow, cannot be mounted read-only, and is lost with its node: keep only caches on it.",
"type": "string"
},
{
"field": "volume.spec.region",
"flag": "--spec.region",
"summary": "The region whose Cell holds the volume; default the project's home region. A lease mounts the volume only in the same region.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/volumes",
"method": "sandboxes.volumes.create",
"permission": "sandboxes:write",
"positional": {
"arg": "ID",
"field": "volume_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "volume",
"summary": "Creates a volume.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "volume.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "volume.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "volume.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "volume.spec.size_gib",
"flag": "--spec.size-gib",
"required": true,
"summary": "Size in GiB, 1 to 1024; it may grow and never shrink. A `local` volume never grows.",
"type": "int"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{volume.name=orgs/*/projects/*/envs/*/volumes/*}",
"method": "sandboxes.volumes.update",
"permission": "sandboxes:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "volume.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/volumes/{volume}"
},
"resource_field": "volume",
"sends_etag": true,
"summary": "Updates a volume: grows `spec.size_gib` and edits metadata.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/volumes/*}",
"method": "sandboxes.volumes.delete",
"permission": "sandboxes:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/volumes/{volume}"
},
"summary": "Deletes a volume and destroys its data. Refused RESOURCE_IN_USE while it is attached.",
"verb": "delete"
}
],
"noun": "volumes",
"resource_type": "sandboxes.sylphx.com/Volume"
},
{
"collection": "snapshots",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/snapshots/*}",
"method": "sandboxes.snapshots.get",
"permission": "sandboxes:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/snapshots/{snapshot}"
},
"summary": "Gets a snapshot.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels, filterable fields, and Ready.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/snapshots",
"method": "sandboxes.snapshots.list",
"paginates": true,
"permission": "sandboxes:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists snapshots in a environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "snapshot.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "snapshot.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "snapshot.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "snapshot.spec.source_lease",
"flag": "--spec.source-lease",
"required": true,
"summary": "The running lease to capture.",
"type": "string"
},
{
"field": "snapshot.spec.include_memory",
"flag": "--spec.include-memory",
"summary": "Capture process memory too. Refused UNIMPLEMENTED until the microVM runtime exposes memory snapshots.",
"type": "bool"
},
{
"field": "snapshot.spec.retention",
"flag": "--spec.retention",
"summary": "Delete the snapshot after this long; default 7 days, at most 30 days.",
"type": "duration"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/snapshots",
"method": "sandboxes.snapshots.create",
"permission": "sandboxes:write",
"positional": {
"arg": "ID",
"field": "snapshot_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "snapshot",
"summary": "Captures a running lease's disk as a snapshot.",
"verb": "create"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the Resource does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/snapshots/*}",
"method": "sandboxes.snapshots.delete",
"permission": "sandboxes:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/snapshots/{snapshot}"
},
"summary": "Deletes a snapshot.",
"verb": "delete"
}
],
"noun": "snapshots",
"resource_type": "sandboxes.sylphx.com/Snapshot"
}
],
"commands": [],
"display_name": "Sylphx Sandboxes",
"noun": "sandboxes",
"stage": "preview"
},
{
"collections": [
{
"collection": "secrets",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/secrets/*}",
"method": "secrets.secrets.get",
"permission": "secrets:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/secrets/{secret}"
},
"summary": "Gets a secret.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/secrets",
"method": "secrets.secrets.list",
"paginates": true,
"permission": "secrets:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists secrets in an environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "secret.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "secret.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "secret.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "secret.spec.encryption_key",
"flag": "--spec.encryption-key",
"summary": "The ENCRYPT Key the values are envelope-encrypted with; unset means the environment's default Key.",
"type": "string"
},
{
"field": "secret.spec.rotation_period",
"flag": "--spec.rotation-period",
"summary": "How often the value should be rotated; the Secret reports Ready=FALSE with reason `RotationDue` once the latest version is older.",
"type": "duration"
},
{
"field": "secret.spec.deletion_protection",
"flag": "--spec.deletion-protection",
"summary": "While true, Delete fails with DELETION_PROTECTED. Default true.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/secrets",
"method": "secrets.secrets.create",
"permission": "secrets:write",
"positional": {
"arg": "ID",
"field": "secret_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "secret",
"summary": "Creates a secret, without a value; add one with CreateSecretVersion.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "secret.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "secret.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "secret.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "secret.spec.rotation_period",
"flag": "--spec.rotation-period",
"summary": "How often the value should be rotated; the Secret reports Ready=FALSE with reason `RotationDue` once the latest version is older.",
"type": "duration"
},
{
"field": "secret.spec.deletion_protection",
"flag": "--spec.deletion-protection",
"summary": "While true, Delete fails with DELETION_PROTECTED. Default true.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{secret.name=orgs/*/projects/*/envs/*/secrets/*}",
"method": "secrets.secrets.update",
"permission": "secrets:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "secret.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/secrets/{secret}"
},
"resource_field": "secret",
"sends_etag": true,
"summary": "Updates a secret.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also delete every child Resource; without it a parent with children fails with FAILED_PRECONDITION.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/secrets/*}",
"method": "secrets.secrets.delete",
"permission": "secrets:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/secrets/{secret}"
},
"summary": "Deletes a secret and destroys every version.",
"verb": "delete"
}
],
"noun": "secrets",
"resource_type": "secrets.sylphx.com/Secret"
},
{
"collection": "secret_versions",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/secrets/*/secret_versions/*}",
"method": "secrets.secret_versions.get",
"permission": "secrets:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/secrets/{secret}/secret_versions/{secret_version}"
},
"summary": "Gets a secret version.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/secrets/*}/secret_versions",
"method": "secrets.secret_versions.list",
"paginates": true,
"permission": "secrets:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/secrets/{secret}"
},
"summary": "Lists a secret's versions.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/secrets/{secret}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "secret_version.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "secret_version.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "secret_version.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "secret_version.payload",
"flag": "--payload",
"required": true,
"sensitive": true,
"summary": "The value, at most 64 KiB. Write-only.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/secrets/*}/secret_versions",
"method": "secrets.secret_versions.create",
"permission": "secrets:write",
"positional": null,
"resource_field": "secret_version",
"summary": "Adds a value to a secret as its newest version. The value is never returned.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Disable only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/secrets/*/secret_versions/*}:disable",
"method": "secrets.secret_versions.disable",
"permission": "secrets:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/secrets/{secret}/secret_versions/{secret_version}"
},
"summary": "Disables a secret version: bindings stop delivering it.",
"verb": "disable"
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Enable only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/secrets/*/secret_versions/*}:enable",
"method": "secrets.secret_versions.enable",
"permission": "secrets:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/secrets/{secret}/secret_versions/{secret_version}"
},
"summary": "Enables a disabled secret version.",
"verb": "enable"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Destroy only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/secrets/*/secret_versions/*}:destroy",
"method": "secrets.secret_versions.destroy",
"permission": "secrets:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/secrets/{secret}/secret_versions/{secret_version}"
},
"summary": "Destroys a secret version's value irrecoverably.",
"verb": "destroy"
},
{
"effect": "read",
"flags": [],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/secrets/*/secret_versions/*}:access",
"method": "secrets.secret_versions.access",
"permission": "secrets:access",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/secrets/{secret}/secret_versions/{secret_version}"
},
"summary": "Reads a secret version's value back. Break-glass: a separate permission, audited on every call, and never exposed to MCP.",
"verb": "access"
}
],
"noun": "secret-versions",
"resource_type": "secrets.sylphx.com/SecretVersion"
},
{
"collection": "secret_bindings",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/secret_bindings/*}",
"method": "secrets.secret_bindings.get",
"permission": "secrets:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/secret_bindings/{secret_binding}"
},
"summary": "Gets a secret binding.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/secret_bindings",
"method": "secrets.secret_bindings.list",
"paginates": true,
"permission": "secrets:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists secret bindings in an environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "secret_binding.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "secret_binding.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "secret_binding.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "secret_binding.spec.secret",
"flag": "--spec.secret",
"required": true,
"summary": "The Secret to deliver, in the same environment.",
"type": "string"
},
{
"field": "secret_binding.spec.version",
"flag": "--spec.version",
"summary": "A pinned version; unset delivers the Secret's latest enabled version.",
"type": "string"
},
{
"field": "secret_binding.spec.workload",
"flag": "--spec.workload",
"required": true,
"summary": "The name of the Resource that consumes the value, for example a Hosting service.",
"type": "string"
},
{
"field": "secret_binding.spec.env_var.variable",
"flag": "--spec.env-var.variable",
"summary": "The variable name, for example `DATABASE_PASSWORD`.",
"type": "string"
},
{
"field": "secret_binding.spec.file.path",
"flag": "--spec.file.path",
"summary": "The absolute path, for example `/run/secrets/tls.key`.",
"type": "string"
},
{
"field": "secret_binding.spec.egress.hosts",
"flag": "--spec.egress.hosts",
"repeated": true,
"summary": "The hosts the value may be sent to, for example `api.example.com`.",
"type": "string"
},
{
"field": "secret_binding.spec.egress.header",
"flag": "--spec.egress.header",
"summary": "The request header to set, for example `Authorization`.",
"type": "string"
},
{
"field": "secret_binding.spec.egress.header_template",
"flag": "--spec.egress.header-template",
"summary": "The header value, with `{value}` standing for the Secret, for example `Bearer {value}`; default `{value}`.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/secret_bindings",
"method": "secrets.secret_bindings.create",
"permission": "secrets:write",
"positional": {
"arg": "ID",
"field": "secret_binding_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "secret_binding",
"summary": "Creates a secret binding.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "secret_binding.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "secret_binding.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "secret_binding.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "secret_binding.spec.secret",
"flag": "--spec.secret",
"required": true,
"summary": "The Secret to deliver, in the same environment.",
"type": "string"
},
{
"field": "secret_binding.spec.version",
"flag": "--spec.version",
"summary": "A pinned version; unset delivers the Secret's latest enabled version.",
"type": "string"
},
{
"field": "secret_binding.spec.workload",
"flag": "--spec.workload",
"required": true,
"summary": "The name of the Resource that consumes the value, for example a Hosting service.",
"type": "string"
},
{
"field": "secret_binding.spec.env_var.variable",
"flag": "--spec.env-var.variable",
"summary": "The variable name, for example `DATABASE_PASSWORD`.",
"type": "string"
},
{
"field": "secret_binding.spec.file.path",
"flag": "--spec.file.path",
"summary": "The absolute path, for example `/run/secrets/tls.key`.",
"type": "string"
},
{
"field": "secret_binding.spec.egress.hosts",
"flag": "--spec.egress.hosts",
"repeated": true,
"summary": "The hosts the value may be sent to, for example `api.example.com`.",
"type": "string"
},
{
"field": "secret_binding.spec.egress.header",
"flag": "--spec.egress.header",
"summary": "The request header to set, for example `Authorization`.",
"type": "string"
},
{
"field": "secret_binding.spec.egress.header_template",
"flag": "--spec.egress.header-template",
"summary": "The header value, with `{value}` standing for the Secret, for example `Bearer {value}`; default `{value}`.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{secret_binding.name=orgs/*/projects/*/envs/*/secret_bindings/*}",
"method": "secrets.secret_bindings.update",
"permission": "secrets:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "secret_binding.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/secret_bindings/{secret_binding}"
},
"resource_field": "secret_binding",
"sends_etag": true,
"summary": "Updates a secret binding.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/secret_bindings/*}",
"method": "secrets.secret_bindings.delete",
"permission": "secrets:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/secret_bindings/{secret_binding}"
},
"summary": "Deletes a secret binding.",
"verb": "delete"
}
],
"noun": "secret-bindings",
"resource_type": "secrets.sylphx.com/SecretBinding"
},
{
"collection": "profiles",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/profiles/*}",
"method": "secrets.profiles.get",
"permission": "secrets:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/profiles/{profile}"
},
"summary": "Gets a profile: its kind, grants, sites and latest version; never a value.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/profiles",
"method": "secrets.profiles.list",
"paginates": true,
"permission": "secrets:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists the profiles of an environment.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "profile.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "profile.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "profile.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "profile.spec.kind",
"flag": "--spec.kind",
"required": true,
"summary": "What the profile holds.",
"type": "enum",
"values": [
"browser",
"computer"
]
},
{
"field": "profile.spec.grants",
"flag": "--spec.grants",
"repeated": true,
"summary": "Who may mount it and how. A principal with no grant cannot mount it, whatever its scopes.",
"type": "json"
},
{
"field": "profile.spec.paths",
"flag": "--spec.paths",
"repeated": true,
"summary": "For a `computer` profile: the paths under the sandbox's home directory its archive holds, for example `.config/app`.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/profiles",
"method": "secrets.profiles.create",
"permission": "secrets:write",
"positional": {
"arg": "ID",
"field": "profile_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "profile",
"summary": "Creates an empty profile; its first version is written by a write-back mount (`:open` with WRITE_BACK, then `:commit`).",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "profile.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "profile.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "profile.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "profile.spec.grants",
"flag": "--spec.grants",
"repeated": true,
"summary": "Who may mount it and how. A principal with no grant cannot mount it, whatever its scopes.",
"type": "json"
},
{
"field": "profile.spec.paths",
"flag": "--spec.paths",
"repeated": true,
"summary": "For a `computer` profile: the paths under the sandbox's home directory its archive holds, for example `.config/app`.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{profile.name=orgs/*/projects/*/envs/*/profiles/*}",
"method": "secrets.profiles.update",
"permission": "secrets:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "profile.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/profiles/{profile}"
},
"resource_field": "profile",
"sends_etag": true,
"summary": "Updates a profile's grants or declared paths. Granting a mount is this call: nothing else adds a grant.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also destroy every version; without it a profile with versions fails with INVALID_STATE.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/profiles/*}",
"method": "secrets.profiles.delete",
"permission": "secrets:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/profiles/{profile}"
},
"summary": "Deletes a profile; with `force`, a profile that has versions too, which destroys every version.",
"verb": "delete"
},
{
"effect": "read",
"flags": [
{
"field": "mode",
"flag": "--mode",
"summary": "READ_ONLY (the default) or WRITE_BACK.",
"type": "enum",
"values": [
"read_only",
"write_back"
]
},
{
"field": "version",
"flag": "--version",
"summary": "A version to mount; unset mounts the latest.",
"type": "string"
},
{
"field": "ttl",
"flag": "--ttl",
"summary": "How long a WRITE_BACK attachment may commit; default 1 hour, at most 12 hours. A lost session cannot write back after it.",
"type": "duration"
},
{
"field": "context",
"flag": "--context",
"repeated": true,
"summary": "Who mounts it, for the audit trail: for example `run`, `step`, `member`. At most 16 entries; keys and values are names, never values.",
"type": "key=value"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/profiles/*}:open",
"method": "secrets.profiles.open",
"permission": "secrets:mount",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/profiles/{profile}"
},
"summary": "Mounts a profile for one session: returns the state of one version and, for WRITE_BACK, an attachment that `:commit` writes through until it expires. Every call is audited with the caller's context; the caller's principal needs a grant of at least the requested mode.",
"verb": "open"
},
{
"effect": "write",
"flags": [
{
"field": "attachment",
"flag": "--attachment",
"required": true,
"summary": "The `attachment` OpenProfile returned with WRITE_BACK.",
"type": "string"
},
{
"field": "state",
"flag": "--state",
"required": true,
"sensitive": true,
"summary": "The whole state to write, in the profile kind's form, at most 2 MiB.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/profiles/*}:commit",
"method": "secrets.profiles.commit",
"permission": "secrets:mount",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/profiles/{profile}"
},
"summary": "Writes a mounted profile back as a new version, by compare-and-set on the version the attachment was opened at (or last committed). When another write landed first, nothing is lost: the result is still a new version, merged site by site with the newer write winning, and marked as a conflict.",
"verb": "commit"
}
],
"noun": "profiles",
"resource_type": "secrets.sylphx.com/Profile"
},
{
"collection": "profile_versions",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/profiles/*/profile_versions/*}",
"method": "secrets.profile_versions.get",
"permission": "secrets:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/profiles/{profile}/profile_versions/{profile_version}"
},
"summary": "Gets a profile version: its sites and lineage; never a value.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/profiles/*}/profile_versions",
"method": "secrets.profile_versions.list",
"paginates": true,
"permission": "secrets:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/profiles/{profile}"
},
"summary": "Lists a profile's versions, newest first.",
"verb": "list"
}
],
"noun": "profile-versions",
"resource_type": "secrets.sylphx.com/ProfileVersion"
}
],
"commands": [],
"display_name": "Sylphx Secrets",
"noun": "secrets",
"stage": "preview"
},
{
"collections": [
{
"collection": "workflows",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/workflows/*}",
"method": "workflows.workflows.get",
"permission": "workflows:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/workflows/{workflow}"
},
"summary": "Gets a workflow.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/workflows",
"method": "workflows.workflows.list",
"paginates": true,
"permission": "workflows:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists workflows.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "workflow.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "workflow.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "workflow.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "workflow.spec.handler_uri",
"flag": "--spec.handler-uri",
"summary": "An HTTPS URI on port 443 whose host is a verified Network Domain of this project or a Hosting route the project owns.",
"type": "string"
},
{
"field": "workflow.spec.service_handler.service",
"flag": "--spec.service-handler.service",
"summary": "The Hosting Service in the same environment.",
"type": "string"
},
{
"field": "workflow.spec.service_handler.path",
"flag": "--spec.service-handler.path",
"summary": "The request path, for example `/api/sylphx/workflows`.",
"type": "string"
},
{
"field": "workflow.spec.retry_policy.max_attempts",
"flag": "--spec.retry-policy.max-attempts",
"summary": "Attempts per step, 1 to 100; default 10.",
"type": "int"
},
{
"field": "workflow.spec.retry_policy.initial_interval",
"flag": "--spec.retry-policy.initial-interval",
"summary": "The first backoff; default 1s.",
"type": "duration"
},
{
"field": "workflow.spec.retry_policy.backoff_coefficient",
"flag": "--spec.retry-policy.backoff-coefficient",
"summary": "Backoff growth, 1.0 to 10.0; default 2.0.",
"type": "number"
},
{
"field": "workflow.spec.retry_policy.max_interval",
"flag": "--spec.retry-policy.max-interval",
"summary": "The largest backoff; default 10m.",
"type": "duration"
},
{
"field": "workflow.spec.timeouts.invocation_timeout",
"flag": "--spec.timeouts.invocation-timeout",
"summary": "One handler invocation, 1s to 900s; default 60s.",
"type": "duration"
},
{
"field": "workflow.spec.timeouts.run_timeout",
"flag": "--spec.timeouts.run-timeout",
"summary": "The whole Run, at most 365d; default 30d.",
"type": "duration"
},
{
"field": "workflow.spec.max_concurrent_runs",
"flag": "--spec.max-concurrent-runs",
"summary": "At most this many running Runs of this Workflow; 0 is unlimited within the plan.",
"type": "int"
},
{
"field": "workflow.spec.job_handler.image",
"flag": "--spec.job-handler.image",
"summary": "The image reference.",
"type": "string"
},
{
"field": "workflow.spec.job_handler.command",
"flag": "--spec.job-handler.command",
"repeated": true,
"summary": "The entrypoint; empty keeps the image's.",
"type": "string"
},
{
"field": "workflow.spec.callers",
"flag": "--spec.callers",
"summary": "Who may start, signal, wait on and cancel its Runs (`callable_by` in `sylphx.toml`); unset is `SERVER`. Not served yet: the server refuses the field, set to any value, until end-user sessions are admitted.",
"type": "enum",
"values": [
"server",
"users"
]
},
{
"field": "workflow.spec.permission",
"flag": "--spec.permission",
"summary": "The app permission an end user's session must hold to call the Run methods of this Workflow; required when `callers` is `USERS`. Not served yet, like `callers`.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/workflows",
"method": "workflows.workflows.create",
"permission": "workflows:write",
"positional": {
"arg": "ID",
"field": "workflow_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "workflow",
"summary": "Creates a workflow.",
"verb": "create"
},
{
"effect": "write",
"flags": [
{
"field": "workflow.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "workflow.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "workflow.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "workflow.spec.handler_uri",
"flag": "--spec.handler-uri",
"summary": "An HTTPS URI on port 443 whose host is a verified Network Domain of this project or a Hosting route the project owns.",
"type": "string"
},
{
"field": "workflow.spec.service_handler.service",
"flag": "--spec.service-handler.service",
"summary": "The Hosting Service in the same environment.",
"type": "string"
},
{
"field": "workflow.spec.service_handler.path",
"flag": "--spec.service-handler.path",
"summary": "The request path, for example `/api/sylphx/workflows`.",
"type": "string"
},
{
"field": "workflow.spec.retry_policy.max_attempts",
"flag": "--spec.retry-policy.max-attempts",
"summary": "Attempts per step, 1 to 100; default 10.",
"type": "int"
},
{
"field": "workflow.spec.retry_policy.initial_interval",
"flag": "--spec.retry-policy.initial-interval",
"summary": "The first backoff; default 1s.",
"type": "duration"
},
{
"field": "workflow.spec.retry_policy.backoff_coefficient",
"flag": "--spec.retry-policy.backoff-coefficient",
"summary": "Backoff growth, 1.0 to 10.0; default 2.0.",
"type": "number"
},
{
"field": "workflow.spec.retry_policy.max_interval",
"flag": "--spec.retry-policy.max-interval",
"summary": "The largest backoff; default 10m.",
"type": "duration"
},
{
"field": "workflow.spec.timeouts.invocation_timeout",
"flag": "--spec.timeouts.invocation-timeout",
"summary": "One handler invocation, 1s to 900s; default 60s.",
"type": "duration"
},
{
"field": "workflow.spec.timeouts.run_timeout",
"flag": "--spec.timeouts.run-timeout",
"summary": "The whole Run, at most 365d; default 30d.",
"type": "duration"
},
{
"field": "workflow.spec.max_concurrent_runs",
"flag": "--spec.max-concurrent-runs",
"summary": "At most this many running Runs of this Workflow; 0 is unlimited within the plan.",
"type": "int"
},
{
"field": "workflow.spec.job_handler.image",
"flag": "--spec.job-handler.image",
"summary": "The image reference.",
"type": "string"
},
{
"field": "workflow.spec.job_handler.command",
"flag": "--spec.job-handler.command",
"repeated": true,
"summary": "The entrypoint; empty keeps the image's.",
"type": "string"
},
{
"field": "workflow.spec.callers",
"flag": "--spec.callers",
"summary": "Who may start, signal, wait on and cancel its Runs (`callable_by` in `sylphx.toml`); unset is `SERVER`. Not served yet: the server refuses the field, set to any value, until end-user sessions are admitted.",
"type": "enum",
"values": [
"server",
"users"
]
},
{
"field": "workflow.spec.permission",
"flag": "--spec.permission",
"summary": "The app permission an end user's session must hold to call the Run methods of this Workflow; required when `callers` is `USERS`. Not served yet, like `callers`.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the workflow when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{workflow.name=orgs/*/projects/*/envs/*/workflows/*}",
"method": "workflows.workflows.update",
"permission": "workflows:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "workflow.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/workflows/{workflow}"
},
"resource_field": "workflow",
"sends_etag": true,
"summary": "Updates a workflow.",
"update_mask": "from-flags",
"verb": "update"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the workflow does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also cancel and delete the Workflow's Runs and Schedules; without it a Workflow with open Runs or Schedules fails with INVALID_STATE.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/workflows/*}",
"method": "workflows.workflows.delete",
"permission": "workflows:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/workflows/{workflow}"
},
"summary": "Deletes a workflow.",
"verb": "delete"
}
],
"noun": "workflows",
"resource_type": "workflows.sylphx.com/Workflow"
},
{
"collection": "schedules",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/schedules/*}",
"method": "workflows.schedules.get",
"permission": "workflows:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/schedules/{schedule}"
},
"summary": "Gets a schedule.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/schedules",
"method": "workflows.schedules.list",
"paginates": true,
"permission": "workflows:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists schedules.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "schedule.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "schedule.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "schedule.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "schedule.spec.workflow",
"flag": "--spec.workflow",
"required": true,
"summary": "The Workflow the Schedule starts, in the same environment.",
"type": "string"
},
{
"field": "schedule.spec.input",
"flag": "--spec.input",
"summary": "The input of every Run, at most 64 KiB of JSON.",
"type": "json"
},
{
"field": "schedule.spec.calendar.cron",
"flag": "--spec.calendar.cron",
"summary": "A 5-field cron expression, for example `0 3 * * *`.",
"type": "string"
},
{
"field": "schedule.spec.calendar.time_zone",
"flag": "--spec.calendar.time-zone",
"summary": "IANA time zone; default `UTC`.",
"type": "string"
},
{
"field": "schedule.spec.interval.every",
"flag": "--spec.interval.every",
"summary": "The period, 1s to 365d.",
"type": "duration"
},
{
"field": "schedule.spec.interval.offset",
"flag": "--spec.interval.offset",
"summary": "Phase offset within each period.",
"type": "duration"
},
{
"field": "schedule.spec.jitter",
"flag": "--spec.jitter",
"summary": "Random delay added to each fire, at most min(interval, 1h).",
"type": "duration"
},
{
"field": "schedule.spec.overlap_policy",
"flag": "--spec.overlap-policy",
"summary": "What a fire does while a previous Run is still running.",
"type": "enum",
"values": [
"skip",
"buffer_one",
"buffer_all",
"cancel_other",
"allow"
]
},
{
"field": "schedule.spec.catchup_window",
"flag": "--spec.catchup-window",
"summary": "Missed fires older than this are skipped; 10s to 365d.",
"type": "duration"
},
{
"field": "schedule.spec.paused",
"flag": "--spec.paused",
"summary": "Whether fires are paused.",
"type": "bool"
},
{
"field": "schedule.spec.pause_note",
"flag": "--spec.pause-note",
"summary": "Why the Schedule is paused; shown in status.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/schedules",
"method": "workflows.schedules.create",
"permission": "workflows:write",
"positional": {
"arg": "ID",
"field": "schedule_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "schedule",
"summary": "Creates a schedule.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "schedule.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "schedule.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "schedule.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "schedule.spec.workflow",
"flag": "--spec.workflow",
"required": true,
"summary": "The Workflow the Schedule starts, in the same environment.",
"type": "string"
},
{
"field": "schedule.spec.input",
"flag": "--spec.input",
"summary": "The input of every Run, at most 64 KiB of JSON.",
"type": "json"
},
{
"field": "schedule.spec.calendar.cron",
"flag": "--spec.calendar.cron",
"summary": "A 5-field cron expression, for example `0 3 * * *`.",
"type": "string"
},
{
"field": "schedule.spec.calendar.time_zone",
"flag": "--spec.calendar.time-zone",
"summary": "IANA time zone; default `UTC`.",
"type": "string"
},
{
"field": "schedule.spec.interval.every",
"flag": "--spec.interval.every",
"summary": "The period, 1s to 365d.",
"type": "duration"
},
{
"field": "schedule.spec.interval.offset",
"flag": "--spec.interval.offset",
"summary": "Phase offset within each period.",
"type": "duration"
},
{
"field": "schedule.spec.jitter",
"flag": "--spec.jitter",
"summary": "Random delay added to each fire, at most min(interval, 1h).",
"type": "duration"
},
{
"field": "schedule.spec.overlap_policy",
"flag": "--spec.overlap-policy",
"summary": "What a fire does while a previous Run is still running.",
"type": "enum",
"values": [
"skip",
"buffer_one",
"buffer_all",
"cancel_other",
"allow"
]
},
{
"field": "schedule.spec.catchup_window",
"flag": "--spec.catchup-window",
"summary": "Missed fires older than this are skipped; 10s to 365d.",
"type": "duration"
},
{
"field": "schedule.spec.paused",
"flag": "--spec.paused",
"summary": "Whether fires are paused.",
"type": "bool"
},
{
"field": "schedule.spec.pause_note",
"flag": "--spec.pause-note",
"summary": "Why the Schedule is paused; shown in status.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the schedule when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{schedule.name=orgs/*/projects/*/envs/*/schedules/*}",
"method": "workflows.schedules.update",
"permission": "workflows:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "schedule.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/schedules/{schedule}"
},
"resource_field": "schedule",
"sends_etag": true,
"summary": "Updates a schedule; with `allow_missing` it creates the schedule when it does not exist, so its short name `schedule` is an upsert by name.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the schedule does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/schedules/*}",
"method": "workflows.schedules.delete",
"permission": "workflows:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/schedules/{schedule}"
},
"summary": "Deletes a schedule.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "pause_note",
"flag": "--pause-note",
"summary": "Why the Schedule is paused.",
"type": "string"
},
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/schedules/*}:pause",
"method": "workflows.schedules.pause",
"permission": "workflows:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/schedules/{schedule}"
},
"summary": "Pauses a Schedule: no fire starts a Run until it is resumed.",
"verb": "pause",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Act only if the current etag matches.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/schedules/*}:resume",
"method": "workflows.schedules.resume",
"permission": "workflows:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/schedules/{schedule}"
},
"summary": "Resumes a paused Schedule; missed fires follow `catchup_window`.",
"verb": "resume",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "schedules",
"resource_type": "workflows.sylphx.com/Schedule"
},
{
"collection": "runs",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/workflows/*/runs/*}",
"method": "workflows.runs.get",
"permission": "workflows:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/workflows/{workflow}/runs/{run}"
},
"summary": "Gets a run.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/workflows/*}/runs",
"method": "workflows.runs.list",
"paginates": true,
"permission": "workflows:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/workflows/{workflow}"
},
"summary": "Lists runs.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/workflows/{workflow}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "run.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "run.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "run.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "run.input",
"flag": "--input",
"summary": "The Run input, at most 256 KiB of JSON.",
"type": "json"
},
{
"field": "run.start_delay",
"flag": "--start-delay",
"summary": "Delay the first invocation by this much.",
"type": "duration"
},
{
"field": "run.schedule_time",
"flag": "--schedule-time",
"summary": "When the first invocation is due: set it directly, or through `start_delay`; at most 365 days ahead. A Run cancelled before then closes `cancelled` with no invocation.",
"type": "timestamp"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/workflows/*}/runs",
"method": "workflows.runs.create",
"permission": "workflows:run",
"positional": {
"arg": "ID",
"field": "run_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "run",
"summary": "Starts a Run of a Workflow, now or after `start_delay` or at `schedule_time`. `run_id` is the caller's key: the same key and intent return the same Run, a changed intent is refused. An end user's session may call it on a Workflow whose `callers` is `USERS` when the session holds the Workflow's `permission`.",
"verb": "start"
},
{
"effect": "write",
"flags": [
{
"field": "inputs",
"flag": "--inputs",
"repeated": true,
"required": true,
"summary": "The inputs, one child Run each; at most 10 000.",
"type": "json"
},
{
"field": "max_concurrency",
"flag": "--max-concurrency",
"summary": "At most this many children run at once; 0 is the Workflow's limit.",
"type": "int"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/workflows/*}/runs:startBatch",
"method": "workflows.runs.start_batch",
"permission": "workflows:run",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/workflows/{workflow}"
},
"summary": "Starts a batch: a parent Run that fans out one child Run per item, each with a stable index and count.",
"verb": "start-batch"
},
{
"effect": "write",
"flags": [
{
"field": "signal",
"flag": "--signal",
"required": true,
"summary": "The signal name the handler waits on.",
"type": "string"
},
{
"field": "payload",
"flag": "--payload",
"summary": "The signal payload, at most 64 KiB of JSON.",
"type": "json"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/workflows/*/runs/*}:signal",
"method": "workflows.runs.signal",
"permission": "workflows:run",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/workflows/{workflow}/runs/{run}"
},
"summary": "Sends a named signal to a running Run; a `wait` op for that name resumes with its payload. A signal to a closed Run fails with INVALID_STATE. An end user's session may call it on a Workflow whose `callers` is `USERS` when the session holds the Workflow's `permission`.",
"verb": "signal"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "reason",
"flag": "--reason",
"summary": "Why the Run is cancelled.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/workflows/*/runs/*}:cancel",
"method": "workflows.runs.cancel",
"permission": "workflows:run",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/workflows/{workflow}/runs/{run}"
},
"summary": "Requests cancellation. Timers and waits stop; a running invocation is not interrupted: the handler receives one final invocation with `cancel: true`, and the Run ends `cancelled` when it answers. An end user's session may call it on a Workflow whose `callers` is `USERS` when the session holds the Workflow's `permission`.",
"verb": "cancel"
},
{
"effect": "read",
"flags": [
{
"field": "timeout",
"flag": "--timeout",
"summary": "How long to wait; default 30s, at most 60s.",
"type": "duration"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/workflows/*/runs/*}:wait",
"method": "workflows.runs.wait",
"permission": "workflows:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/workflows/{workflow}/runs/{run}"
},
"summary": "Waits up to `timeout` (at most 60s) for the Run to close, then returns it, closed or not. Its short name is `result`: the closed Run carries the handler's output or error. An end user's session may call it on a Workflow whose `callers` is `USERS` when the session holds the Workflow's `permission`.",
"verb": "wait"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 100, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
}
],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/workflows/*/runs/*}:readHistory",
"method": "workflows.runs.read_history",
"permission": "workflows:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/workflows/{workflow}/runs/{run}"
},
"summary": "Reads a page of the Run's immutable history, projected to Sylphx events.",
"verb": "read-history"
}
],
"noun": "runs",
"resource_type": "workflows.sylphx.com/Run"
},
{
"collection": "jobs",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/jobs/*}",
"method": "workflows.jobs.get",
"permission": "workflows:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/jobs/{job}"
},
"summary": "Gets a job.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/jobs",
"method": "workflows.jobs.list",
"paginates": true,
"permission": "workflows:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists jobs.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "job.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "job.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "job.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "job.spec.service",
"flag": "--spec.service",
"required": true,
"summary": "The Hosting Service whose env and Secret bindings every run takes, and whose live Release image it runs unless `image` or `build` names another, so a Job never runs code the environment does not serve.",
"type": "string"
},
{
"field": "job.spec.image",
"flag": "--spec.image",
"summary": "A digest-pinned image from this org's Artifacts, in place of the service's image. Exclusive with `build`.",
"type": "string"
},
{
"field": "job.spec.command",
"flag": "--spec.command",
"repeated": true,
"summary": "The entrypoint; empty keeps the image's.",
"type": "string"
},
{
"field": "job.spec.args",
"flag": "--spec.args",
"repeated": true,
"summary": "Arguments; a run may replace them.",
"type": "string"
},
{
"field": "job.spec.env",
"flag": "--spec.env",
"repeated": true,
"summary": "Environment overrides on top of the service's env and Secret bindings.",
"type": "key=value"
},
{
"field": "job.spec.instance_type",
"flag": "--spec.instance-type",
"summary": "A Hosting instance type; default `standard`.",
"type": "string"
},
{
"field": "job.spec.timeout",
"flag": "--spec.timeout",
"summary": "One attempt's deadline, 10s to 24h; default 1h.",
"type": "duration"
},
{
"field": "job.spec.max_retries",
"flag": "--spec.max-retries",
"summary": "Re-runs after a non-zero exit, 0 to 10; backoff 30s doubling.",
"type": "int"
},
{
"field": "job.spec.concurrency",
"flag": "--spec.concurrency",
"summary": "What a start does while a run is active; default forbid.",
"type": "enum",
"values": [
"forbid",
"queue",
"allow"
]
},
{
"field": "job.spec.build",
"flag": "--spec.build",
"summary": "A build the project declares: its latest built image, in place of the service's; the image needs no running service of its own. Exclusive with `image`.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/jobs",
"method": "workflows.jobs.create",
"permission": "workflows:write",
"positional": {
"arg": "ID",
"field": "job_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "job",
"summary": "Creates a job.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "job.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "job.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "job.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "job.spec.service",
"flag": "--spec.service",
"required": true,
"summary": "The Hosting Service whose env and Secret bindings every run takes, and whose live Release image it runs unless `image` or `build` names another, so a Job never runs code the environment does not serve.",
"type": "string"
},
{
"field": "job.spec.image",
"flag": "--spec.image",
"summary": "A digest-pinned image from this org's Artifacts, in place of the service's image. Exclusive with `build`.",
"type": "string"
},
{
"field": "job.spec.command",
"flag": "--spec.command",
"repeated": true,
"summary": "The entrypoint; empty keeps the image's.",
"type": "string"
},
{
"field": "job.spec.args",
"flag": "--spec.args",
"repeated": true,
"summary": "Arguments; a run may replace them.",
"type": "string"
},
{
"field": "job.spec.env",
"flag": "--spec.env",
"repeated": true,
"summary": "Environment overrides on top of the service's env and Secret bindings.",
"type": "key=value"
},
{
"field": "job.spec.instance_type",
"flag": "--spec.instance-type",
"summary": "A Hosting instance type; default `standard`.",
"type": "string"
},
{
"field": "job.spec.timeout",
"flag": "--spec.timeout",
"summary": "One attempt's deadline, 10s to 24h; default 1h.",
"type": "duration"
},
{
"field": "job.spec.max_retries",
"flag": "--spec.max-retries",
"summary": "Re-runs after a non-zero exit, 0 to 10; backoff 30s doubling.",
"type": "int"
},
{
"field": "job.spec.concurrency",
"flag": "--spec.concurrency",
"summary": "What a start does while a run is active; default forbid.",
"type": "enum",
"values": [
"forbid",
"queue",
"allow"
]
},
{
"field": "job.spec.build",
"flag": "--spec.build",
"summary": "A build the project declares: its latest built image, in place of the service's; the image needs no running service of its own. Exclusive with `image`.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the job when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{job.name=orgs/*/projects/*/envs/*/jobs/*}",
"method": "workflows.jobs.update",
"permission": "workflows:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "job.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/jobs/{job}"
},
"resource_field": "job",
"sends_etag": true,
"summary": "Updates a job. Runs already started keep the generation they pinned.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the job does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also cancel active runs and delete Schedules targeting the job; without it a job with an active run or a Schedule fails with INVALID_STATE.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/jobs/*}",
"method": "workflows.jobs.delete",
"permission": "workflows:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/jobs/{job}"
},
"summary": "Deletes a job.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "jobs",
"resource_type": "workflows.sylphx.com/Job"
},
{
"collection": "job_runs",
"commands": [
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/jobs/{job}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "job_run.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "job_run.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "job_run.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "job_run.args",
"flag": "--args",
"repeated": true,
"summary": "Arguments of this run (the Job's when empty).",
"type": "string"
},
{
"field": "job_run.env",
"flag": "--env",
"repeated": true,
"summary": "Environment overrides of this run.",
"type": "key=value"
},
{
"field": "job_run.schedule_time",
"flag": "--schedule-time",
"summary": "Start no earlier than this: set it directly, or through `start_delay`; at most 365 days ahead. A run cancelled before then makes no attempt.",
"type": "timestamp"
},
{
"field": "job_run.start_delay",
"flag": "--start-delay",
"summary": "Start no earlier than this long after the request.",
"type": "duration"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/jobs/*}/job_runs",
"method": "workflows.job_runs.create",
"permission": "workflows:run",
"positional": {
"arg": "ID",
"field": "job_run_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "job_run",
"summary": "Starts a run of a Job now. The same `Idempotency-Key` returns the same run for 24h; a Schedule fire uses `{job}:{intended time}`. With concurrency `forbid`, a start while a run is active fails with INVALID_STATE.",
"verb": "run"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/jobs/*/job_runs/*}",
"method": "workflows.job_runs.get",
"permission": "workflows:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/jobs/{job}/job_runs/{job_run}"
},
"summary": "Gets a job run.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/jobs/*}/job_runs",
"method": "workflows.job_runs.list",
"paginates": true,
"permission": "workflows:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/jobs/{job}"
},
"summary": "Lists a job's runs, newest first.",
"verb": "list"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "reason",
"flag": "--reason",
"summary": "Why the run is cancelled.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/jobs/*/job_runs/*}:cancel",
"method": "workflows.job_runs.cancel",
"permission": "workflows:run",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/jobs/{job}/job_runs/{job_run}"
},
"summary": "Cancels a job run: SIGTERM, then SIGKILL after 30s. A closed run fails with INVALID_STATE.",
"verb": "cancel"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many lines; default 500, clamped to 5000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "wait",
"flag": "--wait",
"summary": "On a running run, wait up to this long (at most 30s) for new lines before returning an empty page.",
"type": "duration"
}
],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/jobs/*/job_runs/*}:readLogs",
"method": "workflows.job_runs.read_logs",
"permission": "workflows:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/jobs/{job}/job_runs/{job_run}"
},
"summary": "Reads a page of a job run's log lines, oldest first. With `wait`, an empty page on a running run waits up to that long for new lines, so a client follows the log by passing each `next_page_token` back.",
"verb": "read-logs"
}
],
"noun": "job-runs",
"resource_type": "workflows.sylphx.com/JobRun"
},
{
"collection": "distributed_jobs",
"commands": [
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/distributed_jobs/*}",
"method": "workflows.distributed_jobs.get",
"permission": "workflows:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/distributed_jobs/{distributed_job}"
},
"summary": "Gets a distributed job.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*}/distributed_jobs",
"method": "workflows.distributed_jobs.list",
"paginates": true,
"permission": "workflows:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}"
},
"summary": "Lists distributed jobs.",
"verb": "list"
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "distributed_job.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "distributed_job.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "distributed_job.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "distributed_job.spec.worker.service",
"flag": "--spec.worker.service",
"required": true,
"summary": "The Hosting Service whose env and Secret bindings every run takes, and whose live Release image it runs unless `image` or `build` names another, so a Job never runs code the environment does not serve.",
"type": "string"
},
{
"field": "distributed_job.spec.worker.image",
"flag": "--spec.worker.image",
"summary": "A digest-pinned image from this org's Artifacts, in place of the service's image. Exclusive with `build`.",
"type": "string"
},
{
"field": "distributed_job.spec.worker.command",
"flag": "--spec.worker.command",
"repeated": true,
"summary": "The entrypoint; empty keeps the image's.",
"type": "string"
},
{
"field": "distributed_job.spec.worker.args",
"flag": "--spec.worker.args",
"repeated": true,
"summary": "Arguments; a run may replace them.",
"type": "string"
},
{
"field": "distributed_job.spec.worker.env",
"flag": "--spec.worker.env",
"repeated": true,
"summary": "Environment overrides on top of the service's env and Secret bindings.",
"type": "key=value"
},
{
"field": "distributed_job.spec.worker.instance_type",
"flag": "--spec.worker.instance-type",
"summary": "A Hosting instance type; default `standard`.",
"type": "string"
},
{
"field": "distributed_job.spec.worker.timeout",
"flag": "--spec.worker.timeout",
"summary": "One attempt's deadline, 10s to 24h; default 1h.",
"type": "duration"
},
{
"field": "distributed_job.spec.worker.max_retries",
"flag": "--spec.worker.max-retries",
"summary": "Re-runs after a non-zero exit, 0 to 10; backoff 30s doubling.",
"type": "int"
},
{
"field": "distributed_job.spec.worker.concurrency",
"flag": "--spec.worker.concurrency",
"summary": "What a start does while a run is active; default forbid.",
"type": "enum",
"values": [
"forbid",
"queue",
"allow"
]
},
{
"field": "distributed_job.spec.worker.build",
"flag": "--spec.worker.build",
"summary": "A build the project declares: its latest built image, in place of the service's; the image needs no running service of its own. Exclusive with `image`.",
"type": "string"
},
{
"field": "distributed_job.spec.worker_class",
"flag": "--spec.worker-class",
"summary": "Price and preemption class; default scavenger.",
"type": "enum",
"values": [
"scavenger",
"standard"
]
},
{
"field": "distributed_job.spec.scale.min_workers",
"flag": "--spec.scale.min-workers",
"summary": "Workers kept while shards remain; default 1.",
"type": "int"
},
{
"field": "distributed_job.spec.scale.max_workers",
"flag": "--spec.scale.max-workers",
"summary": "The most workers at once; the Cell and the org quota cap it too. Default 1.",
"type": "int"
},
{
"field": "distributed_job.spec.scratch_gib",
"flag": "--spec.scratch-gib",
"summary": "Local scratch disk at `/scratch` per worker, GiB; 0 is none.",
"type": "int"
},
{
"field": "distributed_job.spec.shard_count",
"flag": "--spec.shard-count",
"summary": "A run that brings no shards of its own gets this many index-only shards.",
"type": "int"
},
{
"field": "distributed_job.spec.shard_timeout",
"flag": "--spec.shard-timeout",
"summary": "The longest one lease may live without the shard ending; default 30m.",
"type": "duration"
},
{
"field": "distributed_job.spec.shard_retries",
"flag": "--spec.shard-retries",
"summary": "Attempts a shard gets after a failure; a preemption is not one. Default 3.",
"type": "int"
},
{
"field": "distributed_job.spec.max_failed_shards",
"flag": "--spec.max-failed-shards",
"summary": "Failed shards the run tolerates before it fails; default 0.",
"type": "int"
},
{
"field": "distributed_job.spec.run_timeout",
"flag": "--spec.run-timeout",
"summary": "The whole run's deadline; default 48h.",
"type": "duration"
},
{
"field": "distributed_job.spec.checkpoint_uri",
"flag": "--spec.checkpoint-uri",
"summary": "`data://<bucket>/<prefix>/`: checkpoints go under `<run>/<shard>/`.",
"type": "string"
},
{
"field": "distributed_job.spec.output_uri",
"flag": "--spec.output-uri",
"summary": "`data://<bucket>/<prefix>/`: outputs go under `<run>/<shard>/`.",
"type": "string"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*}/distributed_jobs",
"method": "workflows.distributed_jobs.create",
"permission": "workflows:write",
"positional": {
"arg": "ID",
"field": "distributed_job_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "distributed_job",
"summary": "Creates a distributed job.",
"verb": "create",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"field": "distributed_job.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "distributed_job.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "distributed_job.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "distributed_job.spec.worker.service",
"flag": "--spec.worker.service",
"required": true,
"summary": "The Hosting Service whose env and Secret bindings every run takes, and whose live Release image it runs unless `image` or `build` names another, so a Job never runs code the environment does not serve.",
"type": "string"
},
{
"field": "distributed_job.spec.worker.image",
"flag": "--spec.worker.image",
"summary": "A digest-pinned image from this org's Artifacts, in place of the service's image. Exclusive with `build`.",
"type": "string"
},
{
"field": "distributed_job.spec.worker.command",
"flag": "--spec.worker.command",
"repeated": true,
"summary": "The entrypoint; empty keeps the image's.",
"type": "string"
},
{
"field": "distributed_job.spec.worker.args",
"flag": "--spec.worker.args",
"repeated": true,
"summary": "Arguments; a run may replace them.",
"type": "string"
},
{
"field": "distributed_job.spec.worker.env",
"flag": "--spec.worker.env",
"repeated": true,
"summary": "Environment overrides on top of the service's env and Secret bindings.",
"type": "key=value"
},
{
"field": "distributed_job.spec.worker.instance_type",
"flag": "--spec.worker.instance-type",
"summary": "A Hosting instance type; default `standard`.",
"type": "string"
},
{
"field": "distributed_job.spec.worker.timeout",
"flag": "--spec.worker.timeout",
"summary": "One attempt's deadline, 10s to 24h; default 1h.",
"type": "duration"
},
{
"field": "distributed_job.spec.worker.max_retries",
"flag": "--spec.worker.max-retries",
"summary": "Re-runs after a non-zero exit, 0 to 10; backoff 30s doubling.",
"type": "int"
},
{
"field": "distributed_job.spec.worker.concurrency",
"flag": "--spec.worker.concurrency",
"summary": "What a start does while a run is active; default forbid.",
"type": "enum",
"values": [
"forbid",
"queue",
"allow"
]
},
{
"field": "distributed_job.spec.worker.build",
"flag": "--spec.worker.build",
"summary": "A build the project declares: its latest built image, in place of the service's; the image needs no running service of its own. Exclusive with `image`.",
"type": "string"
},
{
"field": "distributed_job.spec.worker_class",
"flag": "--spec.worker-class",
"summary": "Price and preemption class; default scavenger.",
"type": "enum",
"values": [
"scavenger",
"standard"
]
},
{
"field": "distributed_job.spec.scale.min_workers",
"flag": "--spec.scale.min-workers",
"summary": "Workers kept while shards remain; default 1.",
"type": "int"
},
{
"field": "distributed_job.spec.scale.max_workers",
"flag": "--spec.scale.max-workers",
"summary": "The most workers at once; the Cell and the org quota cap it too. Default 1.",
"type": "int"
},
{
"field": "distributed_job.spec.scratch_gib",
"flag": "--spec.scratch-gib",
"summary": "Local scratch disk at `/scratch` per worker, GiB; 0 is none.",
"type": "int"
},
{
"field": "distributed_job.spec.shard_count",
"flag": "--spec.shard-count",
"summary": "A run that brings no shards of its own gets this many index-only shards.",
"type": "int"
},
{
"field": "distributed_job.spec.shard_timeout",
"flag": "--spec.shard-timeout",
"summary": "The longest one lease may live without the shard ending; default 30m.",
"type": "duration"
},
{
"field": "distributed_job.spec.shard_retries",
"flag": "--spec.shard-retries",
"summary": "Attempts a shard gets after a failure; a preemption is not one. Default 3.",
"type": "int"
},
{
"field": "distributed_job.spec.max_failed_shards",
"flag": "--spec.max-failed-shards",
"summary": "Failed shards the run tolerates before it fails; default 0.",
"type": "int"
},
{
"field": "distributed_job.spec.run_timeout",
"flag": "--spec.run-timeout",
"summary": "The whole run's deadline; default 48h.",
"type": "duration"
},
{
"field": "distributed_job.spec.checkpoint_uri",
"flag": "--spec.checkpoint-uri",
"summary": "`data://<bucket>/<prefix>/`: checkpoints go under `<run>/<shard>/`.",
"type": "string"
},
{
"field": "distributed_job.spec.output_uri",
"flag": "--spec.output-uri",
"summary": "`data://<bucket>/<prefix>/`: outputs go under `<run>/<shard>/`.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the distributed job when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{distributed_job.name=orgs/*/projects/*/envs/*/distributed_jobs/*}",
"method": "workflows.distributed_jobs.update",
"permission": "workflows:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "distributed_job.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/distributed_jobs/{distributed_job}"
},
"resource_field": "distributed_job",
"sends_etag": true,
"summary": "Updates a distributed job. Runs already started keep the generation they pinned.",
"update_mask": "from-flags",
"verb": "update",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "etag",
"flag": "--etag",
"summary": "Delete only if the current etag matches.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Succeed when the distributed job does not exist.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
},
{
"field": "force",
"flag": "--force",
"summary": "Also cancel active runs; without it a job with an active run fails with INVALID_STATE.",
"type": "bool"
}
],
"http": "DELETE /v1/{name=orgs/*/projects/*/envs/*/distributed_jobs/*}",
"method": "workflows.distributed_jobs.delete",
"permission": "workflows:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/distributed_jobs/{distributed_job}"
},
"summary": "Deletes a distributed job.",
"verb": "delete",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
}
],
"noun": "distributed-jobs",
"resource_type": "workflows.sylphx.com/DistributedJob"
},
{
"collection": "distributed_runs",
"commands": [
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/distributed_jobs/{distributed_job}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "distributed_run.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "distributed_run.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "distributed_run.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "distributed_run.args",
"flag": "--args",
"repeated": true,
"summary": "Arguments of every worker of this run (the job's when empty).",
"type": "string"
},
{
"field": "distributed_run.env",
"flag": "--env",
"repeated": true,
"summary": "Environment overrides of this run.",
"type": "key=value"
},
{
"field": "distributed_run.shards",
"flag": "--shards",
"repeated": true,
"summary": "The run's own shards (the customer's planner output); without them the job's `shard_count` makes index-only shards.",
"type": "json"
},
{
"field": "distributed_run.open_manifest",
"flag": "--open-manifest",
"summary": "Keep the manifest open: `:addShards` appends until it is closed.",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/distributed_jobs/*}/distributed_runs",
"method": "workflows.distributed_runs.create",
"permission": "workflows:run",
"positional": {
"arg": "ID",
"field": "distributed_run_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "distributed_run",
"summary": "Starts a run of a distributed job. The same `Idempotency-Key` returns the same run for 24h.",
"verb": "run"
},
{
"effect": "read",
"flags": [],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/distributed_jobs/*/distributed_runs/*}",
"method": "workflows.distributed_runs.get",
"permission": "workflows:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/distributed_jobs/{distributed_job}/distributed_runs/{distributed_run}"
},
"summary": "Gets a distributed run: its state, shard and worker counts, and usage.",
"verb": "get"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 50, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "filter",
"flag": "--filter",
"summary": "AIP-160 filter over labels and filterable fields.",
"type": "string"
},
{
"field": "order_by",
"flag": "--order-by",
"summary": "AIP-132 ordering over filterable fields.",
"type": "string"
}
],
"http": "GET /v1/{parent=orgs/*/projects/*/envs/*/distributed_jobs/*}/distributed_runs",
"method": "workflows.distributed_runs.list",
"paginates": true,
"permission": "workflows:read",
"positional": {
"arg": "PARENT",
"default_from_context": true,
"field": "parent",
"optional": true,
"pattern": "orgs/{org}/projects/{project}/envs/{env}/distributed_jobs/{distributed_job}"
},
"summary": "Lists a distributed job's runs, newest first.",
"verb": "list"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "reason",
"flag": "--reason",
"summary": "Why the run is cancelled.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/distributed_jobs/*/distributed_runs/*}:cancel",
"method": "workflows.distributed_runs.cancel",
"permission": "workflows:run",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/distributed_jobs/{distributed_job}/distributed_runs/{distributed_run}"
},
"summary": "Cancels a distributed run: workers get SIGTERM and 30s, then leases are released; finished shards are kept. A closed run fails with INVALID_STATE.",
"verb": "cancel"
},
{
"effect": "write",
"flags": [
{
"field": "shards",
"flag": "--shards",
"repeated": true,
"summary": "The shards to append.",
"type": "json"
},
{
"field": "close",
"flag": "--close",
"summary": "Close the manifest: the run ends once its shards are done.",
"type": "bool"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/distributed_jobs/*/distributed_runs/*}:addShards",
"method": "workflows.distributed_runs.add_shards",
"permission": "workflows:run",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/distributed_jobs/{distributed_job}/distributed_runs/{distributed_run}"
},
"summary": "Appends shards to a run started with an open manifest; `close` ends the manifest, and the run ends once those shards are done.",
"verb": "add-shards"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 100, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
},
{
"field": "state_filter",
"flag": "--state-filter",
"summary": "Only shards in this state; unset reads every shard.",
"type": "enum",
"values": [
"pending",
"leased",
"succeeded",
"failed"
]
}
],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/distributed_jobs/*/distributed_runs/*}:readShards",
"method": "workflows.distributed_runs.read_shards",
"permission": "workflows:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/distributed_jobs/{distributed_job}/distributed_runs/{distributed_run}"
},
"summary": "Reads a page of the run's shards, in queue order.",
"verb": "read-shards"
},
{
"effect": "read",
"flags": [
{
"field": "page_size",
"flag": "--page-size",
"summary": "At most this many; default 100, clamped to 1000.",
"type": "int"
},
{
"field": "page_token",
"flag": "--page-token",
"summary": "`next_page_token` of the previous page.",
"type": "string"
}
],
"http": "GET /v1/{name=orgs/*/projects/*/envs/*/distributed_jobs/*/distributed_runs/*}:readWorkers",
"method": "workflows.distributed_runs.read_workers",
"permission": "workflows:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/distributed_jobs/{distributed_job}/distributed_runs/{distributed_run}"
},
"summary": "Reads a page of the run's workers.",
"verb": "read-workers"
}
],
"noun": "distributed-runs",
"resource_type": "workflows.sylphx.com/DistributedRun"
}
],
"commands": [],
"display_name": "Sylphx Workflows",
"noun": "workflows",
"porcelain": [
{
"effect": "write",
"flags": [
{
"field": "schedule.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "schedule.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "schedule.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "schedule.spec.workflow",
"flag": "--spec.workflow",
"required": true,
"summary": "The Workflow the Schedule starts, in the same environment.",
"type": "string"
},
{
"field": "schedule.spec.input",
"flag": "--spec.input",
"summary": "The input of every Run, at most 64 KiB of JSON.",
"type": "json"
},
{
"field": "schedule.spec.calendar.cron",
"flag": "--spec.calendar.cron",
"summary": "A 5-field cron expression, for example `0 3 * * *`.",
"type": "string"
},
{
"field": "schedule.spec.calendar.time_zone",
"flag": "--spec.calendar.time-zone",
"summary": "IANA time zone; default `UTC`.",
"type": "string"
},
{
"field": "schedule.spec.interval.every",
"flag": "--spec.interval.every",
"summary": "The period, 1s to 365d.",
"type": "duration"
},
{
"field": "schedule.spec.interval.offset",
"flag": "--spec.interval.offset",
"summary": "Phase offset within each period.",
"type": "duration"
},
{
"field": "schedule.spec.jitter",
"flag": "--spec.jitter",
"summary": "Random delay added to each fire, at most min(interval, 1h).",
"type": "duration"
},
{
"field": "schedule.spec.overlap_policy",
"flag": "--spec.overlap-policy",
"summary": "What a fire does while a previous Run is still running.",
"type": "enum",
"values": [
"skip",
"buffer_one",
"buffer_all",
"cancel_other",
"allow"
]
},
{
"field": "schedule.spec.catchup_window",
"flag": "--spec.catchup-window",
"summary": "Missed fires older than this are skipped; 10s to 365d.",
"type": "duration"
},
{
"field": "schedule.spec.paused",
"flag": "--spec.paused",
"summary": "Whether fires are paused.",
"type": "bool"
},
{
"field": "schedule.spec.pause_note",
"flag": "--spec.pause-note",
"summary": "Why the Schedule is paused; shown in status.",
"type": "string"
},
{
"field": "allow_missing",
"flag": "--allow-missing",
"summary": "Create the schedule when it does not exist (declarative upsert).",
"type": "bool"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "PATCH /v1/{schedule.name=orgs/*/projects/*/envs/*/schedules/*}",
"method": "workflows.schedules.update",
"path": [],
"permission": "workflows:write",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "schedule.name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/schedules/{schedule}"
},
"resource_field": "schedule",
"sends_etag": true,
"summary": "Updates a schedule; with `allow_missing` it creates the schedule when it does not exist, so its short name `schedule` is an upsert by name.",
"update_mask": "from-flags",
"verb": "schedule",
"waits": {
"default": true,
"skip_flag": "--no-wait"
}
},
{
"effect": "write",
"flags": [
{
"default_from_context": true,
"field": "parent",
"flag": "--parent",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/workflows/{workflow}",
"summary": "The parent to create in; defaults to the linked project or the key's scope.",
"type": "string"
},
{
"field": "run.meta.labels",
"flag": "--meta.labels",
"repeated": true,
"summary": "Caller-writable, indexed labels (AIP-122 label rules).",
"type": "key=value"
},
{
"field": "run.meta.annotations",
"flag": "--meta.annotations",
"repeated": true,
"summary": "Caller-writable, unindexed annotations.",
"type": "key=value"
},
{
"field": "run.meta.display_name",
"flag": "--meta.display-name",
"summary": "Caller-writable human-readable name.",
"type": "string"
},
{
"field": "run.input",
"flag": "--input",
"summary": "The Run input, at most 256 KiB of JSON.",
"type": "json"
},
{
"field": "run.start_delay",
"flag": "--start-delay",
"summary": "Delay the first invocation by this much.",
"type": "duration"
},
{
"field": "run.schedule_time",
"flag": "--schedule-time",
"summary": "When the first invocation is due: set it directly, or through `start_delay`; at most 365 days ahead. A Run cancelled before then closes `cancelled` with no invocation.",
"type": "timestamp"
},
{
"field": "validate_only",
"flag": "--dry-run",
"summary": "Validate and print the result without writing (validate_only).",
"type": "bool"
}
],
"http": "POST /v1/{parent=orgs/*/projects/*/envs/*/workflows/*}/runs",
"method": "workflows.runs.create",
"path": [],
"permission": "workflows:run",
"positional": {
"arg": "ID",
"field": "run_id",
"optional": true,
"summary": "The id segment of the new Resource's name; the server assigns one when omitted."
},
"resource_field": "run",
"summary": "Starts a Run of a Workflow, now or after `start_delay` or at `schedule_time`. `run_id` is the caller's key: the same key and intent return the same Run, a changed intent is refused. An end user's session may call it on a Workflow whose `callers` is `USERS` when the session holds the Workflow's `permission`.",
"verb": "start"
},
{
"effect": "write",
"flags": [
{
"field": "signal",
"flag": "--signal",
"required": true,
"summary": "The signal name the handler waits on.",
"type": "string"
},
{
"field": "payload",
"flag": "--payload",
"summary": "The signal payload, at most 64 KiB of JSON.",
"type": "json"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/workflows/*/runs/*}:signal",
"method": "workflows.runs.signal",
"path": [],
"permission": "workflows:run",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/workflows/{workflow}/runs/{run}"
},
"summary": "Sends a named signal to a running Run; a `wait` op for that name resumes with its payload. A signal to a closed Run fails with INVALID_STATE. An end user's session may call it on a Workflow whose `callers` is `USERS` when the session holds the Workflow's `permission`.",
"verb": "signal"
},
{
"confirm": {
"prompt": true,
"skip_flag": "--yes"
},
"effect": "destructive",
"flags": [
{
"field": "reason",
"flag": "--reason",
"summary": "Why the Run is cancelled.",
"type": "string"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/workflows/*/runs/*}:cancel",
"method": "workflows.runs.cancel",
"path": [],
"permission": "workflows:run",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/workflows/{workflow}/runs/{run}"
},
"summary": "Requests cancellation. Timers and waits stop; a running invocation is not interrupted: the handler receives one final invocation with `cancel: true`, and the Run ends `cancelled` when it answers. An end user's session may call it on a Workflow whose `callers` is `USERS` when the session holds the Workflow's `permission`.",
"verb": "cancel"
},
{
"effect": "read",
"flags": [
{
"field": "timeout",
"flag": "--timeout",
"summary": "How long to wait; default 30s, at most 60s.",
"type": "duration"
}
],
"http": "POST /v1/{name=orgs/*/projects/*/envs/*/workflows/*/runs/*}:wait",
"method": "workflows.runs.wait",
"path": [],
"permission": "workflows:read",
"positional": {
"arg": "NAME",
"default_from_context": false,
"field": "name",
"pattern": "orgs/{org}/projects/{project}/envs/{env}/workflows/{workflow}/runs/{run}"
},
"summary": "Waits up to `timeout` (at most 60s) for the Run to close, then returns it, closed or not. Its short name is `result`: the closed Run carries the handler's output or error. An end user's session may call it on a Workflow whose `callers` is `USERS` when the session holds the Workflow's `permission`.",
"verb": "result"
}
],
"stage": "preview"
}
],
"usage": "sylphx <service> <collection> <verb> [NAME|PARENT] [--flags]"
}