From 9145d064670b4eb38fea6f4bf0f5c9f3b46653d2 Mon Sep 17 00:00:00 2001 From: "kernel-internal[bot]" <260533166+kernel-internal[bot]@users.noreply.github.com> Date: Fri, 14 Aug 2026 15:23:19 +0000 Subject: [PATCH 1/3] feat: Point at pending stlc seal-tracking PRs Stainless-Generated-From: 3b844df3156f6877d15d8eb40b30f5d76b62e959 --- src/resources/images.ts | 9 +++++++++ src/resources/pushes.ts | 18 ++++++++++++------ tests/api-resources/images.test.ts | 5 +++++ 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/resources/images.ts b/src/resources/images.ts index 7ea89f4..1422968 100644 --- a/src/resources/images.ts +++ b/src/resources/images.ts @@ -1,6 +1,7 @@ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. import { APIResource } from '../core/resource'; +import * as PushesAPI from './pushes'; import { APIPromise } from '../core/api-promise'; import { buildHeaders } from '../internal/headers'; import { RequestOptions } from '../internal/request-options'; @@ -139,6 +140,14 @@ export interface ImageCreateParams { */ name: string; + /** + * Docker-style registry credentials borrowed for one image pull or push request. + * They remain in memory and are never persisted or logged. When omitted or empty, + * the server's own registry credentials are used. An interrupted credentialed + * operation must be retried with fresh credentials. + */ + credentials?: PushesAPI.PushCredentials; + /** * Target platform as os/arch[/variant] (e.g. "linux/amd64"), matching Docker * --platform. Omit for the host platform. Not a fixed enum: the os/arch[/variant] diff --git a/src/resources/pushes.ts b/src/resources/pushes.ts index 38a4488..76b03a7 100644 --- a/src/resources/pushes.ts +++ b/src/resources/pushes.ts @@ -61,8 +61,10 @@ export interface CreatePushRequest { target: string; /** - * Registry credentials borrowed for this push only. When omitted, the server's own - * registry credentials are used. + * Docker-style registry credentials borrowed for one image pull or push request. + * They remain in memory and are never persisted or logged. When omitted or empty, + * the server's own registry credentials are used. An interrupted credentialed + * operation must be retried with fresh credentials. */ credentials?: PushCredentials; @@ -121,8 +123,10 @@ export interface Push { } /** - * Registry credentials borrowed for this push only. When omitted, the server's own - * registry credentials are used. + * Docker-style registry credentials borrowed for one image pull or push request. + * They remain in memory and are never persisted or logged. When omitted or empty, + * the server's own registry credentials are used. An interrupted credentialed + * operation must be retried with fresh credentials. */ export interface PushCredentials { /** @@ -157,8 +161,10 @@ export interface PushCreateParams { target: string; /** - * Registry credentials borrowed for this push only. When omitted, the server's own - * registry credentials are used. + * Docker-style registry credentials borrowed for one image pull or push request. + * They remain in memory and are never persisted or logged. When omitted or empty, + * the server's own registry credentials are used. An interrupted credentialed + * operation must be retried with fresh credentials. */ credentials?: PushCredentials; diff --git a/tests/api-resources/images.test.ts b/tests/api-resources/images.test.ts index 2e2514d..9d279e2 100644 --- a/tests/api-resources/images.test.ts +++ b/tests/api-resources/images.test.ts @@ -24,6 +24,11 @@ describe('resource images', () => { test.skip('create: required and optional params', async () => { const response = await client.images.create({ name: 'docker.io/library/nginx:latest', + credentials: { + password: 'password', + registry_token: 'registry_token', + username: 'username', + }, platform: 'linux/amd64', tags: { team: 'backend', env: 'staging' }, }); From b038e6f5153fb7311cbefe74d7630ac81f19f12c Mon Sep 17 00:00:00 2001 From: "kernel-internal[bot]" <260533166+kernel-internal[bot]@users.noreply.github.com> Date: Mon, 17 Aug 2026 18:57:04 +0000 Subject: [PATCH 2/3] feat: add Python SDK WebSocket primitives Stainless-Generated-From: c0758e9db2158528211faa1bc87054cce107602a --- .stats.yml | 2 +- api.md | 16 ++ src/client.ts | 20 +++ src/resources/capabilities.ts | 180 +++++++++++++++++++++++ src/resources/index.ts | 9 ++ tests/api-resources/capabilities.test.ts | 22 +++ 6 files changed, 248 insertions(+), 1 deletion(-) create mode 100644 src/resources/capabilities.ts create mode 100644 tests/api-resources/capabilities.test.ts diff --git a/.stats.yml b/.stats.yml index 1c9b72d..2814bb7 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1 +1 @@ -configured_endpoints: 61 +configured_endpoints: 62 diff --git a/api.md b/api.md index 8328676..a44fa0d 100644 --- a/api.md +++ b/api.md @@ -14,6 +14,22 @@ Methods: - client.health.check() -> HealthCheckResponse +# Capabilities + +Types: + +- Capabilities +- CapabilitiesDefaultRuntime +- CapabilitiesHost +- CapabilitiesImages +- CapabilitiesNetwork +- CapabilitiesRuntime +- CapabilitiesServer + +Methods: + +- client.capabilities.get() -> Capabilities + # Images Types: diff --git a/src/client.ts b/src/client.ts index a7f4306..541b37f 100644 --- a/src/client.ts +++ b/src/client.ts @@ -37,6 +37,15 @@ import { BuildStatus, Builds, } from './resources/builds'; +import { + Capabilities, + CapabilitiesDefaultRuntime, + CapabilitiesHost, + CapabilitiesImages, + CapabilitiesNetwork, + CapabilitiesRuntime, + CapabilitiesServer, +} from './resources/capabilities'; import { AvailableDevice, Device, @@ -850,6 +859,7 @@ export class Hypeman { static toFile = Uploads.toFile; health: API.Health = new API.Health(this); + capabilities: API.Capabilities = new API.Capabilities(this); images: API.Images = new API.Images(this); instances: API.Instances = new API.Instances(this); snapshots: API.Snapshots = new API.Snapshots(this); @@ -878,6 +888,16 @@ export declare namespace Hypeman { export { Health as Health, type HealthCheckResponse as HealthCheckResponse }; + export { + type Capabilities as Capabilities, + type CapabilitiesDefaultRuntime as CapabilitiesDefaultRuntime, + type CapabilitiesHost as CapabilitiesHost, + type CapabilitiesImages as CapabilitiesImages, + type CapabilitiesNetwork as CapabilitiesNetwork, + type CapabilitiesRuntime as CapabilitiesRuntime, + type CapabilitiesServer as CapabilitiesServer, + }; + export { Images as Images, type Image as Image, diff --git a/src/resources/capabilities.ts b/src/resources/capabilities.ts new file mode 100644 index 0000000..4a24a52 --- /dev/null +++ b/src/resources/capabilities.ts @@ -0,0 +1,180 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import { APIResource } from '../core/resource'; +import { APIPromise } from '../core/api-promise'; +import { RequestOptions } from '../internal/request-options'; + +export class Capabilities extends APIResource { + /** + * Returns machine-readable host capabilities: server and API version, host + * OS/architecture, every runtime available on this host with its per-runtime + * feature IDs, the configured default runtime and whether it is available, guest + * networking model and host gateway, supported image platforms, and stable + * server-level feature IDs. + * + * Runtime-derived values reflect the actual host (for example, snapshot and + * standby support on macOS is gated on the host OS version), so clients can gate + * behavior on capabilities without hard-coding hypervisor knowledge. + */ + get(options?: RequestOptions): APIPromise { + return this._client.get('/capabilities', options); + } +} + +export interface Capabilities { + default_runtime: CapabilitiesDefaultRuntime; + + /** + * Stable server-level feature IDs: API surfaces this server exposes regardless of + * which runtime backs an instance. Always present: "instances", "images", + * "builds", "volumes", "ingress", "exec", "logs". Host-conditional: "devices" + * (device passthrough management, Linux hosts only) and "rosetta-emulation" (Apple + * Silicon macOS hosts with Rosetta currently installed, per the same availability + * probe launches enforce). Per-runtime features are reported under each runtimes[] + * entry. + */ + features: Array; + + host: CapabilitiesHost; + + images: CapabilitiesImages; + + network: CapabilitiesNetwork; + + /** + * Every runtime this server build supports on this host platform, each with its + * own availability flag and feature IDs. Hosts commonly support several runtimes + * at once (for example cloud-hypervisor, firecracker, qemu, and qemu-microvm on + * linux/amd64). A listed runtime is only launchable when its "available" flag is + * true. Entries are sorted by name. + */ + runtimes: Array; + + server: CapabilitiesServer; +} + +export interface CapabilitiesDefaultRuntime { + /** + * Whether the default runtime can launch on this host: it appears in runtimes and + * its launch prerequisites are met (matches that entry's "available"). When false, + * launches that rely on the default will fail until the server is reconfigured + * with an available runtime or the missing prerequisite (for example the QEMU + * system binary) is installed. + */ + available: boolean; + + /** + * Runtime used for launches that do not name one + */ + name: string; +} + +export interface CapabilitiesHost { + /** + * Host CPU architecture + */ + arch: string; + + /** + * Host operating system + */ + os: string; +} + +export interface CapabilitiesImages { + /** + * Image platform selected when a create request omits one + */ + default_platform: string; + + /** + * Image platforms (os/arch) this host can run. On Apple Silicon macOS this + * includes linux/amd64 only when Rosetta is currently installed — probed via the + * same Virtualization.framework availability check launches enforce — so a listed + * platform is launchable right now. Install Rosetta (softwareupdate + * --install-rosetta) to enable it. + */ + platforms: Array; +} + +export interface CapabilitiesNetwork { + /** + * Whether direct VM-to-VM traffic is permitted on the default network + */ + guest_to_guest: boolean; + + /** + * Guest networking model. "bridge" is a Linux bridge with per-VM TAP devices; + * "nat" is hypervisor-provided NAT (macOS). + */ + model: 'bridge' | 'nat'; + + /** + * Guest-visible host gateway IP. Guests reach host services (including host + * ingress) through this address. Omitted when no default network has been resolved + * on this host yet. + */ + gateway?: string; + + /** + * Guest subnet CIDR + */ + subnet?: string; +} + +export interface CapabilitiesRuntime { + /** + * Whether this runtime's launch prerequisites are currently met on this host. + * Listed runtimes are supported by this server build on this platform; + * available=false means a host prerequisite is missing (for example qemu requires + * a runnable system-installed QEMU binary and the host vhost-vsock device) and + * launches naming this runtime will fail until it is installed. + */ + available: boolean; + + /** + * Stable feature IDs supported by this runtime on this host: "snapshots" + * (snapshot/restore), "standby" (pause + memory snapshot, with later restore), + * "fork" (clone an instance from a stopped source; forking a standby or running + * source restores/creates snapshots and additionally requires "standby"), "pause" + * (pause/resume), "hotplug-memory" (live memory resize), "balloon-control" + * (runtime balloon target changes), "vsock" (guest vsock communication), + * "gpu-passthrough" (GPU/PCI device passthrough), "disk-io-limit" (disk I/O rate + * limiting), "disk-resize" (live disk resize). Values are host- and + * configuration-truthful: vz omits snapshots and standby on macOS 13, which lacks + * Virtualization.framework VM save/restore, while still advertising fork + * (stopped-source clones need no save/restore there), and cloud-hypervisor reports + * "disk-resize" only when the configured default version supports it. + */ + features: Array; + + /** + * Runtime identifier + */ + name: string; +} + +export interface CapabilitiesServer { + /** + * API contract version (matches the OpenAPI document info version) + */ + api_version: string; + + /** + * Server build version (short git revision, with "-dirty" suffix for uncommitted + * builds, or "unknown") + */ + version: string; +} + +export declare namespace Capabilities { + export { + type Capabilities as Capabilities, + type CapabilitiesDefaultRuntime as CapabilitiesDefaultRuntime, + type CapabilitiesHost as CapabilitiesHost, + type CapabilitiesImages as CapabilitiesImages, + type CapabilitiesNetwork as CapabilitiesNetwork, + type CapabilitiesRuntime as CapabilitiesRuntime, + type CapabilitiesServer as CapabilitiesServer, + }; +} diff --git a/src/resources/index.ts b/src/resources/index.ts index 2a60e3b..6a44531 100644 --- a/src/resources/index.ts +++ b/src/resources/index.ts @@ -21,6 +21,15 @@ export { type BuildListParams, type BuildEventsParams, } from './builds'; +export { + Capabilities, + type CapabilitiesDefaultRuntime, + type CapabilitiesHost, + type CapabilitiesImages, + type CapabilitiesNetwork, + type CapabilitiesRuntime, + type CapabilitiesServer, +} from './capabilities'; export { Devices, type AvailableDevice, diff --git a/tests/api-resources/capabilities.test.ts b/tests/api-resources/capabilities.test.ts new file mode 100644 index 0000000..b427fca --- /dev/null +++ b/tests/api-resources/capabilities.test.ts @@ -0,0 +1,22 @@ +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. + +import Hypeman from '@onkernel/hypeman'; + +const client = new Hypeman({ + apiKey: 'My API Key', + baseURL: process.env['TEST_API_BASE_URL'] ?? 'http://127.0.0.1:4010', +}); + +describe('resource capabilities', () => { + // Mock server tests are disabled + test.skip('get', async () => { + const responsePromise = client.capabilities.get(); + const rawResponse = await responsePromise.asResponse(); + expect(rawResponse).toBeInstanceOf(Response); + const response = await responsePromise; + expect(response).not.toBeInstanceOf(Response); + const dataAndResponse = await responsePromise.withResponse(); + expect(dataAndResponse.data).toBe(response); + expect(dataAndResponse.response).toBe(rawResponse); + }); +}); From 949aeb62f954325765038beb80e534babaac53c0 Mon Sep 17 00:00:00 2001 From: "kernel-internal[bot]" <260533166+kernel-internal[bot]@users.noreply.github.com> Date: Mon, 17 Aug 2026 19:00:33 +0000 Subject: [PATCH 3/3] release: 0.7.0 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 8 ++++++++ package-lock.json | 4 ++-- package.json | 2 +- src/version.ts | 2 +- 5 files changed, 13 insertions(+), 5 deletions(-) diff --git a/.release-please-manifest.json b/.release-please-manifest.json index bcd0522..e7ca613 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.6.0" + ".": "0.7.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b98d52..163f9ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [0.7.0](https://github.com/kernel/hypeman-ts/compare/v0.6.0...v0.7.0) (2026-08-17) + + +### Features + +* add Python SDK WebSocket primitives ([b038e6f](https://github.com/kernel/hypeman-ts/commit/b038e6f5153fb7311cbefe74d7630ac81f19f12c)) +* Point at pending stlc seal-tracking PRs ([9145d06](https://github.com/kernel/hypeman-ts/commit/9145d064670b4eb38fea6f4bf0f5c9f3b46653d2)) + ## [0.6.0](https://github.com/kernel/hypeman-ts/compare/v0.5.1...v0.6.0) (2026-08-12) diff --git a/package-lock.json b/package-lock.json index f8ffb73..1126dc1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@onkernel/hypeman", - "version": "0.6.0", + "version": "0.7.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@onkernel/hypeman", - "version": "0.6.0", + "version": "0.7.0", "license": "Apache-2.0", "dependencies": { "dockerode": "^4.0.10", diff --git a/package.json b/package.json index 971dfb4..98efff1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@onkernel/hypeman", - "version": "0.6.0", + "version": "0.7.0", "description": "The official TypeScript library for the Hypeman API", "author": "Hypeman <>", "types": "dist/index.d.ts", diff --git a/src/version.ts b/src/version.ts index 30c2817..d9da9f7 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1 +1 @@ -export const VERSION = '0.6.0'; // x-release-please-version +export const VERSION = '0.7.0'; // x-release-please-version