agent-office-studio 0.0.0-stage → 0.3.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 +75 -0
- package/LICENSE +21 -0
- package/README.md +85 -2
- package/bin/agentoffice.js +98 -0
- package/dist/apple-touch-icon.png +0 -0
- package/dist/assets/_commonjsHelpers-CqkleIqs.js +1 -0
- package/dist/assets/addon-fit-BwprjgOP.js +1 -0
- package/dist/assets/index-D5IzEWKU.css +32 -0
- package/dist/assets/index-DgXF8Kqx.js +4457 -0
- package/dist/assets/inter-cyrillic-ext-wght-normal-B2xhLi22.woff2 +0 -0
- package/dist/assets/inter-cyrillic-wght-normal-CMZtQduZ.woff2 +0 -0
- package/dist/assets/inter-greek-ext-wght-normal-CGAr0uHJ.woff2 +0 -0
- package/dist/assets/inter-greek-wght-normal-CaVNZxsx.woff2 +0 -0
- package/dist/assets/inter-latin-ext-wght-normal-CFHvXkgd.woff2 +0 -0
- package/dist/assets/inter-latin-wght-normal-C2S99t-D.woff2 +0 -0
- package/dist/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- package/dist/assets/jetbrains-mono-cyrillic-400-normal-BEIGL1Tu.woff2 +0 -0
- package/dist/assets/jetbrains-mono-cyrillic-400-normal-CIEtRijs.woff +0 -0
- package/dist/assets/jetbrains-mono-greek-400-normal-C190GLew.woff2 +0 -0
- package/dist/assets/jetbrains-mono-greek-400-normal-CNojz0t3.woff +0 -0
- package/dist/assets/jetbrains-mono-latin-400-normal-B11XCQ5g.woff +0 -0
- package/dist/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
- package/dist/assets/jetbrains-mono-latin-ext-400-normal-Bc8Ftmh3.woff2 +0 -0
- package/dist/assets/jetbrains-mono-latin-ext-400-normal-DHMOLxAi.woff +0 -0
- package/dist/assets/jetbrains-mono-vietnamese-400-normal-BeU3T8wf.woff +0 -0
- package/dist/assets/xterm-C7kOH91j.js +9 -0
- package/dist/icon-192.png +0 -0
- package/dist/icon-512.png +0 -0
- package/dist/icon.svg +9 -0
- package/dist/index.html +245 -0
- package/dist/manifest.webmanifest +16 -0
- package/dist/sw.js +39 -0
- package/docs/README.md +27 -0
- package/docs/claude-access.md +31 -0
- package/docs/configuration.md +54 -0
- package/docs/development.md +76 -0
- package/docs/getting-started.md +57 -0
- package/docs/guides/troubleshooting.md +110 -0
- package/docs/guides/updating.md +36 -0
- package/docs/guides/working-with-the-team.md +56 -0
- package/docs/guides/your-first-job.md +65 -0
- package/docs/how-it-works.md +80 -0
- package/docs/images/office.jpg +0 -0
- package/docs/jobs.md +54 -0
- package/docs/leaderboard.md +67 -0
- package/docs/linked-offices.md +81 -0
- package/docs/packaging.md +49 -0
- package/docs/phone.md +32 -0
- package/docs/security.md +80 -0
- package/docs/terminal.md +46 -0
- package/docs/using-the-office.md +109 -0
- package/docs/voice.md +44 -0
- package/package.json +65 -4
- package/server/auth.js +89 -0
- package/server/banter.js +53 -0
- package/server/changes.js +74 -0
- package/server/chief.js +146 -0
- package/server/guests.js +391 -0
- package/server/index.js +2219 -0
- package/server/leaderboard.js +239 -0
- package/server/links.js +350 -0
- package/server/office-mcp.js +101 -0
- package/server/procstat.js +85 -0
- package/server/standup.js +78 -0
- package/server/supervise.js +53 -0
- package/server/terminal.js +255 -0
- package/server/tools.js +52 -0
- package/server/usage.js +40 -0
- package/server/voice.js +174 -0
- package/shared/speakable.js +50 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
Notable changes to Agent Office. The format follows
|
|
4
|
+
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and versions follow
|
|
5
|
+
[Semantic Versioning](https://semver.org/).
|
|
6
|
+
|
|
7
|
+
## 0.3.0 — 2026-10-12
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
- Linked offices. Link two offices with a one-time code, and each sees the other's agents walk into its 3D office as visitors, showing their name, role and what they're doing. Job titles stay home unless `OFFICE_SHARE_JOB_TITLES=1`. You can also invite a guest to start jobs with your agents, limited to the projects, clearance and daily tokens you choose. See [Linked offices](docs/linked-offices.md).
|
|
11
|
+
- A handle without the leaderboard. Linking needs a handle, and sharing counters on the board is now a separate tickbox.
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
- The leaderboard works out of the box: the office points at the hosted board by default. `OFFICE_LEADERBOARD_URL` still overrides it. Nothing is shared until you join.
|
|
15
|
+
- **The office has a key.** Other accounts on the same machine (or the tailnet) could reach the office's API and start jobs as you. The page, API and socket now need a key from `data/office-key` (mode `0600`). Open the office once with the link it prints at startup; `agentoffice --link` prints it again. After upgrading, open that link once.
|
|
16
|
+
- `agentoffice`/`agentstudio` now pick a free port (4317 if open, else any free one). `--port <n>` or `PORT` chooses one; a taken port you asked for stops with a clear message instead of restarting in a loop.
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
- "I couldn't route that one: The chief could not decide" now says why: the error `claude` reported (signed out, out of credit, a model the plan can't use), a timeout, or `claude` exiting without answering. [Troubleshooting](docs/guides/troubleshooting.md#jobs-dont-run) has the one-line check.
|
|
20
|
+
|
|
21
|
+
### Security
|
|
22
|
+
- Only the office's own page can call it: a page on another localhost port (a project's dev server, say) is refused like any other website.
|
|
23
|
+
- A malformed address (`/%E0`) no longer crashes the office.
|
|
24
|
+
- A guest's jobs don't get the host's MCP servers and claude.ai connectors, user-level Claude Code settings and hooks, or Claude Code memory.
|
|
25
|
+
- Git runs with `core.fsmonitor` off and no external diff or textconv drivers when the office records what a job changed.
|
|
26
|
+
|
|
27
|
+
## 0.2.0 — 2026-10-12
|
|
28
|
+
|
|
29
|
+
### Install
|
|
30
|
+
- Published as `agent-office-studio`. `npm install -g agent-office-studio`, then
|
|
31
|
+
run `agentoffice` (or `agentstudio`) in the folder that holds your projects.
|
|
32
|
+
State lives in `~/.agent-office`; `OFFICE_DATA` and `OFFICE_ROOT` override.
|
|
33
|
+
|
|
34
|
+
### Fixed
|
|
35
|
+
- A job whose agent flagged a question, decision or blocker is no longer
|
|
36
|
+
reported as done when their turn ends. The chief posts "Waiting on you"
|
|
37
|
+
instead, and no shipped count, XP or celebration is given until it resumes.
|
|
38
|
+
|
|
39
|
+
### Leaderboard
|
|
40
|
+
- An optional leaderboard: join under a claimed handle and compare jobs
|
|
41
|
+
finished, tokens used and agent time, weekly and all time. Off until you
|
|
42
|
+
join; only per-day counters are shared. The service is a Cloudflare Worker in
|
|
43
|
+
`leaderboard/`. A local ledger (`data/activity.json`) now keeps those counters.
|
|
44
|
+
|
|
45
|
+
## 0.1.0 — 2026-10-11
|
|
46
|
+
|
|
47
|
+
The first public release.
|
|
48
|
+
|
|
49
|
+
### The office
|
|
50
|
+
- A 3D office where each agent is a Claude Code session. Agents walk to the
|
|
51
|
+
library to read, the server room to run commands and their desk to write.
|
|
52
|
+
- Chat with `@agent` and `#project` tags; a chief of staff routes everything
|
|
53
|
+
else, hands follow-ups to whoever is on the job, and asks when unsure.
|
|
54
|
+
- Slack-style channels and threads; attachments, including screenshots the
|
|
55
|
+
chief can read.
|
|
56
|
+
- A daily standup at the whiteboard, and a break room where idle agents talk
|
|
57
|
+
(in #chill-room) and play eight-ball.
|
|
58
|
+
- Levels: shipped jobs earn XP, and each level hires another agent.
|
|
59
|
+
- Themes, light and dark mode, and an installable app for desktop and phone.
|
|
60
|
+
|
|
61
|
+
### Jobs
|
|
62
|
+
- Clearance per job: plan only, edit files, or full autonomy, with the option
|
|
63
|
+
to grant more mid-job.
|
|
64
|
+
- The chief picks Haiku, Sonnet or Opus to fit the work and steps up a rung
|
|
65
|
+
when a job fails.
|
|
66
|
+
- Agents message each other and hand work to free colleagues.
|
|
67
|
+
- "What changed": each job's diff, from working-tree snapshots that never
|
|
68
|
+
touch the repo's own index or history.
|
|
69
|
+
- Jobs resume after a server restart.
|
|
70
|
+
|
|
71
|
+
### Setup
|
|
72
|
+
- Claude access: the Claude Code login on the machine, or an Anthropic API key.
|
|
73
|
+
- Plan usage meters for the Claude Code login.
|
|
74
|
+
- Voice: dictation with whisper.cpp and a Piper voice per agent, all local.
|
|
75
|
+
- An opt-in terminal in a drawer under the office.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Onuoha Obinna
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,86 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Agent Office
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://github.com/onuohasilver/agent-office/actions/workflows/ci.yml)
|
|
4
|
+
[](LICENSE)
|
|
5
|
+
|
|
6
|
+
A 3D office where the staff are Claude Code agents. Hand someone a job and they
|
|
7
|
+
walk to a desk and do it for real, in that project folder, with `claude -p`.
|
|
8
|
+
|
|
9
|
+

|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install -g agent-office-studio
|
|
13
|
+
cd ~/projects # the folder whose subfolders are your projects
|
|
14
|
+
agentoffice # or: agentstudio. Serves on http://localhost:4317, or any free port (`--port <n>` to choose; the URL is printed)
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Or from source:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
git clone https://github.com/onuohasilver/agent-office.git
|
|
21
|
+
cd agent-office
|
|
22
|
+
npm install
|
|
23
|
+
npm start # builds, then serves on http://localhost:4317
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
You need Node.js 20+, git, and [Claude Code](https://docs.anthropic.com/en/docs/claude-code)
|
|
27
|
+
signed in on this machine (or an Anthropic API key). Your projects are the
|
|
28
|
+
folders next to this one (or, with `agentoffice`, in the folder you run it from) — see [Getting started](docs/getting-started.md).
|
|
29
|
+
|
|
30
|
+
## What it does
|
|
31
|
+
|
|
32
|
+
- **You chat; the office does the rest.** `@Ada #storefront fix the checkout
|
|
33
|
+
bar` goes straight to Ada. Anything untagged goes to the chief of staff,
|
|
34
|
+
who works out which project and who's free, hands follow-ups to whoever is
|
|
35
|
+
already on it, and asks when it can't tell.
|
|
36
|
+
- **Real work, visibly.** Every job is a `claude` process in that project.
|
|
37
|
+
Agents walk to the library to read, the server room to run commands and
|
|
38
|
+
their desk to write, and each job's drawer shows its log, the model it ran
|
|
39
|
+
on and exactly which files it changed.
|
|
40
|
+
- **You stay in charge.** Pick the clearance for each job — plan only, edit
|
|
41
|
+
files, or full autonomy — and grant more mid-job when it's blocked. The
|
|
42
|
+
chief picks Haiku, Sonnet or Opus to fit the work and steps up a rung when
|
|
43
|
+
a job fails.
|
|
44
|
+
- **A team, not a queue.** Agents message each other mid-task and hand work
|
|
45
|
+
to free colleagues. There's a standup at 9:30, Slack-style channels, and a
|
|
46
|
+
break room where they talk and play pool when nothing's on.
|
|
47
|
+
- **Talk to it.** Dictate with whisper.cpp and hear replies in a different
|
|
48
|
+
voice per agent — all on this machine.
|
|
49
|
+
- **Yours, on your machine.** It listens on localhost only. Use it on your
|
|
50
|
+
Claude plan or with an API key.
|
|
51
|
+
|
|
52
|
+
## Guides
|
|
53
|
+
|
|
54
|
+
- [Your first job](docs/guides/your-first-job.md) — from a fresh install to a change you've reviewed
|
|
55
|
+
- [Working with the team](docs/guides/working-with-the-team.md) — briefs that work, clearance, channels, cost
|
|
56
|
+
- [Troubleshooting](docs/guides/troubleshooting.md) — common problems and their fixes
|
|
57
|
+
- [Updating](docs/guides/updating.md) — getting new versions without losing your office
|
|
58
|
+
|
|
59
|
+
## Documentation
|
|
60
|
+
|
|
61
|
+
| | |
|
|
62
|
+
|---|---|
|
|
63
|
+
| [Getting started](docs/getting-started.md) | install, run, point it at your projects |
|
|
64
|
+
| [Using the office](docs/using-the-office.md) | the chat, channels, threads, standup, the break room |
|
|
65
|
+
| [Jobs](docs/jobs.md) | clearance, which model, what changed |
|
|
66
|
+
| [The leaderboard](docs/leaderboard.md) | an optional board of jobs, tokens and agent time |
|
|
67
|
+
| [Claude access](docs/claude-access.md) | Claude Code login or API key, and the plan meters |
|
|
68
|
+
| [Configuration](docs/configuration.md) | every setting |
|
|
69
|
+
| [Talking out loud](docs/voice.md) | speech in and voices out |
|
|
70
|
+
| [The terminal](docs/terminal.md) | a real shell under the office |
|
|
71
|
+
| [On your phone](docs/phone.md) | install it like an app |
|
|
72
|
+
| [How the office works](docs/how-it-works.md) | jobs, office tools, where things are kept |
|
|
73
|
+
| [Security](docs/security.md) | who can reach it and what jobs may do |
|
|
74
|
+
| [Development](docs/development.md) | dev server, shipping, testing safely |
|
|
75
|
+
| [Packaging roadmap](docs/packaging.md) | from a clone to an install |
|
|
76
|
+
|
|
77
|
+
## Contributing
|
|
78
|
+
|
|
79
|
+
Bug reports, ideas and pull requests are welcome — see
|
|
80
|
+
[CONTRIBUTING.md](CONTRIBUTING.md). Report security problems privately, as
|
|
81
|
+
described in [SECURITY.md](SECURITY.md). What's changed between versions is in
|
|
82
|
+
[CHANGELOG.md](CHANGELOG.md).
|
|
83
|
+
|
|
84
|
+
## Licence
|
|
85
|
+
|
|
86
|
+
[MIT](LICENSE).
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// `agentoffice` starts the office. Projects are the folders next to where you
|
|
3
|
+
// run it; the office's own state lives in ~/.agent-office, so upgrading the
|
|
4
|
+
// package never touches it. OFFICE_ROOT and OFFICE_DATA override both.
|
|
5
|
+
|
|
6
|
+
import os from 'node:os';
|
|
7
|
+
import path from 'node:path';
|
|
8
|
+
import fs from 'node:fs';
|
|
9
|
+
import net from 'node:net';
|
|
10
|
+
import { fileURLToPath } from 'node:url';
|
|
11
|
+
|
|
12
|
+
const HERE = path.dirname(fileURLToPath(import.meta.url));
|
|
13
|
+
const pkg = JSON.parse(fs.readFileSync(path.join(HERE, '..', 'package.json'), 'utf8'));
|
|
14
|
+
const args = process.argv.slice(2);
|
|
15
|
+
const arg = args[0];
|
|
16
|
+
const DEFAULT_PORT = 4317;
|
|
17
|
+
|
|
18
|
+
// --port 4400, --port=4400 or -p 4400; the PORT variable works too.
|
|
19
|
+
function portFlag() {
|
|
20
|
+
for (let i = 0; i < args.length; i++) {
|
|
21
|
+
const m = /^(?:--port|-p)(?:=(.*))?$/.exec(args[i]);
|
|
22
|
+
if (m) return m[1] ?? args[i + 1] ?? '';
|
|
23
|
+
}
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Can we listen on this port (0 asks the system for any free one)? Returns the
|
|
28
|
+
// port we got, or null when it is taken.
|
|
29
|
+
const tryPort = (port) => new Promise((resolve) => {
|
|
30
|
+
const probe = net.createServer();
|
|
31
|
+
probe.once('error', () => resolve(null));
|
|
32
|
+
probe.listen(port, '127.0.0.1', () => {
|
|
33
|
+
const got = probe.address().port;
|
|
34
|
+
probe.close(() => resolve(got));
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
if (arg === '--version' || arg === '-v') {
|
|
39
|
+
console.log(pkg.version);
|
|
40
|
+
process.exit(0);
|
|
41
|
+
}
|
|
42
|
+
// The running office's link, key included, for a browser that lost it.
|
|
43
|
+
// `npm start` from a checkout keeps its state in the checkout's data folder
|
|
44
|
+
// instead, so look there when the usual place has no key.
|
|
45
|
+
if (arg === '--link') {
|
|
46
|
+
const homeData = process.env.OFFICE_DATA || path.join(os.homedir(), '.agent-office');
|
|
47
|
+
const repoData = path.join(HERE, '..', 'data');
|
|
48
|
+
const hasKey = (dir) => fs.existsSync(path.join(dir, 'office-key'));
|
|
49
|
+
const data = !process.env.OFFICE_DATA && !hasKey(homeData) && hasKey(repoData) ? repoData : homeData;
|
|
50
|
+
try {
|
|
51
|
+
const key = fs.readFileSync(path.join(data, 'office-key'), 'utf8').trim();
|
|
52
|
+
let port = DEFAULT_PORT;
|
|
53
|
+
try { port = Number(fs.readFileSync(path.join(data, 'office-port'), 'utf8')) || DEFAULT_PORT; } catch {}
|
|
54
|
+
console.log(`http://localhost:${port}/?key=${key}`);
|
|
55
|
+
process.exit(0);
|
|
56
|
+
} catch {
|
|
57
|
+
console.error(`No office key in ${data}. Start the office once, and it prints its link.`);
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (arg === '--help' || arg === '-h') {
|
|
62
|
+
console.log(`agentoffice ${pkg.version}
|
|
63
|
+
|
|
64
|
+
Usage: agentoffice [--port <n>] (or agentstudio)
|
|
65
|
+
agentoffice --link print the running office's link, with its key
|
|
66
|
+
|
|
67
|
+
Starts the office on a free port: ${DEFAULT_PORT} if it is open, otherwise any
|
|
68
|
+
free one. Choose your own with --port or PORT; that one is used as given.
|
|
69
|
+
Needs Claude Code (\`claude\`) installed and signed in.
|
|
70
|
+
|
|
71
|
+
OFFICE_ROOT folder whose subfolders are your projects (default: this folder)
|
|
72
|
+
OFFICE_DATA where the office keeps its state (default: ~/.agent-office)
|
|
73
|
+
PORT port to listen on (default: ${DEFAULT_PORT}, or any free port)
|
|
74
|
+
|
|
75
|
+
Docs: ${pkg.homepage}`);
|
|
76
|
+
process.exit(0);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const chosen = portFlag() ?? process.env.PORT;
|
|
80
|
+
if (chosen !== undefined && chosen !== '') {
|
|
81
|
+
const n = Number(chosen);
|
|
82
|
+
if (!Number.isInteger(n) || n < 1 || n > 65535) {
|
|
83
|
+
console.error(`"${chosen}" is not a valid port (1-65535).`);
|
|
84
|
+
process.exit(2);
|
|
85
|
+
}
|
|
86
|
+
if (await tryPort(n) === null) {
|
|
87
|
+
console.error(`Port ${n} is already in use. Pick another with --port, or leave it out and one is chosen for you.`);
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
process.env.PORT = String(n);
|
|
91
|
+
} else {
|
|
92
|
+
process.env.PORT = String(await tryPort(DEFAULT_PORT) ?? await tryPort(0));
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
process.env.OFFICE_ROOT ||= process.cwd();
|
|
96
|
+
process.env.OFFICE_DATA ||= path.join(os.homedir(), '.agent-office');
|
|
97
|
+
|
|
98
|
+
await import('../server/supervise.js');
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function e(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}export{e as g};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{g as f}from"./_commonjsHelpers-CqkleIqs.js";function g(i,n){for(var o=0;o<n.length;o++){const t=n[o];if(typeof t!="string"&&!Array.isArray(t)){for(const e in t)if(e!=="default"&&!(e in i)){const r=Object.getOwnPropertyDescriptor(t,e);r&&Object.defineProperty(i,e,r.get?r:{enumerable:!0,get:()=>t[e]})}}}return Object.freeze(Object.defineProperty(i,Symbol.toStringTag,{value:"Module"}))}var l={exports:{}};(function(i,n){(function(o,t){i.exports=t()})(self,()=>(()=>{var o={};return(()=>{var t=o;Object.defineProperty(t,"__esModule",{value:!0}),t.FitAddon=void 0,t.FitAddon=class{activate(e){this._terminal=e}dispose(){}fit(){const e=this.proposeDimensions();if(!e||!this._terminal||isNaN(e.cols)||isNaN(e.rows))return;const r=this._terminal._core;this._terminal.rows===e.rows&&this._terminal.cols===e.cols||(r._renderService.clear(),this._terminal.resize(e.cols,e.rows))}proposeDimensions(){if(!this._terminal||!this._terminal.element||!this._terminal.element.parentElement)return;const e=this._terminal._core,r=e._renderService.dimensions;if(r.css.cell.width===0||r.css.cell.height===0)return;const c=this._terminal.options.scrollback===0?0:e.viewport.scrollBarWidth,a=window.getComputedStyle(this._terminal.element.parentElement),d=parseInt(a.getPropertyValue("height")),m=Math.max(0,parseInt(a.getPropertyValue("width"))),s=window.getComputedStyle(this._terminal.element),h=d-(parseInt(s.getPropertyValue("padding-top"))+parseInt(s.getPropertyValue("padding-bottom"))),u=m-(parseInt(s.getPropertyValue("padding-right"))+parseInt(s.getPropertyValue("padding-left")))-c;return{cols:Math.max(2,Math.floor(u/r.css.cell.width)),rows:Math.max(1,Math.floor(h/r.css.cell.height))}}}})(),o})())})(l);var p=l.exports;const _=f(p),w=g({__proto__:null,default:_},[p]);export{w as a};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-cyrillic-ext-wght-normal-B2xhLi22.woff2) format("woff2-variations");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-cyrillic-wght-normal-CMZtQduZ.woff2) format("woff2-variations");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-greek-ext-wght-normal-CGAr0uHJ.woff2) format("woff2-variations");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-greek-wght-normal-CaVNZxsx.woff2) format("woff2-variations");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-latin-ext-wght-normal-CFHvXkgd.woff2) format("woff2-variations");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-latin-wght-normal-C2S99t-D.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(data:font/woff2;base64,d09GMgABAAAAAASIABAAAAAACQQAAAQuAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhwbHhwoBmA/U1RBVF4AdBEICoRkhAALIAABNgIkAzoEIAWFAAeBFAwHG2oHKJ6DceNW4lJEFHn9tEOE37LNsvkjHr7f739rn3u+OSrSxLQytE91Dw2PYtNVq3Qaw/vJ7fUBMdOj/u2ImB98cT5WUx9F13ZKt06mU7tG1sAYcM26yCRX4f/0904bmwq8hwkUUMTRX61pa9C3xlpAGYw1vOu8C2SBZZFlld7DAW82RJWmwYMI1AJCKBNCIASqdZGFmtPSNQRhMpR0EKjWTwm6z6sJ+4jqhxjovTinVdRpZaQjaQzAYjI8NgAKDJCokgunCn9oUQE8VZd/F//+v6P4F1U9gLr58yNI/dJX9BAshEoJbTDogz7ocKoUsPvES8UK/aQIUQgpGgECBVLkOEV6iASTYgNAPKdNXayhDPL7IJuAZnEYSZ0eOLc9i5Rv5/+lEi3sW/kfnCf/+fTe0sxS7CKLx5erRJkKOixEqQaoqrvx5HN4iz4VhX0gS6DjFIWUzn/fIXJRVFY1NFRVNVeFt+SYmrK6vCU6eJsnKnJj5HTESMTQZOTI3Y/tzr3rUcOsiRy/ciP50s3Mycgxmhz9GMXhjzVH30ut796NHP0UUa31/Zoa6vCH6iPvdIM0IRANaT60FablmZlZd+UKNFy9NrvnFGxb5NC2CRxR0/rIyF/WNn+35sv9r+tHVhkseuWGKkCPPh96+GXt8Lc/Sh24ujfjf+tNw1lZWreiPuHb/PSpyjdv2rf/++ZE5TSKjFdZxYsBvr1sEHl5STuHZqYR7jGYGvGBBdjcaB5bODY1GAxMjsd0wDMIzXAXODRd74DxNMtO4YuYHclgLQRzp9KlUmxptCwv9bYgvWGD2xBW7r9413fdJu+mxzvzAUYeeONQvZP4kgfqZle4jhH/MWh+UbxgtJdrLdXLymNL53PRU0D3Q6FcXTfGqGcul6vrqhgLGAVSv+IVIfZOHpu+mlLqSlnj903j8mazXDsba/wbxhS/4Oubh1c5/uXDgt4j5KtnGEy5BIJHo0ur+jD+r2qCkuP1aRVM8EpUoRYSJyqNRA38uwDvHBNo0AejO2Z+ZYLLal1QiFyFh1EDQOgSCSCpjwwKU8yDbIjroEwne0G5Qca49cYp4AlqtQNZfWTQoFb1tRpFYAmRD+HXTkV4uQhG2bg4OKmyoypAsUGtWgQXyFxYrkpODeUxvGqIZA61erXo0sFG1UBGuPgpuon8RNUG2DhovAjZCBuZwtXrU3mQGki9+pm0eVZAXoWxLWTQoYHBPrJR4WunNxIFbCHfkTyPK+sqxjxDmGArZvf79JGJ3GwEqjwc7a7NIrl/7bJ7Nzu4+n1Ow6shEPnUrtVo7cnd5Wi5qCUbBIQbNKCP95FMCSZylEV5VCiiMqqiOmrKZ/I/C0gI1fyuulVcM2E1r4MhtcV/fbCD+HwEvVzH1dGNAzFE0FTbKzyQz3gootrNbN2a4PuG0j0JOgE=) format("woff2"),url(data:font/woff;base64,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) format("woff");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/jetbrains-mono-cyrillic-400-normal-BEIGL1Tu.woff2) format("woff2"),url(/assets/jetbrains-mono-cyrillic-400-normal-CIEtRijs.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/jetbrains-mono-greek-400-normal-C190GLew.woff2) format("woff2"),url(/assets/jetbrains-mono-greek-400-normal-CNojz0t3.woff) format("woff");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(data:font/woff2;base64,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) format("woff2"),url(/assets/jetbrains-mono-vietnamese-400-normal-BeU3T8wf.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/jetbrains-mono-latin-ext-400-normal-Bc8Ftmh3.woff2) format("woff2"),url(/assets/jetbrains-mono-latin-ext-400-normal-DHMOLxAi.woff) format("woff");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2) format("woff2"),url(/assets/jetbrains-mono-latin-400-normal-B11XCQ5g.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--ink: #1d1b18;--ink-2: #5d574e;--ink-3: #958d81;--paper: #fbf9f5;--paper-2: #f4f0e9;--line: rgba(29, 27, 24, .09);--good: #2f7d4f;--bad: #b4412f;--work: #2f6fae;--wait: #b9861f;--accent: var(--work);--surface: #fff;--glass: color-mix(in srgb, var(--paper) 88%, transparent);--pane: color-mix(in srgb, var(--paper) 58%, transparent);--pane-edge: color-mix(in srgb, #fff 55%, var(--line));--t1: rgba(29, 27, 24, .05);--t2: var(--t2);--t3: rgba(29, 27, 24, .1);--good-bg: #dcefe2;--good-fg: #25653f;--bad-bg: #f7e0db;--bad-fg: #9a3424;--work-bg: #dde9f6;--work-fg: #24598f;--wait-bg: #fbf0d4;--wait-fg: #8a6312;--view-1: #f6f2ea;--view-2: #ece5da;--view-3: #ddd4c6;--sans: "Inter Variable", Inter, system-ui, sans-serif;--mono: "JetBrains Mono", ui-monospace, monospace;--ease: cubic-bezier(.2, .8, .2, 1);color-scheme:light}html{--h: 80}html[data-theme=ocean]{--h: 235}html[data-theme=forest]{--h: 150}html[data-theme=sunset]{--h: 35}html[data-theme=lavender]{--h: 300}html:is([data-theme=ocean],[data-theme=forest],[data-theme=sunset],[data-theme=lavender]){--ink: oklch(23% .03 var(--h));--ink-2: oklch(44% .03 var(--h));--ink-3: oklch(62% .025 var(--h));--paper: oklch(98.4% .008 var(--h));--paper-2: oklch(95.6% .016 var(--h));--accent: oklch(52% .16 var(--h));--line: color-mix(in srgb, var(--ink) 10%, transparent);--t1: color-mix(in srgb, var(--ink) 5%, transparent);--t2: color-mix(in srgb, var(--ink) 7%, transparent);--t3: color-mix(in srgb, var(--ink) 10%, transparent);--view-1: oklch(96.5% .015 var(--h));--view-2: oklch(92% .02 var(--h));--view-3: oklch(86% .025 var(--h))}html[data-mode=dark]{--ink: oklch(94% .012 var(--h));--ink-2: oklch(78% .016 var(--h));--ink-3: oklch(62% .016 var(--h));--paper: oklch(20% .012 var(--h));--paper-2: oklch(25% .014 var(--h));--surface: oklch(24% .014 var(--h));--pane: color-mix(in srgb, var(--paper) 52%, transparent);--pane-edge: color-mix(in srgb, #fff 14%, transparent);--line: color-mix(in srgb, var(--ink) 12%, transparent);--t1: color-mix(in srgb, var(--ink) 6%, transparent);--t2: color-mix(in srgb, var(--ink) 9%, transparent);--t3: color-mix(in srgb, var(--ink) 13%, transparent);--good: #5fbf85;--bad: #e8806c;--work: #5b9ad8;--wait: #d9a43f;--good-bg: color-mix(in srgb, var(--good) 18%, var(--paper));--good-fg: var(--good);--bad-bg: color-mix(in srgb, var(--bad) 18%, var(--paper));--bad-fg: var(--bad);--work-bg: color-mix(in srgb, var(--work) 18%, var(--paper));--work-fg: #8dbbea;--wait-bg: color-mix(in srgb, var(--wait) 18%, var(--paper));--wait-fg: var(--wait);--view-1: oklch(27% .014 var(--h));--view-2: oklch(22% .013 var(--h));--view-3: oklch(17% .012 var(--h));color-scheme:dark}html[data-mode=dark]:is([data-theme=ocean],[data-theme=forest],[data-theme=sunset],[data-theme=lavender]){--accent: oklch(74% .13 var(--h))}*{box-sizing:border-box}[hidden]{display:none!important}html,body{margin:0;height:100%;overflow:hidden;background:var(--paper)}body{font-family:var(--sans);color:var(--ink);font-size:14px;line-height:1.45;-webkit-font-smoothing:antialiased;font-feature-settings:"cv11","ss01"}button,input,textarea,select{font:inherit;color:inherit}.app{display:grid;grid-template-columns:var(--side-w, 480px) minmax(0,1fr) auto;height:100vh;height:100dvh;background:radial-gradient(40% 36% at 8% 14%,color-mix(in srgb,var(--accent) 22%,transparent) 0%,transparent 100%),radial-gradient(38% 34% at 94% 86%,color-mix(in srgb,var(--accent) 16%,transparent) 0%,transparent 100%),radial-gradient(120% 90% at 50% 38%,var(--view-1) 0%,var(--view-2) 58%,var(--view-3) 100%)}.view{position:relative;overflow:hidden;min-width:0;container-type:inline-size}#stage{position:absolute;top:0;right:0;bottom:0;left:0}#stage canvas{display:block;width:100%;height:100%;touch-action:none}#labels{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;overflow:hidden}.side-grip{position:absolute;z-index:30;top:0;bottom:0;right:-4px;width:9px;cursor:col-resize;touch-action:none}.side-grip:after{content:"";position:absolute;top:0;bottom:0;left:4px;width:2px;background:var(--accent);opacity:0;transition:opacity .15s}.side-grip:hover:after,.side-grip:focus-visible:after,.app.resizing .side-grip:after{opacity:.6}.side-grip:focus-visible{outline:none}.app.resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}.app.resizing #stage{pointer-events:none}.side{position:relative;zoom:var(--side-zoom, 1);display:flex;flex-direction:column;min-height:0;background:var(--pane);border-right:1px solid var(--pane-edge);-webkit-backdrop-filter:blur(24px) saturate(1.5);backdrop-filter:blur(24px) saturate(1.5)}.brand{padding:20px 20px 14px;position:relative}.title-end{display:flex;align-items:center;gap:6px}.theme-btn{all:unset;cursor:pointer;width:26px;height:26px;display:grid;place-items:center;border-radius:8px;color:var(--ink-3);transition:background .15s,color .15s}.theme-btn:hover,.theme-btn[aria-expanded=true]{background:var(--t2);color:var(--ink)}.theme-btn:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.theme-btn svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}.theme-pop{position:absolute;z-index:40;top:52px;right:14px;width:252px;padding:10px 12px 12px;background:var(--paper);border:1px solid var(--line);border-radius:14px;box-shadow:0 10px 30px #00000029}.theme-pop[hidden]{display:none}.theme-k{margin:4px 2px 6px;font-size:11px;font-weight:620;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-3)}.theme-k:not(:first-child){margin-top:12px}.theme-swatches{display:grid;grid-template-columns:repeat(5,1fr);gap:4px}.theme-swatches button{all:unset;cursor:pointer;display:flex;flex-direction:column;align-items:center;gap:4px;padding:6px 0 5px;border-radius:10px;font-size:10.5px;font-weight:580;color:var(--ink-2)}.theme-swatches button:hover{background:var(--t1)}.theme-swatches button:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.theme-swatches button[aria-checked=true]{background:var(--t2);color:var(--ink)}.theme-swatches i{width:24px;height:24px;border-radius:50%;box-shadow:inset 0 0 0 1px #0000001f;background:linear-gradient(135deg,oklch(94% .03 var(--sh)) 50%,oklch(55% .15 var(--sh)) 50%)}.theme-swatches [data-t=paper]{--sh: 80}.theme-swatches [data-t=ocean]{--sh: 235}.theme-swatches [data-t=forest]{--sh: 150}.theme-swatches [data-t=sunset]{--sh: 35}.theme-swatches [data-t=lavender]{--sh: 300}.theme-modes{display:grid;grid-template-columns:repeat(3,1fr);gap:2px;padding:2px;border-radius:10px;background:var(--t1)}.theme-modes button{all:unset;cursor:pointer;text-align:center;padding:5px 0;border-radius:8px;font-size:12.5px;font-weight:580;color:var(--ink-2)}.theme-modes button:hover{color:var(--ink)}.theme-modes button:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.theme-modes button[aria-checked=true]{background:var(--paper);color:var(--ink);box-shadow:0 1px 2px #0000001f}.acct-pop{width:280px}.acct-modes{grid-template-columns:1fr 1fr}.acct-note{margin:10px 2px 0;font-size:12px;line-height:1.45;color:var(--ink-2)}.acct-err{color:var(--bad)}.acct-fine{font-size:11px;color:var(--ink-3)}.acct-form{display:flex;gap:6px;margin-top:10px}.acct-form input{flex:1;min-width:0;padding:6px 9px;border-radius:8px;border:1px solid var(--line);background:var(--paper-2);color:var(--ink);font:inherit;font-size:12.5px}.acct-form input:focus-visible{outline:2px solid var(--accent);outline-offset:-1px}.acct-forget{all:unset;cursor:pointer;margin:8px 2px 0;font-size:12px;color:var(--ink-3);text-decoration:underline}.acct-forget:hover{color:var(--ink)}.lb-pop{width:300px}.lb-me{margin:6px 2px 0;font-size:12.5px;line-height:1.4;color:var(--ink-2)}.lb-me strong{color:var(--ink);font-weight:650}.lb-tabs{margin-top:10px}.lb-period{grid-template-columns:1fr 1fr}.lb-metric{margin-top:6px}.lb-board{margin-top:8px}.lb-list{list-style:none;margin:0;padding:0;max-height:232px;overflow-y:auto}.lb-row{display:grid;grid-template-columns:24px 1fr auto;gap:6px;align-items:baseline;padding:5px 6px;border-radius:8px;font-size:12.5px;color:var(--ink-2)}.lb-row:nth-child(-n+3) .lb-rank{color:var(--accent);font-weight:700}.lb-rank{color:var(--ink-3);font-variant-numeric:tabular-nums}.lb-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ink)}.lb-val{font-variant-numeric:tabular-nums;font-weight:600;color:var(--ink)}.lb-you{background:var(--t2)}.lb-share{display:flex;align-items:center;gap:8px;margin:10px 2px 0;font-size:12.5px;color:var(--ink);cursor:pointer}.lb-share input,.link-repos input,.link-warn input{accent-color:var(--accent);margin:0}.link-pop{width:320px;max-height:calc(100dvh - 80px);overflow-y:auto;overscroll-behavior:contain}.link-actions{display:grid;gap:8px;margin-top:10px}.link-row{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.link-actions .link-row .ghost{flex:1;background:var(--t1)}.link-actions .link-row .ghost:hover{background:var(--t2)}.link-redeem{margin-top:0}.link-redeem input{font-family:var(--mono);letter-spacing:.04em}.link-redeem input::placeholder{font-family:inherit;letter-spacing:0}.link-code,.link-guest{margin-top:12px;padding:8px 10px 10px;border-radius:12px;background:var(--t1)}.link-code .theme-k,.link-guest .theme-k{margin-top:2px}.link-code-row{display:flex;align-items:center;gap:8px}.link-code-v{flex:1;font-family:var(--mono);font-size:22px;font-weight:600;letter-spacing:.08em;color:var(--ink);font-variant-numeric:tabular-nums;-webkit-user-select:all;user-select:all}.link-repos{border:0;margin:10px 0 0;padding:0;max-height:168px;overflow-y:auto}.link-repos legend,.link-k{padding:0;margin:10px 2px 6px;font-size:12px;font-weight:600;color:var(--ink-2)}.link-repos legend{margin-top:0}.link-repos label{display:flex;align-items:center;gap:8px;padding:4px;border-radius:6px;font-size:12.5px;color:var(--ink);cursor:pointer}.link-repos label:hover{background:var(--t2)}.link-repos span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.link-cap button:disabled{opacity:.45;cursor:default}.link-warn{margin-top:8px;padding:8px 10px;border-radius:10px;font-size:12px;line-height:1.45;background:color-mix(in srgb,var(--bad) 10%,transparent);border:1px solid color-mix(in srgb,var(--bad) 30%,transparent)}.link-warn p{margin:0 0 6px;color:var(--ink)}.link-warn label{display:flex;align-items:center;gap:8px;font-weight:600;color:var(--bad);cursor:pointer}.link-tokens{display:flex;align-items:center;gap:8px}.link-tokens span:first-child{flex:1}.link-tokens input{width:108px;padding:5px 8px;border-radius:8px;border:1px solid var(--line);background:var(--paper-2);color:var(--ink);font:inherit;font-size:12.5px;font-variant-numeric:tabular-nums}.link-tokens input:focus-visible{outline:2px solid var(--accent);outline-offset:-1px}.link-guest>.link-row{margin-top:12px}.link-list{max-height:260px}.link-item{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:7px 6px;border-radius:8px;font-size:12.5px}.link-item+.link-item{border-top:1px solid var(--line)}.link-who{display:grid;min-width:0}.link-who strong{color:var(--ink);font-weight:650;overflow:hidden;text-overflow:ellipsis}.link-who span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.link-item .acct-forget{margin:0}.visit-bar{display:flex;align-items:center;justify-content:space-between;gap:8px;margin:0 14px 8px;padding:7px 10px;border-radius:10px;font-size:12.5px;color:var(--ink);background:color-mix(in srgb,var(--accent) 16%,transparent);border:1px solid color-mix(in srgb,var(--accent) 35%,transparent)}.visit-bar a{color:var(--ink-2);white-space:nowrap}.visit-bar{flex-wrap:wrap}.visit-bar.visit-off{background:color-mix(in srgb,var(--bad) 10%,transparent);border-color:color-mix(in srgb,var(--bad) 30%,transparent)}.app.visit-ended #detail .d-foot{display:none}.job .m .from{font-weight:600;color:var(--accent)}.visit-note{flex-basis:100%;margin:0;font-size:12px;color:var(--bad)}.app.visiting :is(#attach,#mic,#channels,#detail .reply .attach),.app.visiting :is(#termToggle,#term,#lbBtn,#linkBtn,#acctBtn,#lbPop,#linkPop,#acctPop,#clear,#standup,#away),.app.visiting :is(.tabs [data-tab=team],.mnav [data-m=team],#teamPane){display:none!important}.brand .title{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px}.brand h1{margin:0;font-size:20px;font-weight:700;letter-spacing:-.025em}.lv{padding:3px 9px;border-radius:999px;background:var(--ink);color:var(--paper);font-size:11.5px;font-weight:640;font-variant-numeric:tabular-nums}.level{display:flex;gap:10px;align-items:center}.xpbar{flex:1;height:4px;border-radius:2px;background:var(--t2);overflow:hidden}.xpbar i{display:block;height:100%;width:0;background:var(--accent);border-radius:2px;transition:width .8s var(--ease)}.xp{font-size:11px;color:var(--ink-3);font-variant-numeric:tabular-nums}.usage{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:14px}.usage[hidden],.meter[hidden]{display:none}#load{margin-top:8px}.meter{display:grid;grid-template-columns:1fr auto;row-gap:6px;align-items:baseline;padding:9px 11px 8px;border-radius:10px;background:var(--paper-2);cursor:default}.meter .k{font-size:11px;font-weight:600;color:var(--ink-3);letter-spacing:.02em}.meter .v{font-size:14px;font-weight:680;color:var(--ink);letter-spacing:-.01em;font-variant-numeric:tabular-nums}.meter .bar{grid-column:1 / -1;height:4px;border-radius:2px;background:var(--t2);overflow:hidden}.meter .bar i{display:block;height:100%;width:0;background:var(--work);border-radius:2px;transition:width .8s var(--ease),background .3s}.meter .r{grid-column:1 / -1;font-size:11px;color:var(--ink-3);font-variant-numeric:tabular-nums;white-space:nowrap}.meter .r:empty{display:none}.meter.warm .bar i{background:var(--wait)}.meter.hot .bar i{background:var(--bad)}.meter.hot .v{color:var(--bad)}.u-err{grid-column:1 / -1;margin:0;font-size:12px;color:var(--ink-3)}.tabs{display:flex;gap:2px;padding:0 12px 8px;border-bottom:1px solid var(--line)}.tabs button{all:unset;cursor:pointer;padding:6px 10px;border-radius:8px;font-weight:600;font-size:13px;color:var(--ink-3);display:inline-flex;gap:6px;align-items:center;transition:color .15s,background .15s}.tabs button:hover{color:var(--ink)}.tabs button.on{color:var(--ink);background:var(--t2)}.tabs #jobCount:not(:empty){font-size:11px;background:var(--accent);color:var(--paper);border-radius:99px;padding:0 6px;line-height:17px}.pane{flex:1;min-height:0;display:flex;flex-direction:column}#jobsPane{padding:8px 12px 12px}.team{flex:1;overflow-y:auto;padding:8px 12px 12px;display:flex;flex-direction:column;gap:2px}.member{border-radius:10px;transition:background .15s}.member:hover,.member.open{background:var(--t1)}.member.later{opacity:.6}.member .head{all:unset;cursor:pointer;display:grid;grid-template-columns:10px 1fr;gap:1px 10px;width:100%;box-sizing:border-box;padding:9px 10px 4px}.member:not(.open) .head:only-child{padding-bottom:9px}.member .head:focus-visible{outline:2px solid var(--accent);outline-offset:-2px;border-radius:10px}.member .head i{grid-row:1 / 3;margin-top:6px;width:8px;height:8px;border-radius:50%}.member .n{font-weight:600}.member .n em{font-style:normal;font-weight:500;font-size:11.5px;color:var(--ink-3);margin-left:4px}.member .r{font-size:12px;color:var(--ink-2)}.member .p{margin:0;padding:2px 10px 9px 30px;font-size:12.5px;color:var(--ink-3);line-height:1.45;text-wrap:pretty;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.member form{display:flex;flex-direction:column;gap:10px;padding:6px 10px 10px 30px}.member label{display:flex;flex-direction:column;gap:4px;font-size:11.5px;font-weight:600;color:var(--ink-3)}.member input,.member textarea{font-size:13.5px;font-weight:400;color:var(--ink);line-height:1.45;resize:vertical;border:1px solid var(--line);border-radius:8px;padding:7px 9px;background:var(--surface);outline:none}.member input:focus,.member textarea:focus{border-color:var(--ink-3)}.member .hint-t{margin:0;font-size:12px;color:var(--ink-3);text-wrap:pretty}.member .row{display:flex;justify-content:flex-end;gap:6px}.projects{flex:1;overflow-y:auto;padding:8px 12px 12px;display:flex;flex-direction:column;gap:2px}.project{border-radius:10px;transition:background .15s}.project:hover,.project.open{background:var(--t1)}.project .head{all:unset;cursor:pointer;display:grid;grid-template-columns:10px 1fr auto;gap:1px 10px;width:100%;box-sizing:border-box;padding:9px 10px}.project .head:focus-visible{outline:2px solid var(--accent);outline-offset:-2px;border-radius:10px}.project .dot{grid-row:1 / 3;margin-top:6px;width:8px;height:8px;border-radius:50%;background:var(--line)}.project .n{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.project .m{grid-column:2 / 4;font-size:12px;color:var(--ink-3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.project .c{font-size:11.5px;color:var(--ink-3);align-self:center}.project .sub{display:flex;flex-direction:column;gap:1px;padding:0 4px 8px 14px}.project .sub .job{padding:7px 8px}.project .sub .none{margin:2px 8px 6px;font-size:12px;color:var(--ink-3)}.project .sub .ghost{align-self:flex-start;font-size:12.5px;margin:4px 8px 0}.jobs{flex:1;overflow-y:auto;display:flex;flex-direction:column;gap:2px}.job{all:unset;cursor:pointer;display:grid;grid-template-columns:10px 1fr;gap:1px 10px;padding:9px 10px;border-radius:10px;transition:background .15s}.job:hover{background:var(--t1)}.job.open{background:var(--t2)}.job .dot{grid-row:1 / 3;margin-top:6px;width:8px;height:8px;border-radius:50%}.job .t{font-weight:560;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.job .m{font-size:12px;color:var(--ink-3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dot.queued{background:var(--wait)}.dot.working{background:var(--work);box-shadow:0 0 0 3px #2f6fae2e;animation:pulse 1.6s infinite}.dot.done{background:var(--good)}.dot.failed{background:var(--bad)}.dot.stopped{background:var(--ink-3)}@keyframes pulse{50%{box-shadow:0 0 0 6px #2f6fae00}}.empty{margin:12px 4px;color:var(--ink-3);font-size:13px;text-wrap:pretty}#clear{font-size:12.5px;padding:7px;margin-top:6px}.channels{flex:none;display:flex;gap:4px;align-items:center;overflow-x:auto;scrollbar-width:none;padding:8px 12px 0}.channels::-webkit-scrollbar{display:none}.channel{all:unset;cursor:pointer;flex:none;display:inline-flex;align-items:center;gap:2px;padding:4px 9px;border-radius:99px;font-size:12.5px;font-weight:580;color:var(--ink-3);transition:color .15s,background .15s}.channel:hover{color:var(--ink);background:var(--t1)}.channel.on{color:var(--paper);background:var(--ink)}.channel .hash{opacity:.55}.channel .badge{margin-left:4px;background:var(--accent);color:var(--paper);border-radius:99px;font-size:10.5px;font-weight:700;line-height:15px;padding:0 5px}.channel.add,.channel.close{color:var(--ink-3);font-size:14px;line-height:1;padding:4px 8px}.channel:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.new-channel{flex:none;display:inline-flex;align-items:center;gap:2px;padding:3px 8px;border:1px solid var(--line);border-radius:99px;background:var(--surface)}.new-channel .hash{color:var(--ink-3);font-size:12.5px}.new-channel input{all:unset;width:96px;font-size:12.5px;font-weight:580}.msgs{flex:1;overflow-y:auto;padding:14px 20px 8px;display:flex;flex-direction:column;gap:16px}.msg .who{display:flex;align-items:center;gap:6px;font-size:12.5px;margin-bottom:3px}.msg .who i{width:8px;height:8px;border-radius:50%;flex:none}.msg .who b{font-weight:640}.msg .who .arrow{color:var(--ink-3)}.msg .who time{color:var(--ink-3);font-size:11.5px;font-variant-numeric:tabular-nums;margin-left:2px}.msg .body{padding-left:14px;overflow-wrap:anywhere}.msg .body p{margin:0 0 6px}.msg .body>:last-child{margin-bottom:0}.msg.from-you .body p{white-space:pre-wrap}.msg.from-chief .body{color:var(--ink-2)}.msg.failed .body{color:var(--bad)}.msg.finished .body{border-left:3px solid var(--line);padding-left:10px;margin-left:4px;color:var(--ink)}.msg.flag .body{border-left:3px solid var(--bad);padding-left:10px;margin-left:4px;color:var(--ink)}.msg.dm .body,.msg.handoff .body,.msg.standup.from-agent .body,.msg.chill .body{border-left:2px solid var(--line);padding-left:10px;margin-left:4px;color:var(--ink-2)}.msg.chill .body{font-style:italic}.msg .kind{font-size:11px;font-weight:620;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-3);margin:0 0 3px 14px}.msg.clamp:not(.full) .body{max-height:190px;overflow:hidden;-webkit-mask-image:linear-gradient(#000 70%,transparent);mask-image:linear-gradient(#000 70%,transparent)}.msg .acts{display:flex;gap:12px;align-items:center;padding-left:14px;margin-top:6px;flex-wrap:wrap}.msg{position:relative}.msg .reacts{display:flex;flex-wrap:wrap;gap:4px;align-items:center;padding-left:14px;margin-top:5px}.msg .reacts:not(.some){position:absolute;top:-4px;right:0;margin:0}.msg .reacts button{all:unset;cursor:pointer;display:inline-flex;align-items:center;gap:4px;font-size:13px;line-height:1}.msg .reacts .pill{padding:3px 7px;border-radius:999px;border:1px solid var(--line);background:var(--paper)}.msg .reacts .pill span{font-size:11.5px;font-weight:620;color:var(--ink-2);font-variant-numeric:tabular-nums}.msg .reacts .pill.mine{border-color:var(--work);background:color-mix(in srgb,var(--work) 10%,transparent)}.msg .reacts .pill:hover{border-color:var(--ink-3)}.msg .reacts .add{padding:3px 7px;border-radius:999px;font-size:12px;color:var(--ink-3);opacity:0;transition:opacity .12s}.msg:hover .reacts .add,.msg .reacts .add:focus-visible{opacity:1}.msg .reacts .add:hover{color:var(--ink);background:var(--line)}.emoji-picker{position:fixed;z-index:50;width:296px;max-height:320px;overflow-y:auto;padding:6px 8px 8px;border-radius:12px;border:1px solid var(--line);background:var(--paper);box-shadow:0 10px 30px #00000029}.emoji-picker[hidden]{display:none}.emoji-picker p{margin:6px 2px 2px;font-size:11px;font-weight:620;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-3)}.emoji-picker .grid{display:grid;grid-template-columns:repeat(8,1fr)}.emoji-picker button{all:unset;cursor:pointer;display:grid;place-items:center;height:32px;border-radius:8px;font-size:19px}.emoji-picker button:hover,.emoji-picker button:focus-visible{background:var(--paper-2)}.msg .acts .icon{all:unset;cursor:pointer;display:inline-flex;padding:3px;margin:-3px;border-radius:6px;color:var(--ink-3)}.msg .acts .icon:hover,.msg .acts .icon:focus-visible{color:var(--ink);background:var(--t2)}.msg .acts .icon svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}.msg .acts .icon.quiet{opacity:0;transition:opacity .12s}.msg:hover .acts .icon.quiet,.msg .acts .icon.quiet:focus-visible{opacity:1}.msg .thread-sum{all:unset;cursor:pointer;display:flex;align-items:center;gap:6px;margin:6px 0 0 8px;padding:4px 8px;border-radius:8px;font-size:12.5px;max-width:calc(100% - 24px);box-sizing:border-box}.msg .thread-sum:hover,.msg .thread-sum:focus-visible{background:var(--t1)}.msg .thread-sum .faces{display:flex;flex:none}.msg .thread-sum .faces i{width:8px;height:8px;border-radius:50%;margin-right:-2px;box-shadow:0 0 0 1.5px var(--paper)}.msg .thread-sum b{flex:none;font-weight:620;color:var(--accent);margin-left:2px}.msg .thread-sum .last{color:var(--ink-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.thread-head{flex:none;display:flex;align-items:center;gap:12px;padding:12px 20px 10px;border-bottom:1px solid var(--line);font-size:13px}.thread-count{margin:0;font-size:11.5px;color:var(--ink-3);display:flex;align-items:center;gap:8px}.thread-count:after{content:"";flex:1;height:1px;background:var(--line)}.msg .blocked{margin:6px 0 0 14px;font-size:12.5px;color:var(--bad)}.link{all:unset;cursor:pointer;font-size:12.5px;font-weight:600;color:var(--accent)}.link:hover{text-decoration:underline}.tag{font-weight:600;color:var(--accent)}.typing{flex:none;padding:0 20px 8px 34px;font-size:12px;color:var(--ink-3);display:flex;align-items:center;gap:3px}.typing span{width:4px;height:4px;border-radius:50%;background:var(--ink-3);animation:dot 1.1s infinite}.typing span:nth-child(2){animation-delay:.15s}.typing span:nth-child(3){animation-delay:.3s;margin-right:5px}@keyframes dot{30%{transform:translateY(-3px);opacity:1}0%,60%,to{opacity:.4}}.composer{flex:none;position:relative;margin:0 12px 12px;border:1px solid var(--line);border-radius:14px;background:var(--surface);padding:10px 10px 8px 12px;box-shadow:0 1px 2px #00000008;transition:border-color .15s,box-shadow .15s}.composer:focus-within{border-color:var(--ink-3);box-shadow:0 0 0 4px var(--t1)}.composer textarea{all:unset;display:block;width:100%;font-size:14px;line-height:1.45;min-height:20px;white-space:pre-wrap;overflow-y:auto}.composer textarea::placeholder{color:var(--ink-3)}.composer .controls{display:flex;align-items:center;gap:3px;margin-top:8px}.composer .controls>button{flex:none}.composer .controls select{border:0;background:var(--t1);font-size:12px;padding:4px 18px 4px 6px;border-radius:7px;color:var(--ink-2);flex:0 1 auto;min-width:72px;text-overflow:ellipsis;outline:none;-moz-appearance:none;appearance:none;-webkit-appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 10 6' fill='none' stroke='%23958d81' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M1 1l4 4 4-4'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 6px center;background-size:9px 6px}.composer .controls select:hover{background-color:var(--t2)}.composer .controls #model{flex:0 1 160px}.composer .controls button[type=submit]{margin-left:auto}.ac{position:absolute;left:0;right:0;bottom:calc(100% + 6px);background:var(--surface);border:1px solid var(--line);border-radius:12px;box-shadow:0 10px 30px #281e0f24;padding:4px;max-height:280px;overflow-y:auto;z-index:5}.ac .item{display:flex;align-items:center;gap:8px;padding:7px 9px;border-radius:8px;cursor:pointer;font-size:13.5px}.ac .item.on{background:var(--t2)}.ac .item i{width:8px;height:8px;border-radius:50%;flex:none}.ac .item i.hash{width:auto;height:auto;font-style:normal;color:var(--ink-3);font-weight:600}.ac .item span{font-weight:560}.ac .item em{margin-left:auto;font-style:normal;font-size:12px;color:var(--ink-3)}.primary,.ghost{border:0;cursor:pointer;border-radius:10px;padding:10px 14px;font-weight:600;display:inline-flex;align-items:center;justify-content:center;gap:8px;transition:transform .12s,background .15s,opacity .15s}.primary{background:var(--ink);color:var(--paper)}.primary:hover{background:color-mix(in srgb,var(--ink) 85%,var(--paper))}.primary:active,.ghost:active{transform:scale(.97)}.ghost{background:transparent;color:var(--ink-2)}.ghost:hover{background:var(--t2);color:var(--ink)}.ghost.danger{color:var(--bad)}.small{padding:7px 12px;font-size:13px}select{border:1px solid var(--line);border-radius:8px;padding:6px 8px;background:var(--surface)}.hud{position:absolute;top:14px;right:14px;display:flex;gap:8px;pointer-events:none}.chip{pointer-events:auto;display:flex;align-items:center;height:38px;padding:0 14px;gap:16px;background:var(--glass);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid var(--line);border-radius:12px;font-size:13px;color:var(--ink-2);box-shadow:0 1px 2px #0000000a,0 6px 18px #3c2d190f}#stats span{white-space:nowrap}#stats b{color:var(--ink);font-weight:650;font-variant-numeric:tabular-nums;margin-right:3px}.chip.tools{padding:0 4px;gap:2px}.chip.tools button{all:unset;cursor:pointer;width:30px;height:30px;display:grid;place-items:center;border-radius:8px;color:var(--ink-2);transition:background .15s,color .15s,transform .12s}.chip.tools button:hover{background:var(--t2);color:var(--ink)}.chip.tools button:active{transform:scale(.92)}.chip.tools button:disabled{opacity:.4;pointer-events:none}.chip.tools svg{width:17px;height:17px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}.chip .sep{width:1px;height:18px;background:var(--line);margin:0 3px}.hint{position:absolute;bottom:14px;left:50%;transform:translate(-50%);margin:0;font-size:12px;color:var(--ink-3);white-space:nowrap;pointer-events:none;transition:opacity .6s}.hint.gone{opacity:0}.detail{width:440px;display:flex;flex-direction:column;min-height:0;padding-top:18px;background:var(--pane);border-left:1px solid var(--pane-edge);-webkit-backdrop-filter:blur(24px) saturate(1.5);backdrop-filter:blur(24px) saturate(1.5);animation:open .3s var(--ease)}@keyframes open{0%{opacity:0;transform:translate(12px)}}.d-head{display:flex;justify-content:space-between;align-items:center;padding:0 20px}.x{all:unset;cursor:pointer;font-size:22px;line-height:1;color:var(--ink-3);padding:2px 6px;border-radius:6px}.x:hover{color:var(--ink);background:var(--t2)}.pill{font-size:11.5px;font-weight:620;letter-spacing:.02em;text-transform:uppercase;padding:3px 8px;border-radius:6px}.pill.queued{background:var(--wait-bg);color:var(--wait-fg)}.pill.working{background:var(--work-bg);color:var(--work-fg)}.pill.done{background:var(--good-bg);color:var(--good-fg)}.pill.failed{background:var(--bad-bg);color:var(--bad-fg)}.pill.stopped{background:var(--t2);color:var(--ink-2)}.detail h2{margin:12px 20px;font-size:18px;font-weight:650;letter-spacing:-.015em;line-height:1.3;text-wrap:balance}.meta{margin:0 20px 14px;display:grid;grid-template-columns:repeat(3,1fr);gap:10px 12px}.meta dt{font-size:11px;color:var(--ink-3);margin-bottom:1px}.meta dd{margin:0;font-size:13px;font-weight:550;font-variant-numeric:tabular-nums;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.log{flex:1;overflow-y:auto;padding:14px 20px 16px;border-top:1px solid var(--line)}.e{margin:0 0 6px}.e p{margin:0;white-space:pre-wrap;overflow-wrap:anywhere}.e .who{display:block;font-size:11px;font-weight:620;letter-spacing:.04em;text-transform:uppercase;color:var(--ink-3);margin-bottom:3px}.e.user{margin:4px 0 14px;padding:10px 12px;background:var(--t1);border-radius:10px}.e.text{margin:10px 0 12px}.e.sys{font-size:12px;color:var(--ink-3)}.e.tool{font-family:var(--mono);font-size:12px;color:var(--ink-2);display:flex;align-items:center;gap:8px}.e.err{font-family:var(--mono);font-size:12px;color:var(--bad);white-space:pre-wrap;overflow-wrap:anywhere}.e.result{margin:14px 0 6px;padding:12px;border-radius:10px;background:var(--good-bg)}.e.result.bad{background:var(--bad-bg)}.st{flex:none;width:7px;height:7px;border-radius:2px;background:var(--ink-3)}.st.library{background:#3d7ea6}.st.servers{background:#2b2f38}.st.window{background:#4f8fc0;border-radius:50%}.st.whiteboard{background:#e07a5f}.st.desk{background:#c39a6b}code{font-family:var(--mono);font-size:.88em;background:var(--t2);padding:1px 4px;border-radius:4px}.d-foot{border-top:1px solid var(--line);padding:12px 20px 16px;display:flex;flex-direction:column;gap:10px}.notice{font-size:13px;color:var(--ink-2);display:flex;flex-direction:column;align-items:flex-start;gap:8px}.reply textarea{width:100%;resize:none;border:1px solid var(--line);border-radius:10px;padding:9px 11px;background:var(--surface);outline:none}.reply textarea:focus{border-color:var(--ink-3)}.reply .row{display:flex;justify-content:space-between;gap:8px;margin-top:8px}.md>:first-child{margin-top:0}.md>:last-child{margin-bottom:0}.md p{margin:0 0 8px;white-space:normal}.md h1,.md h2,.md h3,.md h4{font-size:14px;font-weight:650;margin:12px 0 6px;letter-spacing:-.01em}.md ul,.md ol{margin:0 0 8px;padding-left:20px}.md li{margin:2px 0}.md a{color:var(--accent)}.md pre{font-family:var(--mono);font-size:12px;background:var(--t1);padding:10px 12px;border-radius:8px;overflow-x:auto;margin:0 0 8px}.md pre code{background:none;padding:0}.md table{border-collapse:collapse;width:100%;font-size:12.5px;margin:4px 0 10px;display:block;overflow-x:auto}.md th,.md td{text-align:left;padding:5px 10px 5px 0;border-bottom:1px solid var(--line);vertical-align:top}.md th{font-weight:620;color:var(--ink-2)}.md td{font-variant-numeric:tabular-nums}.md blockquote{margin:0 0 8px;padding-left:10px;border-left:2px solid var(--line);color:var(--ink-2)}.agent-label{position:absolute;left:0;top:0;display:flex;flex-direction:column;align-items:center;gap:5px;will-change:transform}.agent-label .name{display:flex;align-items:center;gap:5px;font-size:11.5px;font-weight:620;background:var(--glass);padding:2px 8px 2px 6px;border-radius:99px;color:var(--ink);box-shadow:0 1px 3px #0000001a}.agent-label .name i{width:7px;height:7px;border-radius:50%}.agent-label.selected .name{background:var(--ink);color:var(--paper)}.agent-label.far .bubble,.agent-label.crowded .bubble{display:none!important}.agent-label.buried{visibility:hidden}.bubble{max-width:170px;font-size:12px;font-weight:500;line-height:1.3;padding:5px 9px;border-radius:11px;background:var(--surface);color:var(--ink);box-shadow:0 2px 10px #281e0f24;text-align:center;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;animation:bub .2s ease-out}@keyframes bub{0%{opacity:0;transform:translateY(4px) scale(.96)}}.bubble.thinking{color:var(--ink-3);font-style:italic}.bubble.idle{color:var(--ink-2)}.bubble.warn{background:var(--bad-bg);color:var(--bad-fg)}.bubble.good{background:var(--good-bg);color:var(--good-fg)}.bubble.talk{background:var(--work-bg);color:var(--work-fg)}.xpfloat{position:absolute;top:-10px;font-size:14px;font-weight:720;color:var(--good-fg);animation:float 1.8s ease-out forwards;text-shadow:0 1px 0 var(--paper)}@keyframes float{0%{opacity:0;transform:translateY(8px)}15%{opacity:1}to{opacity:0;transform:translateY(-36px)}}.toast{position:absolute;left:50%;bottom:44px;transform:translate(-50%,12px);opacity:0;background:var(--ink);color:var(--paper);padding:10px 16px;border-radius:12px;font-weight:500;transition:opacity .2s,transform .25s var(--ease);pointer-events:none;max-width:calc(100% - 32px)}.toast.show{opacity:1;transform:translate(-50%)}.toast.good{background:#22603b;color:#fff}.toast.bad{background:#8f3121;color:#fff}.toast.act{pointer-events:auto}.toast button{all:unset;cursor:pointer;margin-left:10px;font-weight:650;text-decoration:underline;text-underline-offset:3px}.chip.away{gap:4px;padding:0 6px 0 12px}.chip.away span{margin-right:4px;color:var(--ink-3);white-space:nowrap}.chip.away button{all:unset;cursor:pointer;display:flex;align-items:center;gap:6px;height:28px;padding:0 9px;border-radius:8px;color:var(--ink);font-weight:550;transition:background .15s}.chip.away button:hover{background:var(--t2)}.chip.away i{width:8px;height:8px;border-radius:50%}.banner{position:absolute;left:50%;top:32%;transform:translate(-50%,-50%);text-align:center;pointer-events:none;opacity:0;display:flex;flex-direction:column;gap:4px}.banner b{font-size:56px;font-weight:760;letter-spacing:-.04em;line-height:1;text-shadow:0 2px 30px var(--paper)}.banner span{font-size:16px;color:var(--ink-2);font-weight:520}.banner.show{animation:banner 3.4s var(--ease) forwards}@keyframes banner{0%{opacity:0;transform:translate(-50%,-40%) scale(.94)}12%,78%{opacity:1;transform:translate(-50%,-50%) scale(1)}to{opacity:0;transform:translate(-50%,-56%)}}@media (max-width: 1180px){.app{grid-template-columns:min(var(--side-w, 320px),320px) minmax(0,1fr) auto}.detail{width:380px}}@container (max-width: 820px){#stats span:nth-child(n+3){display:none}.hint{display:none}}@container (max-width: 520px){#stats{display:none}}.mnav{display:none}@media (max-width: 860px){.app{grid-template-columns:minmax(0,1fr);grid-template-rows:minmax(0,1fr) auto}.view,.side{grid-area:1 / 1;min-width:0}.side-grip{display:none}.app[data-m=office] .side,.app[data-m=side] .view{visibility:hidden;pointer-events:none}.side{border-right:0;padding-top:env(safe-area-inset-top)}.brand{display:block;padding:12px 16px 8px}.brand .title{margin-bottom:6px}.brand h1{font-size:18px}.usage{gap:6px;margin-top:8px}#load{margin-top:6px}.meter{padding:6px 10px;row-gap:4px}#load .meter .r,.tabs{display:none}.msgs{padding:12px 14px 8px}.channels{padding:8px 10px 0}.channel{padding:7px 12px;font-size:13.5px}.composer{margin:0 10px 10px}.composer textarea,.new-channel input,input,select,textarea{font-size:16px}.composer .controls{gap:6px}.composer .controls>button{min-width:38px;min-height:38px;justify-content:center;align-items:center}.composer .controls select{font-size:13px;min-height:36px;padding-right:22px}.composer .controls button[type=submit]{min-height:38px;padding:0 18px}#jobsPane,.team,.projects{padding-bottom:12px}.hud{top:calc(10px + env(safe-area-inset-top));left:10px;right:10px;flex-direction:column;align-items:flex-end}.chip.tools button{width:36px;height:36px}.chip.away{max-width:100%;height:auto;min-height:38px;flex-wrap:wrap;padding:4px 6px 4px 12px}.hint,#stats{display:none}.toast{max-width:calc(100% - 24px);bottom:calc(18px + var(--term-h, 0px))}.banner b{font-size:40px}.detail{position:fixed;top:0;right:0;bottom:0;left:0;width:auto;z-index:30;padding-top:calc(14px + env(safe-area-inset-top));padding-bottom:env(safe-area-inset-bottom);border-left:0}.meta{margin:0 16px 14px}.detail h2{margin:12px 16px}.d-head{padding:0 16px}.x{font-size:28px;padding:4px 12px}.term-grip{height:18px;top:-9px}.term-icon{width:34px;height:34px}.term-tab>button:first-child{padding:8px 6px 8px 12px}.term-bar select{max-width:110px;font-size:16px}.mnav{display:grid;grid-template-columns:repeat(5,1fr);grid-row:2;z-index:25;background:color-mix(in srgb,var(--paper) 96%,transparent);border-top:1px solid var(--line);padding-bottom:env(safe-area-inset-bottom)}.mnav button{all:unset;cursor:pointer;position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;min-height:54px;font-size:11px;font-weight:600;color:var(--ink-3);-webkit-tap-highlight-color:transparent;transition:color .15s}.mnav button.on{color:var(--ink)}.mnav button:active svg{transform:scale(.88)}.mnav button:focus-visible{outline:2px solid var(--accent);outline-offset:-4px;border-radius:10px}.mnav svg{width:22px;height:22px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;transition:transform .12s}.mnav b:not(:empty){position:absolute;top:5px;left:calc(50% + 6px);font-size:10.5px;background:var(--accent);color:var(--paper);border-radius:99px;padding:0 5px;line-height:15px;font-weight:700}.mnav .dot{position:absolute;top:8px;left:calc(50% + 8px);width:8px;height:8px;border-radius:50%;background:var(--accent)}}@media (hover: none){.term-tab .x{opacity:1}.chip.tools button:hover,.channel:hover{background:none}}body{overscroll-behavior:none;-webkit-tap-highlight-color:transparent}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation-duration:.01ms!important;transition-duration:.01ms!important}}.attach{border:0;background:none;cursor:pointer;padding:4px;border-radius:7px;color:var(--ink-3);display:inline-flex}.attach:hover{background:var(--t1);color:var(--ink-2)}.attach svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}.composer.dropping,.reply.dropping{border-color:var(--work);box-shadow:0 0 0 4px var(--t2)}.reply.dropping textarea{border-color:var(--work)}.tray{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}.tray .file,.files .file{display:inline-flex;align-items:center;gap:6px;max-width:200px;padding:3px 4px 3px 3px;border-radius:8px;background:var(--t1);font-size:12px;color:var(--ink-2);text-decoration:none}.tray .file.loading{opacity:.55}.tray .file img{width:28px;height:28px;object-fit:cover;border-radius:6px;flex:none}.tray .file b,.files .file b{font-size:9px;font-weight:700;letter-spacing:.04em;color:var(--ink-3);background:var(--surface);border-radius:5px;padding:5px 4px;flex:none}.tray .file span,.files .file span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tray .file button{border:0;background:none;cursor:pointer;color:var(--ink-3);font-size:15px;line-height:1;padding:0 3px}.tray .file button:hover{color:var(--ink)}.msg .files{display:flex;flex-wrap:wrap;gap:6px;padding-left:14px;margin-top:4px}.msg .files .thumb img{display:block;max-width:160px;max-height:120px;border-radius:8px;border:1px solid var(--line)}.reply .row .attach{margin-left:auto}.mic{border:0;background:none;cursor:pointer;padding:4px;border-radius:7px;color:var(--ink-3);display:inline-flex}.mic:hover{background:var(--t1);color:var(--ink-2)}.mic:disabled{opacity:.45;pointer-events:none}.mic svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}.mic.on{color:#fff;background:var(--bad)}.mic.on:hover{background:var(--bad);color:#fff}.rec{display:flex;align-items:center;gap:8px;margin-bottom:8px;font-size:12.5px;color:var(--ink-2)}.rec i{width:8px;height:8px;border-radius:50%;background:var(--bad);flex:none;animation:pulse 1.1s ease-in-out infinite}.rec span{font-variant-numeric:tabular-nums}.rec .link{margin-left:auto;color:var(--ink-3)}.rec .link+.link{margin-left:0}.rec.working i{background:var(--work)}@keyframes pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(.8)}}@media (prefers-reduced-motion: reduce){.rec i{animation:none}}audio.voice{width:100%;max-width:260px;height:32px}.msg .files audio.voice{margin-top:2px}.tray .file b{white-space:nowrap}.chip.tools button.on{color:var(--accent);background:color-mix(in srgb,var(--accent) 14%,transparent)}#stage,#labels{bottom:var(--term-h, 0px)}.hint{bottom:calc(14px + var(--term-h, 0px))}.toast{bottom:calc(44px + var(--term-h, 0px))}.term{position:absolute;left:0;right:0;bottom:0;height:var(--term-h, 300px);display:flex;flex-direction:column;min-height:0;z-index:8;background:#221e18;border-top:1px solid rgba(29,27,24,.18);box-shadow:0 -8px 26px #281e0f24}.term-grip{position:absolute;top:-3px;left:0;right:0;height:7px;cursor:ns-resize;z-index:1}.term-grip:hover,.term-grip:focus-visible{background:#7fb2dd80;outline:none}.term-bar{display:flex;align-items:center;gap:6px;padding:5px 8px 0;flex:0 0 auto;color:#b2a894;font-size:12px;min-height:34px}.term-fill{flex:1 1 auto}.term-note{font-family:var(--mono);font-size:11px;color:#776c5b;white-space:nowrap}.term-bar select{border:1px solid rgba(236,228,214,.16);background:#2c261e;color:#cdc3b1;border-radius:7px;padding:3px 6px;font-size:11.5px;max-width:150px}.term-icon{all:unset;cursor:pointer;width:24px;height:24px;flex:0 0 auto;display:grid;place-items:center;border-radius:7px;color:#9d917d;transition:background .15s,color .15s}.term-icon:hover{background:#ece4d61a;color:#ece4d6}.term-icon svg,.term-tab .x svg{width:14px;height:14px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round}.term-tabs{display:flex;gap:3px;min-width:0;overflow-x:auto;scrollbar-width:none}.term-tabs::-webkit-scrollbar{display:none}.term-tab{display:flex;align-items:center;border-radius:8px 8px 0 0;background:transparent;max-width:220px;transition:background .15s}.term-tab:hover{background:#ece4d612}.term-tab.on{background:#2f2820}.term-tab>button:first-child{all:unset;cursor:pointer;padding:5px 4px 6px 10px;font-size:12px;color:#9d917d;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:520}.term-tab.on>button:first-child{color:#ece4d6}.term-tab.dead>button:first-child{color:#6f6454;text-decoration:line-through;text-decoration-thickness:1px}.term-tab .x{all:unset;cursor:pointer;width:18px;height:18px;margin:0 5px 1px 0;display:grid;place-items:center;border-radius:5px;color:#6f6454;opacity:0;transition:opacity .15s,background .15s}.term-tab:hover .x,.term-tab.on .x{opacity:1}.term-tab .x:hover{background:#ece4d624;color:#ece4d6}.term-body{position:relative;flex:1 1 auto;min-height:0;background:#2f2820}.term-pane{position:absolute;top:0;right:0;bottom:0;left:0;padding:8px 4px 4px 10px;visibility:hidden}.term-pane.on{visibility:visible}.term-pane .xterm,.term-pane .xterm-viewport{background:transparent!important}.term-pane .xterm-viewport{scrollbar-width:thin;scrollbar-color:#534a3c transparent}.term-off{flex:1 1 auto;overflow-y:auto;padding:4px 18px 18px;color:#b2a894;max-width:720px}.term-off p{margin:8px 0}.term-off b{color:#ece4d6;font-weight:640}.term-off .term-why{color:#8d8270}.term-off pre{margin:12px 0 0;padding:10px 12px;border-radius:9px;background:#191510;color:#e8bb63;font-family:var(--mono);font-size:12px;overflow-x:auto}@media (max-width: 860px){.term{z-index:19}.toast{bottom:calc(18px + var(--term-h, 0px))}}.changes{margin:0 20px 14px;border:1px solid var(--line);border-radius:10px;background:var(--paper);overflow:hidden}.changes.none{padding:9px 12px;font-size:12.5px;color:var(--ink-3)}.c-head{all:unset;box-sizing:border-box;width:100%;display:flex;align-items:center;gap:10px;padding:9px 12px;cursor:pointer;font-size:13px}.c-head:hover{background:color-mix(in srgb,var(--ink) 4%,transparent)}.c-head:focus-visible,.c-file:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.c-title{font-weight:620}.c-sum{flex:1;color:var(--ink-2);font-variant-numeric:tabular-nums}.c-caret{color:var(--ink-3)}.changes .add{color:var(--good-fg);font-weight:600}.changes .del{color:var(--bad-fg);font-weight:600}.c-files{list-style:none;margin:0;padding:0;border-top:1px solid var(--line);max-height:240px;overflow-y:auto}.c-files li{border-bottom:1px solid var(--line)}.c-files li:last-child{border-bottom:0}.c-files .more{padding:7px 12px;font-size:12px;color:var(--ink-3)}.c-file{all:unset;box-sizing:border-box;width:100%;display:flex;align-items:center;gap:8px;padding:6px 12px;cursor:pointer;font-size:12.5px}.c-file:hover{background:color-mix(in srgb,var(--ink) 4%,transparent)}.c-file .st{font:700 10.5px/1 ui-monospace,monospace;width:16px;text-align:center;padding:3px 0;border-radius:4px;background:var(--t2);color:var(--ink-2)}.c-file .st.added{background:var(--good-bg);color:var(--good-fg)}.c-file .st.deleted{background:var(--bad-bg);color:var(--bad-fg)}.c-file .p{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;direction:rtl;text-align:left;font-family:ui-monospace,monospace}.c-file .n{color:var(--ink-3);font-variant-numeric:tabular-nums}.c-diff{margin:0;padding:8px 12px;max-height:320px;overflow:auto;font:11.5px/1.5 ui-monospace,monospace;background:color-mix(in srgb,var(--ink) 3%,transparent);white-space:pre}.c-diff .add{color:var(--good-fg);background:var(--good-bg);display:inline-block;min-width:100%;font-weight:400}.c-diff .del{color:var(--bad-fg);background:var(--bad-bg);display:inline-block;min-width:100%;font-weight:400}.c-diff .hunk{color:var(--ink-3)}.name-ask{border:1px solid var(--line);border-radius:16px;padding:22px;max-width:380px;width:calc(100vw - 48px);background:var(--paper);color:inherit;box-shadow:0 24px 60px #00000040}.name-ask::backdrop{background:#00000059}.name-ask h2{margin:0 0 8px;font-size:18px}.name-ask .acct-forget{display:block;margin:12px 0 0}.agent-label.visitor .name{box-shadow:0 0 0 1.5px var(--tint),0 1px 3px #0000001a}.agent-label.visitor .name .handle{color:var(--ink-2);font-weight:520;white-space:pre}.door-sign{position:absolute;left:0;top:0;will-change:transform;display:flex;flex-direction:column;gap:2px;align-items:center;font-size:11.5px;font-weight:620;color:var(--ink);background:var(--glass);padding:4px 10px;border-radius:8px;box-shadow:0 1px 3px #0000001f}.visitor-card{position:absolute;left:0;top:0;z-index:20000;width:max-content;max-width:260px;display:flex;flex-direction:column;gap:3px;font-size:12px;line-height:1.35;color:var(--ink);background:var(--surface);padding:8px 11px;border-radius:10px;border-left:3px solid var(--tint);box-shadow:0 4px 16px #281e0f29}.visitor-card .vc-who{font-weight:650}.visitor-card .vc-role,.visitor-card .vc-state{color:var(--ink-2)}.visitor-card .vc-job{font-weight:520}.visitor-card .vc-state{font-size:11px}/**
|
|
2
|
+
* Copyright (c) 2014 The xterm.js authors. All rights reserved.
|
|
3
|
+
* Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
|
|
4
|
+
* https://github.com/chjj/term.js
|
|
5
|
+
* @license MIT
|
|
6
|
+
*
|
|
7
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
* in the Software without restriction, including without limitation the rights
|
|
10
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
* furnished to do so, subject to the following conditions:
|
|
13
|
+
*
|
|
14
|
+
* The above copyright notice and this permission notice shall be included in
|
|
15
|
+
* all copies or substantial portions of the Software.
|
|
16
|
+
*
|
|
17
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
23
|
+
* THE SOFTWARE.
|
|
24
|
+
*
|
|
25
|
+
* Originally forked from (with the author's permission):
|
|
26
|
+
* Fabrice Bellard's javascript vt100 for jslinux:
|
|
27
|
+
* http://bellard.org/jslinux/
|
|
28
|
+
* Copyright (c) 2011 Fabrice Bellard
|
|
29
|
+
* The original design remains. The terminal itself
|
|
30
|
+
* has been extended to include xterm CSI codes, among
|
|
31
|
+
* other features.
|
|
32
|
+
*/.xterm{cursor:text;position:relative;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;right:0;left:0;top:0;bottom:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm .xterm-scroll-area{visibility:hidden}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{position:absolute;left:0;top:0;bottom:0;right:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{text-decoration:double underline}.xterm-underline-3{text-decoration:wavy underline}.xterm-underline-4{text-decoration:dotted underline}.xterm-underline-5{text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{text-decoration:overline double underline}.xterm-overline.xterm-underline-3{text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}
|