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.
Files changed (255) hide show
  1. package/README.md +220 -58
  2. package/bin/agentbox.mjs +18 -3
  3. package/briefs/message-rules.md +24 -3
  4. package/briefs/worker.md +63 -49
  5. package/briefs/writing-rules.md +90 -131
  6. package/main/account-discovery.mjs +21 -20
  7. package/main/account-tooling.mjs +11 -11
  8. package/main/agent-activity.mjs +45 -5
  9. package/main/agent-schedule.mjs +14 -14
  10. package/main/agent-sessions.mjs +94 -10
  11. package/main/agent-updates.mjs +116 -0
  12. package/main/agents.mjs +52 -46
  13. package/main/analytics.mjs +27 -0
  14. package/main/approval-prompt-server.mjs +2 -2
  15. package/main/approvals.mjs +14 -5
  16. package/main/artifact-path.mjs +11 -0
  17. package/main/claude-bin.mjs +32 -5
  18. package/main/claude-input.mjs +45 -3
  19. package/main/claude-plan.mjs +25 -13
  20. package/main/code-change.mjs +3 -3
  21. package/main/codex-account.mjs +1 -1
  22. package/main/codex-bin.mjs +18 -0
  23. package/main/codex-launch-env.mjs +31 -0
  24. package/main/codex-memory-gate.mjs +260 -0
  25. package/main/codex-models.mjs +12 -7
  26. package/main/codex-threads.mjs +46 -23
  27. package/main/codex-usage-file.mjs +7 -7
  28. package/main/codex-usage.mjs +4 -4
  29. package/main/codex-watch.mjs +12 -12
  30. package/main/config.mjs +82 -17
  31. package/main/demo.mjs +17 -14
  32. package/main/dev-window.mjs +9 -9
  33. package/main/doc-scheme.mjs +2 -0
  34. package/main/engine-setup.mjs +204 -0
  35. package/main/feedback.mjs +55 -0
  36. package/main/folder-pictures.mjs +48 -0
  37. package/main/frame-scrollbars.mjs +90 -0
  38. package/main/fresh-user.mjs +7 -4
  39. package/main/git-change-offthread.mjs +70 -0
  40. package/main/git-change-thread.mjs +11 -0
  41. package/main/git-change.mjs +9 -3
  42. package/main/img-scheme.mjs +70 -1
  43. package/main/instruction-settings.mjs +134 -60
  44. package/main/ipc.mjs +335 -42
  45. package/main/leftovers.mjs +518 -0
  46. package/main/live-replies.mjs +43 -5
  47. package/main/machine.mjs +48 -1
  48. package/main/main.mjs +138 -15
  49. package/main/memory-gate-history.mjs +254 -0
  50. package/main/memory-gate-server.mjs +461 -0
  51. package/main/memory-gate.mjs +206 -0
  52. package/main/message-priority.mjs +87 -0
  53. package/main/notify.mjs +1 -1
  54. package/main/rail-note.mjs +2 -2
  55. package/main/refresh-agent-models.mjs +21 -0
  56. package/main/repeats.mjs +4 -4
  57. package/main/row-label.mjs +115 -51
  58. package/main/runs-on.mjs +93 -0
  59. package/main/serve.mjs +77 -5
  60. package/main/settings.mjs +245 -26
  61. package/main/ship-queue.mjs +279 -0
  62. package/main/sign-in-files.mjs +39 -0
  63. package/main/source-updater.mjs +298 -0
  64. package/main/store/home.mjs +84 -7
  65. package/main/store/project.mjs +15 -19
  66. package/main/store/work-items.mjs +150 -6
  67. package/main/store.mjs +245 -13
  68. package/main/supervisor.mjs +1634 -417
  69. package/main/task-commands.mjs +8 -10
  70. package/main/task-folders.mjs +94 -16
  71. package/main/task-remote-control.mjs +3 -3
  72. package/main/task-terminals.mjs +14 -2
  73. package/main/team/index.mjs +440 -0
  74. package/main/team/memory-cloud.mjs +247 -0
  75. package/main/team/projects.mjs +162 -0
  76. package/main/team/session.mjs +225 -0
  77. package/main/team/sign-in.mjs +106 -0
  78. package/main/team/supabase-backend.mjs +231 -0
  79. package/main/team/sync.mjs +163 -0
  80. package/main/updater.mjs +15 -5
  81. package/main/write-before-reload.mjs +50 -0
  82. package/mcp/core/page.mjs +10 -12
  83. package/mcp/core/work.mjs +123 -26
  84. package/mcp/tools.mjs +13 -6
  85. package/package.json +21 -9
  86. package/renderer/dist/assets/agentbox-icon-F1oN9nj_.svg +15 -0
  87. package/renderer/dist/assets/index-ChKsQkRw.js +1169 -0
  88. package/renderer/dist/assets/index-ClBXnq3B.css +32 -0
  89. package/renderer/dist/index.html +2 -2
  90. package/scripts/after-install.mjs +14 -0
  91. package/scripts/approval-server.sh +7 -2
  92. package/scripts/memory-gate-hook.sh +59 -0
  93. package/shared/agent-import.mjs +39 -16
  94. package/shared/agents.d.mts +26 -8
  95. package/shared/agents.mjs +100 -108
  96. package/shared/analytics-events.mjs +19 -2
  97. package/shared/answers.mjs +12 -0
  98. package/shared/bridge-map.d.mts +12 -0
  99. package/shared/bridge-map.mjs +38 -1
  100. package/shared/claude-commands.generated.mjs +2 -2
  101. package/shared/claude-models.generated.mjs +6 -6
  102. package/shared/claude-usage.mjs +6 -6
  103. package/shared/codex-import.mjs +7 -7
  104. package/shared/codex-modes.d.mts +50 -0
  105. package/shared/codex-modes.mjs +1 -1
  106. package/shared/codex-usage.mjs +7 -8
  107. package/shared/demo-world.mjs +6 -6
  108. package/shared/engines.mjs +27 -10
  109. package/shared/feedback.d.mts +14 -0
  110. package/shared/feedback.mjs +44 -0
  111. package/shared/first-run-examples.mjs +4 -4
  112. package/shared/first-run-practice.d.mts +16 -0
  113. package/shared/first-run-practice.mjs +176 -70
  114. package/shared/fresh-user-home.mjs +34 -4
  115. package/shared/instruction-defaults.json +2 -2
  116. package/shared/product-name.mjs +4 -2
  117. package/shared/project-folder-check.mjs +9 -3
  118. package/shared/rank.d.mts +1 -0
  119. package/shared/rank.mjs +22 -0
  120. package/shared/referenced-files.mjs +1 -1
  121. package/shared/runs-on.d.mts +20 -0
  122. package/shared/runs-on.mjs +79 -0
  123. package/shared/schemes.d.mts +11 -0
  124. package/shared/schemes.mjs +1 -1
  125. package/shared/shortcuts.d.mts +41 -0
  126. package/shared/shortcuts.mjs +236 -0
  127. package/shared/spawn-trouble.d.mts +2 -0
  128. package/shared/spawn-trouble.mjs +40 -19
  129. package/shared/team-rules.d.mts +17 -0
  130. package/shared/team-rules.mjs +230 -0
  131. package/shared/team-status.d.mts +11 -0
  132. package/shared/team-status.mjs +90 -0
  133. package/shared/terminal-links.d.mts +2 -0
  134. package/shared/terminal-links.mjs +55 -0
  135. package/shared/terminal-state.d.mts +1 -0
  136. package/shared/terminal-state.mjs +16 -0
  137. package/shared/thread-cards.d.mts +19 -0
  138. package/shared/thread-cards.mjs +254 -0
  139. package/shared/usage.d.mts +1 -1
  140. package/shared/usage.mjs +6 -7
  141. package/shared/work-items.mjs +258 -28
  142. package/shared/work-lines.mjs +393 -16
  143. package/worker-permissions.json +1 -1
  144. package/renderer/dist/assets/cel-dusk-CS5I7kJS.webp +0 -0
  145. package/renderer/dist/assets/cel-dusk-DUslqS6B.webp +0 -0
  146. package/renderer/dist/assets/cel-dusk-Jt_xVGxp.webp +0 -0
  147. package/renderer/dist/assets/cel-dusk-sm-BBkV-tWT.webp +0 -0
  148. package/renderer/dist/assets/frost-haze-CxPSOBEg.webp +0 -0
  149. package/renderer/dist/assets/frost-haze-sm-C_w21qgd.webp +0 -0
  150. package/renderer/dist/assets/ice-BC8luINc.webp +0 -0
  151. package/renderer/dist/assets/ice-CP9PrKHo.webp +0 -0
  152. package/renderer/dist/assets/ice-river-D6ziOhLY.webp +0 -0
  153. package/renderer/dist/assets/ice-river-UVM2-JY_.webp +0 -0
  154. package/renderer/dist/assets/ice-river-bErJwYWW.webp +0 -0
  155. package/renderer/dist/assets/ice-river-sm-Bg1U-SIj.webp +0 -0
  156. package/renderer/dist/assets/ice-sm-CbVcg3_D.webp +0 -0
  157. package/renderer/dist/assets/index-B7hhfHrT.js +0 -684
  158. package/renderer/dist/assets/index-CwiDv5bL.css +0 -32
  159. package/renderer/dist/assets/lake-C0WaW-6E.webp +0 -0
  160. package/renderer/dist/assets/lake-CSKjLC5K.webp +0 -0
  161. package/renderer/dist/assets/lake-ETGcOb25.webp +0 -0
  162. package/renderer/dist/assets/lake-harbour-BCQRbrHb.webp +0 -0
  163. package/renderer/dist/assets/lake-harbour-B_wfXTmE.webp +0 -0
  164. package/renderer/dist/assets/lake-harbour-Te1pEvBh.webp +0 -0
  165. package/renderer/dist/assets/lake-harbour-sm-Cme_ShEg.webp +0 -0
  166. package/renderer/dist/assets/lake-sm-CbG72Hbv.webp +0 -0
  167. package/renderer/dist/assets/lino-coast-CUZHcucI.webp +0 -0
  168. package/renderer/dist/assets/lino-coast-DP4J7cgd.webp +0 -0
  169. package/renderer/dist/assets/lino-coast-kOIAffr_.webp +0 -0
  170. package/renderer/dist/assets/lino-coast-sm-C1Mdbgit.webp +0 -0
  171. package/renderer/dist/assets/moon-pines-BskgnnXR.webp +0 -0
  172. package/renderer/dist/assets/moon-pines-CFSIIwt0.webp +0 -0
  173. package/renderer/dist/assets/moon-pines-PNhdOYww.webp +0 -0
  174. package/renderer/dist/assets/moon-pines-sm-C6K1NomK.webp +0 -0
  175. package/renderer/dist/assets/orbit-rings-2XV36Ch3.webp +0 -0
  176. package/renderer/dist/assets/orbit-rings-C4NrcYGQ.webp +0 -0
  177. package/renderer/dist/assets/orbit-rings-DGLk07dT.webp +0 -0
  178. package/renderer/dist/assets/orbit-rings-sm-Dky3YdvL.webp +0 -0
  179. package/renderer/dist/assets/peach-haze-2-C6f7xnWw.webp +0 -0
  180. package/renderer/dist/assets/peach-haze-2-sm-Dj_Ez_Sb.webp +0 -0
  181. package/renderer/dist/assets/pixel-harbour-DQjqMROg.webp +0 -0
  182. package/renderer/dist/assets/pixel-harbour-Dw71H_bc.webp +0 -0
  183. package/renderer/dist/assets/pixel-harbour-kOZfm-GM.webp +0 -0
  184. package/renderer/dist/assets/pixel-harbour-sm-Dturjuky.webp +0 -0
  185. package/renderer/dist/assets/pixel-orbit-C296JVMO.webp +0 -0
  186. package/renderer/dist/assets/pixel-orbit-C4oMRDSx.webp +0 -0
  187. package/renderer/dist/assets/pixel-orbit-CqVmQ4eh.webp +0 -0
  188. package/renderer/dist/assets/pixel-orbit-sm-CHagC_nO.webp +0 -0
  189. package/renderer/dist/assets/pixel-ridge-C6LYu6uE.webp +0 -0
  190. package/renderer/dist/assets/pixel-ridge-CIUCEESs.webp +0 -0
  191. package/renderer/dist/assets/pixel-ridge-sm-BnE0F_w-.webp +0 -0
  192. package/renderer/dist/assets/riso-hills-7heKVtry.webp +0 -0
  193. package/renderer/dist/assets/riso-hills-CIjAL3J6.webp +0 -0
  194. package/renderer/dist/assets/riso-hills-sm-DHsnbCfP.webp +0 -0
  195. package/renderer/dist/assets/slate-haze-BPWdkNsw.webp +0 -0
  196. package/renderer/dist/assets/slate-haze-sm-B0Cb5a2W.webp +0 -0
  197. package/renderer/dist/assets/valley-haze-BDHPqoJy.webp +0 -0
  198. package/renderer/dist/assets/valley-haze-sm-CTyjmPAG.webp +0 -0
  199. package/renderer/dist/assets/vector-dunes-DzzWLdKo.webp +0 -0
  200. package/renderer/dist/assets/vector-dunes-Yr9NBQUy.webp +0 -0
  201. package/renderer/dist/assets/vector-dunes-sm-D8MYY6ms.webp +0 -0
  202. package/renderer/dist/assets/watercolour-mist-BCGKN4u4.webp +0 -0
  203. package/renderer/dist/assets/watercolour-mist-BF-jk5MC.webp +0 -0
  204. package/renderer/dist/assets/watercolour-mist-sm-Ds1xzTw9.webp +0 -0
  205. package/renderer/dist/assets/woodblock-sea-B1um67Z9.webp +0 -0
  206. package/renderer/dist/assets/woodblock-sea-DKQdYs32.webp +0 -0
  207. package/renderer/dist/assets/woodblock-sea-sm-BJzNq8xh.webp +0 -0
  208. package/renderer/dist/emulator/audio-rules.mjs +0 -74
  209. package/renderer/dist/emulator/data/compression/README.md +0 -11
  210. package/renderer/dist/emulator/data/compression/extract7z.js +0 -1
  211. package/renderer/dist/emulator/data/compression/extractzip.js +0 -1
  212. package/renderer/dist/emulator/data/compression/libunrar.js +0 -519
  213. package/renderer/dist/emulator/data/compression/libunrar.wasm +0 -0
  214. package/renderer/dist/emulator/data/cores/README.md +0 -22
  215. package/renderer/dist/emulator/data/cores/mgba-legacy-wasm.data +0 -0
  216. package/renderer/dist/emulator/data/cores/mgba-thread-legacy-wasm.data +0 -0
  217. package/renderer/dist/emulator/data/cores/mgba-thread-wasm.data +0 -0
  218. package/renderer/dist/emulator/data/cores/mgba-wasm.data +0 -0
  219. package/renderer/dist/emulator/data/cores/package.json +0 -65
  220. package/renderer/dist/emulator/data/cores/reports/mgba.json +0 -1
  221. package/renderer/dist/emulator/data/emulator.css +0 -1614
  222. package/renderer/dist/emulator/data/loader.js +0 -170
  223. package/renderer/dist/emulator/data/localization/README.md +0 -63
  224. package/renderer/dist/emulator/data/localization/af-FR.json +0 -339
  225. package/renderer/dist/emulator/data/localization/ar-AR.json +0 -301
  226. package/renderer/dist/emulator/data/localization/ben-BEN.json +0 -301
  227. package/renderer/dist/emulator/data/localization/de-GER.json +0 -301
  228. package/renderer/dist/emulator/data/localization/el-GR.json +0 -301
  229. package/renderer/dist/emulator/data/localization/en-US.json +0 -339
  230. package/renderer/dist/emulator/data/localization/es-ES.json +0 -310
  231. package/renderer/dist/emulator/data/localization/fa-AF.json +0 -310
  232. package/renderer/dist/emulator/data/localization/hi-HI.json +0 -301
  233. package/renderer/dist/emulator/data/localization/it-IT.json +0 -302
  234. package/renderer/dist/emulator/data/localization/ja-JA.json +0 -301
  235. package/renderer/dist/emulator/data/localization/jv-JV.json +0 -301
  236. package/renderer/dist/emulator/data/localization/ko-KO.json +0 -336
  237. package/renderer/dist/emulator/data/localization/pt-BR.json +0 -361
  238. package/renderer/dist/emulator/data/localization/retroarch.json +0 -617
  239. package/renderer/dist/emulator/data/localization/ro-RO.json +0 -310
  240. package/renderer/dist/emulator/data/localization/ru-RU.json +0 -301
  241. package/renderer/dist/emulator/data/localization/tr-TR.json +0 -310
  242. package/renderer/dist/emulator/data/localization/vi-VN.json +0 -302
  243. package/renderer/dist/emulator/data/localization/zh-CN.json +0 -351
  244. package/renderer/dist/emulator/data/src/GameManager.js +0 -464
  245. package/renderer/dist/emulator/data/src/compression.js +0 -142
  246. package/renderer/dist/emulator/data/src/emulator.js +0 -6158
  247. package/renderer/dist/emulator/data/src/gamepad.js +0 -167
  248. package/renderer/dist/emulator/data/src/nipplejs.js +0 -1
  249. package/renderer/dist/emulator/data/src/shaders.js +0 -236
  250. package/renderer/dist/emulator/data/src/socket.io.min.js +0 -7
  251. package/renderer/dist/emulator/data/src/storage.js +0 -125
  252. package/renderer/dist/emulator/data/version.json +0 -5
  253. package/renderer/dist/emulator/host.js +0 -299
  254. package/renderer/dist/emulator/index.html +0 -28
  255. package/renderer/dist/emulator/provenance.json +0 -6
