openvisio-agent 0.19.12 → 0.20.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/README.md +34 -4
- package/USER_GUIDE.md +174 -0
- package/bin/cli.mjs +9 -0
- package/package.json +7 -3
- package/scenarios/index.mjs +16 -0
- package/scenarios/routing.scenarios.mjs +348 -0
- package/scenarios/runtime.scenarios.mjs +451 -0
- package/scenarios/transport.scenarios.mjs +407 -0
- package/scenarios/workspace.scenarios.mjs +324 -0
- package/scripts/certify.mjs +9 -6
- package/scripts/run-scenarios.mjs +32 -0
- package/src/agent-journal.mjs +138 -0
- package/src/assignment-routing.mjs +19 -7
- package/src/authorization-resume.mjs +1 -1
- package/src/channel-routing.mjs +15 -8
- package/src/codex-mcp-proxy.mjs +63 -18
- package/src/concurrency.mjs +5 -3
- package/src/cycle-queue.mjs +16 -3
- package/src/events.mjs +89 -38
- package/src/mastra-harness.mjs +128 -22
- package/src/mcp-http.mjs +72 -19
- package/src/memory.mjs +15 -2
- package/src/pr-push.mjs +21 -8
- package/src/runner-pool.mjs +14 -3
- package/src/studio-cli.mjs +60 -0
- package/src/studio-server.mjs +224 -0
- package/src/task-types.mjs +3 -2
- package/src/thread-context.mjs +38 -3
- package/src/watch.mjs +345 -116
- package/src/ws.mjs +20 -1
- package/studio/app.mjs +658 -0
- package/studio/guide.html +122 -0
- package/studio/index.html +61 -0
- package/studio/style.css +223 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<meta name="color-scheme" content="light">
|
|
7
|
+
<meta name="description" content="Get started with Agent Studio, understand agent activity, and troubleshoot your local viewer.">
|
|
8
|
+
<title>Agent Studio user guide · OpenVisio</title>
|
|
9
|
+
<link rel="stylesheet" href="/style.css">
|
|
10
|
+
</head>
|
|
11
|
+
<body>
|
|
12
|
+
<a class="skip-link" href="#guide-content">Skip to guide</a>
|
|
13
|
+
<div class="guide-shell">
|
|
14
|
+
<header class="guide-header">
|
|
15
|
+
<div><h1>Agent Studio user guide</h1><p>Follow your agents’ work, find a result, and understand when an agent needs attention.</p></div>
|
|
16
|
+
<a class="button" href="/">Back to Studio</a>
|
|
17
|
+
</header>
|
|
18
|
+
<div class="guide-layout">
|
|
19
|
+
<nav class="guide-nav" aria-label="Guide contents">
|
|
20
|
+
<a href="#start">Open Studio</a>
|
|
21
|
+
<a href="#watchers">Show your agents</a>
|
|
22
|
+
<a href="#find-work">Find and inspect work</a>
|
|
23
|
+
<a href="#statuses">Understand statuses</a>
|
|
24
|
+
<a href="#controls">Pause and follow</a>
|
|
25
|
+
<a href="#access">Keyboard and reading</a>
|
|
26
|
+
<a href="#troubleshooting">Troubleshooting</a>
|
|
27
|
+
<a href="#history">History and privacy</a>
|
|
28
|
+
</nav>
|
|
29
|
+
<main id="guide-content" class="guide-content" tabindex="-1">
|
|
30
|
+
<section id="start">
|
|
31
|
+
<h2>Open Studio</h2>
|
|
32
|
+
<p>Agent Studio is a local viewer for bring-your-own (BYO) agents connected to an OpenVisio team. It shows recorded actions from Claude Code, Codex, and OpenCode watchers on this machine.</p>
|
|
33
|
+
<p>With a Studio-capable version of <code>openvisio-agent</code> installed, run:</p>
|
|
34
|
+
<pre><code>openvisio-agent studio</code></pre>
|
|
35
|
+
<p>Your browser opens the local address printed in the terminal, usually <code>http://127.0.0.1:4317</code>. Keep that terminal running while you use Studio.</p>
|
|
36
|
+
<p>To explore without connecting an agent:</p>
|
|
37
|
+
<pre><code>openvisio-agent studio --demo</code></pre>
|
|
38
|
+
<p>The demo uses clearly labeled sample activity. It makes no model calls. To return to your agents, press <kbd>Ctrl+C</kbd> in the Studio terminal and run the command again without <code>--demo</code>.</p>
|
|
39
|
+
</section>
|
|
40
|
+
<section id="watchers">
|
|
41
|
+
<h2>Show your agents</h2>
|
|
42
|
+
<p>A <strong>watcher</strong> is the local program that listens for assignments and messages, then starts your coding agent when work arrives. Studio displays what the watcher records.</p>
|
|
43
|
+
<ol>
|
|
44
|
+
<li>Connect your agent using the setup command provided by your OpenVisio team. If you already connected it, keep that setup.</li>
|
|
45
|
+
<li>In a separate terminal, start its watcher. Replace <code>ada</code> with the name used during setup:<pre><code>openvisio-agent watch --name ada</code></pre></li>
|
|
46
|
+
<li>Return to Studio. Your agent should appear in the sidebar. Select its name to see its activity.</li>
|
|
47
|
+
</ol>
|
|
48
|
+
<p>Starting a watcher enables it to act on existing assignments and messages. If your watcher is already running, you do not need to start another one.</p>
|
|
49
|
+
<p>Older watchers need a Studio-capable update and a restart before they record activity. Their earlier activity cannot be reconstructed. See <a href="#troubleshooting">restart instructions</a> below.</p>
|
|
50
|
+
</section>
|
|
51
|
+
<section id="find-work">
|
|
52
|
+
<h2>Find and inspect work</h2>
|
|
53
|
+
<ol>
|
|
54
|
+
<li>Select an agent, or choose <strong>All agents</strong>.</li>
|
|
55
|
+
<li>Choose <strong>Activity</strong> for individual actions, <strong>Cycles</strong> for groups of work, or <strong>Processes</strong> for watchers and coding runtimes.</li>
|
|
56
|
+
<li>Search for a ticket such as <code>DEMO-77</code>, an action, or a recorded file path. Use the kind and status filters to narrow the list.</li>
|
|
57
|
+
<li>Select a row. Its details appear beside the list, or below it on a smaller screen.</li>
|
|
58
|
+
</ol>
|
|
59
|
+
<p>A <strong>cycle</strong> is one unit of agent work. It can include a plan, several tool calls, progress updates, and a final response. Expand <strong>Cycle history</strong> to review its recorded sequence.</p>
|
|
60
|
+
<p><strong>No explicit plan recorded</strong> means the provider did not send a plan in the available history. A missing process ID means the provider did not report that operating-system identifier. Neither message alone means the work failed.</p>
|
|
61
|
+
<p>The process summary counts distinct reported process IDs associated with connected watchers. It is not a system-wide process monitor. The demo deliberately shows no real process count.</p>
|
|
62
|
+
</section>
|
|
63
|
+
<section id="statuses">
|
|
64
|
+
<h2>Understand statuses</h2>
|
|
65
|
+
<dl>
|
|
66
|
+
<dt>Live</dt><dd>Your browser is connected to the local Studio server. Check each agent’s own status to see whether its watcher is connected.</dd>
|
|
67
|
+
<dt>Queued / Active</dt><dd>Work is waiting to start, or the current watcher has recorded it as running.</dd>
|
|
68
|
+
<dt>Completed</dt><dd>The selected action or cycle reported completion. A completed tool is only one step; inspect the cycle’s final response and the ticket for the overall result.</dd>
|
|
69
|
+
<dt>Blocked / Failed / Timed out</dt><dd>Read the cycle’s Outcome and final response, then check the ticket or watcher log for the cause. Studio has no retry or approval button.</dd>
|
|
70
|
+
<dt>Cancelled / Skipped</dt><dd>The work was stopped or did not proceed. These are separate from successful completion.</dd>
|
|
71
|
+
<dt>Idle / Connecting / Recovering</dt><dd>A coding runtime is waiting, connecting, or attempting recovery. These describe the runtime’s last recorded state.</dd>
|
|
72
|
+
<dt>Offline</dt><dd>The watcher stopped reporting, exited, or was replaced by a newer run. An unfinished cycle’s outcome is unknown; offline does not mean completed or failed.</dd>
|
|
73
|
+
<dt>Simulated</dt><dd>This record belongs to the demonstration. No real agent is working on it.</dd>
|
|
74
|
+
</dl>
|
|
75
|
+
</section>
|
|
76
|
+
<section id="controls">
|
|
77
|
+
<h2>Pause and follow</h2>
|
|
78
|
+
<p><strong>Pause view</strong> freezes the displayed snapshot so you can read without changes. Your agents keep working. <strong>Resume view</strong> displays the latest available snapshot.</p>
|
|
79
|
+
<p><strong>Follow latest</strong> selects the newest matching activity as updates arrive. Selecting a row turns following off so you can inspect that item. Turn it on again when you want to follow new activity.</p>
|
|
80
|
+
<p><strong>Show earlier activity</strong> reveals more of the available history. Search and filters apply to that same limited history.</p>
|
|
81
|
+
<p>Closing the browser or pressing <kbd>Ctrl+C</kbd> in the Studio terminal leaves watchers running. To stop an agent, use a separate terminal:</p>
|
|
82
|
+
<pre><code>openvisio-agent stop --name ada</code></pre>
|
|
83
|
+
</section>
|
|
84
|
+
<section id="access">
|
|
85
|
+
<h2>Keyboard and reading</h2>
|
|
86
|
+
<p>Use <kbd>Tab</kbd> and <kbd>Shift+Tab</kbd> to move between controls. Use <kbd>Enter</kbd> to activate links and buttons; <kbd>Space</kbd> also activates buttons and checkboxes. Native select menus use your browser’s keyboard controls.</p>
|
|
87
|
+
<p>The first focusable link skips navigation. Controls have text labels, and statuses use words as well as color. Use your screen reader’s headings and landmarks to find the activity list, selected details, or guide sections.</p>
|
|
88
|
+
<p>Pause the view before reading a long result. Browser zoom can enlarge the interface; the details panel moves below the activity list on narrower screens. This guide works without JavaScript and can be printed or saved as a PDF using your browser’s print command.</p>
|
|
89
|
+
</section>
|
|
90
|
+
<section id="troubleshooting">
|
|
91
|
+
<h2>Troubleshooting</h2>
|
|
92
|
+
<h3>“Unknown command: studio”</h3>
|
|
93
|
+
<p>Check <code>openvisio-agent --version</code>. Studio requires version <code>0.20.0</code> or newer. Update with <code>npm install -g openvisio-agent@latest</code>. To run from a local checkout, use:</p>
|
|
94
|
+
<pre><code>node packages/openvisio-agent/bin/cli.mjs studio</code></pre>
|
|
95
|
+
<p>Run this from the repository root after installing the package’s dependencies.</p>
|
|
96
|
+
<h3>No agents or “Restart watcher to connect”</h3>
|
|
97
|
+
<p>Confirm the watcher uses the same local account as Studio. After updating the watcher package, stop the named watcher and start it again. Replace <code>ada</code> with your agent name:</p>
|
|
98
|
+
<pre><code>openvisio-agent stop --name ada
|
|
99
|
+
openvisio-agent watch --name ada</code></pre>
|
|
100
|
+
<p>Stopping interrupts that agent’s work. For a background service on macOS or Linux, use <code>openvisio-agent watch --name ada --install</code> instead of the second command. Studio reads <code>~/.openvisio</code> by default; <code>--state-dir /path/to/state</code> selects a different directory to read.</p>
|
|
101
|
+
<h3>No matching activity</h3>
|
|
102
|
+
<p>Choose <strong>Clear filters</strong> or select <strong>All agents</strong> and clear the search. If there is still no activity, check whether the watcher has received work since its update.</p>
|
|
103
|
+
<h3>Reconnecting or the page will not open</h3>
|
|
104
|
+
<p>Keep the Studio terminal running and open the exact URL it printed. The browser reconnects automatically when the server returns. If automatic browser opening fails, run <code>openvisio-agent studio --no-open</code> and open the printed address yourself.</p>
|
|
105
|
+
<h3>Port already in use</h3>
|
|
106
|
+
<p>Choose another available local port:</p>
|
|
107
|
+
<pre><code>openvisio-agent studio --port 0</code></pre>
|
|
108
|
+
<h3>A result or older event is missing</h3>
|
|
109
|
+
<p>Studio shows a bounded recent history. Look at the original ticket and channel for delivered results. Watcher logs are at <code>~/.openvisio/<agent>.log</code> for the macOS service, or <code>journalctl --user -u openvisio-<agent></code> for the Linux service. A foreground watcher prints to its terminal.</p>
|
|
110
|
+
</section>
|
|
111
|
+
<section id="history">
|
|
112
|
+
<h2>History and privacy</h2>
|
|
113
|
+
<p>Studio reads local journals under <code>~/.openvisio/observability</code>. The viewer serves up to 500 recent events from a bounded set of journal files. Logs rotate, large text can be shortened, and bursts can drop records. This is a recent activity view, not a complete audit archive.</p>
|
|
114
|
+
<p>The journal records visible plans, tool metadata, and public output. Private reasoning and raw tool payloads are excluded. Known credentials and recognizable secret formats are redacted, but visible output can still include project text and file paths. Review it before sharing a screenshot or journal.</p>
|
|
115
|
+
<p>Studio’s server accepts local connections only and has no controls that modify your team or start model calls. Your running watchers continue to use their configured team and provider connections.</p>
|
|
116
|
+
<p><a href="/">Return to Agent Studio</a></p>
|
|
117
|
+
</section>
|
|
118
|
+
</main>
|
|
119
|
+
</div>
|
|
120
|
+
</div>
|
|
121
|
+
</body>
|
|
122
|
+
</html>
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
+
<meta name="color-scheme" content="light">
|
|
7
|
+
<meta name="description" content="A local view of your BYO agents, their work, and recorded progress.">
|
|
8
|
+
<title>Agent studio · OpenVisio</title>
|
|
9
|
+
<link rel="stylesheet" href="/style.css">
|
|
10
|
+
<script type="module" src="/app.mjs"></script>
|
|
11
|
+
</head>
|
|
12
|
+
<body>
|
|
13
|
+
<svg class="icon-definitions" xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><defs>
|
|
14
|
+
<symbol id="i-grid" viewBox="0 0 24 24"><rect x="3" y="3" width="7" height="7" rx="2"/><rect x="14" y="3" width="7" height="7" rx="2"/><rect x="3" y="14" width="7" height="7" rx="2"/><rect x="14" y="14" width="7" height="7" rx="2"/></symbol>
|
|
15
|
+
<symbol id="i-pulse" viewBox="0 0 24 24"><path d="M3 12h4l3-7 4 14 3-7h4"/></symbol>
|
|
16
|
+
<symbol id="i-stack" viewBox="0 0 24 24"><path d="m3 7 9-4 9 4-9 4-9-4Zm0 5 9 4 9-4M3 17l9 4 9-4"/></symbol>
|
|
17
|
+
<symbol id="i-terminal" viewBox="0 0 24 24"><rect x="3" y="4" width="18" height="16" rx="3"/><path d="m7 9 3 3-3 3m6 0h4"/></symbol>
|
|
18
|
+
<symbol id="i-arrow" viewBox="0 0 24 24"><path d="M5 12h14m-5-5 5 5-5 5"/></symbol>
|
|
19
|
+
<symbol id="i-search" viewBox="0 0 24 24"><circle cx="10.5" cy="10.5" r="6.5"/><path d="m16 16 4 4"/></symbol>
|
|
20
|
+
<symbol id="i-pause" viewBox="0 0 24 24"><path d="M8 5v14M16 5v14"/></symbol>
|
|
21
|
+
<symbol id="i-play" viewBox="0 0 24 24"><path d="m8 5 11 7-11 7V5Z"/></symbol>
|
|
22
|
+
<symbol id="i-check" viewBox="0 0 24 24"><path d="m5 12 4 4L19 6"/></symbol>
|
|
23
|
+
<symbol id="i-tool" viewBox="0 0 24 24"><path d="M14 5a6 6 0 0 0-7 8l-4 4a2.8 2.8 0 0 0 4 4l4-4a6 6 0 0 0 8-7l-4 4-4-4 4-4Z"/></symbol>
|
|
24
|
+
<symbol id="i-message" viewBox="0 0 24 24"><path d="M5 4h14a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2H9l-6 3V6a2 2 0 0 1 2-2Z"/><path d="M7 9h10M7 13h7"/></symbol>
|
|
25
|
+
<symbol id="i-list" viewBox="0 0 24 24"><path d="m3 6 1 1 2-2m3 1h12M3 12h3m3 0h12M3 18h3m3 0h12"/></symbol>
|
|
26
|
+
<symbol id="i-clock" viewBox="0 0 24 24"><circle cx="12" cy="12" r="9"/><path d="M12 7v5l3 2"/></symbol>
|
|
27
|
+
<symbol id="i-close" viewBox="0 0 24 24"><path d="m6 6 12 12M6 18 18 6"/></symbol>
|
|
28
|
+
<symbol id="i-copy" viewBox="0 0 24 24"><rect x="8" y="8" width="12" height="13" rx="2"/><path d="M16 8V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h3"/></symbol>
|
|
29
|
+
</defs></svg>
|
|
30
|
+
<a class="skip-link" href="#workspace">Skip to activity</a>
|
|
31
|
+
<div class="app-shell">
|
|
32
|
+
<aside class="sidebar" aria-label="Agent navigation">
|
|
33
|
+
<a class="brand" href="/" aria-label="OpenVisio Agent studio"><span class="brand-mark"><svg class="icon" aria-hidden="true"><use href="#i-grid"/></svg></span><span>OpenVisio<span class="brand-caption">Local workspace</span></span></a>
|
|
34
|
+
<div class="sidebar-title"><span>Agents</span><span class="count" id="agent-count">0</span></div>
|
|
35
|
+
<label class="agent-search"><svg class="icon" aria-hidden="true"><use href="#i-search"/></svg><input id="agent-search" type="search" placeholder="Find an agent" aria-label="Filter agent list" autocomplete="off"></label>
|
|
36
|
+
<nav id="agent-list" class="agent-list" aria-label="Select an agent"><button class="agent-item is-selected" type="button" aria-pressed="true"><span class="agent-avatar"><svg class="icon" aria-hidden="true"><use href="#i-grid"/></svg></span><span class="agent-text"><span class="agent-name">All agents</span><span class="agent-caption">Waiting for data</span></span></button></nav>
|
|
37
|
+
<div class="sidebar-note"><span class="local-indicator"><span class="dot"></span>On this machine</span><p>Recorded actions from your running BYO agents.</p><span class="mono" id="server-address">localhost:4317</span></div>
|
|
38
|
+
</aside>
|
|
39
|
+
<main id="workspace" class="workspace" tabindex="-1">
|
|
40
|
+
<header class="page-header">
|
|
41
|
+
<div><div class="eyebrow">Runtime overview <span id="demo-badge" class="badge demo-badge" hidden>Demo data</span></div><h1>Agent studio</h1><p class="page-description">See what your agents are doing, as it happens.</p></div>
|
|
42
|
+
<div class="header-actions"><a class="button" href="/guide">User guide</a><span id="connection-status" class="connection-status" role="status"><span class="dot"></span><span>Connecting</span></span><button id="pause-button" class="button" type="button" aria-pressed="false"><svg class="icon" aria-hidden="true"><use href="#i-pause"/></svg><span>Pause view</span></button></div>
|
|
43
|
+
</header>
|
|
44
|
+
<div id="notice" class="notice" role="status" hidden></div>
|
|
45
|
+
<section class="metrics" aria-label="Workspace summary">
|
|
46
|
+
<article class="metric"><div class="metric-label">Active cycles<svg class="icon" aria-hidden="true"><use href="#i-pulse"/></svg></div><div class="metric-value" id="metric-active">—</div><div class="metric-caption" id="metric-active-caption">Waiting for activity</div></article>
|
|
47
|
+
<article class="metric"><div class="metric-label">In the queue<svg class="icon" aria-hidden="true"><use href="#i-stack"/></svg></div><div class="metric-value" id="metric-queued">—</div><div class="metric-caption" id="metric-queued-caption">Cycles waiting to start</div></article>
|
|
48
|
+
<article class="metric"><div class="metric-label">Processes<svg class="icon" aria-hidden="true"><use href="#i-terminal"/></svg></div><div class="metric-value" id="metric-processes">—</div><div class="metric-caption" id="metric-processes-caption">Watchers and coding runtimes</div></article>
|
|
49
|
+
<article class="metric"><div class="metric-label">Recorded events<svg class="icon" aria-hidden="true"><use href="#i-list"/></svg></div><div class="metric-value" id="metric-events">—</div><div class="metric-caption" id="metric-events-caption">Recent local history</div></article>
|
|
50
|
+
</section>
|
|
51
|
+
<section class="work-panel" aria-label="Agent activity">
|
|
52
|
+
<div class="panel-toolbar"><div class="view-tabs" role="group" aria-label="Choose a view"><button class="tab is-selected" type="button" data-view="activity" aria-pressed="true"><svg class="icon" aria-hidden="true"><use href="#i-pulse"/></svg>Activity</button><button class="tab" type="button" data-view="cycles" aria-pressed="false"><svg class="icon" aria-hidden="true"><use href="#i-stack"/></svg>Cycles</button><button class="tab" type="button" data-view="processes" aria-pressed="false"><svg class="icon" aria-hidden="true"><use href="#i-terminal"/></svg>Processes</button></div><label class="follow-control"><input type="checkbox" id="follow-latest" checked>Follow latest</label></div>
|
|
53
|
+
<div class="filters"><label class="search-field"><svg class="icon" aria-hidden="true"><use href="#i-search"/></svg><input id="event-search" type="search" placeholder="Search actions, tickets, files…" aria-label="Search recorded activity" autocomplete="off"></label><label class="select-field"><span class="sr-only">Event kind</span><select id="kind-filter"><option value="all">All kinds</option><option value="cycle">Cycles</option><option value="tool">Tools</option><option value="plan">Plans</option><option value="output">Output</option><option value="process">Processes</option><option value="runtime">Watchers</option></select></label><label class="select-field"><span class="sr-only">Status</span><select id="status-filter"><option value="all">All statuses</option><option value="active">Active</option><option value="queued">Queued</option><option value="completed">Completed</option><option value="failed">Failed</option><option value="cancelled">Cancelled</option><option value="blocked">Blocked</option><option value="skipped">Skipped</option><option value="recovering">Recovering</option><option value="idle">Idle</option><option value="connecting">Connecting</option><option value="timeout">Timed out</option><option value="offline">Offline</option></select></label></div>
|
|
54
|
+
<div class="content-grid"><div class="activity-panel"><div class="section-heading"><h2 id="activity-heading">Latest activity</h2><span class="muted" id="result-count">Connecting…</span></div><div id="activity-list" class="activity-list" aria-label="Recorded activity"><div class="loading-state" role="status"><span class="skeleton skeleton-wide"></span><span class="skeleton"></span><span class="skeleton skeleton-wide"></span><span>Connecting to your local agents…</span></div></div><button id="load-more" class="button load-more" type="button" hidden>Show earlier activity</button></div><aside id="inspector" class="inspector" tabindex="-1" aria-label="Selected activity details"><div class="inspector-empty"><span class="empty-icon"><svg class="icon" aria-hidden="true"><use href="#i-terminal"/></svg></span><h2>The work, in view</h2><p>Select a cycle to see its tools, explicit plan, and recorded output.</p></div></aside></div>
|
|
55
|
+
</section>
|
|
56
|
+
<footer class="page-footer"><span id="history-label">Local history · no events yet</span><span id="updated-at">Waiting for the first snapshot</span></footer>
|
|
57
|
+
</main>
|
|
58
|
+
</div>
|
|
59
|
+
<div id="toast" class="toast" role="status" hidden></div>
|
|
60
|
+
</body>
|
|
61
|
+
</html>
|
package/studio/style.css
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
@layer tokens, base, components, responsive;
|
|
2
|
+
|
|
3
|
+
@layer tokens {
|
|
4
|
+
:root {
|
|
5
|
+
--ink: #292929;
|
|
6
|
+
--background: #fff;
|
|
7
|
+
--surface: #fff;
|
|
8
|
+
--stage: #f6f6f6;
|
|
9
|
+
--foreground: var(--ink);
|
|
10
|
+
--muted: color-mix(in oklab, var(--ink) 72%, white);
|
|
11
|
+
--subtle: color-mix(in oklab, var(--ink) 68%, white);
|
|
12
|
+
--border: color-mix(in oklab, var(--ink) 12%, transparent);
|
|
13
|
+
--hover: color-mix(in oklab, var(--ink) 5%, transparent);
|
|
14
|
+
--input: color-mix(in oklab, var(--ink) 14%, transparent);
|
|
15
|
+
--primary: #305dde;
|
|
16
|
+
--success: #28764f;
|
|
17
|
+
--warning: #97691f;
|
|
18
|
+
--destructive: #b7423c;
|
|
19
|
+
--radius: .625rem;
|
|
20
|
+
--radius-sm: calc(var(--radius) * 1.4);
|
|
21
|
+
--radius-md: calc(var(--radius) * 1.8);
|
|
22
|
+
--radius-lg: calc(var(--radius) * 2.2);
|
|
23
|
+
--radius-xl: calc(var(--radius) * 2.6);
|
|
24
|
+
--font-sans: "Inter Tight", Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
25
|
+
--font-mono: "Geist Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@layer base {
|
|
30
|
+
* { box-sizing: border-box; }
|
|
31
|
+
html { min-width: 320px; background: var(--background); }
|
|
32
|
+
body { margin: 0; color: var(--foreground); font-family: var(--font-sans); font-size: 13px; line-height: 1.5; -webkit-font-smoothing: antialiased; }
|
|
33
|
+
button, input, select { font: inherit; color: inherit; }
|
|
34
|
+
button, select, input[type="checkbox"] { cursor: pointer; }
|
|
35
|
+
button { font-weight: 500; }
|
|
36
|
+
button, input, select { -webkit-tap-highlight-color: transparent; }
|
|
37
|
+
button:disabled { cursor: default; opacity: .6; }
|
|
38
|
+
button, a, input, select, summary { touch-action: manipulation; }
|
|
39
|
+
:focus-visible { outline: 2px solid var(--primary); outline-offset: 3px; }
|
|
40
|
+
button, select, a { transition: background-color .16s ease-out, color .16s ease-out, box-shadow .16s ease-out; }
|
|
41
|
+
h1, h2, h3, h4, p { margin: 0; }
|
|
42
|
+
h1, h2, h3, h4, strong { font-weight: 500; }
|
|
43
|
+
h1 { font-size: 30px; letter-spacing: -1.15px; line-height: 1.3; }
|
|
44
|
+
h2 { font-size: 14px; letter-spacing: -.2px; }
|
|
45
|
+
h3 { font-size: 12px; }
|
|
46
|
+
a { color: inherit; }
|
|
47
|
+
input { min-width: 0; }
|
|
48
|
+
input::placeholder { color: var(--subtle); }
|
|
49
|
+
[hidden] { display: none !important; }
|
|
50
|
+
.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }
|
|
51
|
+
.icon-definitions { position: absolute; width: 0; height: 0; overflow: hidden; }
|
|
52
|
+
.icon { width: 17px; height: 17px; flex-shrink: 0; fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }
|
|
53
|
+
.mono { font-family: var(--font-mono); font-size: 11px; font-variant-numeric: tabular-nums; }
|
|
54
|
+
.muted { color: var(--muted); font-size: 11px; }
|
|
55
|
+
.dot { display: inline-block; width: 6px; height: 6px; border-radius: 50%; background: currentColor; flex-shrink: 0; }
|
|
56
|
+
.skip-link { position: fixed; top: 10px; left: 10px; z-index: 5; transform: translateY(-180%); padding: 10px 18px; background: var(--surface); border: 1px solid var(--border); border-radius: 999px; }
|
|
57
|
+
.skip-link:focus { transform: translateY(0); }
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
@layer components {
|
|
61
|
+
.app-shell { display: grid; grid-template-columns: 214px minmax(0, 1fr); min-height: 100dvh; }
|
|
62
|
+
.sidebar { display: flex; flex-direction: column; padding: 27px 14px 20px; border-right: 1px solid var(--border); min-width: 0; }
|
|
63
|
+
.brand { display: flex; align-items: center; gap: 10px; margin: 0 10px 42px; text-decoration: none; font-size: 14px; font-weight: 500; letter-spacing: -.25px; }
|
|
64
|
+
.brand-mark { display: grid; place-items: center; width: 33px; height: 33px; color: white; background: var(--ink); border-radius: 10px; corner-shape: squircle; }
|
|
65
|
+
.brand-mark .icon { width: 19px; height: 19px; stroke-width: 1.5; }
|
|
66
|
+
.brand-caption { display: block; color: var(--muted); font-weight: 400; font-size: 10px; letter-spacing: 0; margin-top: 1px; }
|
|
67
|
+
.sidebar-title { display: flex; align-items: center; justify-content: space-between; padding: 0 10px; margin-bottom: 13px; font-size: 11px; font-weight: 500; color: var(--muted); }
|
|
68
|
+
.count { font-size: 10px; background: var(--stage); min-width: 22px; height: 19px; display: grid; place-items: center; border-radius: 999px; font-variant-numeric: tabular-nums; }
|
|
69
|
+
.agent-search { display: flex; align-items: center; gap: 7px; padding: 8px 10px; margin: 0 0 12px; color: var(--subtle); }
|
|
70
|
+
.agent-search .icon { width: 14px; height: 14px; }
|
|
71
|
+
.agent-search input { width: 100%; border: 0; outline-offset: 5px; background: transparent; font-size: 11px; }
|
|
72
|
+
.agent-list { display: flex; flex-direction: column; gap: 5px; }
|
|
73
|
+
.agent-item { display: flex; align-items: center; gap: 10px; width: 100%; text-align: left; border: 0; background: transparent; padding: 10px; border-radius: var(--radius-md); corner-shape: squircle; }
|
|
74
|
+
.agent-item:hover { background: var(--hover); }
|
|
75
|
+
.agent-item.is-selected { background: var(--stage); }
|
|
76
|
+
.agent-avatar { width: 31px; height: 31px; display: grid; place-items: center; position: relative; flex-shrink: 0; background: var(--surface); border: 1px solid var(--border); border-radius: 10px; corner-shape: squircle; color: var(--muted); font-size: 11px; font-weight: 500; }
|
|
77
|
+
.avatar-status { position: absolute; width: 7px; height: 7px; right: -1px; bottom: -1px; border-radius: 50%; border: 2px solid var(--background); box-sizing: content-box; background: var(--subtle); }
|
|
78
|
+
.avatar-status.online { background: var(--success); }
|
|
79
|
+
.agent-text { flex: 1; min-width: 0; }
|
|
80
|
+
.agent-name { display: block; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; font-size: 12px; font-weight: 500; }
|
|
81
|
+
.agent-caption { display: block; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; color: var(--muted); font-size: 10px; font-weight: 400; margin-top: 2px; }
|
|
82
|
+
.sidebar-note { margin: auto 10px 0; padding-top: 52px; font-size: 10px; color: var(--muted); }
|
|
83
|
+
.sidebar-note p { margin: 10px 0 8px; line-height: 1.7; }
|
|
84
|
+
.sidebar-note .mono { font-size: 9px; color: var(--subtle); }
|
|
85
|
+
.local-indicator { display: flex; align-items: center; gap: 6px; font-weight: 500; color: var(--ink); }
|
|
86
|
+
.workspace { padding: 31px 34px 18px; min-width: 0; max-width: 1860px; width: 100%; margin: 0 auto; }
|
|
87
|
+
.page-header { display: flex; align-items: center; justify-content: space-between; gap: 20px; margin-bottom: 28px; }
|
|
88
|
+
.eyebrow { display: flex; align-items: center; gap: 8px; font-size: 10px; color: var(--muted); margin-bottom: 5px; }
|
|
89
|
+
.page-description { color: var(--muted); font-size: 12px; margin-top: 7px; }
|
|
90
|
+
.header-actions { display: flex; align-items: center; gap: 16px; }
|
|
91
|
+
.connection-status { display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; font-size: 11px; color: var(--muted); }
|
|
92
|
+
.connection-status.connected { color: var(--success); }
|
|
93
|
+
.connection-status.disconnected { color: var(--warning); }
|
|
94
|
+
.button { display: inline-flex; align-items: center; justify-content: center; gap: 7px; min-height: 34px; padding: 7px 13px; background: var(--surface); border: 1px solid var(--border); border-radius: 999px; white-space: nowrap; font-size: 11px; box-shadow: 0 1px 1px color-mix(in oklab, var(--ink) 3%, transparent); }
|
|
95
|
+
.button:hover { background: var(--hover); }
|
|
96
|
+
.button .icon { width: 14px; height: 14px; }
|
|
97
|
+
.button.primary { color: white; background: var(--primary); border-color: transparent; }
|
|
98
|
+
.button.primary:hover { background: color-mix(in oklab, var(--primary) 90%, var(--ink)); }
|
|
99
|
+
.notice { padding: 11px 15px; background: var(--stage); border-radius: var(--radius-sm); font-size: 11px; margin-bottom: 18px; color: var(--muted); overflow-wrap: anywhere; }
|
|
100
|
+
.metrics { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; margin-bottom: 28px; }
|
|
101
|
+
.metric { padding: 15px 16px 14px; background: var(--stage); border-radius: var(--radius-lg); corner-shape: squircle; min-width: 0; }
|
|
102
|
+
.metric-label { display: flex; align-items: center; justify-content: space-between; font-size: 11px; color: var(--muted); }
|
|
103
|
+
.metric-label .icon { width: 15px; height: 15px; opacity: .7; }
|
|
104
|
+
.metric-value { font-size: 29px; font-weight: 400; line-height: 1.4; margin: 9px 0 2px; font-variant-numeric: tabular-nums; letter-spacing: -1px; }
|
|
105
|
+
.metric-caption { font-size: 10px; color: var(--muted); min-height: 15px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
106
|
+
.work-panel { min-width: 0; }
|
|
107
|
+
.panel-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 16px; margin-bottom: 16px; }
|
|
108
|
+
.view-tabs { display: inline-flex; gap: 2px; padding: 4px; background: var(--stage); border-radius: 999px; }
|
|
109
|
+
.tab { display: inline-flex; align-items: center; gap: 7px; border: 0; border-radius: 999px; padding: 8px 13px; color: var(--muted); background: transparent; font-size: 11px; }
|
|
110
|
+
.tab .icon { width: 14px; height: 14px; }
|
|
111
|
+
.tab:hover { color: var(--ink); }
|
|
112
|
+
.tab.is-selected { color: var(--ink); background: var(--surface); box-shadow: 0 1px 4px color-mix(in oklab, var(--ink) 8%, transparent); }
|
|
113
|
+
.follow-control { display: flex; align-items: center; gap: 6px; color: var(--muted); font-size: 10px; white-space: nowrap; cursor: pointer; }
|
|
114
|
+
.follow-control input { accent-color: var(--primary); width: 13px; height: 13px; margin: 0; }
|
|
115
|
+
.filters { display: flex; gap: 9px; margin-bottom: 19px; }
|
|
116
|
+
.search-field { flex: 1; min-width: 90px; display: flex; align-items: center; gap: 9px; border: 1px solid var(--border); border-radius: 999px; padding: 8px 12px; color: var(--subtle); }
|
|
117
|
+
.search-field .icon { width: 14px; height: 14px; }
|
|
118
|
+
.search-field input { width: 100%; background: transparent; border: 0; font-size: 11px; outline-offset: 4px; }
|
|
119
|
+
.select-field { display: inline-flex; align-items: center; min-width: 108px; }
|
|
120
|
+
.select-field select { width: 100%; min-height: 34px; padding: 7px 26px 7px 12px; border: 1px solid var(--border); border-radius: 999px; background-color: var(--surface); font-size: 11px; }
|
|
121
|
+
.content-grid { display: grid; grid-template-columns: minmax(300px, 1.1fr) minmax(300px, 1fr); gap: 14px; align-items: start; }
|
|
122
|
+
.activity-panel { min-width: 0; }
|
|
123
|
+
.section-heading { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 4px 2px 15px; min-height: 37px; }
|
|
124
|
+
.section-heading h2 { font-size: 12px; }
|
|
125
|
+
.section-heading .muted { font-size: 10px; }
|
|
126
|
+
.activity-list { display: flex; flex-direction: column; gap: 4px; max-height: min(67vh, 810px); min-height: 380px; overflow: auto; overscroll-behavior: contain; scrollbar-width: thin; padding: 2px; }
|
|
127
|
+
.activity-row { display: flex; align-items: flex-start; gap: 11px; text-align: left; width: 100%; padding: 13px 11px; border: 1px solid transparent; border-radius: var(--radius-md); corner-shape: squircle; background: transparent; }
|
|
128
|
+
.activity-row:hover { background: var(--hover); }
|
|
129
|
+
.activity-row.is-selected { background: var(--stage); border-color: var(--border); }
|
|
130
|
+
.event-icon { width: 29px; height: 29px; display: grid; place-items: center; flex-shrink: 0; color: var(--muted); background: var(--surface); border: 1px solid var(--border); border-radius: 10px; corner-shape: squircle; margin-top: 1px; }
|
|
131
|
+
.event-icon .icon { width: 14px; height: 14px; }
|
|
132
|
+
.event-body { min-width: 0; flex: 1; }
|
|
133
|
+
.event-title { display: block; font-size: 11px; font-weight: 500; line-height: 1.55; overflow-wrap: anywhere; }
|
|
134
|
+
.event-description { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; font-size: 10px; font-weight: 400; color: var(--muted); margin-top: 4px; line-height: 1.7; overflow-wrap: anywhere; }
|
|
135
|
+
.event-meta { display: flex; align-items: center; flex-wrap: wrap; gap: 5px 8px; font-size: 9px; font-weight: 400; color: var(--muted); margin-top: 7px; }
|
|
136
|
+
.event-meta .badge { font-size: 8px; padding: 1px 6px; }
|
|
137
|
+
.event-time { font-size: 9px; color: var(--subtle); white-space: nowrap; font-weight: 400; font-family: var(--font-mono); margin-top: 4px; }
|
|
138
|
+
.badge { display: inline-flex; align-items: center; gap: 4px; padding: 3px 8px; border-radius: 999px; background: var(--hover); color: var(--muted); font-size: 9px; font-weight: 400; white-space: nowrap; }
|
|
139
|
+
.badge .dot { width: 4px; height: 4px; }
|
|
140
|
+
.badge.active, .badge.completed, .badge.online { color: var(--success); }
|
|
141
|
+
.badge.queued, .badge.demo, .badge.connecting, .badge.recovering, .demo-badge { color: var(--warning); }
|
|
142
|
+
.badge.failed, .badge.cancelled, .badge.blocked, .badge.timeout { color: var(--destructive); }
|
|
143
|
+
.load-more { display: flex; margin: 15px auto 0; }
|
|
144
|
+
.inspector { padding: 17px; background: var(--stage); border-radius: var(--radius-xl); corner-shape: squircle; min-width: 0; min-height: 418px; max-height: min(77vh, 930px); overflow: auto; scrollbar-width: thin; overscroll-behavior: contain; }
|
|
145
|
+
.inspector-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 8px; margin: 0 0 15px; }
|
|
146
|
+
.inspector-eyebrow { font-size: 9px; color: var(--muted); margin-bottom: 6px; }
|
|
147
|
+
.inspector-title { font-size: 16px; line-height: 1.4; letter-spacing: -.4px; overflow-wrap: anywhere; }
|
|
148
|
+
.inspector-subtitle { font-size: 10px; color: var(--muted); margin-top: 4px; overflow-wrap: anywhere; }
|
|
149
|
+
.inspector-empty, .empty-state { display: flex; flex-direction: column; align-items: center; text-align: center; justify-content: center; padding: 40px 26px; min-height: 370px; }
|
|
150
|
+
.inspector-empty h2, .empty-state h2 { font-size: 14px; margin: 15px 0 8px; }
|
|
151
|
+
.inspector-empty p, .empty-state p { color: var(--muted); font-size: 11px; max-width: 280px; line-height: 1.8; }
|
|
152
|
+
.empty-icon { display: grid; place-items: center; width: 42px; height: 42px; background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-sm); corner-shape: squircle; color: var(--muted); }
|
|
153
|
+
.empty-icon .icon { width: 21px; height: 21px; }
|
|
154
|
+
.empty-state .command-copy { margin: 18px 0 11px; }
|
|
155
|
+
.command-copy { display: flex; width: 100%; max-width: 320px; align-items: center; justify-content: space-between; gap: 10px; padding: 11px 12px; border: 1px solid var(--border); background: var(--surface); border-radius: var(--radius-sm); corner-shape: squircle; text-align: left; }
|
|
156
|
+
.command-copy code { font-family: var(--font-mono); font-weight: 400; font-size: 10px; overflow-wrap: anywhere; }
|
|
157
|
+
.command-copy .icon { width: 14px; height: 14px; color: var(--muted); }
|
|
158
|
+
.detail-section { padding: 13px; background: var(--surface); border-radius: var(--radius-md); corner-shape: squircle; margin-top: 10px; min-width: 0; }
|
|
159
|
+
.detail-section h3 { display: flex; align-items: center; gap: 6px; margin-bottom: 11px; font-size: 11px; }
|
|
160
|
+
.detail-section h3 .icon { width: 13px; height: 13px; color: var(--muted); }
|
|
161
|
+
.detail-section h3 .count { margin-left: auto; }
|
|
162
|
+
.detail-grid { display: grid; grid-template-columns: minmax(55px, auto) minmax(0, 1fr); gap: 8px 14px; margin: 0; font-size: 10px; }
|
|
163
|
+
.detail-grid dt { color: var(--muted); }
|
|
164
|
+
.detail-grid dd { margin: 0; text-align: right; overflow-wrap: anywhere; }
|
|
165
|
+
.detail-grid dd.mono { font-size: 9px; }
|
|
166
|
+
.detail-note { font-size: 10px; line-height: 1.7; color: var(--muted); }
|
|
167
|
+
.plan-list { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 12px; }
|
|
168
|
+
.plan-step { display: flex; gap: 9px; align-items: flex-start; font-size: 10px; line-height: 1.7; }
|
|
169
|
+
.plan-marker { display: grid; place-items: center; flex-shrink: 0; width: 16px; height: 16px; border: 1px solid var(--border); color: var(--muted); border-radius: 50%; font-size: 8px; margin-top: 1px; }
|
|
170
|
+
.plan-marker .icon { width: 10px; height: 10px; }
|
|
171
|
+
.plan-step.completed { color: var(--muted); }
|
|
172
|
+
.plan-step.completed .plan-marker { color: var(--success); }
|
|
173
|
+
.plan-step.active .plan-marker { color: var(--primary); border-color: currentColor; }
|
|
174
|
+
.plan-content { flex: 1; min-width: 0; overflow-wrap: anywhere; }
|
|
175
|
+
.plan-status { font-size: 8px; color: var(--subtle); white-space: nowrap; }
|
|
176
|
+
.tools-list { display: flex; flex-direction: column; gap: 9px; }
|
|
177
|
+
.tool-item { min-width: 0; padding: 9px 10px; background: var(--stage); border-radius: var(--radius-sm); corner-shape: squircle; }
|
|
178
|
+
.tool-heading { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
|
|
179
|
+
.tool-name { min-width: 0; overflow-wrap: anywhere; font-size: 10px; font-weight: 500; }
|
|
180
|
+
.tool-title { margin-top: 7px; font-family: var(--font-mono); font-size: 9px; line-height: 1.75; color: var(--muted); white-space: pre-wrap; overflow-wrap: anywhere; max-height: 140px; overflow: auto; }
|
|
181
|
+
.file-location { display: block; font-family: var(--font-mono); font-size: 9px; color: var(--muted); margin-top: 5px; overflow-wrap: anywhere; }
|
|
182
|
+
.recorded-output { margin: 0; font-family: var(--font-mono); font-size: 10px; line-height: 1.9; white-space: pre-wrap; overflow-wrap: anywhere; max-height: 310px; overflow: auto; scrollbar-width: thin; }
|
|
183
|
+
.output-entry + .output-entry { margin-top: 13px; }
|
|
184
|
+
.history-details summary { cursor: pointer; font-size: 10px; color: var(--muted); padding: 2px 0; }
|
|
185
|
+
.history-details[open] summary { margin-bottom: 12px; }
|
|
186
|
+
.mini-event { display: flex; gap: 11px; font-size: 9px; line-height: 1.8; color: var(--muted); padding: 5px 0; }
|
|
187
|
+
.mini-event time { font-family: var(--font-mono); color: var(--subtle); white-space: nowrap; }
|
|
188
|
+
.mini-event span { overflow-wrap: anywhere; }
|
|
189
|
+
.page-footer { display: flex; justify-content: space-between; gap: 12px; color: var(--subtle); font-size: 9px; padding: 22px 2px 0; }
|
|
190
|
+
.loading-state { display: flex; flex-direction: column; gap: 14px; padding: 21px 12px; font-size: 10px; color: var(--muted); }
|
|
191
|
+
.skeleton { height: 14px; width: 55%; background: var(--stage); border-radius: 999px; }
|
|
192
|
+
.skeleton-wide { width: 85%; }
|
|
193
|
+
.toast { position: fixed; bottom: 23px; left: 50%; transform: translateX(-50%); max-width: calc(100vw - 32px); padding: 11px 18px; border: 1px solid var(--border); border-radius: 999px; background: var(--surface); box-shadow: 0 8px 30px color-mix(in oklab, var(--ink) 12%, transparent); font-size: 11px; z-index: 10; }
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
@layer responsive {
|
|
197
|
+
.guide-shell { max-width: 1080px; margin: auto; padding: 32px 24px 64px; font-size: 16px; line-height: 1.75; }
|
|
198
|
+
.guide-shell .button { font-size: 14px; min-height: 40px; text-decoration: none; }
|
|
199
|
+
.guide-header { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 16px; margin-bottom: 32px; }
|
|
200
|
+
.guide-header p { color: var(--muted); margin-top: 10px; max-width: 640px; }
|
|
201
|
+
.guide-layout { display: grid; grid-template-columns: 190px minmax(0, 1fr); gap: 40px; align-items: start; }
|
|
202
|
+
.guide-nav { position: sticky; top: 24px; display: flex; flex-direction: column; gap: 8px; font-size: 14px; }
|
|
203
|
+
.guide-nav a { padding: 5px 0; text-underline-offset: 4px; }
|
|
204
|
+
.guide-content { min-width: 0; }
|
|
205
|
+
.guide-content section { margin-bottom: 40px; scroll-margin-top: 24px; }
|
|
206
|
+
.guide-content h2 { font-size: 24px; margin-bottom: 14px; }
|
|
207
|
+
.guide-content h3 { font-size: 18px; margin: 24px 0 10px; }
|
|
208
|
+
.guide-content p, .guide-content ol, .guide-content ul, .guide-content dl { margin: 0 0 16px; }
|
|
209
|
+
.guide-content li { margin: 8px 0; }
|
|
210
|
+
.guide-content pre { margin: 12px 0 18px; padding: 16px; border-radius: var(--radius-md); background: var(--stage); white-space: pre-wrap; overflow-wrap: anywhere; font-size: 14px; }
|
|
211
|
+
.guide-content code, .guide-content kbd { font-family: var(--font-mono); font-size: .9em; overflow-wrap: anywhere; }
|
|
212
|
+
.guide-content dt { font-weight: 500; margin-top: 16px; }
|
|
213
|
+
.guide-content dd { margin: 4px 0 16px; color: var(--muted); }
|
|
214
|
+
.guide-content a { color: var(--primary); text-underline-offset: 3px; }
|
|
215
|
+
.guide-callout { padding: 18px; border-radius: var(--radius-md); background: var(--stage); }
|
|
216
|
+
@media print { .guide-nav, .guide-header .button, .skip-link { display: none; } .guide-layout { display: block; } .guide-shell { max-width: none; padding: 0; } .guide-content section { break-inside: avoid; } }
|
|
217
|
+
@media (max-width: 640px) { .guide-shell { padding: 24px 20px; } .guide-layout { grid-template-columns: minmax(0, 1fr); gap: 24px; } .guide-nav { position: static; } .panel-toolbar { flex-wrap: wrap; } }
|
|
218
|
+
@media (min-width: 1550px) { .workspace { padding: 38px 46px 22px; } .content-grid { grid-template-columns: minmax(400px, 1.2fr) minmax(350px, 1fr); gap: 24px; } .activity-row { padding: 15px; } .inspector { padding: 21px; } }
|
|
219
|
+
@media (max-width: 1120px) { .app-shell { grid-template-columns: 185px minmax(0, 1fr); } .sidebar { padding-inline: 10px; } .workspace { padding: 27px 22px 18px; } .content-grid { grid-template-columns: minmax(250px, 1fr) minmax(270px, 1fr); } .metric { padding: 13px; } .metrics { gap: 8px; } .header-actions { gap: 10px; } .metric-caption { font-size: 9px; } }
|
|
220
|
+
@media (max-width: 940px) { .content-grid { grid-template-columns: minmax(0, 1fr); } .inspector { max-height: none; min-height: 220px; } .inspector-empty { min-height: 200px; } .activity-list { min-height: 250px; max-height: 440px; } .metrics { grid-template-columns: repeat(2, minmax(0, 1fr)); } .page-header { align-items: flex-start; } .header-actions { flex-direction: column; align-items: flex-end; padding-top: 7px; gap: 13px; } .page-description { max-width: 230px; } }
|
|
221
|
+
@media (max-width: 640px) { .app-shell { grid-template-columns: minmax(0, 1fr); } .sidebar { padding: 16px 18px 8px; border-right: 0; } .brand { margin: 0 0 16px; font-size: 13px; } .brand-caption { display: none; } .brand-mark { width: 28px; height: 28px; } .brand-mark .icon { width: 17px; height: 17px; } .sidebar-title, .agent-search, .sidebar-note { display: none; } .agent-list { flex-direction: row; overflow-x: auto; padding: 2px 2px 7px; gap: 6px; } .agent-item { width: auto; min-width: 132px; max-width: 170px; padding: 8px; flex-shrink: 0; } .agent-avatar { width: 25px; height: 25px; font-size: 9px; } .agent-name { font-size: 10px; } .agent-caption { font-size: 9px; } .workspace { padding: 17px 18px 20px; } .page-header { margin-bottom: 22px; gap: 10px; } h1 { font-size: 27px; } .page-description { font-size: 11px; max-width: 210px; } .eyebrow { font-size: 9px; } .header-actions .button { min-height: 30px; font-size: 10px; padding: 6px 10px; } .connection-status { font-size: 10px; } .metrics { margin-bottom: 22px; } .metric-value { font-size: 27px; } .metric-label { font-size: 10px; } .panel-toolbar { gap: 8px; } .tab { padding: 7px 9px; font-size: 10px; gap: 5px; } .tab .icon { width: 12px; height: 12px; } .follow-control { font-size: 9px; gap: 4px; } .filters { flex-wrap: wrap; gap: 7px; } .search-field { flex-basis: 100%; } .select-field { flex: 1; } .select-field select { font-size: 10px; } .content-grid { gap: 20px; } .page-footer { flex-direction: column; gap: 4px; } .event-time { font-size: 8px; } .activity-row { gap: 8px; padding: 12px 8px; } .inspector { padding: 14px; } }
|
|
222
|
+
@media (prefers-reduced-motion: reduce) { *, *::before, *::after { transition-duration: 0s !important; animation-duration: 0s !important; scroll-behavior: auto !important; } }
|
|
223
|
+
}
|