Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 21 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
# Ellipsis CLI

Drive the [Ellipsis](https://ellipsis.dev) cloud from your terminal: start agent
runs, stream their output live, manage configurations, and open a run in the
browser IDE.
sessions, stream their output live, manage configurations, and open a session
in the browser IDE.

This is a thin client. The agent runs in the Ellipsis cloud; the CLI
authenticates, opens a WebSocket, and streams results. It is open source
(MIT) the proprietary engine stays server-side.
(MIT), and the proprietary engine stays server-side.

## Install

Expand All @@ -21,14 +21,15 @@ agent login # device-code auth (use --no-browser for SSH)
agent logout # remove stored credentials
agent me # show the current credential's identity

agent run start --config <id> # start a run from a saved config
agent run start --config-file f.json # ...or from an inline config
agent run start --template welcome-to-ellipsis # ...or from a maintained template
agent run start --config <id> --config-override "limits:\n run: 5" # override config fields for this run
agent run start --config <id> --watch # start and immediately stream it
agent run list --limit 20 # list recent runs (filter by --source, --days, …)
agent run get <run-id> # inspect one run (prints a dashboard link)
agent run get <run-id> --watch # follow a run until it finishes
agent session start --config <id> # start a session from a saved config
agent session start --config-file f.json # ...or from an inline config
agent session start --template welcome-to-ellipsis # ...or from a maintained template
agent session start --config <id> --config-override "limits:\n run: 5" # override config fields for this session
agent session start --config <id> --watch # start and immediately stream it
agent session list --limit 20 # list recent sessions (filter by --source, --days, …)
agent session get <session-id> # inspect one session (prints a dashboard link)
agent session get <session-id> --watch # follow a session until it finishes
agent session stop <session-id> # stop an in-flight session

agent config list # list saved agent configs
agent config get <config-id> # show one config as YAML (-o json for JSON)
Expand All @@ -47,18 +48,18 @@ Most commands accept `--json` to print the raw API response. The CLI talks to
the public `/v1` REST API; point it elsewhere with `ELLIPSIS_API_BASE_URL`
(or the legacy `ELLIPSIS_API_BASE`).

`--watch` (on both `run start` and `run get`) streams the run's output live over
WebSocket until it reaches a terminal status, falling back to periodic status
polling if the live stream is unavailable. Either way it first prints a
clickable dashboard link. The stream protocol is specified in
`--watch` (on both `session start` and `session get`) streams the session's
output live over WebSocket until it reaches a terminal status, falling back to
periodic status polling if the live stream is unavailable. Either way it first
prints a clickable dashboard link. The stream protocol is specified in
[`docs/RUN_STREAMING_SPEC.md`](docs/RUN_STREAMING_SPEC.md).

### Auth

`agent login` uses the device-code flow: it requests a code pair, prints a
verification URL (and opens it unless `--no-browser`), and polls until you
approve the request in the dashboard. The issued user token is stored under
`~/.config/ellipsis/config.json` (mode 0600) and attributes runs to you.
`~/.config/ellipsis/config.json` (mode 0600) and attributes sessions to you.

**Credentials resolve in this order (highest wins):** explicit argument →
environment (`ELLIPSIS_API_TOKEN` / `ELLIPSIS_API_BASE_URL`, with the legacy
Expand Down Expand Up @@ -138,7 +139,7 @@ scoped to that one repo only — no account-wide PAT involved.

### Status

The full `/v1` REST surface (auth, runs, configs, budget/usage) is wired against
the live API. Still pending: the server-side WebSocket frame protocol behind
`run view`, a `run stop` endpoint, and replacing the hand-rolled request/response
types with the generated `@ellipsis/sdk` package.
The full `/v1` REST surface (auth, sessions, configs, budget/usage) is wired
against the live API, including live WebSocket streaming and `session stop`.
Still pending: replacing the hand-rolled request/response types with the
generated `@ellipsis/sdk` package.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@ellipsis/cli",
"version": "0.1.6",
"description": "Ellipsis agent CLI drive the Ellipsis cloud from your terminal",
"description": "Ellipsis agent CLI: drive the Ellipsis cloud from your terminal",
"license": "MIT",
"type": "module",
"packageManager": "bun@1.3.14",
Expand Down
6 changes: 3 additions & 3 deletions src/cli.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Command } from 'commander'
import { registerLogin } from './commands/login'
import { registerMe } from './commands/me'
import { registerRun } from './commands/run'
import { registerSession } from './commands/session'
import { registerConfig } from './commands/config'
import { registerSandbox } from './commands/sandbox'
import { registerTemplate } from './commands/template'
Expand All @@ -13,12 +13,12 @@ const program = new Command()

program
.name('agent')
.description('Ellipsis agent CLI drive the Ellipsis cloud from your terminal')
.description('Ellipsis agent CLI: drive the Ellipsis cloud from your terminal')
.version(VERSION)

registerLogin(program)
registerMe(program)
registerRun(program)
registerSession(program)
registerConfig(program)
registerSandbox(program)
registerTemplate(program)
Expand Down
4 changes: 2 additions & 2 deletions src/commands/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export function registerConfig(program: Command): void {

config
.command('list')
.description('List saved agent configurations (GET /v1/agents/configs)')
.description('List saved agent configurations (GET /v1/configs)')
.option('--json', 'output raw JSON')
.action(async (opts: { json?: boolean }) => {
await runAction(async () => {
Expand All @@ -41,7 +41,7 @@ export function registerConfig(program: Command): void {

config
.command('get <configId>')
.description('Get a single agent configuration (GET /v1/agents/configs/{id})')
.description('Get a single agent configuration (GET /v1/configs/{id})')
.option('-o, --output <format>', 'output format: yaml (default) or json', parseFormat, 'yaml')
.action(async (configId: string, opts: { output: 'yaml' | 'json' }) => {
await runAction(async () => {
Expand Down
Loading
Loading