Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ curl -fsSL https://raw.githubusercontent.com/AgentSystemLabs/agent-office/main/i
- **GitHub on the walls.** Issues and pull requests hang on cork boards. Hand an issue to a worker, queue tasks, give a worker its own git worktree and open its PR with one key (if one gets deleted behind the office's back, the worker waits at its desk until you rebuild it). One task can span several projects: the worker gets a worktree of each, and a PR in each that links the others.
- **Agents that manage agents.** Every worker can list, hire, message and send home the others, through an `agent-office` MCP server (Claude Code, Codex, OpenCode) or the `office-workers` command. Ask one to "send everyone whose PR merged home" and it does, deleting their worktrees and branches unless they hold unpushed work. A worker that opens its pull request itself (`gh pr create`) shows it at its desk, and one the office missed can be told which is its own (`office-workers pr`).
- **Together.** Voice, chat, screen sharing on the lounge TV and a shared whiteboard.
- **Boss Executive Workstation.** Walk upstairs to the boss loft office, sit in the boss's chair, and take command: an interactive host terminal, direct inter-agent messaging, live fleet radar, and Minesweeper. Host commands and worker directives require a signed-in office admin account; regular members cannot call these endpoints.

- **Other maps.** Turn the whole building into a castle: sit on a throne of iron blades while your workers line up before you when they're done, send new ones off through the Hand of the King, and watch their beards grow long and grey as they toil. Send one home and the Kingsguard runs up from the dungeon, marches it down the stairs and throws it in a cell, where it starves, dies and rots down to a skeleton. Or into a space station in orbit, the Earth turning outside its windows: you run it from the captain's chair on the bridge, and a worker sent home is marched to the airlock and blown out into space, to drift off past the observation windows with everyone who went before it. Or make a map of your own, with its own way of seeing workers off in JSON ([docs/maps.md](docs/maps.md)).

Expand Down
8 changes: 5 additions & 3 deletions docs/features.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,11 @@ Everything in the office, room by room. Back to the [README](../README.md).
- **Halloween and Christmas.** Under **⚙️** → *Holiday theme*, anyone can dress the whole building up, for everyone on every floor. For Halloween the workers turn into shambling zombies with stitched grins and bandages, your first-person hands become an undead warlock's, bony and clawed with green witch-fire curling round them, everyone dresses as a warlock (a crooked hat, a purple robe with an orange sash and a ragged hem, and pointed boots), and the dog gets bat wings and a witch's hat. The sky goes creepy, purple overhead and blood orange at the horizon, with a big harvest moon, bats crossing it and circling the building, and the odd far-off flash. Jack-o'-lanterns glow everywhere: on every desk, the window sills, the counter, the balcony rail and down the street, with gravestones on the lawn and cobwebs in the corners. For Christmas the workers are elves, your hands are in mittens, everyone wears a Santa suit (the hat, white fur trim, a black belt with a gold buckle, green mittens and black boots), the dog is Rudolph, the potted plants turn into little decorated trees with presents under them, and it snows outside, onto a big lit tree and a few snowmen out front. *By the calendar* (the default) puts up Halloween through October and Christmas through December, by the office's clock.
- **Smoke breaks.** Glass doors on the south wall slide open onto a balcony with string lights, a bench and a bistro table. Press **E** at the ashtray to light up. Everyone sees you puffing away until you stub it out or step back inside.
- **Golf off the balcony.** Next to the ashtray there's a tee: a square of turf, a ball on a tee and a bag of clubs. Across the street, where the neighbours leave a gap, a fairway runs up to a green with a flag on it, 43 m out and a storey down (further down from the floors above). Press **E** at the tee to step up with a club. The camera drops down behind the ball. The mouse or **A**/**D** aims, **W**/**S** set the loft (too flat and it hits the railing), and holding **Space** takes the club back while the power meter runs up and down: let go to hit. The camera follows the ball out and down, and a label says where it stopped and how far from the pin. Everyone on your floor sees you swing and your ball fly, landing in the same spot. Hole one and the green goes up in confetti. Your closest shot and your holes in one are kept in your browser. **E** puts the club back.
- **Take a seat.** Press **E** at the lounge couch, a beanbag, the balcony bench or a stool at its bistro table, or the couch or the boss's chair up in the boss office to sit down. Walk off, jump or press **E** again to get up. Everyone on your floor sees you sitting. Sit on the couch facing the TV while someone's sharing their screen and it opens full screen for you.
- **Minesweeper on the boss's monitor.** In the boss's chair, **E** plays Minesweeper on the monitor: the camera moves in close and the board sits right on the screen. Click to dig, right-click (or Shift-click) to flag, and click a number to dig around it once its mines are flagged. The first click is never a mine. **Stop playing** leaves your game up on the monitor, with its clock paused, until you come back. Walk off to get up.
- **Pick your character.** The first time you join, a character select screen lets you choose your name, skin tone, hair style, hair color and shirt, with a spinning preview. No name in mind? Leave it blank (or skip the screen) and you go by the made-up one shown in the box, like *Sunny Otter*, or press **🎲** for another. The office remembers your name and look in that browser, so you only pick once. Change it any time from **⚙️** or by clicking your name under *In the office* (turn on **👥 People** in the **☰** menu).
- **Boss Executive Workstation on the boss's monitor.** Sitting in the boss's chair upstairs in the boss office (or looking at the monitor), press **E** to open the **Boss Executive Workstation**: the camera glides right up to the screen. Signed-in office admins can run host commands, issue worker directives, and view fleet status from the desk. Regular member accounts are denied access to all boss endpoints:
- ⚡ **Host Terminal**: An interactive command runner executing commands on the host machine in the workspace with absolute permissions and zero permission prompts, plus quick action buttons (budget status, lead status, task queue, test runner, and git status).
- 💬 **Talk to Agents & Directives**: Send executive commands or directives to the Big Brain CEO (Desk 1), Executive Technical Lead (Desk 2), all desks via broadcast, or any active worker, with live reply logs.
- 📋 **Fleet Radar**: Real-time overview of all desks, active workers, current tasks, and task queue.
- 💣 **Minesweeper Game**: The classic game remains available right on its own tab anytime you want to unwind. Close with **✕** or **Esc** to return straight to mouse-look.
- **Hire workers.** Walk up to an empty desk and press **E** to choose Claude Code, OpenCode, Codex, Grok, Muse, DeepSeek Harness, Pi or Cursor, or press **P** to write a task first. A little worker sits down, a laptop opens, and the agent's live screen appears on it. Choose the agent for each queue task too.
- **Signs over the desks.** Press **L** at any desk, empty or not, to hang a big sign from the ceiling over it: *Operations*, *Code cleanup*, *Frontend*, whatever that desk is for. Type up to 32 characters (or pick one of the ideas), choose one of seven colors and press **Enter**. It hangs over the far edge of the desk, facing the chair, so it reads over the shoulder of whoever sits there; while the desk back to back with it has no sign of its own, it says the same on the back, so you can read it from across the room either way. Everyone on the floor sees it, the hint at the desk names it, and it stays up across restarts. **L** again changes it or takes it down. Each floor has its own.
- **Room to grow.** When a floor needs more desks, the north wall past the gong comes down. Walk up to the yellow **🚧 Room to grow** sign on it and press **E**, then **🔨 Knock through**: the wall goes, and a back office opens behind it with a pair of desks, a rug, a lamp and a window, in a puff of confetti. Knock through once more and it goes back another row, for two more desks (two rows is as far as it goes before the street behind the building). New workers, and the task queue, take its desks once the room's are full, before any bean bag comes out. The sign moves to the back wall, where **E** can also wall the last row back up, once nobody's working there. Each floor is built out on its own, and from outside you see it: the back office sticks out of that storey, on posts down to the lawn.
Expand Down
232 changes: 232 additions & 0 deletions src/client/features/arcade/boss-workstation.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,232 @@
/* Boss Office Executive Workstation styling */
.boss-workstation {
display: flex;
flex-direction: column;
width: 100%;
height: 100%;
background: #090e1a;
color: #f8fafc;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, monospace, sans-serif;
overflow: hidden;
}

.boss-tabs {
display: flex;
align-items: center;
gap: 4px;
padding: 8px 12px;
background: #0f172a;
border-bottom: 2px solid #1e293b;
flex-shrink: 0;
}

.boss-tab {
background: transparent;
border: 1px solid transparent;
color: #94a3b8;
padding: 6px 12px;
border-radius: 6px;
font-size: 13px;
font-weight: 700;
cursor: pointer;
transition: all 0.15s ease;
display: inline-flex;
align-items: center;
gap: 6px;
}

.boss-tab:hover {
background: #1e293b;
color: #f1f5f9;
}

.boss-tab.active {
background: #f59e0b;
color: #000;
border-color: #f59e0b;
}

.boss-tab-content {
flex: 1;
display: flex;
flex-direction: column;
padding: 14px;
overflow-y: auto;
}

/* Host Terminal styling */
.boss-terminal-view {
display: flex;
flex-direction: column;
height: 100%;
gap: 10px;
}

.boss-quick-actions {
display: flex;
gap: 6px;
flex-wrap: wrap;
flex-shrink: 0;
}

.boss-quick-btn {
background: #1e293b;
color: #cbd5e1;
border: 1px solid #334155;
border-radius: 6px;
padding: 4px 10px;
font-size: 11px;
font-weight: 700;
cursor: pointer;
transition: all 0.15s ease;
}

.boss-quick-btn:hover {
background: #334155;
color: #f8fafc;
border-color: #f59e0b;
}

.boss-terminal-log {
flex: 1;
background: #030712;
border: 1px solid #1e293b;
border-radius: 8px;
padding: 12px;
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
font-size: 12px;
line-height: 1.5;
overflow-y: auto;
white-space: pre-wrap;
word-break: break-all;
color: #a5f3fc;
}

.boss-terminal-input-row {
display: flex;
gap: 8px;
align-items: center;
background: #030712;
border: 1px solid #334155;
border-radius: 8px;
padding: 4px 8px;
flex-shrink: 0;
}

.boss-terminal-input-row .prompt-symbol {
color: #f59e0b;
font-weight: 800;
font-family: monospace;
font-size: 14px;
}

.boss-terminal-input-row input {
flex: 1;
background: transparent;
border: none;
color: #f8fafc;
font-family: monospace;
font-size: 13px;
outline: none;
}

.boss-btn {
background: #f59e0b;
color: #000;
border: none;
font-weight: 800;
font-size: 12px;
padding: 6px 14px;
border-radius: 6px;
cursor: pointer;
}

.boss-btn:hover {
background: #d97706;
}

/* Agent Comms styling */
.boss-comms-view {
display: flex;
flex-direction: column;
height: 100%;
gap: 12px;
}

.boss-comms-form {
background: #0f172a;
border: 1px solid #1e293b;
border-radius: 8px;
padding: 12px;
display: flex;
flex-direction: column;
gap: 8px;
}

.boss-comms-form select,
.boss-comms-form textarea {
width: 100%;
background: #030712;
border: 1px solid #334155;
border-radius: 6px;
color: #f8fafc;
padding: 8px 10px;
font-size: 13px;
box-sizing: border-box;
}

.boss-comms-history {
flex: 1;
overflow-y: auto;
display: flex;
flex-direction: column;
gap: 8px;
}

.boss-comms-item {
background: #0b1120;
border-left: 3px solid #f59e0b;
border-radius: 6px;
padding: 10px;
font-size: 13px;
}

.boss-comms-item-header {
display: flex;
justify-content: space-between;
font-size: 11px;
color: #94a3b8;
margin-bottom: 4px;
}

/* Fleet Radar */
.boss-fleet-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
gap: 12px;
}

.boss-worker-card {
background: #0f172a;
border: 1px solid #1e293b;
border-radius: 8px;
padding: 12px;
}

.boss-worker-card-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 6px;
}

.boss-status-pill {
font-size: 10px;
font-weight: 700;
padding: 2px 6px;
border-radius: 4px;
text-transform: uppercase;
}

.boss-status-idle { background: rgba(56, 189, 248, 0.15); color: #38bdf8; }
.boss-status-busy { background: rgba(245, 158, 11, 0.15); color: #f59e0b; }
Loading