π File detail
utils/teleport/environments.ts
π― Use case
This file lives under βutils/β, which covers cross-cutting helpers (shell, tempfiles, settings, messages, process input, β¦). On the API surface it exposes EnvironmentKind, EnvironmentState, EnvironmentResource, EnvironmentListResponse, and fetchEnvironments (and more) β mainly types, interfaces, or factory objects. Dependencies touch HTTP client and src. It composes internal code from auth, errors, log, and api (relative imports).
Generated from folder role, exports, dependency roots, and inline comments β not hand-reviewed for every path.
π§ Inline summary
import axios from 'axios' import { getOauthConfig } from 'src/constants/oauth.js' import { getOrganizationUUID } from 'src/services/oauth/client.js' import { getClaudeAIOAuthTokens } from '../auth.js' import { toError } from '../errors.js'
π€ Exports (heuristic)
EnvironmentKindEnvironmentStateEnvironmentResourceEnvironmentListResponsefetchEnvironmentscreateDefaultCloudEnvironment
π External import roots
Package roots from from "β¦" (relative paths omitted).
axiossrc
π₯οΈ Source preview
import axios from 'axios'
import { getOauthConfig } from 'src/constants/oauth.js'
import { getOrganizationUUID } from 'src/services/oauth/client.js'
import { getClaudeAIOAuthTokens } from '../auth.js'
import { toError } from '../errors.js'
import { logError } from '../log.js'
import { getOAuthHeaders } from './api.js'
export type EnvironmentKind = 'anthropic_cloud' | 'byoc' | 'bridge'
export type EnvironmentState = 'active'
export type EnvironmentResource = {
kind: EnvironmentKind
environment_id: string
name: string
created_at: string
state: EnvironmentState
}
export type EnvironmentListResponse = {
environments: EnvironmentResource[]
has_more: boolean
first_id: string | null
last_id: string | null
}
/**
* Fetches the list of available environments from the Environment API
* @returns Promise<EnvironmentResource[]> Array of available environments
* @throws Error if the API request fails or no access token is available
*/
export async function fetchEnvironments(): Promise<EnvironmentResource[]> {
const accessToken = getClaudeAIOAuthTokens()?.accessToken
if (!accessToken) {
throw new Error(
'Claude Code web sessions require authentication with a Claude.ai account. API key authentication is not sufficient. Please run /login to authenticate, or check your authentication status with /status.',
)
}
const orgUUID = await getOrganizationUUID()
if (!orgUUID) {
throw new Error('Unable to get organization UUID')
}
const url = `${getOauthConfig().BASE_API_URL}/v1/environment_providers`
try {
const headers = {
...getOAuthHeaders(accessToken),
'x-organization-uuid': orgUUID,
}
const response = await axios.get<EnvironmentListResponse>(url, {
headers,
timeout: 15000,
})
if (response.status !== 200) {
throw new Error(
`Failed to fetch environments: ${response.status} ${response.statusText}`,
)
}
return response.data.environments
} catch (error) {
const err = toError(error)
logError(err)
throw new Error(`Failed to fetch environments: ${err.message}`)
}
}
/**
* Creates a default anthropic_cloud environment for users who have none.
* Uses the public environment_providers route (same auth as fetchEnvironments).
*/
export async function createDefaultCloudEnvironment(
name: string,
): Promise<EnvironmentResource> {
const accessToken = getClaudeAIOAuthTokens()?.accessToken
if (!accessToken) {
throw new Error('No access token available')
}
const orgUUID = await getOrganizationUUID()
if (!orgUUID) {
throw new Error('Unable to get organization UUID')
}
const url = `${getOauthConfig().BASE_API_URL}/v1/environment_providers/cloud/create`
const response = await axios.post<EnvironmentResource>(
url,
{
name,
kind: 'anthropic_cloud',
description: '',
config: {
environment_type: 'anthropic',
cwd: '/home/user',
init_script: null,
environment: {},
languages: [
{ name: 'python', version: '3.11' },
{ name: 'node', version: '20' },
],
network_config: {
allowed_hosts: [],
allow_default_hosts: true,
},
},
},
{
headers: {
...getOAuthHeaders(accessToken),
'anthropic-beta': 'ccr-byoc-2025-07-29',
'x-organization-uuid': orgUUID,
},
timeout: 15000,
},
)
return response.data
}