@brokkai/mjolnir-linux-arm64-gnu 2.4.0 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -1,497 +1,146 @@
|
|
|
1
1
|
# Mjolnir
|
|
2
2
|
|
|
3
|
-
Mjolnir (`mj`) is a
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
dashboard for their sessions, quotas, and credentials. Agents connect through
|
|
7
|
-
the [Agent Client Protocol](https://agentclientprotocol.com) (ACP).
|
|
3
|
+
Mjolnir (`mj`) is a session manager for coding agents that provisions their
|
|
4
|
+
execution environments and lets you continue work across harnesses, accounts,
|
|
5
|
+
and machines.
|
|
8
6
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
Start a task with Claude Code locally, continue with Codex in a remote container,
|
|
8
|
+
and restore the session on another host. Choose the harness account and execution
|
|
9
|
+
target independently; Mjolnir handles provisioning, credential synchronization,
|
|
10
|
+
checkpointing, and the handoff.
|
|
12
11
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
Codex accounts and a Claude account, on three machines, overnight, does not.
|
|
17
|
-
Mjolnir exists for the second case.
|
|
18
|
-
|
|
19
|
-
- **Sessions survive everything.** Prompts queue durably on the target and keep
|
|
20
|
-
executing in order while your terminal is closed or your laptop is off. Every
|
|
21
|
-
session records a hash-chained event journal. Recovery archives are verified
|
|
22
|
-
end to end before Mjolnir tears anything down, and crashed or wedged workers are
|
|
23
|
-
detected and restarted automatically.
|
|
24
|
-
- **Full-access mode without fear.** Isolated targets run the agent in its
|
|
25
|
-
unrestricted mode — no permission prompts — because the blast radius is a
|
|
26
|
-
disposable container or instance, not your machine.
|
|
27
|
-
- **Your credentials stay canonical.** Each profile keeps one credential set on
|
|
28
|
-
your machine. Mjolnir copies a minimal allowlist into each target, reconciles
|
|
29
|
-
rotating OAuth tokens across every live session within about a minute, and
|
|
30
|
-
structurally excludes credentials from event streams and recovery archives.
|
|
31
|
-
- **One view of capacity.** Sessions, per-profile quota and usage, and host
|
|
32
|
-
capacity in one dashboard — and on your phone through the persistent Mjolnir daemon.
|
|
33
|
-
- **Agents can operate it.** `mj doctor --json` and `mj setup instructions`
|
|
34
|
-
are designed so your coding agent can converge a host to session-ready by
|
|
35
|
-
looping on machine-readable checks.
|
|
36
|
-
|
|
37
|
-
## Goals
|
|
38
|
-
|
|
39
|
-
1. Run many concurrent, long-lived agent sessions and make them durable:
|
|
40
|
-
detached execution, verified recovery archives, resume onto a fresh target.
|
|
41
|
-
2. Make unrestricted agent modes safe by pairing them with disposable,
|
|
42
|
-
isolated environments.
|
|
43
|
-
3. Keep provisioning minimal and deterministic: per-harness allowlists,
|
|
44
|
-
SHA-256-verified workers and archives, no snowflake state in targets.
|
|
45
|
-
4. Give one control plane across harnesses and profiles: sessions, quotas,
|
|
46
|
-
credentials, and remote control in one place.
|
|
47
|
-
5. Fail loudly. A failed checkpoint leaves the session usable and says so;
|
|
48
|
-
retired formats are rejected, never half-converted.
|
|
49
|
-
6. Stay operable by both humans (TUI, web) and coding agents (JSON output,
|
|
50
|
-
scriptable CLI).
|
|
51
|
-
|
|
52
|
-
## Non-goals
|
|
53
|
-
|
|
54
|
-
- **Mjolnir is not an agent.** It does not write code, plan, or pick models. It
|
|
55
|
-
manages harnesses that do.
|
|
56
|
-
- **No privileged host setup.** Mjolnir will not install container runtimes, edit
|
|
57
|
-
`subuid`/`subgid`, create AWS launch templates or security groups, or make
|
|
58
|
-
SSH hosts reachable. You (or your agent, with your credentials) do that;
|
|
59
|
-
`mj doctor` verifies it and prescribes the exact remediation.
|
|
60
|
-
- **No wholesale environment transfer.** SSH and GPG keys, shell dotfiles,
|
|
61
|
-
editor configuration, package-registry credentials, cloud configuration, and
|
|
62
|
-
toolchain state are never copied into targets.
|
|
63
|
-
- **Not a team server.** One controller process owns a session store, enforced
|
|
64
|
-
by an OS-backed lock. The web server is a personal remote control with one
|
|
65
|
-
viewer credential, not a multi-user service.
|
|
66
|
-
- **Not an orchestration platform.** Containers are unnamed disposable
|
|
67
|
-
templates, rebuilt from checkpoints rather than upgraded in place. There is
|
|
68
|
-
no scheduler and no load-based admission; overcommit is your call.
|
|
69
|
-
- **No compatibility shims.** Old relay protocols and archive schemas are
|
|
70
|
-
rejected with a clear error instead of being partially converted.
|
|
71
|
-
|
|
72
|
-
## Harnesses and targets
|
|
73
|
-
|
|
74
|
-
| Harness | Credentials & quota | Checkpoint/restore of native state |
|
|
75
|
-
|---|---|---|
|
|
76
|
-
| Codex | yes | yes |
|
|
77
|
-
| Claude Code | yes | yes |
|
|
78
|
-
| Kimi Code | yes | yes |
|
|
79
|
-
| Grok Build | yes | yes |
|
|
80
|
-
| DeepSeek Harness | credentials yes; usage-priced, no subscription quota | yes |
|
|
81
|
-
| Muse Code | credentials yes; quota unavailable | yes |
|
|
12
|
+
[Documentation](https://mjolnir.brokk.ai/) ·
|
|
13
|
+
[Quickstart](https://mjolnir.brokk.ai/quickstart/) ·
|
|
14
|
+
[Releases](https://github.com/BrokkAi/mjolnir/releases)
|
|
82
15
|
|
|
83
|
-
|
|
84
|
-
view or `mj import <harness>`. Use `deepseek` (or `dsh`) for DSH and `muse` for
|
|
85
|
-
Muse Code. Imports preserve native session identity and can resume in a relocated
|
|
86
|
-
workspace; Muse and DSH accept one workspace root.
|
|
87
|
-
|
|
88
|
-
The set is extensible by design: these six are reference integrations, not a
|
|
89
|
-
closed list. A new ACP-speaking harness needs a launch recipe or bridge, its
|
|
90
|
-
credential file shapes and login command, its home environment variable, a
|
|
91
|
-
checkpoint allowlist for native session state, and optionally a quota reader.
|
|
92
|
-
Issues and pull requests for new harnesses are welcome.
|
|
93
|
-
|
|
94
|
-
| Target | Kind | Where it runs | Agent mode |
|
|
95
|
-
|---|---|---|---|
|
|
96
|
-
| Local Git worktree | `local-bare` | your machine | your configured approvals |
|
|
97
|
-
| Podman container | `local-podman` | Linux, WSL2 | unrestricted |
|
|
98
|
-
| Docker container | `local-docker` | Linux, WSL2 | unrestricted |
|
|
99
|
-
| Apple container | `apple-container` | macOS 26+, Apple silicon | unrestricted |
|
|
100
|
-
| SSH machine | `ssh-bare` | a Linux host you name | guardian or unrestricted |
|
|
101
|
-
| Podman over SSH | `ssh-podman` | a Linux host you name | unrestricted |
|
|
102
|
-
| Docker over SSH | `ssh-docker` | a Linux host with Docker Engine | unrestricted |
|
|
103
|
-
| EC2 instance | `aws-ec2` | your AWS account | unrestricted |
|
|
104
|
-
|
|
105
|
-
The controller (the `mj` binary you run) supports Linux and macOS. Windows is
|
|
106
|
-
not supported; use WSL2.
|
|
107
|
-
|
|
108
|
-
## Install
|
|
16
|
+
## Why Mjolnir
|
|
109
17
|
|
|
110
|
-
|
|
18
|
+
- **Provision the environment with the session.** Launch disposable Docker or
|
|
19
|
+
Podman containers locally or over SSH, or EC2 instances from your launch
|
|
20
|
+
templates. Mjolnir uploads session workers to remote hosts without requiring a
|
|
21
|
+
resident Mjolnir daemon on each host. Multi-repository bundles give each session
|
|
22
|
+
the complete project layout.
|
|
23
|
+
- **Choose the harness, account, and machine independently.** Keep multiple
|
|
24
|
+
profiles for the same harness, adopt existing native sessions, and move work to
|
|
25
|
+
another account or target. When switching harnesses, Mjolnir preserves repository
|
|
26
|
+
state and the visible conversation and gives the new harness a condensed
|
|
27
|
+
handoff. Same-harness resume restores native session state.
|
|
28
|
+
- **Keep credentials and project knowledge available.** Mjolnir continuously
|
|
29
|
+
synchronizes whitelisted credentials into live targets and shares project memory
|
|
30
|
+
across sessions and harnesses. The dashboard brings profile quota and target
|
|
31
|
+
capacity together; independent adversarial review can check completed work.
|
|
32
|
+
|
|
33
|
+
The comparison below covers product capabilities. **—** means no first-class
|
|
34
|
+
capability; manual scripts, host setup, and filesystem access are described where
|
|
35
|
+
relevant. Compared against repository snapshots inspected on **September 8, 2026**:
|
|
36
|
+
[Herdr](https://github.com/herdrdev/herdr),
|
|
37
|
+
[Paseo](https://github.com/getpaseo/paseo), and
|
|
38
|
+
[T3 Code](https://github.com/pingdotgg/t3code).
|
|
39
|
+
|
|
40
|
+
### Provisioning
|
|
41
|
+
|
|
42
|
+
| Feature | Mjolnir | Herdr | Paseo | T3 Code |
|
|
43
|
+
|---|---|---|---|---|
|
|
44
|
+
| **Remote targets** | Anything reachable over SSH¹ | SSH machines with Herdr installed | Machines running a reachable Paseo daemon | SSH/WSL environments running a T3 backend |
|
|
45
|
+
| **Remote execution** | Uploads an on-demand session worker; no resident per-host daemon | Requires a Herdr server on each host | Requires a Paseo daemon on each host | Requires a T3 backend in each environment |
|
|
46
|
+
| **EC2** | Provisions and terminates instances from launch templates | Manual setup as a remote host | Manual setup as a remote host | Manual setup as a remote environment |
|
|
47
|
+
| **Session containers** | Docker, Podman | — | — | — |
|
|
48
|
+
| **Credential synchronization** | Continuously syncs whitelisted credentials into live targets | Host-local credentials | Per-daemon credentials | Per-environment credentials |
|
|
49
|
+
|
|
50
|
+
### Session continuity
|
|
51
|
+
|
|
52
|
+
| Feature | Mjolnir | Herdr | Paseo | T3 Code |
|
|
53
|
+
|---|---|---|---|---|
|
|
54
|
+
| **Native-session adoption** | All supported harnesses | No external adoption; only restarts sessions it was already supervising | All supported providers with native list/load support | No external adoption; continues T3-owned sessions |
|
|
55
|
+
| **Resume sessions across profiles and harnesses** | ✓ | Manual handoff | `/paseo-handoff` skill | Same-harness only² |
|
|
56
|
+
| **Cross-host move and restore** | ✓ — live Move or stop/resume onto another target | — | — | — |
|
|
57
|
+
| **Multi-repo projects** | Bundles provision, checkpoint, review, move, and restore member repos together³ | Filesystem access only; separate workspaces or panes | Filesystem/provider access only; one root per workspace | Filesystem access only; one workspace root per project |
|
|
58
|
+
|
|
59
|
+
### Harnesses and accounts
|
|
60
|
+
|
|
61
|
+
| Feature | Mjolnir | Herdr | Paseo | T3 Code |
|
|
62
|
+
|---|---|---|---|---|
|
|
63
|
+
| **Supported harnesses** | Claude Code, Codex, Kimi Code, Grok Build, DSH, Muse Code | Pi, OMP, Copilot, Devin, Kimi, Hermes, Qoder, Qwen, Droid, OpenCode, Kilo, MastraCode, Claude, Codex, Cursor, Amp, Grok, Antigravity, Kiro, Maki, Muse; any other CLI runs without agent-aware features | Claude, Codex, Copilot, OpenCode, Pi, OMP; catalog and custom ACP agents including Kimi, Cursor, Hermes, and Qwen | Codex, Claude, Cursor, Grok, OpenCode |
|
|
64
|
+
| **Multiple profiles per harness** | First-class named profiles | Manual wrappers and environment configuration | Custom provider aliases | Provider instances; continuation compatibility varies by harness |
|
|
65
|
+
| **Usage and quota view** | Live subscription quota by profile plus target capacity⁴ | — | Provider plan usage on demand | Token and API-cost analytics; not remaining subscription quota |
|
|
66
|
+
|
|
67
|
+
### Assistance and control
|
|
68
|
+
|
|
69
|
+
| Feature | Mjolnir | Herdr | Paseo | T3 Code |
|
|
70
|
+
|---|---|---|---|---|
|
|
71
|
+
| **Cross-session project memory** | Synchronized project memory shared across sessions, profiles, harnesses, and targets | — | — | — |
|
|
72
|
+
| **Automatic adversarial review** | Built-in automatic or on-demand independent review | Scriptable through agent automation; no built-in review loop | Manual `/paseo-advisor` second opinion | — |
|
|
73
|
+
| **Control surfaces** | TUI, web, desktop shell, CLI | TUI, CLI | Web, desktop, iOS, Android, CLI | Web, desktop, iOS, Android, CLI |
|
|
74
|
+
| **Voice input** | TUI and web dictation | — | Dictation and conversational voice mode | — |
|
|
75
|
+
|
|
76
|
+
### Extensibility
|
|
77
|
+
|
|
78
|
+
| Feature | Mjolnir | Herdr | Paseo | T3 Code |
|
|
79
|
+
|---|---|---|---|---|
|
|
80
|
+
| **Product plugins** | — | Workflow packages with actions, event hooks, terminal panes, and link handlers | Full-stack client/server plugins: UI surfaces, RPCs, tools, providers, themes, and commands | — |
|
|
81
|
+
|
|
82
|
+
“Native-session adoption” means discovering a session created outside the product
|
|
83
|
+
and bringing it under management. Ordinary same-harness continuation is excluded.
|
|
84
|
+
|
|
85
|
+
1. Mjolnir's SSH targets require a supported Linux host and the documented runtime
|
|
86
|
+
prerequisites. It also supports Apple's container runtime on compatible Macs.
|
|
87
|
+
See [targets](https://mjolnir.brokk.ai/targets/).
|
|
88
|
+
2. T3 continuation also requires compatible provider homes: Codex can share history
|
|
89
|
+
across accounts using its shadow-home setup; separate Claude account homes
|
|
90
|
+
cannot continue the same thread.
|
|
91
|
+
3. Bundles apply to managed targets. DSH (DeepSeek Harness) and Muse Code currently
|
|
92
|
+
accept one workspace root. Bare sessions can access neighboring repositories
|
|
93
|
+
subject to harness permissions, but do not manage them as a bundle.
|
|
94
|
+
4. Quota availability depends on the harness. Muse currently cannot use the
|
|
95
|
+
project-memory tools or act as a reviewer. Cross-harness resume requires a
|
|
96
|
+
configured utility-capable profile to generate the handoff; see
|
|
97
|
+
[durability and recovery](https://mjolnir.brokk.ai/durability/).
|
|
98
|
+
|
|
99
|
+
## Get started
|
|
100
|
+
|
|
101
|
+
Install the release bundle on Linux or macOS (use WSL2 on Windows):
|
|
102
|
+
|
|
103
|
+
```sh
|
|
111
104
|
curl -fsSL https://raw.githubusercontent.com/BrokkAi/mjolnir/master/install.sh | bash
|
|
112
105
|
```
|
|
113
106
|
|
|
114
|
-
|
|
115
|
-
needed. Each desktop release ships the headless `mj` controller, its separate
|
|
116
|
-
`mj-desktop` application, the voice worker, and dedicated session workers.
|
|
117
|
-
Linux workers are static musl binaries that Mjolnir uploads into disposable
|
|
118
|
-
targets; the macOS bundle also has a native worker for `local-bare`. `mj` itself
|
|
119
|
-
does not load native desktop libraries. Run `mj doctor` next. The installer also honors
|
|
120
|
-
`MJOLNIR_VERSION` to install a specific tag and `MJOLNIR_INSTALL_DIR` (or
|
|
121
|
-
`INSTALL_DIR`) to choose the install directory; see `--help`.
|
|
122
|
-
|
|
123
|
-
npm works too:
|
|
124
|
-
|
|
125
|
-
```console
|
|
126
|
-
npm install -g @brokkai/mjolnir
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
For source development, build the native controller and the much smaller
|
|
130
|
-
portable worker separately:
|
|
131
|
-
|
|
132
|
-
```console
|
|
133
|
-
scripts/run.sh --release -- --version
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
On Linux this builds `mj` for the host and only `mj-worker` for musl. On macOS
|
|
137
|
-
both are native, which supports `local-bare` development without Zig; managed
|
|
138
|
-
Linux targets require a packaged static worker or an explicit worker override.
|
|
139
|
-
|
|
140
|
-
The desktop application is a separate native build. On x86-64 GNU/Linux,
|
|
141
|
-
install the WebKitGTK development package for your distribution and run:
|
|
142
|
-
|
|
143
|
-
```console
|
|
144
|
-
cargo build --release -p brokk-mjolnir -p brokk-mj-desktop \
|
|
145
|
-
--target x86_64-unknown-linux-gnu
|
|
146
|
-
./target/x86_64-unknown-linux-gnu/release/mj app
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
Use the corresponding host target on ARM64 Linux or macOS. Installing from
|
|
150
|
-
crates.io likewise requires both `brokk-mjolnir` and `brokk-mj-desktop` when
|
|
151
|
-
you want `mj app`; headless installations need only `brokk-mjolnir`.
|
|
152
|
-
|
|
153
|
-
For container targets, pull the published multi-arch agent image (public, no
|
|
154
|
-
authentication):
|
|
155
|
-
|
|
156
|
-
```console
|
|
157
|
-
podman pull ghcr.io/brokkai/mjolnir/agent-dev:latest
|
|
158
|
-
# or
|
|
159
|
-
docker pull ghcr.io/brokkai/mjolnir/agent-dev:latest
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
It includes Rust, cargo-nextest, Node, OpenJDK 25, Git, GitHub CLI, the Codex
|
|
163
|
-
and Claude ACP bridges, and pinned DeepSeek Harness with its bundled ACP profile.
|
|
164
|
-
It also bakes in Playwright's Chromium system libraries and the Chromium
|
|
165
|
-
headless shell (in `PLAYWRIGHT_BROWSERS_PATH=/ms-playwright`), so headless
|
|
166
|
-
browser tests run without a privileged install or a run-time download,
|
|
167
|
-
and the profiling tools `perf`, `cargo-flamegraph`, `samply`, and `heaptrack`
|
|
168
|
-
(`perf` also needs the host's `kernel.perf_event_paranoid` to be 1 or lower, or
|
|
169
|
-
`--cap-add SYS_ADMIN` on the container).
|
|
170
|
-
For optional local coverage analysis, the image carries the
|
|
171
|
-
`llvm-tools-preview` component, pinned `cargo-llvm-cov`, and `lcov` for
|
|
172
|
-
`genhtml`.
|
|
173
|
-
See [docs/src/content/docs/custom-images.md](docs/src/content/docs/custom-images.md)
|
|
174
|
-
to build your own.
|
|
175
|
-
|
|
176
|
-
## Quickstart
|
|
177
|
-
|
|
178
|
-
1. Run `mj` from your project directory. If no workspace exists, Mjolnir
|
|
179
|
-
creates one using the directory name. An empty workspace automatically
|
|
180
|
-
starts a session and focuses the prompt. Existing workspace selection and
|
|
181
|
-
live-session startup keep their current behavior.
|
|
182
|
-
2. On Linux and macOS, a fresh configuration starts with your Codex home
|
|
183
|
-
(`CODEX_HOME`, or `~/.codex`). Automatic target selection prefers usable
|
|
184
|
-
Podman, then Docker, then a local directory session. Container sessions use
|
|
185
|
-
the current repository, including its uncommitted changes; plain directories
|
|
186
|
-
use the local target. Runtime checks and session launch run in the background.
|
|
187
|
-
3. Type your first prompt when launch finishes. Use `[startup]` in `config.toml`
|
|
188
|
-
to set `profile = "your-profile"`, `target = "your-target"`, or
|
|
189
|
-
`enabled = false`. Explicit targets are honored even when unavailable, so
|
|
190
|
-
their launch errors remain visible. Use `mj setup` for guided configuration
|
|
191
|
-
of additional execution environments, and **New…** or `Alt+W` for a custom session.
|
|
192
|
-
4. If launch reports a prerequisite failure, run `mj doctor` and use
|
|
193
|
-
`mj login --profile <id>` when authentication is needed. Detach with `Alt+Q`;
|
|
194
|
-
running sessions continue. Reattach with `mj` or use the daemon-owned web
|
|
195
|
-
viewer shown by `mj daemon status`.
|
|
196
|
-
|
|
197
|
-
## The terminal surface
|
|
198
|
-
|
|
199
|
-
Mjolnir's TUI is one screen. The **Workspace** switcher and **Sessions** list
|
|
200
|
-
sit in a sidebar beside the **transcript**, **Prompt** composer, **Targets**,
|
|
201
|
-
and **Quota**, with a footer that names the keys that apply right now. Nothing
|
|
202
|
-
is behind a navigation step, so you can read an agent's output while seeing what your other
|
|
203
|
-
agents are doing and how loaded your machines are.
|
|
204
|
-
|
|
205
|
-
Mjolnir opens on the session in your opened workspace whose agent spoke most
|
|
206
|
-
recently, with the cursor in Prompt. The Sessions sidebar shows every session across all workspaces, including
|
|
207
|
-
stopped sessions. Select one and press Enter to switch to its conversation.
|
|
208
|
-
Click the **Workspace** switcher above Sessions, or press `F3`, to choose the
|
|
209
|
-
workspace where new sessions will be created. It shows the workspace you opened,
|
|
210
|
-
even when you view a session from another workspace.
|
|
211
|
-
|
|
212
|
-
Use **New…** below the switcher to choose session options, or **Quick new** to
|
|
213
|
-
create with saved defaults. **Commands** opens the command palette; select an
|
|
214
|
-
action and click **Run**. Each session's **⋯** button opens its actions. The
|
|
215
|
-
workspace picker provides clickable Open, New, Rename, Recover, Delete, and
|
|
216
|
-
Back controls, and displayed dashboard shortcut hints are clickable too.
|
|
217
|
-
Click **Show stopped** at the bottom of Sessions, or press `h` in that panel,
|
|
218
|
-
to hide or show stopped sessions. The choice is remembered.
|
|
219
|
-
|
|
220
|
-
In Sessions, `n` immediately creates a session using your
|
|
221
|
-
saved defaults: Codex when configured, a usable local Podman or Docker runtime,
|
|
222
|
-
then a local worktree when neither runtime is available. The session uses the
|
|
223
|
-
directory you launched Mjolnir in and belongs to the workspace you opened.
|
|
224
|
-
Its normal Prompt receives focus when ready. `N` opens the full
|
|
225
|
-
creation wizard. `s` stops and `r` restarts the selected session without
|
|
226
|
-
confirmation. `d` deletes it after a Yes/No choice; no identifier typing is required.
|
|
227
|
-
|
|
228
|
-
`F7` opens Setup for accounts, targets, projects, new-session defaults, sidebar
|
|
229
|
-
placement, display, review, and web access. Choose Left or Right for the sidebar,
|
|
230
|
-
and turn off **Focus prompt after creating** to keep focus in Sessions.
|
|
231
|
-
Choose **Theme** for Midnight (the default), Light, or Dracula. Press `Enter` to
|
|
232
|
-
apply the choice to your draft, then `Ctrl+S` to save and update the terminal
|
|
233
|
-
colors immediately. The preference is kept across restarts.
|
|
234
|
-
|
|
235
|
-
`Tab` moves the keyboard through the layout — Sessions, Prompt, Targets, Quota —
|
|
236
|
-
and `Shift+Tab` reverses it. Every pane remains in that ring at every size. The
|
|
237
|
-
transcript is not a Tab stop: read it with the mouse wheel or
|
|
238
|
-
`PageUp`/`PageDown` from wherever you are. Moving focus never resizes a pane.
|
|
239
|
-
|
|
240
|
-
Sessions, Targets, and Quota each have `▁`, `▪`, and `□` controls in their
|
|
241
|
-
title bars for minimized, standard, and maximized size. Minimized Targets and
|
|
242
|
-
Quota become one summary row each; minimized Sessions narrows the full-height
|
|
243
|
-
sidebar and shows one line per session. Maximizing Sessions widens the sidebar.
|
|
244
|
-
A maximized Targets or Quota pane gets available vertical space below Prompt. Only one pane can be maximized
|
|
245
|
-
at a time.
|
|
246
|
-
|
|
247
|
-
`Alt+Z` cycles the focused support pane through its three sizes without moving
|
|
248
|
-
focus. `Alt+G` is the layout shortcut: from all-standard it minimizes Sessions,
|
|
249
|
-
Targets, and Quota to leave more room for the conversation; from any customized
|
|
250
|
-
layout it restores all three panes to standard. Tab leaves every chosen size alone.
|
|
251
|
-
|
|
252
|
-
A few keys answer from everywhere, including while you are typing in Prompt:
|
|
253
|
-
`F2` opens the command palette, `F3` the workspace picker, `F4` the web viewer,
|
|
254
|
-
`F5` refreshes Targets and Quota, `F7` opens Setup, `Alt+N` opens quick New,
|
|
255
|
-
`Alt+W` opens the full creation wizard,
|
|
256
|
-
`Alt+S` resumes one, `Alt+A` marks everything read, `Alt+X` cancels whatever
|
|
257
|
-
the selected session is in the middle of, `Alt+Z` sizes the focused support
|
|
258
|
-
pane, `Alt+G` toggles the pane preset, and
|
|
259
|
-
`Alt+Q` detaches this terminal client — the daemon and the sessions it runs
|
|
260
|
-
keep working. The plain `n`, `N`, `s`, `r`, and `d` keys work in Sessions;
|
|
261
|
-
the global chords also work while Prompt has focus.
|
|
262
|
-
|
|
263
|
-
`F2` is the way to reach a command you have no key for. It lists the selected
|
|
264
|
-
session's own commands first — rename it, edit its container settings, stop it
|
|
265
|
-
— under a heading naming that session, then the commands for the pane you are
|
|
266
|
-
in, then everything that works anywhere, each with the key that runs it. Type
|
|
267
|
-
to filter by name or description, `Up`/`Down` to move, `Enter` to run, `Escape`
|
|
268
|
-
to close. Commands that cannot run right now stay in the list, greyed, with the
|
|
269
|
-
reason.
|
|
270
|
-
|
|
271
|
-
In Prompt, `Ctrl+R` searches your prompt history, as in a shell, and `Alt+T`
|
|
272
|
-
switches the transcript between rendered and raw. Inside the search, `Alt+R`
|
|
273
|
-
cycles which history it reads. Every other `Ctrl` key in Prompt is a text
|
|
274
|
-
editing key, as in a shell.
|
|
275
|
-
|
|
276
|
-
`Alt` chords need Option to act as Meta in macOS terminals (iTerm2:
|
|
277
|
-
Preferences, Profiles, Keys, "Left Option key: Esc+"; Terminal.app: "Use Option
|
|
278
|
-
as Meta key"), and inside tmux a short `escape-time`, for example
|
|
279
|
-
`set -sg escape-time 10` in `~/.tmux.conf`. Without those the terminal reports
|
|
280
|
-
`Alt+N` as `Escape` then `n`. The command palette on `F2` and the key reference
|
|
281
|
-
below are the fallbacks: every chord is also a line in both.
|
|
282
|
-
|
|
283
|
-
`F1` opens the key reference, and so does `?` from any pane. It lists every key
|
|
284
|
-
this screen answers, greying the ones that do not apply where you are; `Escape`,
|
|
285
|
-
`F1`, or `?` closes it and puts back whatever it opened over. The footer is
|
|
286
|
-
generated from the same list, so it names only the keys that apply right now —
|
|
287
|
-
`Alt-X cancel launch`, for instance, appears only while the selected session is
|
|
288
|
-
starting or stopping.
|
|
289
|
-
|
|
290
|
-
The footer reads in three groups, separated by a vertical bar: what the pane
|
|
291
|
-
you are in answers, the `Alt` chords that answer anywhere, then the function
|
|
292
|
-
keys. A narrow terminal drops hints from the left-hand groups first; the
|
|
293
|
-
function keys stay, because they are the way to the palette and the reference.
|
|
294
|
-
|
|
295
|
-
The panes take plain keys, because the composer is a separate focus and never
|
|
296
|
-
sees them. A plain letter is always pane-local: everything reachable from
|
|
297
|
-
anywhere is a chord. On Sessions: `Enter` opens the selection, `Space` and
|
|
298
|
-
`1`–`9` collapse and expand projects; a session's own commands are on `F2`. On
|
|
299
|
-
Targets and Quota: `Enter` or `e` opens that row's actions, and `F5` refreshes
|
|
300
|
-
both panes from anywhere.
|
|
301
|
-
Every list also takes the arrow keys, `j`/`k`, `Ctrl+N`/`Ctrl+P`, and
|
|
302
|
-
`Home`/`End`.
|
|
303
|
-
|
|
304
|
-
`Escape` belongs to the conversation: it cancels a running turn or a shell
|
|
305
|
-
command, and closes a dialog. It never detaches.
|
|
306
|
-
|
|
307
|
-
In an attached TUI or the phone viewer, start a message with `!` to run the
|
|
308
|
-
rest as `bash -lc` inside that session's target. Shell commands run in the
|
|
309
|
-
session workspace without blocking an active agent turn. Their bounded live
|
|
310
|
-
output is saved in the transcript and included once as hidden context on the
|
|
311
|
-
next prompt submitted after the command finishes. Press Escape in the TUI, or
|
|
312
|
-
use the shell's Cancel button in the viewer, to stop it.
|
|
313
|
-
|
|
314
|
-
Configuration lives at `~/.config/mjolnir/config.toml` (the platform-equivalent
|
|
315
|
-
directory elsewhere). First launch writes minimal local defaults; `mj setup`
|
|
316
|
-
offers guided discovery, and further settings can be edited in TOML. A minimal example:
|
|
317
|
-
|
|
318
|
-
```toml
|
|
319
|
-
version = 2
|
|
320
|
-
|
|
321
|
-
[profiles.codex-1]
|
|
322
|
-
kind = "codex"
|
|
323
|
-
home = "/home/me/.codex"
|
|
324
|
-
|
|
325
|
-
[profiles.claude-1]
|
|
326
|
-
kind = "claude"
|
|
327
|
-
home = "/home/me/.claude"
|
|
328
|
-
|
|
329
|
-
[bundles.myapp]
|
|
330
|
-
primary_repo = "myapp"
|
|
331
|
-
|
|
332
|
-
[[bundles.myapp.repositories]]
|
|
333
|
-
id = "myapp"
|
|
334
|
-
github = "your-org/myapp" # or: local = "/home/me/src/myapp"
|
|
335
|
-
destination = "myapp"
|
|
336
|
-
|
|
337
|
-
[targets.podman]
|
|
338
|
-
kind = "local-podman"
|
|
339
|
-
image = "ghcr.io/brokkai/mjolnir/agent-dev:latest"
|
|
340
|
-
# Optional: auto (default), always, newer, missing, or never. Auto launches from
|
|
341
|
-
# the cached image; the daemon refreshes remote latest tags hourly in the
|
|
342
|
-
# background. Versioned tags stay cached and digest references stay pinned.
|
|
343
|
-
# pull_policy = "auto"
|
|
344
|
-
|
|
345
|
-
# Docker uses the same fields:
|
|
346
|
-
# [targets.docker]
|
|
347
|
-
# kind = "local-docker"
|
|
348
|
-
# image = "ghcr.io/brokkai/mjolnir/agent-dev:latest"
|
|
349
|
-
|
|
350
|
-
# Docker over SSH runs the Docker CLI and OverlayFS operations on the named
|
|
351
|
-
# Linux host. The SSH alias must be usable with BatchMode=yes.
|
|
352
|
-
# [targets.builder-docker]
|
|
353
|
-
# kind = "ssh-docker"
|
|
354
|
-
# host = "builder"
|
|
355
|
-
# image = "ghcr.io/brokkai/mjolnir/agent-dev:latest"
|
|
356
|
-
```
|
|
357
|
-
|
|
358
|
-
`version` is the config schema version. A file written by a *newer* Mjolnir still
|
|
359
|
-
loads: the settings this build understands keep working, and the config becomes
|
|
360
|
-
read-only, so the older build refuses to save and never downgrades the file.
|
|
361
|
-
`mj doctor` reports that state. Update Mjolnir, or change settings with the newer
|
|
362
|
-
build, to make it writable again.
|
|
363
|
-
|
|
364
|
-
Profiles point at harness home directories on your machine — run as many
|
|
365
|
-
profiles per harness as you have accounts. Bundles describe the repositories a
|
|
366
|
-
session checks out (multi-repository bundles give agents a virtual monorepo).
|
|
367
|
-
Mjolnir-owned worker and bridge commands use non-login shells. On raw local, SSH,
|
|
368
|
-
and EC2 targets, Mjolnir makes one bounded login-shell probe when each worker starts
|
|
369
|
-
and carries only its discovered `PATH` into the non-login runtime; an explicit
|
|
370
|
-
`environment.PATH` in the profile takes precedence. Raw SSH and EC2 workers install
|
|
371
|
-
the exact Mjolnir-pinned harness runtime in a shared per-user cache and never fall
|
|
372
|
-
back to an arbitrary executable from `PATH`. Their host still needs the installer
|
|
373
|
-
prerequisites: Node.js 22 plus npm for npm-based harnesses, or curl and Bash for
|
|
374
|
-
Kimi Code and Grok Build. Mjolnir does not use sudo to install those prerequisites.
|
|
375
|
-
Later profile changes take effect after the worker restarts or the session resumes.
|
|
376
|
-
Agent-requested shell commands still run as `bash -lc` and intentionally use the
|
|
377
|
-
session user's login environment.
|
|
378
|
-
Target prerequisites and full option lists are covered in
|
|
379
|
-
[docs/PODMAN.md](docs/PODMAN.md), [docs/DOCKER.md](docs/DOCKER.md),
|
|
380
|
-
[docs/SSH.md](docs/SSH.md), and
|
|
381
|
-
[docs/AWS.md](docs/AWS.md).
|
|
382
|
-
|
|
383
|
-
### Web viewer and Tailscale
|
|
384
|
-
|
|
385
|
-
The daemon starts the authenticated web viewer by default. Run
|
|
386
|
-
`mj daemon status` for its URL and six-digit login code. Without Tailscale it
|
|
387
|
-
serves HTTP only on `127.0.0.1:3765`.
|
|
107
|
+
From your project directory, run:
|
|
388
108
|
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
desktop executable uses the system WebKitGTK runtime; install
|
|
392
|
-
`libwebkit2gtk-4.1-0` on Debian/Ubuntu or the equivalent package for your
|
|
393
|
-
distribution if it is not already present.
|
|
394
|
-
|
|
395
|
-
When the local Tailscale node has MagicDNS and HTTPS Certificates enabled, Mjolnir
|
|
396
|
-
automatically requests the node's trusted `ts.net` certificate and serves HTTPS
|
|
397
|
-
on all interfaces at the same port. Certificate issuance runs in the background
|
|
398
|
-
and may take about 30 seconds the first time; certificates renew daily without a
|
|
399
|
-
daemon restart. If HTTPS Certificates are unavailable, the status output keeps
|
|
400
|
-
the viewer loopback-only and explains how to enable them. After changing the
|
|
401
|
-
tailnet setting, run `mj daemon restart`.
|
|
402
|
-
|
|
403
|
-
The historical configuration section remains `[phone]`. Explicit certificate
|
|
404
|
-
configuration takes precedence over automatic Tailscale detection:
|
|
405
|
-
|
|
406
|
-
```toml
|
|
407
|
-
[phone]
|
|
408
|
-
# Set false to disable the web viewer entirely.
|
|
409
|
-
enabled = true
|
|
410
|
-
bind = "127.0.0.1:3765"
|
|
411
|
-
# Set false to keep the viewer loopback-only without probing Tailscale.
|
|
412
|
-
tailscale_detect = true
|
|
413
|
-
# tls_cert = "/path/to/cert.pem"
|
|
414
|
-
# tls_key = "/path/to/key.pem"
|
|
109
|
+
```sh
|
|
110
|
+
mj
|
|
415
111
|
```
|
|
416
112
|
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
per-session Git protocol bridge over the session's own transport: `git
|
|
449
|
-
fetch` and fast-forward `git push origin` operate on your checkout with no
|
|
450
|
-
inbound port and no writable mount. Force pushes, ref deletion, and receive
|
|
451
|
-
hooks are disabled; pushes to a dirty checked-out branch are rejected. Git
|
|
452
|
-
LFS is not supported through the bridge.
|
|
453
|
-
- Attached directories reject symbolic links, so an attachment cannot escape
|
|
454
|
-
its source or destination tree.
|
|
455
|
-
- The daemon's web viewer requires a six-digit code exchanged for a signed
|
|
456
|
-
session cookie. It binds only to loopback unless explicit TLS is configured
|
|
457
|
-
or automatic Tailscale detection obtains a trusted `ts.net` certificate.
|
|
458
|
-
|
|
459
|
-
## Durability
|
|
460
|
-
|
|
461
|
-
Mjolnir saves a recovery copy automatically after completed turns when the session
|
|
462
|
-
is idle (at most every ten minutes), and `mj checkpoint --session <id>`
|
|
463
|
-
forces one. "Idle" includes work the agent starts on its own: when Claude Code
|
|
464
|
-
picks a task back up after a background command finishes, the session shows as
|
|
465
|
-
running and a recovery copy waits until that work ends, and the composer's Esc
|
|
466
|
-
cancels only a prompt you sent. Recovery archives are checked byte-for-byte
|
|
467
|
-
against the target's SHA-256 before any teardown; their full structure and
|
|
468
|
-
payload hashes are verified when they are read for resume or import. A normal
|
|
469
|
-
Stop refuses teardown if its checksum gate fails. Explicit force-destroy is the
|
|
470
|
-
data-loss escape hatch.
|
|
471
|
-
|
|
472
|
-
A stopped session resumes by provisioning a fresh target from its archive,
|
|
473
|
-
with its pending prompt queue intact (resume asks whether to keep or discard
|
|
474
|
-
it). For Codex, the archive retains the primary thread and canonical transcript,
|
|
475
|
-
including child-agent results surfaced in that transcript, but not child agents'
|
|
476
|
-
private rollouts; stopped child agents cannot receive follow-ups after resume.
|
|
477
|
-
A session recorded under one harness can be resumed under another; Mjolnir
|
|
478
|
-
condenses the transcript into a size-bounded handoff for the new harness. That
|
|
479
|
-
compaction is direct, tool-free inference and does not create an ACP session.
|
|
480
|
-
Mjolnir chooses a configured profile with usable quota and a current model in
|
|
481
|
-
this precedence: Codex GPT Luna, Grok, Kimi, then DeepSeek Flash. Model versions
|
|
482
|
-
come from each provider's live catalog. Claude profiles are never utility
|
|
483
|
-
models; if Claude is the only configured harness, cross-harness compaction has
|
|
484
|
-
no utility model and resume reports that error.
|
|
485
|
-
|
|
486
|
-
If Mjolnir or its host crashes, workers and their queued prompts keep running.
|
|
487
|
-
`mj recover scan` finds managed containers and instances that are no longer
|
|
488
|
-
tracked; `mj recover adopt` reconnects one as a tracked session.
|
|
489
|
-
|
|
490
|
-
After Mjolnir itself is upgraded, each running session's worker is replaced with
|
|
491
|
-
the new one at the session's next quiet moment - no prompt running, no terminal
|
|
492
|
-
or background command alive, nothing queued - because replacing a worker ends
|
|
493
|
-
the agent process with it. A session that is never quiet keeps the worker it
|
|
494
|
-
started with until it is stopped.
|
|
113
|
+
On first launch, Mjolnir creates a workspace from the current directory. If the
|
|
114
|
+
opened workspace has no live session, it starts one automatically using your
|
|
115
|
+
configured Codex account and prefers usable Podman, then Docker, then a local
|
|
116
|
+
directory target. This happens once while the dashboard opens; switching
|
|
117
|
+
workspace tabs only filters the list. Press **Create** for the full wizard, or
|
|
118
|
+
use `mj setup` to configure other harness accounts and targets. Run `mj doctor`
|
|
119
|
+
to check prerequisites.
|
|
120
|
+
|
|
121
|
+
Follow the [quickstart](https://mjolnir.brokk.ai/quickstart/) for your first
|
|
122
|
+
session. The [installation guide](https://mjolnir.brokk.ai/install/) covers npm,
|
|
123
|
+
source builds, desktop dependencies, and portable workers.
|
|
124
|
+
|
|
125
|
+
## Documentation
|
|
126
|
+
|
|
127
|
+
- [Profiles and harnesses](https://mjolnir.brokk.ai/profiles/): accounts, login,
|
|
128
|
+
credentials, skills, and runtime prerequisites.
|
|
129
|
+
- [Targets](https://mjolnir.brokk.ai/targets/) and
|
|
130
|
+
[bundles](https://mjolnir.brokk.ai/workspaces-bundles/): local, container, SSH,
|
|
131
|
+
and EC2 environments; multi-repository projects and shared memory.
|
|
132
|
+
- [Session lifecycle](https://mjolnir.brokk.ai/sessions/) and
|
|
133
|
+
[durability](https://mjolnir.brokk.ai/durability/): adoption, move, resume,
|
|
134
|
+
checkpoints, and recovery.
|
|
135
|
+
- [Terminal](https://mjolnir.brokk.ai/terminal-surface/) and
|
|
136
|
+
[web/desktop](https://mjolnir.brokk.ai/web-viewer/): controls and remote access.
|
|
137
|
+
- [Adversarial review](https://mjolnir.brokk.ai/turn-review/),
|
|
138
|
+
[configuration](https://mjolnir.brokk.ai/configuration/),
|
|
139
|
+
[CLI reference](https://mjolnir.brokk.ai/cli-reference/), and
|
|
140
|
+
[security boundaries](https://mjolnir.brokk.ai/security/).
|
|
141
|
+
|
|
142
|
+
The website source lives in [docs/](docs/README.md). For the previous product
|
|
143
|
+
generation, see [Mjolnir 1.x](https://github.com/BrokkAi/mjolnir/releases/tag/v1.17.0).
|
|
495
144
|
|
|
496
145
|
## License
|
|
497
146
|
|
package/bin/mj
CHANGED
|
Binary file
|
package/bin/mj-desktop
CHANGED
|
Binary file
|
package/bin/mj-voice-worker
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -10274,14 +10274,14 @@ insights.
|
|
|
10274
10274
|
<h3 id="GPL-3.0-only">GNU General Public License v3.0 only</h3>
|
|
10275
10275
|
<h4>Used by:</h4>
|
|
10276
10276
|
<ul class="license-used-by">
|
|
10277
|
-
<li><a href="https://crates.io/crates/brokk-mj-core/2.
|
|
10278
|
-
<li><a href="https://crates.io/crates/brokk-mj-chat/2.
|
|
10279
|
-
<li><a href="https://crates.io/crates/brokk-mjolnir/2.
|
|
10280
|
-
<li><a href="https://crates.io/crates/brokk-mj-controller/2.
|
|
10281
|
-
<li><a href="https://crates.io/crates/brokk-mj-desktop/2.
|
|
10282
|
-
<li><a href="https://crates.io/crates/brokk-mj-tui/2.
|
|
10283
|
-
<li><a href="https://crates.io/crates/brokk-mj-worker/2.
|
|
10284
|
-
<li><a href="https://crates.io/crates/brokk-mj-voice-worker/2.
|
|
10277
|
+
<li><a href="https://crates.io/crates/brokk-mj-core/2.5.0">brokk-mj-core 2.5.0</a></li>
|
|
10278
|
+
<li><a href="https://crates.io/crates/brokk-mj-chat/2.5.0">brokk-mj-chat 2.5.0</a></li>
|
|
10279
|
+
<li><a href="https://crates.io/crates/brokk-mjolnir/2.5.0">brokk-mjolnir 2.5.0</a></li>
|
|
10280
|
+
<li><a href="https://crates.io/crates/brokk-mj-controller/2.5.0">brokk-mj-controller 2.5.0</a></li>
|
|
10281
|
+
<li><a href="https://crates.io/crates/brokk-mj-desktop/2.5.0">brokk-mj-desktop 2.5.0</a></li>
|
|
10282
|
+
<li><a href="https://crates.io/crates/brokk-mj-tui/2.5.0">brokk-mj-tui 2.5.0</a></li>
|
|
10283
|
+
<li><a href="https://crates.io/crates/brokk-mj-worker/2.5.0">brokk-mj-worker 2.5.0</a></li>
|
|
10284
|
+
<li><a href="https://crates.io/crates/brokk-mj-voice-worker/2.5.0">brokk-mj-voice-worker 2.5.0</a></li>
|
|
10285
10285
|
</ul>
|
|
10286
10286
|
<pre class="license-text">GNU GENERAL PUBLIC LICENSE
|
|
10287
10287
|
Version 3, 29 June 2007
|
|
@@ -10627,7 +10627,7 @@ THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
|
|
|
10627
10627
|
<h3 id="LGPL-3.0-only">GNU Lesser General Public License v3.0 only</h3>
|
|
10628
10628
|
<h4>Used by:</h4>
|
|
10629
10629
|
<ul class="license-used-by">
|
|
10630
|
-
<li><a href="https://crates.io/crates/brokk-anvil-client/0.28.
|
|
10630
|
+
<li><a href="https://crates.io/crates/brokk-anvil-client/0.28.2">brokk-anvil-client 0.28.2</a></li>
|
|
10631
10631
|
</ul>
|
|
10632
10632
|
<pre class="license-text">GNU LESSER GENERAL PUBLIC LICENSE
|
|
10633
10633
|
Version 3, 29 June 2007
|