Skip to content
Draft
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
59 changes: 59 additions & 0 deletions .github/workflows/desktop.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
name: Desktop macOS
on:
pull_request:
paths: ['desktop/**', 'lib/**', 'scripts/provision_remote.py', 'mix.exs', 'mix.lock', '.github/workflows/desktop.yml']
push:
branches: [main]
paths: ['desktop/**', 'lib/**', 'scripts/provision_remote.py', 'mix.exs', 'mix.lock', '.github/workflows/desktop.yml']
workflow_dispatch:
permissions:
contents: read
concurrency:
group: desktop-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
package:
strategy:
fail-fast: false
matrix:
runner: [macos-15, macos-15-intel]
runs-on: ${{ matrix.runner }}
timeout-minutes: 60
defaults:
run:
working-directory: desktop
steps:
- uses: actions/checkout@v4
- uses: erlef/setup-beam@v1
with:
otp-version: '28.4'
elixir-version: '1.19.5'
- uses: actions/cache@v4
id: tauri-cli
with:
path: ~/.cargo/bin/cargo-tauri
key: tauri-cli-${{ runner.os }}-${{ runner.arch }}-rust1.96.0-tauri2.11.4
- name: Install pinned native build tools
run: |
rustup toolchain install 1.96.0 --profile minimal
rustup default 1.96.0
if [ '${{ steps.tauri-cli.outputs.cache-hit }}' != 'true' ]; then
cargo install tauri-cli --version 2.11.4 --locked
fi
cargo tauri --version
- name: Fetch test dependencies
run: mix deps.get
- name: Test actual service, ACP and local subprocess workflows
run: mix check
- name: Build embedded release and app
run: cargo tauri build --bundles app --ci
- name: Exercise the native fleet UI with real ACP service processes
run: python3 scripts/smoke-native-fleet.py
- name: Verify and smoke-test the delivery archive
run: python3 scripts/package-macos.py
- uses: actions/upload-artifact@v4
with:
name: desktop-${{ matrix.runner }}
path: desktop/dist/*
if-no-files-found: error
retention-days: 14
8 changes: 8 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,11 @@

__pycache__/
*.pyc

/desktop/_build/
/desktop/deps/
/desktop/src-tauri/target/
/desktop/src-tauri/gen/
/desktop/.state/
/desktop/dist/
/desktop/priv/static/assets/phoenix*.js
150 changes: 68 additions & 82 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,87 +1,73 @@
# Manasprites

A persistent coding agent you can talk to from your terminal or over HTTP.

```sh
manasprites sprite create --file agent.json
manasprites prompt "Build a Python reading-list CLI. Save to JSON. Write and run tests."
manasprites prompt --continue "Add search. Keep the storage format and test the new command."
```

Manasprites creates a [Sprite](https://sprites.dev), prepares the workspace, and
starts the agent service. `prompt` streams the answer and tool activity, then
exits when the turn finishes. Follow-ups resume the same conversation and files.

## Setup

You need macOS or Linux, Python 3.9+, curl, an authenticated
[Sprites CLI](https://docs.sprites.dev/quickstart/), and `OPENAI_API_KEY` exported.
Install the CLI:

```sh
curl -fsSL https://github.com/managoat/manasprites/releases/download/cli-v0.2.0/install-cli.sh | sh
export PATH="$HOME/.local/bin:$PATH"
```

Save this as `agent.json`, replacing `your-sprites-org`:

```json
{
"name": "my-agent",
"org": "your-sprites-org",
"url_auth": "public",
"agent": {"runtime": "codex"}
}
```

Run the three commands at the top. The CLI reads `agent.json` by default and
loads the saved URL and API key for you. Use `--file path/to/agent.json` to select
another config.

Starting with a project? Add `repository`, `env`, and `bootstrap` to the config;
Manasprites clones it, imports the named variables, and runs your setup commands.
See the [complete example](examples/agent.json) and
[configuration reference](docs/provisioning.md). Already have a Sprite?
[Install the service directly](docs/manual-install.md).

## Conversations

```sh
manasprites conversations
manasprites prompt --conversation CONVERSATION_ID "Run the tests and fix any failures."
manasprites watch CONVERSATION_ID
```

`--continue` uses your last conversation on this Sprite. `watch` replays the
latest turn and follows it without submitting work. Ctrl-C stops watching;
the agent keeps working. One turn runs at a time across the shared workspace.

For longer prompts or scripts:

```sh
cat task.md | manasprites prompt -
manasprites conversations --json
```

The service also exposes an authenticated HTTP API and SSE streams for your own
app. See the [CLI and HTTP walkthroughs](docs/conversations.md).

## Docs and status

The service is a [v0.1.0 preview](https://github.com/managoat/manasprites/releases/tag/v0.1.0);
the [CLI preview](https://github.com/managoat/manasprites/releases/tag/cli-v0.2.0) installs separately. Codex has live inference and continuation
coverage; Claude still needs live qualification. There is no bundled web UI.

Setup makes no model request; prompts use your inference account. The generated
bearer key grants owner access, and tool permissions default to `auto_allow`.
Choose `url_auth: sprite` for private access through a tunnel.

- [Provisioning](docs/provisioning.md): repositories, environment, bootstrap, and retries.
- [Conversations](docs/conversations.md): CLI commands, HTTP examples, and streaming.
- [Operations](docs/guide.md): configuration, service management, backups, and upgrades.
- [API specification](docs/spec.md#http-contract) · [OpenAPI](priv/openapi.json).
- [Development](docs/development.md): tests and release builds.
- [Acceptance record](docs/acceptance.md): verified behavior and remaining work.
A desktop app for running a fleet of coding agents on [Sprites](https://sprites.dev).
Give agents work, follow their progress, answer approvals, and review their files
and Git changes from one place. Each agent works in its own persistent cloud
workspace while you manage it from your laptop.

![Manasprites fleet overview showing two agents awaiting approval](docs/screenshots/desktop-fleet.png)

## Work with your agents

- **Create or connect agents.** Add a Sprite with a repository, runtime and
instructions, or connect an existing agent.
- **Keep work moving.** Send tasks to different agents, see which are working or
need attention, answer tool approvals, and interrupt a turn when needed.
- **Pick up where you left off.** Reopen conversations and send follow-ups in the
same workspace.
- **Review the results.** Browse project files and inspect staged and unstaged
Git changes beside the conversation.

![Conversation workbench with a project file preview](docs/screenshots/desktop-files.png)

<details>
<summary>See Git changes</summary>

![Conversation workbench with an unstaged Git diff](docs/screenshots/desktop-changes.png)

</details>

Screenshots show the running native macOS app with synthetic demo agents.

## Try the macOS preview

The preview requires **macOS 15 or later** and currently needs to be built from
source. Follow the
[macOS build instructions](desktop/README.md#build-and-test-on-macos) to build
and open `Manasprites.app`. A signed, notarized desktop download is still pending.

Once the app is open:

1. Save your Sprites token and inference API key in **Keys & settings**.
2. Choose **Add a Sprite**, select a runtime, and optionally add a repository.
Use **Connect an agent** if you already have an installed Manasprites agent.
3. Open the agent, give it a task, and follow its conversation and workspace.

You bring your own Sprites and inference accounts. The app saves connections,
credentials and cached history locally; the agents and their project files live
on Sprites. See the [desktop guide](desktop/README.md) for setup and usage details.

## Preview status

Native macOS builds and workflow checks have passed on Apple Silicon and Intel. Live Codex
checks cover public/private creation, coding tasks, follow-ups, interruption,
cold wake, file/Git inspection, and overlapping work on two agents. Live approval
answering passed on a fresh service installation.

Funded Claude inference and desktop distribution remain open. The
[acceptance record](docs/desktop-acceptance.md) separates verified behavior from
remaining work.

## Development

The laptop app uses **Elixir + Phoenix LiveView**, OTP for fleet connections and
jobs, and **SQLite/Ecto** for local state. Tauri + ElixirKit provides the native
macOS shell and embeds the Elixir runtime.

- [Desktop development and build guide](desktop/README.md)
- [Architecture and delivery plan](docs/desktop.md)
- [Sprite service development](docs/development.md) and [API specification](docs/spec.md#http-contract)
- [Optional CLI guide](docs/cli.md) for terminal workflows and scripts

Built with [Managoat ACP](https://github.com/managoat/managoat_acp),
[Runtimes](https://github.com/managoat/managoat_runtimes), and
Expand Down
5 changes: 5 additions & 0 deletions desktop/.formatter.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
[
import_deps: [:phoenix, :phoenix_live_view],
plugins: [Phoenix.LiveView.HTMLFormatter],
inputs: ["mix.exs", "{config,lib,test,priv}/**/*.{ex,exs,heex}"]
]
Loading
Loading