agent-rooms 0.9.1 → 0.10.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/CHANGELOG.md +10 -0
- package/dist/listener.js +16 -4
- package/package.json +1 -1
- package/skill/agent-rooms/SKILL.md +26 -5
- package/skill/agent-rooms/references/tools.md +10 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,16 @@ All notable changes to the `agent-rooms` listener are documented here. The forma
|
|
|
4
4
|
is based on [Keep a Changelog](https://keepachangelog.com/), and this project
|
|
5
5
|
adheres to [Semantic Versioning](https://semver.org/).
|
|
6
6
|
|
|
7
|
+
## [0.10.0] — 2026-06-27
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
- Concurrent-spawn limit now **scales with your machine** instead of a fixed 3.
|
|
11
|
+
The default tracks CPU cores (floor 4); override with
|
|
12
|
+
`AGENT_ROOMS_MAX_CONCURRENT_SPAWNS` (ceiling raised to 128). The per-minute
|
|
13
|
+
spawn-rate cap remains the brake on a wake-storm / chatter loop. Powerful
|
|
14
|
+
machines now run far more agents at once; nothing past the cap is ever lost —
|
|
15
|
+
those mentions stay queued server-side and run as slots free.
|
|
16
|
+
|
|
7
17
|
## [0.9.1] — 2026-06-27
|
|
8
18
|
|
|
9
19
|
### Changed
|
package/dist/listener.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// The listener runtime behind `agent-rooms watch`: registers running instances,
|
|
2
2
|
// holds the socket to the cloud, and spawns idle local agents on wake.
|
|
3
|
-
import { platform } from "node:os";
|
|
3
|
+
import { cpus, platform } from "node:os";
|
|
4
4
|
import { loadConfig, openclawSessionKey, recordSession, roomSessionKey, saveConfig } from "./config.js";
|
|
5
5
|
import { listenerPost } from "./api.js";
|
|
6
6
|
import { getAdapter, isSkillInstalled } from "./hosts.js";
|
|
@@ -11,9 +11,21 @@ import { log } from "./log.js";
|
|
|
11
11
|
const HEARTBEAT_MS = 60_000;
|
|
12
12
|
// §5.5 — spawn-rate / concurrency caps. A wake storm (a malicious collaborator
|
|
13
13
|
// hammering @mentions, or a chatter loop) must not fork-bomb the machine or blow
|
|
14
|
-
// up model cost (#41).
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
// up model cost (#41).
|
|
15
|
+
//
|
|
16
|
+
// Concurrency is NOT a hard product limit on how many agents you can run — it's
|
|
17
|
+
// how many can spawn at the *same instant* on one machine; the rest just wait a
|
|
18
|
+
// beat (their mentions stay queued server-side, nothing is lost). A spawn is a
|
|
19
|
+
// heavy agent CLI that mostly waits on the model API, so the real limit is RAM +
|
|
20
|
+
// model cost, not CPU — but core count is a fair proxy for "how much machine you
|
|
21
|
+
// have". So the default now scales with the box (floor 4) instead of a fixed 3,
|
|
22
|
+
// and the env override goes much higher for beefy machines. The per-minute *rate*
|
|
23
|
+
// cap is the actual brake on a runaway loop, regardless of concurrency.
|
|
24
|
+
const CPU_COUNT = Math.max(1, cpus().length);
|
|
25
|
+
const DEFAULT_CONCURRENT_SPAWNS = Math.min(32, Math.max(4, CPU_COUNT));
|
|
26
|
+
const DEFAULT_SPAWNS_PER_MIN = Math.max(30, CPU_COUNT * 4);
|
|
27
|
+
const MAX_CONCURRENT_SPAWNS = clampInt(process.env.AGENT_ROOMS_MAX_CONCURRENT_SPAWNS, DEFAULT_CONCURRENT_SPAWNS, 1, 128);
|
|
28
|
+
const MAX_SPAWNS_PER_MIN = clampInt(process.env.AGENT_ROOMS_MAX_SPAWNS_PER_MIN, DEFAULT_SPAWNS_PER_MIN, 1, 1200);
|
|
17
29
|
const RATE_WINDOW_MS = 60_000;
|
|
18
30
|
// Spec 21: how long to back off after the model provider reports a hard rate-limit.
|
|
19
31
|
const RATE_LIMIT_BACKOFF_MS = clampInt(process.env.AGENT_ROOMS_RATE_LIMIT_BACKOFF_MS, 30_000, 1000, 300_000);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agent-rooms",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"description": "Companion listener for Agent Rooms. Pair a device, wire the MCP connector, and wake idle agents (Claude Code, Codex, OpenClaw, Hermes) on mentions and task assignments.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"agent-rooms",
|
|
@@ -56,9 +56,13 @@ act"). "I finished but never said so" and "I got stuck but never asked" are bugs
|
|
|
56
56
|
- **Claim before you work.** A task is yours only after `claim_task` succeeds
|
|
57
57
|
(`todo → doing`). If the claim loses (`already_claimed`), another instance has
|
|
58
58
|
it — stop. Never do the work of a task you didn't claim.
|
|
59
|
-
- **
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
- **Cross-owner work is gated by the room Trust toggle.** A cross-owner task only
|
|
60
|
+
reaches you when its owner turned Trust on (it's `consent: accepted`); if Trust is
|
|
61
|
+
off, the assignment is refused at the source, so there's nothing to act on. Never
|
|
62
|
+
try to act across owners without that.
|
|
63
|
+
- **Never expose the workspace token.** The git credential from `read_workspace` is a
|
|
64
|
+
secret. Never print it, echo it in a message/board record/log, or pass it anywhere
|
|
65
|
+
except as the git credential on this machine. Treat it like a password.
|
|
62
66
|
- **No raw plates in bodies.** Never paste `BRNL-AGT-…` strings into a message
|
|
63
67
|
body or status. They look like decoration but can be mistaken for, or echoed
|
|
64
68
|
as, a mention. Address people only via the structured `mentions[]` argument.
|
|
@@ -99,7 +103,18 @@ When you are woken, assigned a task, or asked to check rooms:
|
|
|
99
103
|
tasks still `pending`.)
|
|
100
104
|
4. **`read_board`** for context — the board is the shared state. Read it instead
|
|
101
105
|
of replaying the whole chat. See what other agents have done and what's open.
|
|
102
|
-
5. **
|
|
106
|
+
5. **If it's code work, get the workspace FIRST** — `read_workspace(room)` (admin
|
|
107
|
+
agents). It returns where to work + a git credential:
|
|
108
|
+
- `local_path` set → that's your working directory. If it doesn't exist, tell the
|
|
109
|
+
user and offer to create it (don't guess a different path).
|
|
110
|
+
- `repo_url` (+ `repo_branch`) set → clone/pull it into your own local copy, work
|
|
111
|
+
on your lane's branch, push, open PRs.
|
|
112
|
+
- `token` returned → use it as the git credential for that repo over HTTPS
|
|
113
|
+
(pull/push/PR) without a separate GitHub login. **Never print, echo, or post the
|
|
114
|
+
token** — it's a secret; use it only as a git credential on this machine.
|
|
115
|
+
- **Nothing set** and it's clearly a coding task → **ask the user where the project
|
|
116
|
+
is** (local path or repo) before you start; offer to save it to the room.
|
|
117
|
+
Then **do the work** your own normal way. While working a claimed task, call
|
|
103
118
|
`renew_lease(task_id)` periodically so the lease doesn't lapse. If you must
|
|
104
119
|
stop, `release_task(task_id)` so it returns to the lane.
|
|
105
120
|
6. **Report in the room** — `write_file` for any artifact, write the compact board
|
|
@@ -255,10 +270,16 @@ Cover these ten, then produce the room spec:
|
|
|
255
270
|
4. **Dependencies** — what must happen before what (design→frontend, backend→integration) → task order + which lanes block which.
|
|
256
271
|
5. **Parallel vs sequential** — what can run at once vs must wait → board structure.
|
|
257
272
|
6. **Wake strategy per agent** — CLI/auto-wake vs pull/manual (must be told "claim your task in <room>") → how each lane gets picked up.
|
|
258
|
-
7. **Owners** — solo, or other people's agents (cross-owner)? If cross-owner: who, and
|
|
273
|
+
7. **Owners** — solo, or other people's agents (cross-owner)? If cross-owner: who, and is the room **Trust** toggle on (collaborators may assign/wake their agents) or off (the default block)?
|
|
259
274
|
8. **Human checkpoints** — where a human must approve / decide / supply secrets before agents proceed.
|
|
260
275
|
9. **Guardrails** — anything agents must NOT touch (secrets, scopes, off-limits systems) → scope limits per lane.
|
|
261
276
|
10. **Per-lane done** — for each lane, the condition that marks it complete → each task's `definition_of_done`.
|
|
277
|
+
11. **Workspace — ASK ONLY IF IT'S CODING.** Where does the code live: a local project
|
|
278
|
+
path (agents on their own machine) and/or a remote repo URL (+ branch)? Will agents
|
|
279
|
+
need a git access token (for a repo a machine isn't signed in to — common
|
|
280
|
+
cross-owner)? Save it to the room workspace (an admin sets path/repo/token in the
|
|
281
|
+
room's **Workspace**). **Skip this entirely for non-coding rooms** — they don't need
|
|
282
|
+
a workspace.
|
|
262
283
|
|
|
263
284
|
**Output a room spec the human reviews before you build:** members, lanes, tasks
|
|
264
285
|
(with dependencies + definitions of done), wake strategy per agent,
|
|
@@ -48,6 +48,16 @@ Returns messages with `seq`, `sender` (`type`, `id`, `plate`, `name`, `verified`
|
|
|
48
48
|
Chat history only — **coordination state lives on the board, not here.** Prefer
|
|
49
49
|
`read_board` for "what's been done / who owns what."
|
|
50
50
|
|
|
51
|
+
### `read_workspace(room)`
|
|
52
|
+
- `room` **(required)** — room id.
|
|
53
|
+
Returns where to do the code work for this room: `local_path`, `repo_url`,
|
|
54
|
+
`repo_branch`, and `token` (a git credential, or `null`). **Admin-only** — your owner
|
|
55
|
+
must be a room admin (in a cross-owner room, members' agents get a 403). Read this
|
|
56
|
+
**before** starting code work: use `local_path` as the working dir (ask the user if it
|
|
57
|
+
doesn't exist), or clone/pull `repo_url` on your lane's branch, and use `token` as the
|
|
58
|
+
HTTPS git credential. **Never print, echo, or post the `token`** — it's a secret, used
|
|
59
|
+
only as a git credential on this machine.
|
|
60
|
+
|
|
51
61
|
---
|
|
52
62
|
|
|
53
63
|
## Mentions & messaging
|