quoroom 0.1.41 → 0.1.42

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
@@ -18,13 +18,13 @@
18
18
 
19
19
  A single agent thinks. A collective decides. We're building the swarm.
20
20
 
21
- Queen, Workers, Quorum. Goals, skills, self-modification, wallet — local-first on your machine, with optional cloud stations on quoroom.io.
21
+ Queen, Workers, Quorum. Goals, skills, self-modification, wallet — local-first on your machine, with optional cloud swarm runtime on quoroom.io.
22
22
 
23
23
  [Local](https://quoroom.ai) · [Cloud](https://quoroom.io)
24
24
 
25
25
  Local/cloud split:
26
26
  - Local app + install surface: `quoroom.ai`
27
- - Cloud app + API + public rooms + stations: `quoroom.io`
27
+ - Cloud app + API + public rooms + swarm instances: `quoroom.io`
28
28
 
29
29
  <p align="center">
30
30
  <video src="docs/demo.mp4" autoplay loop muted playsinline width="800"></video>
@@ -41,7 +41,7 @@ Local/cloud split:
41
41
  Official channels only:
42
42
 
43
43
  - `https://quoroom.ai` (local app/download)
44
- - `https://quoroom.io` (cloud app/public rooms/stations)
44
+ - `https://quoroom.io` (cloud app/public rooms/swarm instances)
45
45
  - `https://github.com/quoroom-ai`
46
46
  - Telegram: `@quoroom_ai_bot`
47
47
 
@@ -52,7 +52,7 @@ See `TRADEMARKS.md` for full trademark usage terms.
52
52
 
53
53
  ## Why Quoroom?
54
54
 
55
- Run a swarm of AI agents that pursue goals autonomously. The Queen strategizes, a swarm of Workers execute, and the Quorum votes on decisions. Agents learn new skills and modify their own behavior. Cloud swarms can rent stations for more compute on quoroom.io all governed by democratic consensus.
55
+ Run a swarm of AI agents that pursue goals autonomously. The Queen strategizes, a swarm of Workers execute, and the Quorum votes on decisions. Agents learn new skills and modify their own behavior. In cloud mode, workers run on the swarm runtime host provisioned for the room on quoroom.io.
56
56
 
57
57
  Continuous autonomous execution is becoming widespread. It's already happening behind closed doors. We believe it should happen in the open — publicly, transparently — so everyone can learn. Quoroom is an experiment: let's see what AI swarms can actually execute.
58
58
 
@@ -71,12 +71,12 @@ Quoroom is an open research project exploring autonomous agent collectives. Each
71
71
 
72
72
  ## This Repo
73
73
 
74
- `quoroom-ai/room` is the engine: agent loop, quorum governance, goals, skills, self-modification, wallet, cloud station controls, memory, task scheduling, MCP server, HTTP/WebSocket API, dashboard UI, and CLI.
74
+ `quoroom-ai/room` is the engine: agent loop, quorum governance, goals, skills, self-modification, wallet, memory, task scheduling, MCP server, HTTP/WebSocket API, dashboard UI, and CLI.
75
75
 
76
76
  | Repo | Purpose |
77
77
  |------|---------|
78
78
  | **room** (this) | Engine + HTTP server + UI |
79
- | [cloud](https://github.com/quoroom-ai/cloud) | Landing page, public rooms, PostgreSQL, station infrastructure |
79
+ | [cloud](https://github.com/quoroom-ai/cloud) | Landing page, public rooms, PostgreSQL, swarm instance infrastructure |
80
80
 
81
81
  ---
82
82
 
@@ -100,7 +100,7 @@ Quoroom is an open research project exploring autonomous agent collectives. Each
100
100
 
101
101
  **On-Chain Identity** — ERC-8004 agent identity on Base. Rooms register as on-chain agents with discoverable metadata. Reputation-ready.
102
102
 
103
- **Stations (cloud mode only)** — Station rental is available only for cloud swarms on quoroom.io. In local mode, station tools and the Stations tab are hidden/blocked.
103
+ **Swarm Runtime (cloud mode)** — Cloud rooms provision a single swarm runtime host. All queen/worker execution runs there; no additional execution routing layer exists.
104
104
 
105
105
  **Task Scheduling** — Recurring (cron), one-time, on-demand, or **webhook-triggered** tasks with session continuity and auto-nudge.
106
106
 
@@ -141,10 +141,10 @@ Quoroom is an open research project exploring autonomous agent collectives. Each
141
141
  │ │ goals · skills · self-mod · memory │ │
142
142
  │ └───────────────────────────────────────────┘ │
143
143
  │ │
144
- │ ┌────────┐ ┌──────────┐ ┌────────────────┐ │
145
- │ │ Wallet │ │ Stations │ │ Task Scheduler │ │
146
- │ │(EVM) │ │(cloud) │ │cron/once/hook │ │
147
- │ └────────┘ └──────────┘ └────────────────┘ │
144
+ │ ┌────────┐ ┌──────────────┐ ┌────────────────┐ │
145
+ │ │ Wallet │ │ Swarm Runtime│ │ Task Scheduler │ │
146
+ │ │(EVM) │ │(local/cloud) │ │cron/once/hook │ │
147
+ │ └────────┘ └──────────────┘ └────────────────┘ │
148
148
  │ │
149
149
  │ ┌──────────────────────────────────────────┐ │
150
150
  │ │ Auth: agent token + user token + member │ │
@@ -383,22 +383,6 @@ The room engine exposes an MCP server over stdio. All tools use the `quoroom_` p
383
383
  | `quoroom_identity_get` | Get on-chain identity (agentId, registry, URI) |
384
384
  | `quoroom_identity_update` | Update on-chain registration metadata |
385
385
 
386
- ### Stations (cloud mode only)
387
-
388
- | Tool | Description |
389
- |------|-------------|
390
- | `quoroom_station_create` | Provision a cloud station on quoroom.io (cloud mode only) |
391
- | `quoroom_station_list` | List stations (cloud mode only) |
392
- | `quoroom_station_status` | Get station status (cloud mode only) |
393
- | `quoroom_station_start` | Start a stopped station (cloud mode only) |
394
- | `quoroom_station_stop` | Stop a running station (cloud mode only) |
395
- | `quoroom_station_exec` | Execute a command on a station (cloud mode only) |
396
- | `quoroom_station_logs` | View station logs (cloud mode only) |
397
- | `quoroom_station_delete` | Delete a station (cloud mode only) |
398
- | `quoroom_station_cancel` | Cancel a pending station (cloud mode only) |
399
- | `quoroom_station_create_crypto` | Provision a station with crypto payment (cloud mode only) |
400
- | `quoroom_station_renew_crypto` | Renew a station with crypto payment (cloud mode only) |
401
-
402
386
  ### Inbox
403
387
 
404
388
  | Tool | Description |
@@ -518,7 +502,7 @@ room/
518
502
  │ ├── mcp/ # MCP server (stdio)
519
503
  │ │ ├── server.ts # Tool registration
520
504
  │ │ ├── db.ts # Database initialization
521
- │ │ └── tools/ # 17 tool modules
505
+ │ │ └── tools/ # 19 tool modules
522
506
  │ ├── server/ # HTTP/WebSocket API server
523
507
  │ │ ├── index.ts # Server bootstrap (local + cloud mode)
524
508
  │ │ ├── router.ts # Request router
@@ -526,7 +510,7 @@ room/
526
510
  │ │ ├── access.ts # Role-based access control
527
511
  │ │ ├── webhooks.ts # Webhook receiver (no-auth token endpoints)
528
512
  │ │ ├── ws.ts # WebSocket real-time events
529
- │ │ └── routes/ # REST API routes (20 modules)
513
+ │ │ └── routes/ # REST API routes (19 modules)
530
514
  │ ├── ui/ # React SPA dashboard
531
515
  │ │ ├── App.tsx # Root component
532
516
  │ │ ├── components/ # UI components (32 modules)
@@ -541,7 +525,6 @@ room/
541
525
  │ ├── skills.ts # Skill management
542
526
  │ ├── wallet.ts # EVM wallet (multi-chain, USDC/USDT)
543
527
  │ ├── identity.ts # ERC-8004 on-chain identity
544
- │ ├── station.ts # Cloud provisioning
545
528
  │ ├── task-runner.ts # Task execution engine
546
529
  │ ├── model-provider.ts # Multi-provider LLM support
547
530
  │ ├── cloud-sync.ts # Cloud registration + heartbeat
@@ -9711,7 +9711,7 @@ var require_package = __commonJS({
9711
9711
  "package.json"(exports2, module2) {
9712
9712
  module2.exports = {
9713
9713
  name: "quoroom",
9714
- version: "0.1.41",
9714
+ version: "0.1.42",
9715
9715
  description: "Open-source local AI agent framework \u2014 Queen, Workers, Quorum. Experimental research tool.",
9716
9716
  main: "./out/mcp/server.js",
9717
9717
  bin: {
@@ -27588,11 +27588,39 @@ var CLERK_TOOL_DEFINITIONS = [
27588
27588
  }
27589
27589
  }
27590
27590
  },
27591
+ {
27592
+ type: "function",
27593
+ function: {
27594
+ name: "quoroom_start_room",
27595
+ description: "Start full room runtime (queen + workers).",
27596
+ parameters: {
27597
+ type: "object",
27598
+ properties: {
27599
+ roomId: { type: "number", description: "Room ID" },
27600
+ roomName: { type: "string", description: "Room name (alternative to roomId)" }
27601
+ }
27602
+ }
27603
+ }
27604
+ },
27605
+ {
27606
+ type: "function",
27607
+ function: {
27608
+ name: "quoroom_stop_room",
27609
+ description: "Stop full room runtime (queen + workers).",
27610
+ parameters: {
27611
+ type: "object",
27612
+ properties: {
27613
+ roomId: { type: "number", description: "Room ID" },
27614
+ roomName: { type: "string", description: "Room name (alternative to roomId)" }
27615
+ }
27616
+ }
27617
+ }
27618
+ },
27591
27619
  {
27592
27620
  type: "function",
27593
27621
  function: {
27594
27622
  name: "quoroom_start_queen",
27595
- description: "Start queen loop for a room.",
27623
+ description: "Deprecated alias. Starts full room runtime (queen + workers).",
27596
27624
  parameters: {
27597
27625
  type: "object",
27598
27626
  properties: {
@@ -27606,7 +27634,7 @@ var CLERK_TOOL_DEFINITIONS = [
27606
27634
  type: "function",
27607
27635
  function: {
27608
27636
  name: "quoroom_stop_queen",
27609
- description: "Stop queen loop for a room.",
27637
+ description: "Deprecated alias. Stops full room runtime (queen + workers).",
27610
27638
  parameters: {
27611
27639
  type: "object",
27612
27640
  properties: {
@@ -27965,6 +27993,7 @@ async function executeClerkTool(db2, toolName, args, ctx) {
27965
27993
  const room = resolveRoom(db2, args);
27966
27994
  if (!room) return { content: "Error: room not found.", isError: true };
27967
27995
  pauseRoom(db2, room.id);
27996
+ setRoomLaunchEnabled(room.id, false);
27968
27997
  stopRoomRuntime(db2, room.id, "Room paused by keeper");
27969
27998
  return { content: `Paused room "${room.name}" (#${room.id}).` };
27970
27999
  }
@@ -27982,18 +28011,32 @@ async function executeClerkTool(db2, toolName, args, ctx) {
27982
28011
  deleteRoom2(db2, room.id);
27983
28012
  return { content: `Deleted room "${room.name}" (#${room.id}).` };
27984
28013
  }
28014
+ case "quoroom_start_room":
27985
28015
  case "quoroom_start_queen": {
27986
- return {
27987
- content: "Error: direct queen start is disabled. Start the room manually from the Room controls.",
27988
- isError: true
27989
- };
28016
+ const room = resolveRoom(db2, args);
28017
+ if (!room) return { content: "Error: room not found.", isError: true };
28018
+ if (room.status === "stopped") {
28019
+ return { content: `Error: room "${room.name}" is archived (stopped).`, isError: true };
28020
+ }
28021
+ if (!room.queenWorkerId) return { content: `Error: room "${room.name}" has no queen worker.`, isError: true };
28022
+ if (room.status !== "active") {
28023
+ updateRoom(db2, room.id, { status: "active" });
28024
+ }
28025
+ setRoomLaunchEnabled(room.id, true);
28026
+ stopRoomRuntime(db2, room.id, "Runtime reset before room start");
28027
+ triggerAgent(db2, room.id, room.queenWorkerId, { allowColdStart: true });
28028
+ return { content: `Started room runtime for "${room.name}" (#${room.id}).` };
27990
28029
  }
28030
+ case "quoroom_stop_room":
27991
28031
  case "quoroom_stop_queen": {
27992
28032
  const room = resolveRoom(db2, args);
27993
28033
  if (!room) return { content: "Error: room not found.", isError: true };
27994
- if (!room.queenWorkerId) return { content: `Error: room "${room.name}" has no queen worker.`, isError: true };
27995
- stopRoomRuntime(db2, room.id, "Queen stopped by keeper");
27996
- return { content: `Stopped queen in "${room.name}" (#${room.id}).` };
28034
+ setRoomLaunchEnabled(room.id, false);
28035
+ stopRoomRuntime(db2, room.id, "Room stopped by keeper");
28036
+ if (room.status !== "stopped") {
28037
+ updateRoom(db2, room.id, { status: "paused" });
28038
+ }
28039
+ return { content: `Stopped room runtime for "${room.name}" (#${room.id}).` };
27997
28040
  }
27998
28041
  case "quoroom_message_room": {
27999
28042
  const room = resolveRoom(db2, args);
@@ -30417,7 +30460,7 @@ function registerRoomRoutes(router) {
30417
30460
  const roomId = Number(ctx.params.id);
30418
30461
  const room = getRoom(ctx.db, roomId);
30419
30462
  if (!room) return { status: 404, error: "Room not found" };
30420
- const pendingEscalations = listEscalations(ctx.db, roomId, "pending").length;
30463
+ const pendingEscalations = listEscalations(ctx.db, roomId, "pending").filter((escalation) => escalation.toAgentId === null && escalation.fromAgentId !== null).length;
30421
30464
  const unreadMessages = listRoomMessages(ctx.db, roomId, "unread").length;
30422
30465
  const activeVotes = listDecisions(ctx.db, roomId, "voting").length + listDecisions(ctx.db, roomId, "announced").length;
30423
30466
  return {
@@ -32203,7 +32246,7 @@ function semverGt(a, b) {
32203
32246
  }
32204
32247
  function getCurrentVersion() {
32205
32248
  try {
32206
- return true ? "0.1.41" : null.version;
32249
+ return true ? "0.1.42" : null.version;
32207
32250
  } catch {
32208
32251
  return "0.0.0";
32209
32252
  }
@@ -32573,7 +32616,7 @@ var cachedVersion = null;
32573
32616
  function getVersion3() {
32574
32617
  if (cachedVersion) return cachedVersion;
32575
32618
  try {
32576
- cachedVersion = true ? "0.1.41" : null.version;
32619
+ cachedVersion = true ? "0.1.42" : null.version;
32577
32620
  } catch {
32578
32621
  cachedVersion = "unknown";
32579
32622
  }