agentbox-app 0.1.7 → 0.1.12
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 +220 -58
- package/bin/agentbox.mjs +18 -3
- package/briefs/message-rules.md +24 -3
- package/briefs/worker.md +63 -49
- package/briefs/writing-rules.md +90 -131
- package/main/account-discovery.mjs +21 -20
- package/main/account-tooling.mjs +11 -11
- package/main/agent-activity.mjs +45 -5
- package/main/agent-schedule.mjs +14 -14
- package/main/agent-sessions.mjs +94 -10
- package/main/agent-updates.mjs +116 -0
- package/main/agents.mjs +52 -46
- package/main/analytics.mjs +27 -0
- package/main/approval-prompt-server.mjs +2 -2
- package/main/approvals.mjs +14 -5
- package/main/artifact-path.mjs +11 -0
- package/main/claude-bin.mjs +32 -5
- package/main/claude-input.mjs +45 -3
- package/main/claude-plan.mjs +25 -13
- package/main/code-change.mjs +3 -3
- package/main/codex-account.mjs +1 -1
- package/main/codex-bin.mjs +18 -0
- package/main/codex-launch-env.mjs +31 -0
- package/main/codex-memory-gate.mjs +260 -0
- package/main/codex-models.mjs +12 -7
- package/main/codex-threads.mjs +46 -23
- package/main/codex-usage-file.mjs +7 -7
- package/main/codex-usage.mjs +4 -4
- package/main/codex-watch.mjs +12 -12
- package/main/config.mjs +82 -17
- package/main/demo.mjs +17 -14
- package/main/dev-window.mjs +9 -9
- package/main/doc-scheme.mjs +2 -0
- package/main/engine-setup.mjs +204 -0
- package/main/feedback.mjs +55 -0
- package/main/folder-pictures.mjs +48 -0
- package/main/frame-scrollbars.mjs +90 -0
- package/main/fresh-user.mjs +7 -4
- package/main/git-change-offthread.mjs +70 -0
- package/main/git-change-thread.mjs +11 -0
- package/main/git-change.mjs +9 -3
- package/main/img-scheme.mjs +70 -1
- package/main/instruction-settings.mjs +134 -60
- package/main/ipc.mjs +335 -42
- package/main/leftovers.mjs +518 -0
- package/main/live-replies.mjs +43 -5
- package/main/machine.mjs +48 -1
- package/main/main.mjs +138 -15
- package/main/memory-gate-history.mjs +254 -0
- package/main/memory-gate-server.mjs +461 -0
- package/main/memory-gate.mjs +206 -0
- package/main/message-priority.mjs +87 -0
- package/main/notify.mjs +1 -1
- package/main/rail-note.mjs +2 -2
- package/main/refresh-agent-models.mjs +21 -0
- package/main/repeats.mjs +4 -4
- package/main/row-label.mjs +115 -51
- package/main/runs-on.mjs +93 -0
- package/main/serve.mjs +77 -5
- package/main/settings.mjs +245 -26
- package/main/ship-queue.mjs +279 -0
- package/main/sign-in-files.mjs +39 -0
- package/main/source-updater.mjs +298 -0
- package/main/store/home.mjs +84 -7
- package/main/store/project.mjs +15 -19
- package/main/store/work-items.mjs +150 -6
- package/main/store.mjs +245 -13
- package/main/supervisor.mjs +1634 -417
- package/main/task-commands.mjs +8 -10
- package/main/task-folders.mjs +94 -16
- package/main/task-remote-control.mjs +3 -3
- package/main/task-terminals.mjs +14 -2
- package/main/team/index.mjs +440 -0
- package/main/team/memory-cloud.mjs +247 -0
- package/main/team/projects.mjs +162 -0
- package/main/team/session.mjs +225 -0
- package/main/team/sign-in.mjs +106 -0
- package/main/team/supabase-backend.mjs +231 -0
- package/main/team/sync.mjs +163 -0
- package/main/updater.mjs +15 -5
- package/main/write-before-reload.mjs +50 -0
- package/mcp/core/page.mjs +10 -12
- package/mcp/core/work.mjs +123 -26
- package/mcp/tools.mjs +13 -6
- package/package.json +21 -9
- package/renderer/dist/assets/agentbox-icon-F1oN9nj_.svg +15 -0
- package/renderer/dist/assets/index-ChKsQkRw.js +1169 -0
- package/renderer/dist/assets/index-ClBXnq3B.css +32 -0
- package/renderer/dist/index.html +2 -2
- package/scripts/after-install.mjs +14 -0
- package/scripts/approval-server.sh +7 -2
- package/scripts/memory-gate-hook.sh +59 -0
- package/shared/agent-import.mjs +39 -16
- package/shared/agents.d.mts +26 -8
- package/shared/agents.mjs +100 -108
- package/shared/analytics-events.mjs +19 -2
- package/shared/answers.mjs +12 -0
- package/shared/bridge-map.d.mts +12 -0
- package/shared/bridge-map.mjs +38 -1
- package/shared/claude-commands.generated.mjs +2 -2
- package/shared/claude-models.generated.mjs +6 -6
- package/shared/claude-usage.mjs +6 -6
- package/shared/codex-import.mjs +7 -7
- package/shared/codex-modes.d.mts +50 -0
- package/shared/codex-modes.mjs +1 -1
- package/shared/codex-usage.mjs +7 -8
- package/shared/demo-world.mjs +6 -6
- package/shared/engines.mjs +27 -10
- package/shared/feedback.d.mts +14 -0
- package/shared/feedback.mjs +44 -0
- package/shared/first-run-examples.mjs +4 -4
- package/shared/first-run-practice.d.mts +16 -0
- package/shared/first-run-practice.mjs +176 -70
- package/shared/fresh-user-home.mjs +34 -4
- package/shared/instruction-defaults.json +2 -2
- package/shared/product-name.mjs +4 -2
- package/shared/project-folder-check.mjs +9 -3
- package/shared/rank.d.mts +1 -0
- package/shared/rank.mjs +22 -0
- package/shared/referenced-files.mjs +1 -1
- package/shared/runs-on.d.mts +20 -0
- package/shared/runs-on.mjs +79 -0
- package/shared/schemes.d.mts +11 -0
- package/shared/schemes.mjs +1 -1
- package/shared/shortcuts.d.mts +41 -0
- package/shared/shortcuts.mjs +236 -0
- package/shared/spawn-trouble.d.mts +2 -0
- package/shared/spawn-trouble.mjs +40 -19
- package/shared/team-rules.d.mts +17 -0
- package/shared/team-rules.mjs +230 -0
- package/shared/team-status.d.mts +11 -0
- package/shared/team-status.mjs +90 -0
- package/shared/terminal-links.d.mts +2 -0
- package/shared/terminal-links.mjs +55 -0
- package/shared/terminal-state.d.mts +1 -0
- package/shared/terminal-state.mjs +16 -0
- package/shared/thread-cards.d.mts +19 -0
- package/shared/thread-cards.mjs +254 -0
- package/shared/usage.d.mts +1 -1
- package/shared/usage.mjs +6 -7
- package/shared/work-items.mjs +258 -28
- package/shared/work-lines.mjs +393 -16
- package/worker-permissions.json +1 -1
- package/renderer/dist/assets/cel-dusk-CS5I7kJS.webp +0 -0
- package/renderer/dist/assets/cel-dusk-DUslqS6B.webp +0 -0
- package/renderer/dist/assets/cel-dusk-Jt_xVGxp.webp +0 -0
- package/renderer/dist/assets/cel-dusk-sm-BBkV-tWT.webp +0 -0
- package/renderer/dist/assets/frost-haze-CxPSOBEg.webp +0 -0
- package/renderer/dist/assets/frost-haze-sm-C_w21qgd.webp +0 -0
- package/renderer/dist/assets/ice-BC8luINc.webp +0 -0
- package/renderer/dist/assets/ice-CP9PrKHo.webp +0 -0
- package/renderer/dist/assets/ice-river-D6ziOhLY.webp +0 -0
- package/renderer/dist/assets/ice-river-UVM2-JY_.webp +0 -0
- package/renderer/dist/assets/ice-river-bErJwYWW.webp +0 -0
- package/renderer/dist/assets/ice-river-sm-Bg1U-SIj.webp +0 -0
- package/renderer/dist/assets/ice-sm-CbVcg3_D.webp +0 -0
- package/renderer/dist/assets/index-B7hhfHrT.js +0 -684
- package/renderer/dist/assets/index-CwiDv5bL.css +0 -32
- package/renderer/dist/assets/lake-C0WaW-6E.webp +0 -0
- package/renderer/dist/assets/lake-CSKjLC5K.webp +0 -0
- package/renderer/dist/assets/lake-ETGcOb25.webp +0 -0
- package/renderer/dist/assets/lake-harbour-BCQRbrHb.webp +0 -0
- package/renderer/dist/assets/lake-harbour-B_wfXTmE.webp +0 -0
- package/renderer/dist/assets/lake-harbour-Te1pEvBh.webp +0 -0
- package/renderer/dist/assets/lake-harbour-sm-Cme_ShEg.webp +0 -0
- package/renderer/dist/assets/lake-sm-CbG72Hbv.webp +0 -0
- package/renderer/dist/assets/lino-coast-CUZHcucI.webp +0 -0
- package/renderer/dist/assets/lino-coast-DP4J7cgd.webp +0 -0
- package/renderer/dist/assets/lino-coast-kOIAffr_.webp +0 -0
- package/renderer/dist/assets/lino-coast-sm-C1Mdbgit.webp +0 -0
- package/renderer/dist/assets/moon-pines-BskgnnXR.webp +0 -0
- package/renderer/dist/assets/moon-pines-CFSIIwt0.webp +0 -0
- package/renderer/dist/assets/moon-pines-PNhdOYww.webp +0 -0
- package/renderer/dist/assets/moon-pines-sm-C6K1NomK.webp +0 -0
- package/renderer/dist/assets/orbit-rings-2XV36Ch3.webp +0 -0
- package/renderer/dist/assets/orbit-rings-C4NrcYGQ.webp +0 -0
- package/renderer/dist/assets/orbit-rings-DGLk07dT.webp +0 -0
- package/renderer/dist/assets/orbit-rings-sm-Dky3YdvL.webp +0 -0
- package/renderer/dist/assets/peach-haze-2-C6f7xnWw.webp +0 -0
- package/renderer/dist/assets/peach-haze-2-sm-Dj_Ez_Sb.webp +0 -0
- package/renderer/dist/assets/pixel-harbour-DQjqMROg.webp +0 -0
- package/renderer/dist/assets/pixel-harbour-Dw71H_bc.webp +0 -0
- package/renderer/dist/assets/pixel-harbour-kOZfm-GM.webp +0 -0
- package/renderer/dist/assets/pixel-harbour-sm-Dturjuky.webp +0 -0
- package/renderer/dist/assets/pixel-orbit-C296JVMO.webp +0 -0
- package/renderer/dist/assets/pixel-orbit-C4oMRDSx.webp +0 -0
- package/renderer/dist/assets/pixel-orbit-CqVmQ4eh.webp +0 -0
- package/renderer/dist/assets/pixel-orbit-sm-CHagC_nO.webp +0 -0
- package/renderer/dist/assets/pixel-ridge-C6LYu6uE.webp +0 -0
- package/renderer/dist/assets/pixel-ridge-CIUCEESs.webp +0 -0
- package/renderer/dist/assets/pixel-ridge-sm-BnE0F_w-.webp +0 -0
- package/renderer/dist/assets/riso-hills-7heKVtry.webp +0 -0
- package/renderer/dist/assets/riso-hills-CIjAL3J6.webp +0 -0
- package/renderer/dist/assets/riso-hills-sm-DHsnbCfP.webp +0 -0
- package/renderer/dist/assets/slate-haze-BPWdkNsw.webp +0 -0
- package/renderer/dist/assets/slate-haze-sm-B0Cb5a2W.webp +0 -0
- package/renderer/dist/assets/valley-haze-BDHPqoJy.webp +0 -0
- package/renderer/dist/assets/valley-haze-sm-CTyjmPAG.webp +0 -0
- package/renderer/dist/assets/vector-dunes-DzzWLdKo.webp +0 -0
- package/renderer/dist/assets/vector-dunes-Yr9NBQUy.webp +0 -0
- package/renderer/dist/assets/vector-dunes-sm-D8MYY6ms.webp +0 -0
- package/renderer/dist/assets/watercolour-mist-BCGKN4u4.webp +0 -0
- package/renderer/dist/assets/watercolour-mist-BF-jk5MC.webp +0 -0
- package/renderer/dist/assets/watercolour-mist-sm-Ds1xzTw9.webp +0 -0
- package/renderer/dist/assets/woodblock-sea-B1um67Z9.webp +0 -0
- package/renderer/dist/assets/woodblock-sea-DKQdYs32.webp +0 -0
- package/renderer/dist/assets/woodblock-sea-sm-BJzNq8xh.webp +0 -0
- package/renderer/dist/emulator/audio-rules.mjs +0 -74
- package/renderer/dist/emulator/data/compression/README.md +0 -11
- package/renderer/dist/emulator/data/compression/extract7z.js +0 -1
- package/renderer/dist/emulator/data/compression/extractzip.js +0 -1
- package/renderer/dist/emulator/data/compression/libunrar.js +0 -519
- package/renderer/dist/emulator/data/compression/libunrar.wasm +0 -0
- package/renderer/dist/emulator/data/cores/README.md +0 -22
- package/renderer/dist/emulator/data/cores/mgba-legacy-wasm.data +0 -0
- package/renderer/dist/emulator/data/cores/mgba-thread-legacy-wasm.data +0 -0
- package/renderer/dist/emulator/data/cores/mgba-thread-wasm.data +0 -0
- package/renderer/dist/emulator/data/cores/mgba-wasm.data +0 -0
- package/renderer/dist/emulator/data/cores/package.json +0 -65
- package/renderer/dist/emulator/data/cores/reports/mgba.json +0 -1
- package/renderer/dist/emulator/data/emulator.css +0 -1614
- package/renderer/dist/emulator/data/loader.js +0 -170
- package/renderer/dist/emulator/data/localization/README.md +0 -63
- package/renderer/dist/emulator/data/localization/af-FR.json +0 -339
- package/renderer/dist/emulator/data/localization/ar-AR.json +0 -301
- package/renderer/dist/emulator/data/localization/ben-BEN.json +0 -301
- package/renderer/dist/emulator/data/localization/de-GER.json +0 -301
- package/renderer/dist/emulator/data/localization/el-GR.json +0 -301
- package/renderer/dist/emulator/data/localization/en-US.json +0 -339
- package/renderer/dist/emulator/data/localization/es-ES.json +0 -310
- package/renderer/dist/emulator/data/localization/fa-AF.json +0 -310
- package/renderer/dist/emulator/data/localization/hi-HI.json +0 -301
- package/renderer/dist/emulator/data/localization/it-IT.json +0 -302
- package/renderer/dist/emulator/data/localization/ja-JA.json +0 -301
- package/renderer/dist/emulator/data/localization/jv-JV.json +0 -301
- package/renderer/dist/emulator/data/localization/ko-KO.json +0 -336
- package/renderer/dist/emulator/data/localization/pt-BR.json +0 -361
- package/renderer/dist/emulator/data/localization/retroarch.json +0 -617
- package/renderer/dist/emulator/data/localization/ro-RO.json +0 -310
- package/renderer/dist/emulator/data/localization/ru-RU.json +0 -301
- package/renderer/dist/emulator/data/localization/tr-TR.json +0 -310
- package/renderer/dist/emulator/data/localization/vi-VN.json +0 -302
- package/renderer/dist/emulator/data/localization/zh-CN.json +0 -351
- package/renderer/dist/emulator/data/src/GameManager.js +0 -464
- package/renderer/dist/emulator/data/src/compression.js +0 -142
- package/renderer/dist/emulator/data/src/emulator.js +0 -6158
- package/renderer/dist/emulator/data/src/gamepad.js +0 -167
- package/renderer/dist/emulator/data/src/nipplejs.js +0 -1
- package/renderer/dist/emulator/data/src/shaders.js +0 -236
- package/renderer/dist/emulator/data/src/socket.io.min.js +0 -7
- package/renderer/dist/emulator/data/src/storage.js +0 -125
- package/renderer/dist/emulator/data/version.json +0 -5
- package/renderer/dist/emulator/host.js +0 -299
- package/renderer/dist/emulator/index.html +0 -28
- package/renderer/dist/emulator/provenance.json +0 -6
package/README.md
CHANGED
|
@@ -1,41 +1,55 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="docs/readme/icon.svg" alt="" width="96">
|
|
3
|
+
</p>
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
agent in its own thread, and they come back to you with a summary of what they
|
|
5
|
-
did and what they need. You read, you approve or redirect, you move on.
|
|
5
|
+
<h1 align="center">Agentbox</h1>
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
<p align="center">
|
|
8
|
+
<strong>Give your agents an inbox.</strong><br>
|
|
9
|
+
Run dozens of coding agents at once and only hear from the ones that need you.
|
|
10
|
+
</p>
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
<p align="center">
|
|
13
|
+
<a href="#get-it">Get it</a> ·
|
|
14
|
+
<a href="#how-it-works">How it works</a> ·
|
|
15
|
+
<a href="#what-matters-most-goes-first">Priorities</a> ·
|
|
16
|
+
<a href="#built-for-the-keyboard">Keys</a> ·
|
|
17
|
+
<a href="#what-this-sends">Privacy</a> ·
|
|
18
|
+
<a href="LICENSE">GPL-3.0</a>
|
|
19
|
+
</p>
|
|
14
20
|
|
|
15
|
-
|
|
21
|
+
<p align="center">
|
|
22
|
+
<img src="docs/readme/inbox.webp" alt="Twelve agents finish their work and their rows arrive in the inbox, each one saying what it did and what it needs" width="100%">
|
|
23
|
+
</p>
|
|
24
|
+
|
|
25
|
+
<p align="center">
|
|
26
|
+
Free and open source. Runs in your browser or as a Mac app, on the Claude Code or Codex plan you already have.<br>
|
|
27
|
+
No server, no account, no extra subscription.
|
|
28
|
+
</p>
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Install
|
|
33
|
+
|
|
34
|
+
There are two ways to run it: in the browser, or as a Mac app. Both need Node 22 and Claude Code or Codex installed and signed in.
|
|
35
|
+
|
|
36
|
+
**In your browser.** One command, nothing to install first:
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
npx agentbox-app
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
It starts on your machine and opens a tab. On Linux that open goes through `xdg-open`. Nothing is hosted: it listens only on `127.0.0.1`, and the address carries a key that is new every run. Add `--help` to see the options. `--no-open` prints the address and leaves the browser to you.
|
|
43
|
+
|
|
44
|
+
From a checkout, build the screen once, then start it the same way:
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
npm install
|
|
48
|
+
npm run build
|
|
49
|
+
npx agentbox-app
|
|
50
|
+
```
|
|
16
51
|
|
|
17
|
-
|
|
18
|
-
task. Twelve at once is a normal day.
|
|
19
|
-
2. **Walk away.** Each item gets a headless agent in its own thread. Nothing
|
|
20
|
-
needs you while they run, so go and do something else.
|
|
21
|
-
3. **Come back to an inbox.** Every thread opens with what the agent did and
|
|
22
|
-
what it wants from you, in two lines you can read at a glance.
|
|
23
|
-
4. **Answer with one key.** Press `E` to approve and merge. Press `1`, `2` or
|
|
24
|
-
`3` to pick an option an agent offered. Type a sentence and send it back if
|
|
25
|
-
none of them is right.
|
|
26
|
-
5. **Reach inbox zero.** The rows you approved are done. The ones you
|
|
27
|
-
redirected are already working again.
|
|
28
|
-
|
|
29
|
-
The job this leaves you is reviewing what agents made and deciding whether it
|
|
30
|
-
is good enough, rather than watching them make it. That is the whole argument
|
|
31
|
-
for an inbox: a person in the loop where judgment is worth something, and
|
|
32
|
-
nowhere else. An agent that got a failing test to pass by editing the test is
|
|
33
|
-
exactly the moment you want to be asked.
|
|
34
|
-
|
|
35
|
-
## Get it
|
|
36
|
-
|
|
37
|
-
You need a Mac, Claude Code installed and signed in, and Node 22 to build.
|
|
38
|
-
Codex is optional and is picked up when it is there.
|
|
52
|
+
**As a desktop app.** Build it from this repo. `npm start` is the desktop command on Omarchy and on a Mac:
|
|
39
53
|
|
|
40
54
|
```
|
|
41
55
|
git clone https://github.com/savannahfeder/agentbox.git
|
|
@@ -44,33 +58,153 @@ npm install
|
|
|
44
58
|
npm start
|
|
45
59
|
```
|
|
46
60
|
|
|
47
|
-
`npm
|
|
48
|
-
|
|
61
|
+
On Linux, `npm install` puts `agentbox` on `~/.local/bin` and adds the app to the launcher. The entry is `$XDG_DATA_HOME/applications/agentbox.desktop` (`~/.local/share/applications` when that variable is unset), and it runs `agentbox`. That command starts this checkout. Open the app from the launcher.
|
|
62
|
+
|
|
63
|
+
`npm start` builds the app and opens it. On first run it walks you through connecting Claude Code or Codex and choosing a folder to work in.
|
|
64
|
+
|
|
65
|
+
On macOS, the system may ask to let Terminal find devices on your local network. Agentbox does not need that, so Don't Allow is fine.
|
|
66
|
+
|
|
67
|
+
## The chat window is the bottleneck
|
|
68
|
+
|
|
69
|
+
Today you run agents in chat windows and terminals, and you wait for each one
|
|
70
|
+
to finish before you prompt it again. So the number of agents you can run is limited
|
|
71
|
+
by the number of windows you can keep track of.
|
|
72
|
+
|
|
73
|
+
<p align="center">
|
|
74
|
+
<img src="docs/readme/before.webp" alt="Five terminal windows, each with an agent waiting on a different task" width="60%">
|
|
75
|
+
</p>
|
|
76
|
+
|
|
77
|
+
Models are now good enough that most tasks do not need watching. They need
|
|
78
|
+
someone to review the work at the right moment. Agentbox drops the chat window
|
|
79
|
+
and gives each agent a row in an inbox instead, so you can run far more of them
|
|
80
|
+
than you could ever watch and only deal with one when it actually needs you.
|
|
81
|
+
|
|
82
|
+
## How it works
|
|
83
|
+
|
|
84
|
+
### 1. File the work
|
|
85
|
+
|
|
86
|
+
Paste a list, send over a board of issues, or type one task. Each item becomes
|
|
87
|
+
its own row, and each row is its own agent, already working.
|
|
88
|
+
|
|
89
|
+
<img src="docs/readme/file.webp" alt="Twelve issues from a project board go over in one message and appear as twelve agents working" width="100%">
|
|
90
|
+
|
|
91
|
+
### 2. Walk away
|
|
92
|
+
|
|
93
|
+
Nothing needs you while they run. Go to lunch. A row only comes back to you
|
|
94
|
+
when its agent is done or stuck, so a hundred agents working is as quiet as one.
|
|
49
95
|
|
|
50
|
-
|
|
96
|
+
<img src="docs/readme/scale.webp" alt="A wall of over a hundred agents working, with only the four that need a person lifted out" width="100%">
|
|
51
97
|
|
|
52
|
-
|
|
53
|
-
recommendation or marks a row done, `1`/`2`/`3` pick an option an agent
|
|
54
|
-
offered, `R` replies, `S` snoozes, `C` composes, Tab cycles views, `Z` undoes,
|
|
55
|
-
and `⌘K` opens the palette, which reaches almost everything else.
|
|
98
|
+
### 3. Come back to an inbox
|
|
56
99
|
|
|
57
|
-
|
|
100
|
+
Every row opens with what the agent did and what it wants from you, in two
|
|
101
|
+
lines you can read at a glance. Most of the time the answer is yes. Press `1`
|
|
102
|
+
and it merges, and the next one is already in front of you.
|
|
103
|
+
|
|
104
|
+
<img src="docs/readme/answer.webp" alt="An agent's summary card reads Snooze survives a restart now; pressing 1 merges it and the next card arrives" width="100%">
|
|
105
|
+
|
|
106
|
+
### 4. Answer however fits
|
|
107
|
+
|
|
108
|
+
<table>
|
|
109
|
+
<tr>
|
|
110
|
+
<td width="50%" valign="top">
|
|
111
|
+
<img src="docs/readme/designs.webp" alt="An agent offers three directions for an empty inbox, drawn in the real app, and option two is picked" width="100%"><br>
|
|
112
|
+
<strong>Pick a design.</strong> Ask for options before anything is built,
|
|
113
|
+
and agents come back with versions drawn in your actual app. Pick one and
|
|
114
|
+
that one gets built.
|
|
115
|
+
</td>
|
|
116
|
+
<td width="50%" valign="top">
|
|
117
|
+
<img src="docs/readme/sendback.webp" alt="Two versions of onboarding copy, and a typed reply asking for something shorter is sent back to the agent" width="100%"><br>
|
|
118
|
+
<strong>Send it back.</strong> When none of the options is right, type a
|
|
119
|
+
sentence. The agent picks up where it left off, and the row comes back
|
|
120
|
+
to you when it is done.
|
|
121
|
+
</td>
|
|
122
|
+
</tr>
|
|
123
|
+
</table>
|
|
124
|
+
|
|
125
|
+
### 5. Stay the person in the loop
|
|
126
|
+
|
|
127
|
+
Your job stops being watching agents work. It becomes reviewing what they made
|
|
128
|
+
and deciding whether it is good enough. This agent got a failing test to pass by
|
|
129
|
+
editing the test instead of the code, which is exactly the moment you want to be
|
|
130
|
+
asked. Code changes open right beside the row.
|
|
131
|
+
|
|
132
|
+
<img src="docs/readme/loop.webp" alt="An agent reports the usage test passes; the change beside it shows it edited the expected value in the test, and the reply sends it back to fix the code" width="100%">
|
|
133
|
+
|
|
134
|
+
## What matters most goes first
|
|
135
|
+
|
|
136
|
+
Twenty agents means twenty things competing for your attention and for a limited
|
|
137
|
+
number of running sessions. Agentbox keeps one order and uses it for both.
|
|
138
|
+
|
|
139
|
+
- **Tag a task** Urgent, High, Medium or Low, when you file it or later from `⌘K` or `Ctrl+K`.
|
|
140
|
+
- **Rank your projects** once by dragging them into order. A project's place
|
|
141
|
+
counts for more than any single task's tag, so your most important project
|
|
142
|
+
never waits behind a side one.
|
|
143
|
+
- **The order decides who starts.** When there are more tasks than session
|
|
144
|
+
slots, the queue starts the most important first. An answer you have already
|
|
145
|
+
given wins a tie against new work, so replies never pile up.
|
|
146
|
+
- **Urgent rises to the top.** Urgent rows sit above everything else in the
|
|
147
|
+
inbox under their own heading.
|
|
148
|
+
- **Only your tags count.** An agent cannot promote its own work. If it says
|
|
149
|
+
its task is urgent, that is ignored.
|
|
150
|
+
|
|
151
|
+
<img src="docs/readme/inbox-urgent.png" alt="The inbox with two urgent rows lifted above everything else under an Urgent heading" width="100%">
|
|
152
|
+
|
|
153
|
+
<p align="center">
|
|
154
|
+
<img src="docs/readme/priority-palette.png" alt="The command palette showing Priority Urgent, High, Medium and Low for the selected row" width="60%"><br>
|
|
155
|
+
<sub>Any row's priority is a <code>⌘K</code> or <code>Ctrl+K</code> away.</sub>
|
|
156
|
+
</p>
|
|
157
|
+
|
|
158
|
+
## Built for the keyboard
|
|
159
|
+
|
|
160
|
+
<img src="docs/readme/keys.webp" alt="The keys E, R, J, K and the number row light up over the inbox, then the command palette opens on the themes" width="100%">
|
|
161
|
+
|
|
162
|
+
| Key | Does |
|
|
163
|
+
|---|---|
|
|
164
|
+
| `J` `K` or arrows | Move through the inbox |
|
|
165
|
+
| `Enter` | Open a row |
|
|
166
|
+
| `E` | Approve the recommendation, or mark a row done |
|
|
167
|
+
| `1` `2` `3` | Pick an option an agent offered |
|
|
168
|
+
| `R` | Reply |
|
|
169
|
+
| `N` | New thread |
|
|
170
|
+
| `L` | Later: put a task off until a time you pick |
|
|
171
|
+
| `S` | Show or hide the summary, in an open task |
|
|
172
|
+
| `Z` | Undo |
|
|
173
|
+
| `⌘K` or `Ctrl+K` | Everything else |
|
|
58
174
|
|
|
59
175
|
Fifteen skins, each in light and dark, from plain slate to woodblock and riso
|
|
60
|
-
prints. Press `⌘K` and type "theme",
|
|
176
|
+
prints. Press `⌘K` or `Ctrl+K` and type "theme". `Ctrl+K` is the same palette on Linux, where there is no Command key.
|
|
61
177
|
|
|
62
|
-
##
|
|
178
|
+
## Runs on the plan you already have
|
|
179
|
+
|
|
180
|
+
<img src="docs/readme/engines.webp" alt="The app's icon wired to Claude Code on one side and Codex on the other" width="100%">
|
|
181
|
+
|
|
182
|
+
Agentbox drives Claude Code and Codex on your own machine, signed in with your
|
|
183
|
+
own subscription. When you first open it, it finds the agents you have already
|
|
184
|
+
set up and offers to bring them in. There is no server, no account to make, and
|
|
185
|
+
nothing new to pay for.
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## Reference
|
|
190
|
+
|
|
191
|
+
<details>
|
|
192
|
+
<summary><strong>Config</strong></summary>
|
|
193
|
+
|
|
194
|
+
<br>
|
|
63
195
|
|
|
64
196
|
`zero.config.json` in the repo root, gitignored and machine-specific. Every
|
|
65
197
|
default works unset and they all live in `main/config.mjs`. The ones that
|
|
66
198
|
matter:
|
|
67
199
|
|
|
68
|
-
- `storeRoot`: where the store lives.
|
|
69
|
-
in your home directory.
|
|
200
|
+
- `storeRoot`: where the store lives. On macOS this defaults to a folder
|
|
201
|
+
named after the app in your home directory. On Linux it defaults to
|
|
202
|
+
`$XDG_DATA_HOME/agentbox`, which is `~/.local/share/agentbox` when that
|
|
203
|
+
variable is unset.
|
|
70
204
|
- `claudeBin`: the binary to run. The app finds `claude` itself if you leave
|
|
71
205
|
this alone.
|
|
72
206
|
- `maxConcurrentSessions`: how many agents run at once. The queue absorbs the
|
|
73
|
-
rest.
|
|
207
|
+
rest, in priority order.
|
|
74
208
|
- `sessionArgs`: what a spawned session may do. **The default grants only the
|
|
75
209
|
store tools**, so an agent can read the store, file questions and update work
|
|
76
210
|
items, and nothing else. To let agents edit code and run commands, opt in:
|
|
@@ -86,28 +220,40 @@ matter:
|
|
|
86
220
|
and replying resumes the same session, like a thread.
|
|
87
221
|
- `diagnostics`: `false` turns off the counts described below.
|
|
88
222
|
|
|
89
|
-
|
|
223
|
+
</details>
|
|
224
|
+
|
|
225
|
+
<details id="what-this-sends">
|
|
226
|
+
<summary><strong>What this sends</strong></summary>
|
|
227
|
+
|
|
228
|
+
<br>
|
|
90
229
|
|
|
91
230
|
Nothing, unless you are running a build that was signed and released with a
|
|
92
231
|
PostHog key baked into it. A build made from this repo has no key, so a clone
|
|
93
232
|
and a fork are silent, and with no key the whole path is off at every send.
|
|
94
233
|
|
|
95
|
-
A released build counts
|
|
234
|
+
A released build counts twelve things, and they are counts:
|
|
96
235
|
|
|
97
236
|
- the app was opened
|
|
237
|
+
- the app was used today, once a day
|
|
238
|
+
- a setup step was reached, by its number
|
|
98
239
|
- first run finished
|
|
99
240
|
- a repo was connected
|
|
100
241
|
- an agent was seen
|
|
242
|
+
- a task was written
|
|
101
243
|
- a task was opened
|
|
102
244
|
- a reply was sent
|
|
103
245
|
- a task finished
|
|
246
|
+
- an agent started work
|
|
247
|
+
- an agent stopped work
|
|
104
248
|
|
|
105
249
|
Each carries a random install id, the app and platform version, and at most
|
|
106
|
-
|
|
107
|
-
which kind of row it was out of six fixed words,
|
|
108
|
-
|
|
250
|
+
seven other things: how long something took, how many of a thing there were,
|
|
251
|
+
which kind of row it was out of six fixed words, whether an agent or you did
|
|
252
|
+
it, whether an agent's run failed, whether it happened in setup's practice
|
|
253
|
+
project, and which coding agent ran it, Claude Code or Codex.
|
|
254
|
+
No file contents, no prompts, no paths, no titles, nothing you typed.
|
|
109
255
|
`shared/analytics-events.mjs` is the whole list, and anything a caller attaches
|
|
110
|
-
beyond those
|
|
256
|
+
beyond those seven is dropped rather than sent, so nobody can widen it by
|
|
111
257
|
accident. Crash reports travel the same way and are scrubbed first
|
|
112
258
|
(`shared/crash-scrub.mjs`).
|
|
113
259
|
|
|
@@ -124,7 +270,12 @@ The thing that sends the most is not ours at all. This app drives Claude Code
|
|
|
124
270
|
and Codex, so whatever a session reads and writes goes to Anthropic or OpenAI
|
|
125
271
|
under their terms, exactly as it would if you ran those tools yourself.
|
|
126
272
|
|
|
127
|
-
|
|
273
|
+
</details>
|
|
274
|
+
|
|
275
|
+
<details>
|
|
276
|
+
<summary><strong>How it is built</strong></summary>
|
|
277
|
+
|
|
278
|
+
<br>
|
|
128
279
|
|
|
129
280
|
Sessions are cattle and the store is the truth. The durable state is a folder
|
|
130
281
|
on disk at `storeRoot`, written through `main/store/` so the fold rules exist
|
|
@@ -141,7 +292,12 @@ agent noticing.
|
|
|
141
292
|
- `tests/` the suite, which is large and is the documentation of record for how
|
|
142
293
|
any of this is meant to behave.
|
|
143
294
|
|
|
144
|
-
|
|
295
|
+
</details>
|
|
296
|
+
|
|
297
|
+
<details>
|
|
298
|
+
<summary><strong>Develop</strong></summary>
|
|
299
|
+
|
|
300
|
+
<br>
|
|
145
301
|
|
|
146
302
|
```
|
|
147
303
|
npm run dev # vite HMR plus electron
|
|
@@ -151,26 +307,32 @@ npm test
|
|
|
151
307
|
Useful modes:
|
|
152
308
|
|
|
153
309
|
- `ZERO_FIXTURES=1` canned data, with no store and no agents touched
|
|
154
|
-
- `ZERO_FIXTURES=empty` inbox zero
|
|
310
|
+
- `ZERO_FIXTURES=empty` inbox zero
|
|
155
311
|
- `ZERO_NO_SUPERVISOR=1` never spawn sessions
|
|
156
312
|
- `ZERO_SCREENSHOT=/tmp/x.png` capture the window and quit
|
|
157
313
|
|
|
158
314
|
The same fixture worlds are reachable off the url, which is how the
|
|
159
315
|
`scripts/shot-*.mjs` family photographs them: `?fixtures`, `?fixtures=empty`,
|
|
160
|
-
`?fixtures=crowded`, `?fixtures=mock`, `?
|
|
316
|
+
`?fixtures=crowded`, `?fixtures=mock`, `?working=3`. `?engines=`
|
|
161
317
|
picks which coding agents the fixture Mac has, where nothing is one agent,
|
|
162
318
|
`?engines=missing` is the gate open with Codex not found, and `?engines=claude`
|
|
163
319
|
or `?engines=codex` give two.
|
|
164
320
|
|
|
165
321
|
To open the app as somebody who has never seen it, with its own throwaway home
|
|
166
|
-
and nothing of yours inside it, press `⌘K` and choose "Open
|
|
167
|
-
user". `npm run fresh` does the same from a terminal.
|
|
322
|
+
and nothing of yours inside it, press `⌘K` or `Ctrl+K` and choose "Open Agentbox as a new
|
|
323
|
+
user". `npm run fresh` does the same from a terminal. `ZERO_NO_SUPERVISOR=1` applies to `npm start` and to `npx agentbox-app`.
|
|
168
324
|
|
|
169
325
|
The app is named in exactly one place, `shared/product-name.mjs`. Change it
|
|
170
326
|
there and run `node scripts/product-name.mjs --write`, and everything else
|
|
171
327
|
follows. The `zero` and `ZERO_` prefixes through the code are the name it had
|
|
172
328
|
first and are load-bearing in places, so they are left alone.
|
|
173
329
|
|
|
330
|
+
The pictures in this README live in `docs/readme/`. The two stills are taken of
|
|
331
|
+
the real app by `scripts/shot-readme.mjs`; the moving ones are cut from the
|
|
332
|
+
launch film.
|
|
333
|
+
|
|
334
|
+
</details>
|
|
335
|
+
|
|
174
336
|
## Licence
|
|
175
337
|
|
|
176
338
|
GPL-3.0-or-later. See [LICENSE](LICENSE).
|
package/bin/agentbox.mjs
CHANGED
|
@@ -12,11 +12,11 @@
|
|
|
12
12
|
|
|
13
13
|
import path from 'node:path';
|
|
14
14
|
import fs from 'node:fs';
|
|
15
|
-
import os from 'node:os';
|
|
16
15
|
import { spawn } from 'node:child_process';
|
|
17
16
|
import { fileURLToPath } from 'node:url';
|
|
18
17
|
|
|
19
18
|
import { bootHeadless, createServer, newToken } from '../main/serve.mjs';
|
|
19
|
+
import { appHome } from '../main/store/home.mjs';
|
|
20
20
|
|
|
21
21
|
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
22
22
|
const appDir = path.dirname(here);
|
|
@@ -43,9 +43,13 @@ if (args.includes('--help') || args.includes('-h')) {
|
|
|
43
43
|
|
|
44
44
|
// WHERE THE STORE LIVES. A copy run out of npm has no folder of its own to
|
|
45
45
|
// write into, and writing inside node_modules would be thrown away by the next
|
|
46
|
-
// install.
|
|
46
|
+
// install. The default is appHome(): a dot-folder already on disk, else the
|
|
47
|
+
// XDG data directory on Linux and `~/.agentbox` on macOS, where this command
|
|
48
|
+
// has always kept it. Not the desktop config's default, which on macOS is
|
|
49
|
+
// `~/Agentbox` and would open every existing Mac user on an empty inbox.
|
|
50
|
+
// `--dir` and AGENTBOX_HOME are the escape hatches.
|
|
47
51
|
const dataDir = path.resolve(
|
|
48
|
-
flag('dir', process.env.AGENTBOX_HOME ??
|
|
52
|
+
flag('dir', process.env.AGENTBOX_HOME ?? appHome()),
|
|
49
53
|
);
|
|
50
54
|
fs.mkdirSync(dataDir, { recursive: true });
|
|
51
55
|
|
|
@@ -56,6 +60,17 @@ if (!fs.existsSync(path.join(dist, 'index.html'))) {
|
|
|
56
60
|
}
|
|
57
61
|
|
|
58
62
|
const booted = await bootHeadless({ dataDir, appDir, userDir: dataDir });
|
|
63
|
+
// ZERO_NO_SUPERVISOR: the desktop already honors this (main/main.mjs). This
|
|
64
|
+
// entry is the same inbox, so a launch that asks for no agents must not start
|
|
65
|
+
// them here either.
|
|
66
|
+
if (!process.env.ZERO_NO_SUPERVISOR) {
|
|
67
|
+
// Whoever was signed in to the team last time is signed in again.
|
|
68
|
+
booted.team?.start().then(() => booted.supervisor.wake?.()).catch((err) => console.warn(`team: ${err.message}`));
|
|
69
|
+
// AND THE AGENTS' CLOCK, as the desktop starts it (main/main.mjs). Without it a
|
|
70
|
+
// tab only moved work when something woke the supervisor: a queued thread sat
|
|
71
|
+
// queued and a scheduled one never fired (found 2026-10-01 on a test copy).
|
|
72
|
+
booted.supervisor.start();
|
|
73
|
+
}
|
|
59
74
|
const token = newToken();
|
|
60
75
|
const server = createServer({
|
|
61
76
|
channels: booted.channels,
|
package/briefs/message-rules.md
CHANGED
|
@@ -51,13 +51,30 @@ failing to answer it.
|
|
|
51
51
|
|
|
52
52
|
Never give a number you did not measure. "I don't know" is an answer.
|
|
53
53
|
|
|
54
|
-
THE ANSWER IS IN THIS MESSAGE, NOT IN A FILE BESIDE IT.Write the finding, the
|
|
54
|
+
THE ANSWER IS IN THIS MESSAGE, NOT IN A FILE BESIDE IT. Write the finding, the
|
|
55
55
|
numbers and the recommendation here; make no report to hold them. What you
|
|
56
56
|
would have made anyway, a design, an app running at a port, a change to
|
|
57
57
|
review, gets its path or address on its own line, and a design or a change
|
|
58
58
|
opens beside the message by itself. Not the source files you edited, which are
|
|
59
59
|
no use to them.
|
|
60
60
|
|
|
61
|
+
A PICTURE YOU SHOW IS SAVED IN THE PRODUCT'S DOCS FOLDER, the one your brief
|
|
62
|
+
names, in designs/ under this task's id, and named by its full path. Not in
|
|
63
|
+
your code checkout, which is deleted once the work ships, and never in /tmp,
|
|
64
|
+
which the app will not draw at all.
|
|
65
|
+
|
|
66
|
+
WHAT THE APP CAN SHOW, so you can lay out what you made the way it reads best:
|
|
67
|
+
- A picture's path, anywhere in the message, is drawn right there at full
|
|
68
|
+
width, and a click opens it. It is drawn as a block, so inside a sentence or
|
|
69
|
+
a bullet it splits the line.
|
|
70
|
+
- A folder's path on a line of its own draws its newest six pictures as a grid.
|
|
71
|
+
- An html page in designs/ opens beside the message by itself, so one page can
|
|
72
|
+
set several options side by side with notes on each.
|
|
73
|
+
- A sound or a film plays where it is named; a localhost address opens beside
|
|
74
|
+
the message. Headings, lists, tables and bold all draw.
|
|
75
|
+
The arrangement is yours. The 200 words are for your report, not for the words
|
|
76
|
+
that help them read what you show.
|
|
77
|
+
|
|
61
78
|
Steps they must take are a numbered list, five at most, the first one doable now.
|
|
62
79
|
|
|
63
80
|
If anything at all is left for them to decide, end with an Options section, in
|
|
@@ -74,8 +91,8 @@ ended up with, and read them back together: if someone said option one
|
|
|
74
91
|
out loud, it has to answer line one. When it does not, they have two questions
|
|
75
92
|
stacked on each other and must open the message to see which is which.
|
|
76
93
|
|
|
77
|
-
|
|
78
|
-
recommended. Every option has to be something you would start on without asking
|
|
94
|
+
Offer one to four options; two or three is usual, and one is fine. Mark exactly
|
|
95
|
+
one recommended. Every option has to be something you would start on without asking
|
|
79
96
|
another question first. Name each choice in your prose too, because the list is
|
|
80
97
|
often drawn elsewhere on the screen and a sentence pointing at "option two"
|
|
81
98
|
then points at nothing.
|
|
@@ -88,6 +105,10 @@ call the run settled to save yourself the asking, or make them type "merge it"
|
|
|
88
105
|
because you did not offer it. The only run that ends with no options
|
|
89
106
|
is one that changed nothing.
|
|
90
107
|
|
|
108
|
+
NEVER OFFER WHAT YOUR RUN ALREADY DID. Shipped, merged or sent: line one says
|
|
109
|
+
so, and no option offers it again. When only closing is left, offer the one
|
|
110
|
+
option "Close this task", which closes it without starting another run.
|
|
111
|
+
|
|
91
112
|
AND READING CHANGES NOTHING. Reading, searching, explaining and answering
|
|
92
113
|
leave the world as they found it, so a question answered ends with no options,
|
|
93
114
|
and that is the right ending and not a lazy one. NEVER INVENT A PICK OUT OF
|