HelmrClient
HelmrClient calls the Developer API with an API key. It always acts with its
own credentials, including when it is constructed inside Agent code; it never
inherits a Session’s runtime authority.
import { HelmrClient } from "@helmr/sdk"
const url = process.env["HELMR_API_URL"]
if (!url) throw new Error("Set HELMR_API_URL to your control plane URL")
const client = new HelmrClient({ url, apiKey: process.env["HELMR_API_KEY"]! })
Options
interface HelmrClientOptions {
readonly url?: string
readonly apiKey: string
readonly fetch?: typeof fetch
}
| Option | Description |
|---|---|
apiKey |
Required. An Environment-scoped API key, sent as Authorization: Bearer <key>. Surrounding whitespace is trimmed; an empty key throws. |
url |
Control plane origin. Must use HTTPS, except http://localhost, http://127.0.0.1 and http://[::1]. Must not contain credentials, a path, query or fragment. Defaults to https://api.helmr.dev, the planned managed service; set it explicitly for a self-hosted control plane. |
fetch |
Custom fetch implementation. Defaults to globalThis.fetch. |
The SDK does not read HELMR_API_URL or HELMR_API_KEY itself. API keys and
their permissions are described in Authentication.
Properties
| Property | Methods | Reference |
|---|---|---|
agents |
get, list |
Agent |
sessions |
create, get, list, ref |
Agent |
templates |
get, list |
Computer |
computers |
create, get, list, ref |
Computer |
commands |
ref |
Computer |
deployments |
list, current, get |
Deployments |
triggers |
get, list |
Triggers |
secrets |
create, get, list, ref |
Secrets |
Every method accepts an optional final RequestOptions argument,
{ signal?: AbortSignal }. Turn and Command waits take { timeout?, signal? }
instead. List methods return { items, nextCursor? }; definition pages also
include deploymentId. Treat cursors as opaque.
Errors
A non-2xx response rejects with an Error whose name is "HelmrError":
interface HelmrError extends Error {
readonly code: string
readonly details?: Readonly<Record<string, JsonValue>>
readonly requestId?: string
}
code comes from the response’s error body, or from the HTTP status when the
body has none. requestId is the X-Request-ID response header. Codes are
listed in Errors. Use the exported isHelmrError
guard when catching an unknown value:
try {
await client.sessions.get(sessionId)
} catch (error) {
if (isHelmrError(error)) console.error(error.code, error.requestId)
else throw error
}
Import isHelmrError from @helmr/sdk. Network and abort errors retain their
native identity and are not automatically converted to API errors.
Deployments
client.deployments.list(query?: { cursor?: string; limit?: number }, options?): Promise<CursorPage<DeploymentListItem>>
client.deployments.current(options?): Promise<Deployment | null>
client.deployments.get(deploymentId: string, options?): Promise<Deployment>
Deployment and DeploymentListItem are { id, version, bundleDigest, createdAt }.
current() resolves to null when the Environment has no current Deployment.
limit is 1–100. See Projects.
Secrets
client.secrets.create(request: { secret: string; value: string; idempotencyKey?: string }, options?): Promise<Secret>
client.secrets.get(id: string, options?): Promise<Secret>
client.secrets.list(query?: SecretListQuery, options?): Promise<CursorPage<Secret>>
client.secrets.ref(id: string): SecretRef
interface SecretRef {
readonly secret: string
rotate(request: { value: string; idempotencyKey?: string }, options?): Promise<Secret>
revoke(request?: { idempotencyKey?: string }, options?): Promise<Secret>
}
SecretListQuery is { cursor?, limit? } (limit 1–100). Use get("GITHUB_TOKEN")
for a direct lookup by the same identifier used in your bindings. rotate and
revoke generate a new idempotencyKey per call when you omit one; pass the
same key to retry one operation after a lost response. A replayed revoke
returns its original result and never revokes the Secret again after a later
rotation.
rotate sets the next version of the same Secret. Rotating a revoked Secret
reactivates it with its existing bindings. create only makes new names: an
active name fails with conflict, and a revoked name fails with
secret_revoked; rotate it instead.
Secret is { secret, status, createdAt, rotatedAt?, revokedAt? }, where
status is "active" or "revoked". Reads never return the value. Bind
Secrets to Computers with { secret: "GITHUB_TOKEN", env: { ... } }; see Computer
and Secrets.