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
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ agent host delete beta # remove a host and its stored token
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> --config-override "budget:\n session: 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, --author, --days, …)
agent session search "webhook retries" # search session history: transcripts, recaps, created PRs, similarity
Expand Down
4 changes: 2 additions & 2 deletions skills/ellipsis/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -241,8 +241,8 @@ sandbox:
repositories:
- name: api

limits:
run: 5.00
budget:
session: 5.00
```

## Inside an Ellipsis sandbox
Expand Down
6 changes: 3 additions & 3 deletions src/commands/session.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ export function registerSession(program: Command): void {
)
.option(
'-o, --config-override <yaml>',
'partial agent config (YAML/JSON) merged onto the chosen config for this session, e.g. "limits:\\n run: 5"',
'partial agent config (YAML/JSON) merged onto the chosen config for this session, e.g. "budget:\\n session: 5"',
)
.option(
'--config-override-file <path>',
Expand All @@ -127,7 +127,7 @@ export function registerSession(program: Command): void {
'--rebuild',
'skip the sandbox image cache: fresh full build (image layers, clones, image.setup), whose snapshot refreshes the cache',
)
.option('--budget <usd>', 'per-run spend limit in USD for this session (limits.run)', toNumber)
.option('--budget <usd>', 'spend limit in USD for this session (budget.session)', toNumber)
.option(
'-p, --prompt <text>',
"the session prompt, appended to the agent's initial user query (or pass it positionally)",
Expand Down Expand Up @@ -1029,7 +1029,7 @@ export function buildStartOverride(opts: {
if (opts.repo && opts.repo.length) sandbox.repositories = opts.repo.map(parseRepo)
if (Object.keys(sandbox).length) sugar.sandbox = sandbox

if (opts.budget !== undefined) sugar.limits = { run: opts.budget }
if (opts.budget !== undefined) sugar.budget = { session: opts.budget }

const merged = deepMerge(base, sugar)
return Object.keys(merged).length ? merged : undefined
Expand Down
18 changes: 9 additions & 9 deletions test/session.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,8 +103,8 @@ describe('readConfigFile', () => {
}

it('parses a .yaml file', () => {
const path = write('cfg.yaml', 'name: demo\nlimits:\n run: 5\n')
expect(readConfigFile(path)).toEqual({ name: 'demo', limits: { run: 5 } })
const path = write('cfg.yaml', 'name: demo\nbudget:\n session: 5\n')
expect(readConfigFile(path)).toEqual({ name: 'demo', budget: { session: 5 } })
})

it('parses a .yml file', () => {
Expand All @@ -113,8 +113,8 @@ describe('readConfigFile', () => {
})

it('parses a .json file', () => {
const path = write('cfg.json', '{"name":"demo","limits":{"run":5}}')
expect(readConfigFile(path)).toEqual({ name: 'demo', limits: { run: 5 } })
const path = write('cfg.json', '{"name":"demo","budget":{"session":5}}')
expect(readConfigFile(path)).toEqual({ name: 'demo', budget: { session: 5 } })
})

it('falls back to YAML for unknown extensions (JSON is valid YAML)', () => {
Expand Down Expand Up @@ -152,10 +152,10 @@ describe('applyConfigOverride', () => {
})

it('reads and parses a file override into the structured mapping', () => {
const path = write('override.yaml', 'limits:\n run: 5\n')
const path = write('override.yaml', 'budget:\n session: 5\n')
const req: { config_override?: Record<string, unknown>; config_override_yaml?: string } = {}
applyConfigOverride(req, { configOverrideFile: path })
expect(req).toEqual({ config_override: { limits: { run: 5 } } })
expect(req).toEqual({ config_override: { budget: { session: 5 } } })
})

it('rejects passing both inline and file forms', () => {
Expand Down Expand Up @@ -214,7 +214,7 @@ describe('buildStartOverride', () => {
compute: { cpu: 2, memory: '8GB', timeout: '30m' },
repositories: [{ owner: 'ellipsis-dev', name: 'ellipsis' }, { name: 'solo' }],
},
limits: { run: 0.5 },
budget: { session: 0.5 },
})
})

Expand All @@ -231,9 +231,9 @@ describe('buildStartOverride', () => {
})

it('uses a file override as the base', () => {
const path = write('base.yaml', 'limits:\n run: 1\n')
const path = write('base.yaml', 'budget:\n session: 1\n')
expect(buildStartOverride({ configOverrideFile: path, budget: 5 })).toEqual({
limits: { run: 5 },
budget: { session: 5 },
})
})

Expand Down