@brokkai/mjolnir-linux-arm64-gnu 2.3.1 → 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,488 +1,146 @@
1
1
  # Mjolnir
2
2
 
3
- Mjolnir (`mj`) is a terminal control plane for coding agents. It runs many long-lived
4
- agent sessions Codex, Claude Code, Kimi Code, Grok Build, DeepSeek Harness, and Muse Code — in disposable
5
- isolated environments, keeps them working while you are away, and gives you one
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
- Mjolnir 2.0 is a new product generation: the session control plane replaces
10
- the 1.x interactive client. The last 1.x release remains available at the
11
- [v1.17.0 tag](https://github.com/BrokkAi/mjolnir/releases/tag/v1.17.0).
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
- ## Why Mjolnir
14
-
15
- Running one coding agent in one terminal works. Running six of them across two
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
- All six harnesses support importing external native sessions through the Import
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
- ```console
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
- This downloads a verified release into `~/.local/bin` — no Rust toolchain
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:
107
+ From your project directory, run:
131
108
 
132
- ```console
133
- scripts/run.sh --release -- --version
109
+ ```sh
110
+ mj
134
111
  ```
135
112
 
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 `Alt+N` 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
- Click **Show stopped** at the bottom of Sessions, or press `h` in that panel,
212
- to hide or show stopped sessions. The choice is remembered.
213
-
214
- In Sessions, `n` immediately creates a session using your
215
- saved defaults: Codex when configured, a usable local Podman or Docker runtime,
216
- then a local worktree when neither runtime is available. The session uses the
217
- directory you launched Mjolnir in and belongs to the workspace you opened.
218
- Its normal Prompt receives focus when ready. `N` opens the full
219
- creation wizard. `s` stops and `r` restarts the selected session without
220
- confirmation. `d` deletes it after a Yes/No choice; no identifier typing is required.
221
-
222
- `F7` opens Setup for accounts, targets, projects, new-session defaults, sidebar
223
- placement, display, review, and web access. Choose Left or Right for the sidebar,
224
- and turn off **Focus prompt after creating** to keep focus in Sessions.
225
-
226
- `Tab` moves the keyboard through the layout — Sessions, Prompt, Targets, Quota —
227
- and `Shift+Tab` reverses it. Every pane remains in that ring at every size. The
228
- transcript is not a Tab stop: read it with the mouse wheel or
229
- `PageUp`/`PageDown` from wherever you are. Moving focus never resizes a pane.
230
-
231
- Sessions, Targets, and Quota each have `▁`, `▪`, and `□` controls in their
232
- title bars for minimized, standard, and maximized size. Minimized Targets and
233
- Quota become one summary row each; minimized Sessions narrows the full-height
234
- sidebar and shows one line per session. Maximizing Sessions widens the sidebar.
235
- A maximized Targets or Quota pane gets available vertical space below Prompt. Only one pane can be maximized
236
- at a time.
237
-
238
- `Alt+Z` cycles the focused support pane through its three sizes without moving
239
- focus. `Alt+G` is the layout shortcut: from all-standard it minimizes Sessions,
240
- Targets, and Quota to leave more room for the conversation; from any customized
241
- layout it restores all three panes to standard. Tab leaves every chosen size alone.
242
-
243
- A few keys answer from everywhere, including while you are typing in Prompt:
244
- `F2` opens the command palette, `F3` the workspace picker, `F4` the web viewer,
245
- `F5` refreshes Targets and Quota, `F7` opens Setup, `Alt+N` opens quick New,
246
- `Alt+W` opens the full creation wizard,
247
- `Alt+S` resumes one, `Alt+A` marks everything read, `Alt+X` cancels whatever
248
- the selected session is in the middle of, `Alt+Z` sizes the focused support
249
- pane, `Alt+G` toggles the pane preset, and
250
- `Alt+Q` detaches this terminal client — the daemon and the sessions it runs
251
- keep working. The plain `n`, `N`, `s`, `r`, and `d` keys work in Sessions;
252
- the global chords also work while Prompt has focus.
253
-
254
- `F2` is the way to reach a command you have no key for. It lists the selected
255
- session's own commands first — rename it, edit its container settings, stop it
256
- — under a heading naming that session, then the commands for the pane you are
257
- in, then everything that works anywhere, each with the key that runs it. Type
258
- to filter by name or description, `Up`/`Down` to move, `Enter` to run, `Escape`
259
- to close. Commands that cannot run right now stay in the list, greyed, with the
260
- reason.
261
-
262
- In Prompt, `Ctrl+R` searches your prompt history, as in a shell, and `Alt+T`
263
- switches the transcript between rendered and raw. Inside the search, `Alt+R`
264
- cycles which history it reads. Every other `Ctrl` key in Prompt is a text
265
- editing key, as in a shell.
266
-
267
- `Alt` chords need Option to act as Meta in macOS terminals (iTerm2:
268
- Preferences, Profiles, Keys, "Left Option key: Esc+"; Terminal.app: "Use Option
269
- as Meta key"), and inside tmux a short `escape-time`, for example
270
- `set -sg escape-time 10` in `~/.tmux.conf`. Without those the terminal reports
271
- `Alt+N` as `Escape` then `n`. The command palette on `F2` and the key reference
272
- below are the fallbacks: every chord is also a line in both.
273
-
274
- `F1` opens the key reference, and so does `?` from any pane. It lists every key
275
- this screen answers, greying the ones that do not apply where you are; `Escape`,
276
- `F1`, or `?` closes it and puts back whatever it opened over. The footer is
277
- generated from the same list, so it names only the keys that apply right now —
278
- `Alt-X cancel launch`, for instance, appears only while the selected session is
279
- starting or stopping.
280
-
281
- The footer reads in three groups, separated by a vertical bar: what the pane
282
- you are in answers, the `Alt` chords that answer anywhere, then the function
283
- keys. A narrow terminal drops hints from the left-hand groups first; the
284
- function keys stay, because they are the way to the palette and the reference.
285
-
286
- The panes take plain keys, because the composer is a separate focus and never
287
- sees them. A plain letter is always pane-local: everything reachable from
288
- anywhere is a chord. On Sessions: `Enter` opens the selection, `Space` and
289
- `1`–`9` collapse and expand projects; a session's own commands are on `F2`. On
290
- Targets and Quota: `Enter` or `e` opens that row's actions, and `F5` refreshes
291
- both panes from anywhere.
292
- Every list also takes the arrow keys, `j`/`k`, `Ctrl+N`/`Ctrl+P`, and
293
- `Home`/`End`.
294
-
295
- `Escape` belongs to the conversation: it cancels a running turn or a shell
296
- command, and closes a dialog. It never detaches.
297
-
298
- In an attached TUI or the phone viewer, start a message with `!` to run the
299
- rest as `bash -lc` inside that session's target. Shell commands run in the
300
- session workspace without blocking an active agent turn. Their bounded live
301
- output is saved in the transcript and included once as hidden context on the
302
- next prompt submitted after the command finishes. Press Escape in the TUI, or
303
- use the shell's Cancel button in the viewer, to stop it.
304
-
305
- Configuration lives at `~/.config/mjolnir/config.toml` (the platform-equivalent
306
- directory elsewhere). First launch writes minimal local defaults; `mj setup`
307
- offers guided discovery, and further settings can be edited in TOML. A minimal example:
308
-
309
- ```toml
310
- version = 2
311
-
312
- [profiles.codex-1]
313
- kind = "codex"
314
- home = "/home/me/.codex"
315
-
316
- [profiles.claude-1]
317
- kind = "claude"
318
- home = "/home/me/.claude"
319
-
320
- [bundles.myapp]
321
- primary_repo = "myapp"
322
-
323
- [[bundles.myapp.repositories]]
324
- id = "myapp"
325
- github = "your-org/myapp" # or: local = "/home/me/src/myapp"
326
- destination = "myapp"
327
-
328
- [targets.podman]
329
- kind = "local-podman"
330
- image = "ghcr.io/brokkai/mjolnir/agent-dev:latest"
331
- # Optional: auto (default), always, newer, missing, or never. Auto launches from
332
- # the cached image; the daemon refreshes remote latest tags hourly in the
333
- # background. Versioned tags stay cached and digest references stay pinned.
334
- # pull_policy = "auto"
335
-
336
- # Docker uses the same fields:
337
- # [targets.docker]
338
- # kind = "local-docker"
339
- # image = "ghcr.io/brokkai/mjolnir/agent-dev:latest"
340
-
341
- # Docker over SSH runs the Docker CLI and OverlayFS operations on the named
342
- # Linux host. The SSH alias must be usable with BatchMode=yes.
343
- # [targets.builder-docker]
344
- # kind = "ssh-docker"
345
- # host = "builder"
346
- # image = "ghcr.io/brokkai/mjolnir/agent-dev:latest"
347
- ```
348
-
349
- `version` is the config schema version. A file written by a *newer* Mjolnir still
350
- loads: the settings this build understands keep working, and the config becomes
351
- read-only, so the older build refuses to save and never downgrades the file.
352
- `mj doctor` reports that state. Update Mjolnir, or change settings with the newer
353
- build, to make it writable again.
354
-
355
- Profiles point at harness home directories on your machine — run as many
356
- profiles per harness as you have accounts. Bundles describe the repositories a
357
- session checks out (multi-repository bundles give agents a virtual monorepo).
358
- Mjolnir-owned worker and bridge commands use non-login shells. On raw local, SSH,
359
- and EC2 targets, Mjolnir makes one bounded login-shell probe when each worker starts
360
- and carries only its discovered `PATH` into the non-login runtime; an explicit
361
- `environment.PATH` in the profile takes precedence. Raw SSH and EC2 workers install
362
- the exact Mjolnir-pinned harness runtime in a shared per-user cache and never fall
363
- back to an arbitrary executable from `PATH`. Their host still needs the installer
364
- prerequisites: Node.js 22 plus npm for npm-based harnesses, or curl and Bash for
365
- Kimi Code and Grok Build. Mjolnir does not use sudo to install those prerequisites.
366
- Later profile changes take effect after the worker restarts or the session resumes.
367
- Agent-requested shell commands still run as `bash -lc` and intentionally use the
368
- session user's login environment.
369
- Target prerequisites and full option lists are covered in
370
- [docs/PODMAN.md](docs/PODMAN.md), [docs/DOCKER.md](docs/DOCKER.md),
371
- [docs/SSH.md](docs/SSH.md), and
372
- [docs/AWS.md](docs/AWS.md).
373
-
374
- ### Web viewer and Tailscale
375
-
376
- The daemon starts the authenticated web viewer by default. Run
377
- `mj daemon status` for its URL and six-digit login code. Without Tailscale it
378
- serves HTTP only on `127.0.0.1:3765`.
379
-
380
- `mj app` opens that viewer in the sibling `mj-desktop` executable. The main
381
- `mj` process remains headless and works without GUI libraries. On Linux the
382
- desktop executable uses the system WebKitGTK runtime; install
383
- `libwebkit2gtk-4.1-0` on Debian/Ubuntu or the equivalent package for your
384
- distribution if it is not already present.
385
-
386
- When the local Tailscale node has MagicDNS and HTTPS Certificates enabled, Mjolnir
387
- automatically requests the node's trusted `ts.net` certificate and serves HTTPS
388
- on all interfaces at the same port. Certificate issuance runs in the background
389
- and may take about 30 seconds the first time; certificates renew daily without a
390
- daemon restart. If HTTPS Certificates are unavailable, the status output keeps
391
- the viewer loopback-only and explains how to enable them. After changing the
392
- tailnet setting, run `mj daemon restart`.
393
-
394
- The historical configuration section remains `[phone]`. Explicit certificate
395
- configuration takes precedence over automatic Tailscale detection:
396
-
397
- ```toml
398
- [phone]
399
- # Set false to disable the web viewer entirely.
400
- enabled = true
401
- bind = "127.0.0.1:3765"
402
- # Set false to keep the viewer loopback-only without probing Tailscale.
403
- tailscale_detect = true
404
- # tls_cert = "/path/to/cert.pem"
405
- # tls_key = "/path/to/key.pem"
406
- ```
407
-
408
- ## Security and isolation model
409
-
410
- - Execution policy is selected by target, then translated into each harness's
411
- own controls. Containers and EC2 targets run unconstrained. Named raw SSH
412
- targets (`ssh-bare`) explicitly select `permissions = "guardian"` to preserve
413
- configured approvals or `permissions = "yolo"` for unconstrained execution.
414
- A local worktree (`local-bare`) also preserves the profile and harness's
415
- configured approval behavior. Codex, Claude Code, and Grok Build expose
416
- guardian modes; Kimi Code and DeepSeek Harness do not, so Mjolnir shows a
417
- prominent warning when guardian permissions cannot be enforced on a target.
418
- - Harness homes are copied by allowlist, not wholesale. For Claude Code, for
419
- example: credentials, settings, `CLAUDE.md`, `skills/`, and `plugins/` — no
420
- transcripts, history, or caches. Mjolnir sets `CODEX_HOME`, `CLAUDE_CONFIG_DIR`,
421
- `KIMI_CODE_HOME`, `GROK_HOME`, or `DSH_HOME` in the target. Skill edits on your machine
422
- propagate to live sessions within about a minute.
423
- - Credentials travel only between the controller and a session's worker. They
424
- are never written to the event journal or recovery archives. When the
425
- controller's `gh` is authenticated, Mjolnir continuously pushes its active
426
- GitHub token to every live non-local session, including raw SSH targets.
427
- The token is not stored in archives.
428
- - Rotating OAuth logins are single use, so a container and the controller that
429
- reach the same expiry instant both spend the same refresh token: one wins and
430
- the other session's turn dies with an expired session. For Codex profiles the
431
- daemon rotates the login ahead of expiry and pushes the new file, so container
432
- copies never arrive at that instant. Claude Code has no early refresh, so
433
- store a long-lived token instead with `mj login --profile <id> --setup-token`;
434
- new and resumed sessions of that profile run with `CLAUDE_CODE_OAUTH_TOKEN`
435
- set, and a token that does not rotate cannot lose the race. It covers model
436
- requests only, not Remote Control or claude.ai connectors, which Mjolnir
437
- sessions do not use.
438
- - A repository configured with `local` is served to workers through a
439
- per-session Git protocol bridge over the session's own transport: `git
440
- fetch` and fast-forward `git push origin` operate on your checkout with no
441
- inbound port and no writable mount. Force pushes, ref deletion, and receive
442
- hooks are disabled; pushes to a dirty checked-out branch are rejected. Git
443
- LFS is not supported through the bridge.
444
- - Attached directories reject symbolic links, so an attachment cannot escape
445
- its source or destination tree.
446
- - The daemon's web viewer requires a six-digit code exchanged for a signed
447
- session cookie. It binds only to loopback unless explicit TLS is configured
448
- or automatic Tailscale detection obtains a trusted `ts.net` certificate.
449
-
450
- ## Durability
451
-
452
- Mjolnir saves a recovery copy automatically after completed turns when the session
453
- is idle (at most every ten minutes), and `mj checkpoint --session <id>`
454
- forces one. "Idle" includes work the agent starts on its own: when Claude Code
455
- picks a task back up after a background command finishes, the session shows as
456
- running and a recovery copy waits until that work ends, and the composer's Esc
457
- cancels only a prompt you sent. Recovery archives are checked byte-for-byte
458
- against the target's SHA-256 before any teardown; their full structure and
459
- payload hashes are verified when they are read for resume or import. A normal
460
- Stop refuses teardown if its checksum gate fails. Explicit force-destroy is the
461
- data-loss escape hatch.
462
-
463
- A stopped session resumes by provisioning a fresh target from its archive,
464
- with its pending prompt queue intact (resume asks whether to keep or discard
465
- it). For Codex, the archive retains the primary thread and canonical transcript,
466
- including child-agent results surfaced in that transcript, but not child agents'
467
- private rollouts; stopped child agents cannot receive follow-ups after resume.
468
- A session recorded under one harness can be resumed under another; Mjolnir
469
- condenses the transcript into a size-bounded handoff for the new harness. That
470
- compaction is direct, tool-free inference and does not create an ACP session.
471
- Mjolnir chooses a configured profile with usable quota and a current model in
472
- this precedence: Codex GPT Luna, Grok, Kimi, then DeepSeek Flash. Model versions
473
- come from each provider's live catalog. Claude profiles are never utility
474
- models; if Claude is the only configured harness, cross-harness compaction has
475
- no utility model and resume reports that error.
476
-
477
- If Mjolnir or its host crashes, workers and their queued prompts keep running.
478
- `mj recover scan` finds managed containers and instances that are no longer
479
- tracked; `mj recover adopt` reconnects one as a tracked session.
480
-
481
- After Mjolnir itself is upgraded, each running session's worker is replaced with
482
- the new one at the session's next quiet moment - no prompt running, no terminal
483
- or background command alive, nothing queued - because replacing a worker ends
484
- the agent process with it. A session that is never quiet keeps the worker it
485
- 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).
486
144
 
487
145
  ## License
488
146
 
package/bin/mj CHANGED
Binary file
package/bin/mj-desktop CHANGED
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.3.1">brokk-mj-core 2.3.1</a></li>
10278
- <li><a href="https://crates.io/crates/brokk-mj-chat/2.3.1">brokk-mj-chat 2.3.1</a></li>
10279
- <li><a href="https://crates.io/crates/brokk-mjolnir/2.3.1">brokk-mjolnir 2.3.1</a></li>
10280
- <li><a href="https://crates.io/crates/brokk-mj-controller/2.3.1">brokk-mj-controller 2.3.1</a></li>
10281
- <li><a href="https://crates.io/crates/brokk-mj-desktop/2.3.1">brokk-mj-desktop 2.3.1</a></li>
10282
- <li><a href="https://crates.io/crates/brokk-mj-tui/2.3.1">brokk-mj-tui 2.3.1</a></li>
10283
- <li><a href="https://crates.io/crates/brokk-mj-worker/2.3.1">brokk-mj-worker 2.3.1</a></li>
10284
- <li><a href="https://crates.io/crates/brokk-mj-voice-worker/2.3.1">brokk-mj-voice-worker 2.3.1</a></li>
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 &quot;AS IS&quot; 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.1">brokk-anvil-client 0.28.1</a></li>
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brokkai/mjolnir-linux-arm64-gnu",
3
- "version": "2.3.1",
3
+ "version": "2.5.0",
4
4
  "license": "GPL-3.0-only",
5
5
  "repository": "https://github.com/BrokkAi/mjolnir",
6
6
  "homepage": "https://mjolnir.brokk.ai/",