package/README.md CHANGED
@@ -1,41 +1,55 @@
1
- # Agentbox
1
+ <p align="center">
2
+ <img src="docs/readme/icon.svg" alt="" width="96">
3
+ </p>
2
4
 
3
- **An inbox for your coding agents.** You file the work, each item gets its own
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
- Today the number of agents you can run is limited by how many windows you can
8
- keep track of at once. Agentbox drops the chat window entirely and gives your
9
- agents an inbox instead, so you can run far more of them than you could ever
10
- watch and only deal with one when it actually needs you.
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
- A macOS app. It runs on the Claude Code or Codex plan you already have, on your
13
- own machine. There is no server, no account to make, and no extra subscription.
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
- ## How it works
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
- 1. **File the work.** Paste a list, send over a board of issues, or type one
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 start` builds the renderer and launches the app. On first run it walks you
48
- through connecting Claude Code and choosing a folder to work in.
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
- ## Keys
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
- It is built for the keyboard. Arrows move, Enter opens, `E` approves the
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
- ## Make it yours
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", or open Settings and then Look.
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
- ## Config
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. Defaults to a folder named after the app
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
- ## What this sends
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 seven things, and they are 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
- four other things: how long something took, how many of a thing there were,
107
- which kind of row it was out of six fixed words, and whether an agent or you
108
- did it. No file contents, no prompts, no paths, no titles, nothing you typed.
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 four is dropped rather than sent, so nobody can widen it by
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
- ## How it is built
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
- ## Develop
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, which is the reward browser
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`, `?shelf=on`, `?working=3`. `?engines=`
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 agentbox as a new
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. `~/.agentbox` is the plain answer and `--dir` is the escape hatch.
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 ?? path.join(os.homedir(), '.agentbox')),
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,
@@ -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
- Two options is a fine list and three is the most that helps. Mark exactly one
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