Skip to content

feat(apps): opper apps — deploy and manage agents as managed apps#18

Open
mattias-lundell wants to merge 2 commits into
mainfrom
feat/apps
Open

feat(apps): opper apps — deploy and manage agents as managed apps#18
mattias-lundell wants to merge 2 commits into
mainfrom
feat/apps

Conversation

@mattias-lundell

Copy link
Copy Markdown
Member

Adds the opper apps command group for Opper Apps (the deploy/Knative backend): agent source in, running app out, via task-api's /v3/apps surface.

opper apps list | get <name> | delete <name>
opper apps create [--name n] [--dir . | --repo <git-url> [--ref branch|tag]] [--config json]
opper apps redeploy <name> --dir .
opper apps logs <name>             # live SSE tail
opper apps run <name> --input "…"  # one-shot invoke
opper apps secrets list|set|delete <app> [KEY] [VALUE]

Highlights:

  • Deploy from a git repo: --repo shallow-clones and deploys, no local checkout needed — opper apps create --repo https://github.com/org/agent just works when the repo carries an opper.yaml.
  • Manifest-aware: --name is optional when the source's opper.yaml declares name: (fly.io-style config-as-code).
  • Client additions: postMultipart (FormData upload) + streamGet (SSE-over-GET) sharing the existing SSE parser; new INVALID_ARGUMENT error code (exit 8).
  • Source tarball via system tar, excluding .git/node_modules/__pycache__/.venv — mirrors the Go deploy CLI.

Tested: 8 new vitest cases (full suite 382 green, tsc clean), plus live verification against the evroc deployment — apps list/get/secrets round-trip and apps run hermes answered through the new command.

🤖 Generated with Claude Code

mattias-lundell and others added 2 commits June 12, 2026 10:01
New `opper apps` command group against the /v3/apps surface (Opper
Apps — agent source in, running app out; the platform UI is a viewer,
the CLI is the creation path):

  opper apps list | get <name> | delete <name>
  opper apps create [--name n] [--dir .|--repo <git-url> [--ref r]]
                    [--config json]
  opper apps redeploy <name> --dir .
  opper apps logs <name>          # SSE tail
  opper apps run <name> --input "…"
  opper apps secrets list|set|delete <app> [KEY] [VALUE]

- create accepts a local directory (tarred with the system tar,
  excluding .git/node_modules/__pycache__/.venv) or a git URL that is
  shallow-cloned and deployed; --name is optional when the source's
  opper.yaml manifest declares one.
- OpperApi gains postMultipart (FormData upload) and streamGet
  (SSE-over-GET for logs), sharing the existing SSE parser.
- New INVALID_ARGUMENT error code (exit 8) for bad local input.

Verified live against the evroc deployment: list/get/run/secrets all
round-trip; `apps run hermes` answered through the new command.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
`opper apps shell <name>` opens a real PTY in the app's container over
the app's /run/shell WebSocket (the in-pod ttyd, proxied by the wrapper),
through the normal API-key-authed chain — no SSH, no cluster access. It
puts stdin in raw mode so Ctrl-C/Ctrl-D/arrows reach the remote shell,
forwards SIGWINCH as ttyd resize frames, and restores the terminal on
exit. Uses the `ws` client (Node 20 floor has no global WebSocket).

Verified against a ttyd-enabled image: connects, runs a command, streams
output back. Needs the deploy-side terminal (opper#2954) and the task-api
websocket proxy (opper#2955) deployed to work end to end.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant