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
4 changes: 2 additions & 2 deletions apps/app/src/connect.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,12 @@ export function Connect({ previous }: { previous?: string }) {
<p className="text-sm leading-6 text-muted-foreground">
{previous
? `Couldn't reach ${previous}. Check that Tailscale is on, then try again or enter another host.`
: "Enter the address your Ace host prints for HTTPS, such as mac.tailnet.ts.net:5141. This device must be on your tailnet."}
: "Enter the address your Ace host prints for HTTPS, such as mac.tailnet.ts.net:5140. This device must be on your tailnet."}
</p>
</div>
<Input
aria-label="Host address"
placeholder="mac.tailnet.ts.net:5141"
placeholder="mac.tailnet.ts.net:5140"
autoCapitalize="none"
autoCorrect="off"
spellCheck={false}
Expand Down
2 changes: 1 addition & 1 deletion apps/host/src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ export async function hostedAuth(): Promise<Record<string, string>> {
const secret = await key("ACE_SECRET");
if (!secret) {
throw new Error(
"The team's services need ACE_SECRET. Add it in Settings → This Mac → Team directory, or with ace key set ACE_SECRET",
"The team's services need ACE_SECRET. Add it in Settings → Team, or with ace key set ACE_SECRET",
);
}
return serviceAuth(secret);
Expand Down
2 changes: 1 addition & 1 deletion apps/host/src/manage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ export async function defaultModel(): Promise<ModelRef> {
export async function project(dir: string): Promise<string> {
dir = resolve(dir === "~" ? homedir() : dir.startsWith("~/") ? homedir() + dir.slice(1) : dir);
const result = await git(dir, ["rev-parse", "--show-toplevel"]);
if (result.status === null) throw new Error("Git is unavailable. Check This Mac in Settings.");
if (result.status === null) throw new Error("Git is unavailable. Check Settings → Ace Helper.");
if (result.status !== 0) {
throw new Error(`${dir} is not a Git repository. Initialize Git to start channels in it.`);
}
Expand Down
2 changes: 1 addition & 1 deletion apps/host/src/projects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ export async function init(path: string): Promise<Project> {
if (!paths().includes(path)) throw new Error("Open this folder in Ace first");
const run = async (args: string[]) => {
const result = await git(path, args);
if (result.status === null) throw new Error("Git is unavailable. Check This Mac in Settings.");
if (result.status === null) throw new Error("Git is unavailable. Check Settings → Ace Helper.");
if (result.status !== 0) throw new Error(result.stderr.trim() || `git ${args[0]} failed`);
};
if ((await checkout(path)).commit) return project(path);
Expand Down
2 changes: 1 addition & 1 deletion docs/architecture.md
Original file line number Diff line number Diff line change
Expand Up @@ -420,7 +420,7 @@ Literal insertion uses one GUI-owned temporary plain-text paste, with the existi
lane and clipboard transaction gate held through delivery and cleanup. The GUI preserves bounded
prior clipboard contents privately and restores them only when no paste key was sent or the expected
edit was observed in the same control. Uncertain consumption leaves the replacement or preserves newer contents; no
restore journal or automatic retry is created. Clipboard read policy is reported in This Mac.
restore journal or automatic retry is created. Clipboard read policy is reported in Settings → Computer use.
The same clipboard gate retains a content-free reservation while a dispatched paste is unresolved.
Later automated writes require observed consumption or termination of the exact receiver process
generation. The reservation survives GUI restart; clipboard contents and comparison state do not.
Expand Down
2 changes: 1 addition & 1 deletion docs/data.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ it. pi-durable owns the database format, messages, runs, tool results, chats, an
`ACE_HOME` overrides the host data directory. Canary and development preferences have the same
`-canary` and `-dev` suffixes. A source CLI uses the stable profile unless given `ACE_HOME`; target
the installed app's profile explicitly when backing it up. The command an app installs from
Settings → This Mac, `ace` for stable and `ace-canary` for Canary, already uses that app's profile.
Settings → Ace Helper, `ace` for stable and `ace-canary` for Canary, already uses that app's profile.

Each channel directory holds `channel.json` and pi's `channel.sqlite`. Lanes are worktrees in the
project at `.lane/trees/<prefix>/<name>`, created by the lane CLI; a `lanes/` directory holds those
Expand Down
14 changes: 7 additions & 7 deletions docs/desktop.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ channel sidebar. Project paths are scoped to their host until repository-based i
store nonsecret preferences under `~/Library/Application Support/Ace` on macOS.
- The app's command line tool is Ace Helper itself: started under any other name, it runs the CLI
with its app's data directory, port, and Keychain service, and spawns workers as Ace Helper.
Settings → This Mac links `~/.local/bin/ace`, or `ace-<channel>` for other channels, to the
Settings → Ace Helper links `~/.local/bin/ace`, or `ace-<channel>` for other channels, to the
bundle's helper. It needs no administrator rights, adds no second compiled runtime, and keeps
`Contents/Helpers`, which is first on agents' `PATH`, limited to lane. Install replaces only a
link to another Ace and refuses other files; a translocated app can't install a link.
Expand Down Expand Up @@ -146,7 +146,7 @@ and Ace's grouped permission in macOS background-item settings.
caching object snapshots in the shared local-storage hook.
- Follow-up work is tracked in the [dogfooding](https://github.com/githubnext/ace/issues/5) and
[desktop distribution](https://github.com/githubnext/ace/issues/7) meta issues. Providers beyond
Anthropic/OpenAI still use the CLI. This Mac joins, changes, and leaves the team directory and
Anthropic/OpenAI still use the CLI. Settings → Team joins, changes, and leaves the team directory and
saves its secret; deploying the directory stays a CLI step.

## UI testing
Expand Down Expand Up @@ -216,7 +216,7 @@ history should remain available.
This helper-testing mode cannot coexist with source dev builds. They share the same app identity,
and macOS can resolve a registered helper from another copy even though source apps never
register it. For routine development, use `bun desktop dev` alongside installed Canary. Before
switching from installed Ace-dev to source development, stop Ace Helper in Settings → This Mac,
switching from installed Ace-dev to source development, stop Ace Helper in Settings → Ace Helper,
quit Ace-dev, and remove its installed bundle. Keep its data directories.

The installed `/Applications/Ace-dev.app` uses `dev.ace.desktop.dev`, port 4141, the `ace-dev`
Expand All @@ -233,20 +233,20 @@ registered helper's signature, so an ad-hoc or differently signed replacement fa
constraint violation. The build refuses ad-hoc signing. Apple recommends an
[Apple-issued identity for both the app and helper](https://developer.apple.com/forums/thread/799910).

To replace it, stop Ace Helper in Settings → This Mac, which unregisters it, and quit Ace. Remove
To replace it, stop Ace Helper in Settings → Ace Helper, which unregisters it, and quit Ace. Remove
the old bundle and move the new one from `dist/dev-macos-arm64` into `/Applications` as a complete
directory; do not overwrite executables inside the installed bundle or leave copies with the
`dev.ace.desktop.dev` identifier elsewhere, because launchd can resolve the helper from any
registered copy. Refresh its registration with
`/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f /Applications/Ace-dev.app`,
then open Ace and enable Ace Helper. In Settings → This Mac, try restarting the helper, then stopping
then open Ace and enable Ace Helper. In Settings → Ace Helper, try restarting the helper, then stopping
and starting it. Keep the `ace-dev` data, preferences, and Keychain service. Changing the signing
identity may require approving Keychain access again. This build is signed locally, not notarized.

## Test hosts

`ace serve --loopback` runs a host that only listens on 127.0.0.1. It doesn't bind the tailnet,
find peers, or publish to the team directory; Settings says so under Tailscale. Give a disposable
find peers, or publish to the team directory; Settings → Team says so under Tailscale. Give a disposable
host its own `ACE_HOME`, `ACE_CONFIG_HOME`, `ACE_KEYCHAIN_SERVICE`, and port. A busy port's error
names the Ace on it and never asks to restart a listener that belongs to another app or checkout.

Expand Down Expand Up @@ -277,7 +277,7 @@ The Chat tab keeps the channel's name; use `ace rename` to change that name inst

The commands connect to an already running local host and never start one. Use its `ACE_HOME`
profile and pass `--port <port>` when it differs from `ACE_PORT` or the default 4140. The command the
installed app links from Settings → This Mac, such as `ace-canary tabs`, already targets its app. For
installed app links from Settings → Ace Helper, such as `ace-canary tabs`, already targets its app. For
a source CLI, the installed canary uses `ACE_HOME="$HOME/.local/state/ace-canary"` and `--port 4142`; the development
app uses `ACE_HOME="$HOME/.local/state/ace-dev"` and `--port 4141`. Authentication checks the host's
identity and protocol before connecting. Listing or renaming tabs over the tailnet is unavailable.
Expand Down
6 changes: 3 additions & 3 deletions docs/setup.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ take priority and Settings identifies them.

## Command line tool

`Settings → This Mac` installs the command line tool. It links `ace` for stable, or `ace-canary`
`Settings → Ace Helper` installs the command line tool. It links `ace` for stable, or `ace-canary`
for Canary, in `~/.local/bin` to the app's own Ace Helper, so it uses that app's channels and port
and stays current with app updates. Settings says whether your shell finds it and, if not, what to
add to your `PATH`.
Expand Down Expand Up @@ -52,8 +52,8 @@ home screen to use it as an app.

The team's directory lists every host's channels, so they stay visible while their host sleeps.
Whoever sets up the team deploys the services once from a checkout; everyone else joins in
`Settings → This Mac → Team directory` with the directory's URL and the team's secret, shared
privately. `Troubleshooting → Refresh status` syncs at once. From a checkout,
`Settings → Team` (Join…) with the directory's URL and the team's secret, shared privately.
Refresh there syncs at once. From a checkout,
`printf %s "$SECRET" | bun ace key set ACE_SECRET` then `bun ace directory <url>` does the same.

The services are cells, so they run on Cloudflare Workers, or on [celld](#on-celld) on machines the
Expand Down
2 changes: 1 addition & 1 deletion readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ Read [the trust model](docs/architecture.md#the-team) before running or sharing
## Run

Install Ace or Ace Canary from [releases](https://github.com/githubnext/ace/releases), add a key in
`Settings → Providers`, and join your team's directory in `Settings → This Mac`. Press Cmd+O to
`Settings → Providers`, and join your team's directory in `Settings → Team`. Press Cmd+O to
open a folder as a project, then start a channel from its dashboard.

From a checkout, with Bun 1.4 or later:
Expand Down