SDK リファレンス
NanoTermClient クラスの全メソッドです。すべての非同期メソッドは型付きの結果を返します。エラーは共通エラーエンベロープに従います。
ワークスペース
createWorkspace(config?)
新しいワークスペースを作成します。
const ws = await client.createWorkspace({
name: 'my-agent', // 省略可
image: 'ubuntu:22.04' // 省略可、デフォルト: ubuntu:22.04
})
console.log(ws)
// {
// id: 'ws_a1b2c3d4',
// name: 'my-agent',
// image: 'ubuntu:22.04',
// status: 'running',
// createdAt: '2026-04-06T...'
// }
戻り値: Promise<WorkspaceInfo>
listWorkspaces()
現在の組織のワークスペース一覧を取得します。
const workspaces = await client.listWorkspaces()
// WorkspaceInfo[]
getWorkspace(id)
特定のワークスペースの詳細を取得します。
const ws = await client.getWorkspace('ws_a1b2c3d4')
terminateWorkspace(id)
ワークスペースを停止・削除します。
await client.terminateWorkspace('ws_a1b2c3d4')
コマンド実行
exec(workspaceId, command, opts?)
コマンドを実行して結果を返します。
const result = await client.exec('ws_a1b2c3d4', ['npm', 'test'])
console.log(result)
// {
// stdout: 'PASS src/index.test.ts\nTests: 12 passed',
// stderr: '',
// exitCode: 0
// }
// サブディレクトリで実行
await client.exec('ws_a1b2c3d4', ['pnpm', 'build'], {
cwd: '/workspace/api',
})
パラメータ:
| 名前 | 型 | 説明 |
|---|---|---|
workspaceId | string | 対象ワークスペース ID |
command | string[] | コマンドと引数 |
opts.cwd | string | ワークスペース内の作業ディレクトリ(デフォルト /workspace) |
戻り値: Promise<ExecResult>
interface ExecResult {
stdout: string
stderr: string
exitCode: number
}
getTerminalUrl(workspaceId)
対話型ターミナル用の WebSocket URL を取得します。
const url = client.getTerminalUrl('ws_a1b2c3d4')
// wss://api.nanoterm.dev/api/workspaces/ws_a1b2c3d4/terminal
WebSocket のアップグレードハンドシェイクは HTTP と同じ認証で
ゲートされます。生 WebSocket クライアントには
getAuthHeaders() で取得したヘッダーを渡して
ください:
import WebSocket from 'ws'
const ws = new WebSocket(client.getTerminalUrl(id), {
headers: client.getAuthHeaders(),
})
メッセージは JSON フレーム形式:
クライアント → サーバー:
{ type: 'stdin', data: '<base64>' } // 入力
{ type: 'resize', cols: 80, rows: 24 } // リサイズ
サーバー → クライアント:
{ type: 'stdout', data: '<base64>' } // 出力
ファイル
writeFile(workspaceId, filePath, content)
ワークスペース内のファイルに書き込みます。サーバーは書き込み後に
ファイルを stat して、実際の bytes と mtime を返します。
呼び出し側は bytes が送信サイズと一致することを確認してから
成功扱いしてください。
const content = new TextEncoder().encode('hello\n').buffer
const result = await client.writeFile('ws_a1b2c3d4', '/workspace/hello.txt', content)
// { bytes: 6, mtime: '2026-05-06T08:01:23.000Z' }
if (result.bytes !== 6) {
throw new Error('write was truncated upstream')
}
4xx / 5xx レスポンスは NanoTermError として throw されます。代表的
なエラーコード:
| コード | 意味 |
|---|---|
FILE_WRITE_BYTE_MISMATCH | ディスク上のバイト数が送信内容と一致しない(経路上のプロキシ/ストリーミング問題)。リトライ。 |
readFile(workspaceId, filePath)
ワークスペースからファイルを ArrayBuffer で読みます。非 2xx
レスポンス(共通エラーエンベロープ含む)では throw します。
const buf = await client.readFile('ws_a1b2c3d4', '/workspace/result.json')
const text = new TextDecoder().decode(buf)
認証ヘルパー
getAuthHeaders()
SDK が通常の HTTP リクエストに付けるヘッダー(Authorization,
X-Org-Id, X-Client-Name, X-Client-Version)を返します。
生 WebSocket / fetch でターミナル・プロキシ等を開くときに、
アップグレードハンドシェイクを正しく認証するために使用します:
const ws = new WebSocket(client.getTerminalUrl(id), {
headers: client.getAuthHeaders(),
})
エラーハンドリング
SDK が throw するのは NanoTermError(サーバーからの HTTP エンベ
ロープ)または TransientNetworkError(ネットワークエラー / 非 JSON
5xx)です。どちらもエージェントが利用できる以下のフィールドを持ち
ます:
| フィールド | セットされるとき | 意味 |
|---|---|---|
code | NanoTermError | 安定エラー識別子(例 WORKSPACE_NOT_FOUND) |
retryable | 両方 | 同一呼び出しが後で成功しうるか |
requestSent | 両方 | false = サーバーに届いていない(非冪等操作も安全に再試行可)。true = 副作用が発生している可能性 |
attempt | NanoTermError | このエラーを生んだリトライ回数(1 始まり) |
status | 両方 | HTTP ステータス |
retryAfterSec | NanoTermError 429 時 | 再試行までの待機秒数 |
CLI の --json モードはこのフィールド構造をそのまま stderr に出力
するので、エージェントは文字列を解釈せずに復旧戦略を決められます。
型定義
すべての型は @nanoterm/types からインポートできます:
import type {
WorkspaceInfo,
WorkspaceStatus,
CreateWorkspaceRequest,
ExecRequest,
ExecResult,
TerminalInputMessage,
TerminalOutputMessage,
OrgInfo,
ApiKeyInfo,
} from '@nanoterm/types'