@tt-a1i/hive 0.6.0-alpha.0 → 0.6.0-alpha.2
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 +61 -2
- package/README.md +166 -90
- package/README.zh-CN.md +213 -0
- package/SECURITY.md +1 -2
- package/assets/hive-hero.png +0 -0
- package/dist/src/server/agent-runtime.js +3 -0
- package/dist/src/server/agent-runtime.js.map +1 -1
- package/dist/src/server/routes-workspaces.js +12 -7
- package/dist/src/server/routes-workspaces.js.map +1 -1
- package/dist/src/server/runtime-store-helpers.d.ts +2 -0
- package/dist/src/server/runtime-store-helpers.js +10 -0
- package/dist/src/server/runtime-store-helpers.js.map +1 -1
- package/dist/src/server/runtime-store.d.ts +1 -0
- package/dist/src/server/runtime-store.js +1 -0
- package/dist/src/server/runtime-store.js.map +1 -1
- package/dist/src/server/team-list-serializer.d.ts +2 -8
- package/dist/src/server/team-list-serializer.js +2 -1
- package/dist/src/server/team-list-serializer.js.map +1 -1
- package/dist/src/server/terminal-state-mirror.d.ts +6 -0
- package/dist/src/server/terminal-state-mirror.js +21 -0
- package/dist/src/server/terminal-state-mirror.js.map +1 -1
- package/dist/src/server/worker-output-tracker.d.ts +14 -0
- package/dist/src/server/worker-output-tracker.js +51 -0
- package/dist/src/server/worker-output-tracker.js.map +1 -0
- package/dist/src/shared/types.d.ts +3 -0
- package/package.json +2 -1
- package/web/dist/assets/index-BGhNuRRP.css +1 -0
- package/web/dist/assets/index-D8sy4JED.js +75 -0
- package/web/dist/index.html +2 -2
- package/web/dist/assets/index-CjlaoOoA.css +0 -1
- package/web/dist/assets/index-CwdRvXrs.js +0 -63
|
@@ -5,12 +5,17 @@ import { authenticateCliAgent, requireCommandForRole } from './team-authz.js';
|
|
|
5
5
|
import { serializeTeamListItem } from './team-list-serializer.js';
|
|
6
6
|
import { requireUiTokenFromRequest } from './ui-auth-helpers.js';
|
|
7
7
|
import { getOrchestratorId } from './workspace-store-support.js';
|
|
8
|
-
const
|
|
9
|
-
const
|
|
8
|
+
const enrichWithLastOutput = (workspaceId, store, workers) => workers.map((worker) => {
|
|
9
|
+
const line = store.getLastOutputLineForAgent(workspaceId, worker.id);
|
|
10
|
+
return line === null ? worker : { ...worker, lastOutputLine: line };
|
|
11
|
+
});
|
|
12
|
+
const getSerializedWorker = (workspaceId, workerId, store) => {
|
|
13
|
+
const worker = store.listWorkers(workspaceId).find((item) => item.id === workerId);
|
|
10
14
|
if (!worker) {
|
|
11
15
|
throw new Error(`Worker not found: ${workerId}`);
|
|
12
16
|
}
|
|
13
|
-
|
|
17
|
+
const line = store.getLastOutputLineForAgent(workspaceId, workerId);
|
|
18
|
+
return serializeTeamListItem(line === null ? worker : { ...worker, lastOutputLine: line });
|
|
14
19
|
};
|
|
15
20
|
const getRuntimePort = (request) => String(request.socket.localPort ?? '');
|
|
16
21
|
export const workspaceRoutes = [
|
|
@@ -53,7 +58,7 @@ export const workspaceRoutes = [
|
|
|
53
58
|
return;
|
|
54
59
|
}
|
|
55
60
|
requireUiTokenFromRequest(request, store.validateUiToken);
|
|
56
|
-
sendJson(response, 200, store.listWorkers(workspaceId).map(serializeTeamListItem));
|
|
61
|
+
sendJson(response, 200, enrichWithLastOutput(workspaceId, store, store.listWorkers(workspaceId)).map(serializeTeamListItem));
|
|
57
62
|
}),
|
|
58
63
|
route('GET', '/api/workspaces/:workspaceId/team', ({ params, request, response, store }) => {
|
|
59
64
|
const workspaceId = getRequiredParam(response, params, 'workspaceId', 'Workspace id is required');
|
|
@@ -70,7 +75,7 @@ export const workspaceRoutes = [
|
|
|
70
75
|
workspaceId,
|
|
71
76
|
});
|
|
72
77
|
requireCommandForRole(agent, 'list');
|
|
73
|
-
sendJson(response, 200, store.listWorkers(workspaceId).map(serializeTeamListItem));
|
|
78
|
+
sendJson(response, 200, enrichWithLastOutput(workspaceId, store, store.listWorkers(workspaceId)).map(serializeTeamListItem));
|
|
74
79
|
}),
|
|
75
80
|
route('POST', '/api/workspaces/:workspaceId/workers', async ({ params, request, response, store }) => {
|
|
76
81
|
const workspaceId = getRequiredParam(response, params, 'workspaceId', 'Workspace id is required');
|
|
@@ -97,7 +102,7 @@ export const workspaceRoutes = [
|
|
|
97
102
|
})
|
|
98
103
|
: { ok: false, error: null, run_id: null };
|
|
99
104
|
sendJson(response, 201, {
|
|
100
|
-
...getSerializedWorker(workspaceId, worker.id, store
|
|
105
|
+
...getSerializedWorker(workspaceId, worker.id, store),
|
|
101
106
|
agent_start: agentStart,
|
|
102
107
|
});
|
|
103
108
|
}),
|
|
@@ -125,7 +130,7 @@ export const workspaceRoutes = [
|
|
|
125
130
|
return;
|
|
126
131
|
}
|
|
127
132
|
store.renameWorker(workspaceId, workerId, body.name);
|
|
128
|
-
sendJson(response, 200, getSerializedWorker(workspaceId, workerId, store
|
|
133
|
+
sendJson(response, 200, getSerializedWorker(workspaceId, workerId, store));
|
|
129
134
|
}),
|
|
130
135
|
route('POST', '/api/workspaces/:workspaceId/user-input', async ({ params, request, response, store }) => {
|
|
131
136
|
const workspaceId = getRequiredParam(response, params, 'workspaceId', 'Workspace id is required');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes-workspaces.js","sourceRoot":"","sources":["../../../src/server/routes-workspaces.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA;AACnF,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAA;AACvE,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAQpF,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAA;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAEhE,MAAM,
|
|
1
|
+
{"version":3,"file":"routes-workspaces.js","sourceRoot":"","sources":["../../../src/server/routes-workspaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@ import { createTasksFileService } from './tasks-file.js';
|
|
|
11
11
|
import { createTasksFileWatcher } from './tasks-file-watcher.js';
|
|
12
12
|
import { createTeamOperations } from './team-operations.js';
|
|
13
13
|
import { createUiAuth } from './ui-auth.js';
|
|
14
|
+
import { type WorkerOutputTracker } from './worker-output-tracker.js';
|
|
14
15
|
import { createWorkspaceStore } from './workspace-store.js';
|
|
15
16
|
export interface RuntimeStoreServices {
|
|
16
17
|
agentRunStore: ReturnType<typeof createAgentRunStore>;
|
|
@@ -24,6 +25,7 @@ export interface RuntimeStoreServices {
|
|
|
24
25
|
tasksFileService: ReturnType<typeof createTasksFileService>;
|
|
25
26
|
teamOps: ReturnType<typeof createTeamOperations>;
|
|
26
27
|
uiAuth: ReturnType<typeof createUiAuth>;
|
|
28
|
+
workerOutputTracker: WorkerOutputTracker | null;
|
|
27
29
|
workspaceStore: ReturnType<typeof createWorkspaceStore>;
|
|
28
30
|
}
|
|
29
31
|
interface CreateRuntimeStoreServicesOptions {
|
|
@@ -11,6 +11,7 @@ import { createTasksFileService } from './tasks-file.js';
|
|
|
11
11
|
import { createTasksFileWatcher } from './tasks-file-watcher.js';
|
|
12
12
|
import { createTeamOperations } from './team-operations.js';
|
|
13
13
|
import { createUiAuth } from './ui-auth.js';
|
|
14
|
+
import { createWorkerOutputTracker } from './worker-output-tracker.js';
|
|
14
15
|
import { createWorkspaceStore } from './workspace-store.js';
|
|
15
16
|
const notifyTasksUpdated = (callbacks, workspaceId, content) => {
|
|
16
17
|
for (const callback of callbacks) {
|
|
@@ -46,7 +47,11 @@ export const createRuntimeStoreServices = (options = {}) => {
|
|
|
46
47
|
tasksFileService,
|
|
47
48
|
workspaceStore,
|
|
48
49
|
});
|
|
50
|
+
const workerOutputTracker = options.agentManager
|
|
51
|
+
? createWorkerOutputTracker(options.agentManager.getOutputBus())
|
|
52
|
+
: null;
|
|
49
53
|
const agentRuntime = createAgentRuntime(options.agentManager, agentRunStore, agentSessionStore, settings.getCommandPreset, (workspaceId, agentId) => {
|
|
54
|
+
workerOutputTracker?.detach(workspaceId, agentId);
|
|
50
55
|
if (!workspaceStore.hasAgent(workspaceId, agentId))
|
|
51
56
|
return;
|
|
52
57
|
workspaceStore.markAgentStopped(workspaceId, agentId);
|
|
@@ -75,6 +80,7 @@ export const createRuntimeStoreServices = (options = {}) => {
|
|
|
75
80
|
tasksFileService,
|
|
76
81
|
teamOps,
|
|
77
82
|
uiAuth,
|
|
83
|
+
workerOutputTracker,
|
|
78
84
|
workspaceStore,
|
|
79
85
|
};
|
|
80
86
|
};
|
|
@@ -87,6 +93,9 @@ export const createRuntimeStoreLifecycle = ({ agentManager, services, }) => {
|
|
|
87
93
|
if (run.status === 'error') {
|
|
88
94
|
services.workspaceStore.markAgentStopped(workspaceId, agentId);
|
|
89
95
|
}
|
|
96
|
+
else {
|
|
97
|
+
services.workerOutputTracker?.attach(workspaceId, agentId, run.runId, run.output);
|
|
98
|
+
}
|
|
90
99
|
return run;
|
|
91
100
|
}
|
|
92
101
|
catch (error) {
|
|
@@ -131,6 +140,7 @@ export const createRuntimeStoreLifecycle = ({ agentManager, services, }) => {
|
|
|
131
140
|
close: async () => {
|
|
132
141
|
await services.agentRuntime.close();
|
|
133
142
|
await services.tasksFileWatcher.close();
|
|
143
|
+
services.workerOutputTracker?.closeAll();
|
|
134
144
|
services.agentRunStore.close?.();
|
|
135
145
|
services.db?.close();
|
|
136
146
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-store-helpers.js","sourceRoot":"","sources":["../../../src/server/runtime-store-helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAA+B,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AACvF,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAEvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAA;AAEvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAA;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAA;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"runtime-store-helpers.js","sourceRoot":"","sources":["../../../src/server/runtime-store-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,7 @@ interface RuntimeStore {
|
|
|
22
22
|
reportTask: (workspaceId: string, workerId: string, input?: ReportTaskInput) => DispatchRecord;
|
|
23
23
|
listDispatches: (workspaceId: string, options?: ListDispatchesOptions) => DispatchRecord[];
|
|
24
24
|
listWorkers: (workspaceId: string) => TeamListItem[];
|
|
25
|
+
getLastOutputLineForAgent: (workspaceId: string, agentId: string) => string | null;
|
|
25
26
|
getWorkspaceSnapshot: (workspaceId: string) => WorkspaceRecord;
|
|
26
27
|
getWorker: (workspaceId: string, workerId: string) => AgentSummary;
|
|
27
28
|
getAgent: (workspaceId: string, agentId: string) => AgentSummary;
|
|
@@ -52,6 +52,7 @@ export const createRuntimeStore = (options = {}) => {
|
|
|
52
52
|
reportTask: services.teamOps.reportTask,
|
|
53
53
|
listDispatches: services.dispatchLedgerStore.listWorkspaceDispatches,
|
|
54
54
|
listWorkers: (workspaceId) => services.workspaceStore.listWorkers(workspaceId),
|
|
55
|
+
getLastOutputLineForAgent: (workspaceId, agentId) => services.workerOutputTracker?.getLastOutputLine(workspaceId, agentId) ?? null,
|
|
55
56
|
getWorkspaceSnapshot: (workspaceId) => services.workspaceStore.getWorkspaceSnapshot(workspaceId),
|
|
56
57
|
getWorker: (workspaceId, workerId) => services.workspaceStore.getWorker(workspaceId, workerId),
|
|
57
58
|
getAgent: (workspaceId, agentId) => services.workspaceStore.getAgent(workspaceId, agentId),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-store.js","sourceRoot":"","sources":["../../../src/server/runtime-store.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,2BAA2B,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"runtime-store.js","sourceRoot":"","sources":["../../../src/server/runtime-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,2 @@
|
|
|
1
|
-
import type { TeamListItem } from '../shared/types.js';
|
|
2
|
-
export declare const serializeTeamListItem: ({ id, name, pendingTaskCount, role, status, }: TeamListItem) =>
|
|
3
|
-
id: string;
|
|
4
|
-
name: string;
|
|
5
|
-
role: string;
|
|
6
|
-
status: string;
|
|
7
|
-
pending_task_count: number;
|
|
8
|
-
};
|
|
1
|
+
import type { TeamListItem, TeamListItemPayload } from '../shared/types.js';
|
|
2
|
+
export declare const serializeTeamListItem: ({ id, lastOutputLine, name, pendingTaskCount, role, status, }: TeamListItem) => TeamListItemPayload;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
export const serializeTeamListItem = ({ id, name, pendingTaskCount, role, status, }) => ({
|
|
1
|
+
export const serializeTeamListItem = ({ id, lastOutputLine, name, pendingTaskCount, role, status, }) => ({
|
|
2
2
|
id,
|
|
3
3
|
name,
|
|
4
4
|
role,
|
|
5
5
|
status,
|
|
6
6
|
pending_task_count: pendingTaskCount,
|
|
7
|
+
last_output_line: lastOutputLine ?? null,
|
|
7
8
|
});
|
|
8
9
|
//# sourceMappingURL=team-list-serializer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"team-list-serializer.js","sourceRoot":"","sources":["../../../src/server/team-list-serializer.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,EACpC,EAAE,EACF,IAAI,EACJ,gBAAgB,EAChB,IAAI,EACJ,MAAM,GACO,
|
|
1
|
+
{"version":3,"file":"team-list-serializer.js","sourceRoot":"","sources":["../../../src/server/team-list-serializer.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,EACpC,EAAE,EACF,cAAc,EACd,IAAI,EACJ,gBAAgB,EAChB,IAAI,EACJ,MAAM,GACO,EAAuB,EAAE,CAAC,CAAC;IACxC,EAAE;IACF,IAAI;IACJ,IAAI;IACJ,MAAM;IACN,kBAAkB,EAAE,gBAAgB;IACpC,gBAAgB,EAAE,cAAc,IAAI,IAAI;CACzC,CAAC,CAAA"}
|
|
@@ -10,6 +10,12 @@ export declare class TerminalStateMirror {
|
|
|
10
10
|
constructor(size?: TerminalMirrorSize);
|
|
11
11
|
dispose(): void;
|
|
12
12
|
getSnapshot(): Promise<string>;
|
|
13
|
+
/**
|
|
14
|
+
* Returns the most recent non-empty scrollback line (trimmed, ANSI-stripped,
|
|
15
|
+
* truncated to `maxLen`). Returns `null` when scrollback has no printable
|
|
16
|
+
* content, so the wire protocol can express "no output yet" as a null.
|
|
17
|
+
*/
|
|
18
|
+
lastOutputLine(maxLen?: number): string | null;
|
|
13
19
|
resize(cols: number, rows: number): void;
|
|
14
20
|
write(chunk: string): void;
|
|
15
21
|
}
|
|
@@ -7,6 +7,11 @@ const normalizeTerminalSize = ({ cols, rows }) => ({
|
|
|
7
7
|
cols: Math.max(1, Math.floor(cols)),
|
|
8
8
|
rows: Math.max(1, Math.floor(rows)),
|
|
9
9
|
});
|
|
10
|
+
// Strips CSI escape sequences emitted by interactive CLIs (color, cursor moves,
|
|
11
|
+
// etc.) before exposing a single line of scrollback to JSON consumers. Built
|
|
12
|
+
// from a String so the regex source does not embed a literal control character
|
|
13
|
+
// (lint/suspicious/noControlCharactersInRegex would otherwise flag the file).
|
|
14
|
+
const ANSI_CSI_PATTERN = new RegExp(`${String.fromCharCode(0x1b)}\\[[0-9;?]*[a-zA-Z]`, 'g');
|
|
10
15
|
export class TerminalStateMirror {
|
|
11
16
|
serializeAddon = new SerializeAddon();
|
|
12
17
|
terminal;
|
|
@@ -28,6 +33,22 @@ export class TerminalStateMirror {
|
|
|
28
33
|
await this.operationQueue;
|
|
29
34
|
return this.serializeAddon.serialize();
|
|
30
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Returns the most recent non-empty scrollback line (trimmed, ANSI-stripped,
|
|
38
|
+
* truncated to `maxLen`). Returns `null` when scrollback has no printable
|
|
39
|
+
* content, so the wire protocol can express "no output yet" as a null.
|
|
40
|
+
*/
|
|
41
|
+
lastOutputLine(maxLen = 60) {
|
|
42
|
+
const buffer = this.terminal.buffer.active;
|
|
43
|
+
for (let row = buffer.length - 1; row >= 0; row -= 1) {
|
|
44
|
+
const raw = buffer.getLine(row)?.translateToString(true) ?? '';
|
|
45
|
+
const cleaned = raw.replace(ANSI_CSI_PATTERN, '').trim();
|
|
46
|
+
if (cleaned.length === 0)
|
|
47
|
+
continue;
|
|
48
|
+
return cleaned.slice(0, maxLen);
|
|
49
|
+
}
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
31
52
|
resize(cols, rows) {
|
|
32
53
|
const normalized = normalizeTerminalSize({ cols, rows });
|
|
33
54
|
this.operationQueue = this.operationQueue
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-state-mirror.js","sourceRoot":"","sources":["../../../src/server/terminal-state-mirror.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,MAAM,wBAAwB,CAAA;AACzD,OAAO,sBAAsB,MAAM,iBAAiB,CAAA;AAEpD,MAAM,EAAE,cAAc,EAAE,GAAG,oBAA+D,CAAA;AAC1F,MAAM,EAAE,QAAQ,EAAE,GAAG,sBAA0D,CAAA;AAE/E,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAA;AAOzC,MAAM,qBAAqB,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAsB,EAAsB,EAAE,CAAC,CAAC;IACzF,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;CACpC,CAAC,CAAA;AAEF,MAAM,OAAO,mBAAmB;IACb,cAAc,GAAG,IAAI,cAAc,EAAE,CAAA;IACrC,QAAQ,CAA+B;IAChD,cAAc,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAA;IAEzD,YAAY,OAA2B,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QAC3D,MAAM,UAAU,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAA;QAC9C,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC;YAC3B,gBAAgB,EAAE,IAAI;YACtB,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,UAAU,EAAE,mBAAmB;SAChC,CAAC,CAAA;QACF,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC9C,CAAC;IAED,OAAO;QACL,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAA;IACzB,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,IAAI,CAAC,cAAc,CAAA;QACzB,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,CAAA;IACxC,CAAC;IAED,MAAM,CAAC,IAAY,EAAE,IAAY;QAC/B,MAAM,UAAU,GAAG,qBAAqB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QACxD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc;aACtC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;aACtB,IAAI,CAAC,GAAG,EAAE;YACT,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,CAAA;QACxD,CAAC,CAAC,CAAA;IACN,CAAC;IAED,KAAK,CAAC,KAAa;QACjB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc;aACtC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;aACtB,IAAI,CACH,GAAG,EAAE,CACH,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAC5B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAA;QAC7C,CAAC,CAAC,CACL,CAAA;IACL,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"terminal-state-mirror.js","sourceRoot":"","sources":["../../../src/server/terminal-state-mirror.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,MAAM,wBAAwB,CAAA;AACzD,OAAO,sBAAsB,MAAM,iBAAiB,CAAA;AAEpD,MAAM,EAAE,cAAc,EAAE,GAAG,oBAA+D,CAAA;AAC1F,MAAM,EAAE,QAAQ,EAAE,GAAG,sBAA0D,CAAA;AAE/E,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAA;AAOzC,MAAM,qBAAqB,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,EAAsB,EAAsB,EAAE,CAAC,CAAC;IACzF,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;CACpC,CAAC,CAAA;AAEF,gFAAgF;AAChF,6EAA6E;AAC7E,+EAA+E;AAC/E,8EAA8E;AAC9E,MAAM,gBAAgB,GAAG,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAA;AAE3F,MAAM,OAAO,mBAAmB;IACb,cAAc,GAAG,IAAI,cAAc,EAAE,CAAA;IACrC,QAAQ,CAA+B;IAChD,cAAc,GAAkB,OAAO,CAAC,OAAO,EAAE,CAAA;IAEzD,YAAY,OAA2B,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QAC3D,MAAM,UAAU,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAA;QAC9C,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC;YAC3B,gBAAgB,EAAE,IAAI;YACtB,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,UAAU,EAAE,mBAAmB;SAChC,CAAC,CAAA;QACF,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC9C,CAAC;IAED,OAAO;QACL,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAA;IACzB,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,IAAI,CAAC,cAAc,CAAA;QACzB,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,CAAA;IACxC,CAAC;IAED;;;;OAIG;IACH,cAAc,CAAC,MAAM,GAAG,EAAE;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAA;QAC1C,KAAK,IAAI,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;YACrD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;YAC9D,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;YACxD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAQ;YAClC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;QACjC,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,CAAC,IAAY,EAAE,IAAY;QAC/B,MAAM,UAAU,GAAG,qBAAqB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QACxD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc;aACtC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;aACtB,IAAI,CAAC,GAAG,EAAE;YACT,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,CAAA;QACxD,CAAC,CAAC,CAAA;IACN,CAAC;IAED,KAAK,CAAC,KAAa;QACjB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc;aACtC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;aACtB,IAAI,CACH,GAAG,EAAE,CACH,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAC5B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAA;QAC7C,CAAC,CAAC,CACL,CAAA;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { PtyOutputBus } from './pty-output-bus.js';
|
|
2
|
+
export interface WorkerOutputTracker {
|
|
3
|
+
attach: (workspaceId: string, agentId: string, runId: string, initialOutput: string) => void;
|
|
4
|
+
closeAll: () => void;
|
|
5
|
+
detach: (workspaceId: string, agentId: string) => void;
|
|
6
|
+
getLastOutputLine: (workspaceId: string, agentId: string) => string | null;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Maintains a headless terminal mirror per active agent run so the team-list
|
|
10
|
+
* endpoint can report each worker's last output line without requiring a
|
|
11
|
+
* connected UI viewer. Created on run start (via `attach`) and torn down on
|
|
12
|
+
* run exit (via `detach`).
|
|
13
|
+
*/
|
|
14
|
+
export declare const createWorkerOutputTracker: (outputBus: PtyOutputBus) => WorkerOutputTracker;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { TerminalStateMirror } from './terminal-state-mirror.js';
|
|
2
|
+
const trackerKey = (workspaceId, agentId) => `${workspaceId}:${agentId}`;
|
|
3
|
+
/**
|
|
4
|
+
* Maintains a headless terminal mirror per active agent run so the team-list
|
|
5
|
+
* endpoint can report each worker's last output line without requiring a
|
|
6
|
+
* connected UI viewer. Created on run start (via `attach`) and torn down on
|
|
7
|
+
* run exit (via `detach`).
|
|
8
|
+
*/
|
|
9
|
+
export const createWorkerOutputTracker = (outputBus) => {
|
|
10
|
+
const tracked = new Map();
|
|
11
|
+
const disposeEntry = (entry) => {
|
|
12
|
+
entry.unsubscribe();
|
|
13
|
+
entry.mirror.dispose();
|
|
14
|
+
};
|
|
15
|
+
return {
|
|
16
|
+
attach(workspaceId, agentId, runId, initialOutput) {
|
|
17
|
+
const key = trackerKey(workspaceId, agentId);
|
|
18
|
+
const existing = tracked.get(key);
|
|
19
|
+
if (existing) {
|
|
20
|
+
if (existing.runId === runId)
|
|
21
|
+
return;
|
|
22
|
+
disposeEntry(existing);
|
|
23
|
+
}
|
|
24
|
+
const mirror = new TerminalStateMirror();
|
|
25
|
+
if (initialOutput.length > 0)
|
|
26
|
+
mirror.write(initialOutput);
|
|
27
|
+
const unsubscribe = outputBus.subscribe(runId, (chunk) => {
|
|
28
|
+
mirror.write(chunk);
|
|
29
|
+
});
|
|
30
|
+
tracked.set(key, { mirror, runId, unsubscribe });
|
|
31
|
+
},
|
|
32
|
+
closeAll() {
|
|
33
|
+
for (const entry of tracked.values())
|
|
34
|
+
disposeEntry(entry);
|
|
35
|
+
tracked.clear();
|
|
36
|
+
},
|
|
37
|
+
detach(workspaceId, agentId) {
|
|
38
|
+
const key = trackerKey(workspaceId, agentId);
|
|
39
|
+
const entry = tracked.get(key);
|
|
40
|
+
if (!entry)
|
|
41
|
+
return;
|
|
42
|
+
disposeEntry(entry);
|
|
43
|
+
tracked.delete(key);
|
|
44
|
+
},
|
|
45
|
+
getLastOutputLine(workspaceId, agentId) {
|
|
46
|
+
const entry = tracked.get(trackerKey(workspaceId, agentId));
|
|
47
|
+
return entry ? entry.mirror.lastOutputLine() : null;
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=worker-output-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-output-tracker.js","sourceRoot":"","sources":["../../../src/server/worker-output-tracker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAehE,MAAM,UAAU,GAAG,CAAC,WAAmB,EAAE,OAAe,EAAE,EAAE,CAAC,GAAG,WAAW,IAAI,OAAO,EAAE,CAAA;AAExF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,SAAuB,EAAuB,EAAE;IACxF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAA;IAE7C,MAAM,YAAY,GAAG,CAAC,KAAiB,EAAE,EAAE;QACzC,KAAK,CAAC,WAAW,EAAE,CAAA;QACnB,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;IACxB,CAAC,CAAA;IAED,OAAO;QACL,MAAM,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa;YAC/C,MAAM,GAAG,GAAG,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;YAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACjC,IAAI,QAAQ,EAAE,CAAC;gBACb,IAAI,QAAQ,CAAC,KAAK,KAAK,KAAK;oBAAE,OAAM;gBACpC,YAAY,CAAC,QAAQ,CAAC,CAAA;YACxB,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAA;YACxC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;YACzD,MAAM,WAAW,GAAG,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;gBACvD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YACrB,CAAC,CAAC,CAAA;YACF,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAA;QAClD,CAAC;QACD,QAAQ;YACN,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAA;YACzD,OAAO,CAAC,KAAK,EAAE,CAAA;QACjB,CAAC;QACD,MAAM,CAAC,WAAW,EAAE,OAAO;YACzB,MAAM,GAAG,GAAG,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;YAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAC9B,IAAI,CAAC,KAAK;gBAAE,OAAM;YAClB,YAAY,CAAC,KAAK,CAAC,CAAA;YACnB,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACrB,CAAC;QACD,iBAAiB,CAAC,WAAW,EAAE,OAAO;YACpC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAA;YAC3D,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,CAAA;QACrD,CAAC;KACF,CAAA;AACH,CAAC,CAAA"}
|
|
@@ -21,6 +21,8 @@ export interface TeamListItem {
|
|
|
21
21
|
role: WorkerRole;
|
|
22
22
|
status: AgentStatus;
|
|
23
23
|
pendingTaskCount: number;
|
|
24
|
+
/** Optional: last output line shown in the worker card when status is working. */
|
|
25
|
+
lastOutputLine?: string;
|
|
24
26
|
}
|
|
25
27
|
/**
|
|
26
28
|
* Wire payload shape for /api/workspaces/:id/team and worker-creation responses.
|
|
@@ -33,4 +35,5 @@ export interface TeamListItemPayload {
|
|
|
33
35
|
role: WorkerRole;
|
|
34
36
|
status: AgentStatus;
|
|
35
37
|
pending_task_count: number;
|
|
38
|
+
last_output_line: string | null;
|
|
36
39
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tt-a1i/hive",
|
|
3
|
-
"version": "0.6.0-alpha.
|
|
3
|
+
"version": "0.6.0-alpha.2",
|
|
4
4
|
"description": "Local multi-agent workspace for coordinating CLI coding agents through a web UI.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "pnpm@10.30.3",
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
"node": ">=22"
|
|
28
28
|
},
|
|
29
29
|
"files": [
|
|
30
|
+
"assets/",
|
|
30
31
|
"CHANGELOG.md",
|
|
31
32
|
"LICENSE",
|
|
32
33
|
"README.md",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-medium:500;--font-weight-semibold:600;--tracking-wide:.025em;--tracking-wider:.05em;--leading-tight:1.25;--leading-snug:1.375;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, .2, 1);--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-accent:#5e6ad2;--color-status-red:#f85149}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-4{top:calc(var(--spacing) * 4)}.top-8{top:calc(var(--spacing) * 8)}.right-0{right:calc(var(--spacing) * 0)}.right-2{right:calc(var(--spacing) * 2)}.right-4{right:calc(var(--spacing) * 4)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-2{bottom:calc(var(--spacing) * 2)}.bottom-8{bottom:calc(var(--spacing) * 8)}.left-1\/2{left:50%}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.m-2{margin:calc(var(--spacing) * 2)}.m-auto{margin:auto}.mx-2{margin-inline:calc(var(--spacing) * 2)}.-mt-0\.5{margin-top:calc(var(--spacing) * -.5)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-5{margin-top:calc(var(--spacing) * 5)}.-mr-1{margin-right:calc(var(--spacing) * -1)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.h-1{height:calc(var(--spacing) * 1)}.h-3{height:calc(var(--spacing) * 3)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-11{height:calc(var(--spacing) * 11)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-24{height:calc(var(--spacing) * 24)}.h-full{height:100%}.h-screen{height:100vh}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-\[calc\(100vh-32px\)\]{max-height:calc(100vh - 32px)}.max-h-screen{max-height:100vh}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-\[78px\]{min-height:78px}.min-h-\[118px\]{min-height:118px}.min-h-\[200px\]{min-height:200px}.min-h-\[360px\]{min-height:360px}.w-1{width:calc(var(--spacing) * 1)}.w-3{width:calc(var(--spacing) * 3)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-12{width:calc(var(--spacing) * 12)}.w-14{width:calc(var(--spacing) * 14)}.w-24{width:calc(var(--spacing) * 24)}.w-\[280px\]{width:280px}.w-\[380px\]{width:380px}.w-\[420px\]{width:420px}.w-\[440px\]{width:440px}.w-\[480px\]{width:480px}.w-\[560px\]{width:560px}.w-\[760px\]{width:760px}.w-full{width:100%}.w-px{width:1px}.max-w-\[380px\]{max-width:380px}.max-w-\[400px\]{max-width:400px}.max-w-\[calc\(100vw-32px\)\]{max-width:calc(100vw - 32px)}.max-w-full{max-width:100%}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[260px\]{min-width:260px}.min-w-\[320px\]{min-width:320px}.min-w-\[480px\]{min-width:480px}.flex-1{flex:1}.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.resize-y{resize:vertical}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0{gap:calc(var(--spacing) * 0)}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-\[var\(--border-bright\)\]{border-color:var(--border-bright)}.p-1{padding:calc(var(--spacing) * 1)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pr-9{padding-right:calc(var(--spacing) * 9)}.pr-10{padding-right:calc(var(--spacing) * 10)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-2\.5{padding-bottom:calc(var(--spacing) * 2.5)}.pl-3{padding-left:calc(var(--spacing) * 3)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-pre-wrap{white-space:pre-wrap}.text-accent{color:var(--color-accent)}.text-status-red{color:var(--color-status-red)}.uppercase{text-transform:uppercase}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}@media(hover:hover){.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.last\:mb-0:last-child{margin-bottom:calc(var(--spacing) * 0)}.focus-within\:ring-2:focus-within{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-within\:ring-\[var\(--ring-focus\)\]:focus-within{--tw-ring-color:var(--ring-focus)}.focus-within\:outline-none:focus-within{--tw-outline-style:none;outline-style:none}@media(hover:hover){.hover\:text-status-red:hover{color:var(--color-status-red)}}.focus\:border-\[var\(--accent\)\]:focus{border-color:var(--accent)}.focus\:opacity-100:focus{opacity:1}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}}:root{--bg-0:#08090a;--bg-1:#0f0f11;--bg-2:#18181b;--bg-3:#232326;--bg-crust:#050506;--bg-overlay:#08090ab8;--bg-elevated:#1c1c20;--border:#222226;--border-bright:#2b2b30;--text-primary:#f7f8f8;--text-secondary:#8a8f98;--text-tertiary:#62656c;--accent:#5e6ad2;--accent-hover:#7078e3;--status-green:#3fb950;--status-orange:#d29922;--status-red:#f85149;--status-blue:#4c9aff;--status-purple:#a371f7;--status-gold:#d4a72c;--text-xs:10px;--text-sm:11px;--text-base:13px;--text-md:14px;--text-lg:15px;--icon-xs:12px;--icon-sm:14px;--icon-md:16px;--icon-lg:20px;--radius-sm:4px;--radius-md:6px;--radius-lg:8px;--radius-xl:12px;--ease-out:cubic-bezier(.16, 1, .3, 1);--ease-in:cubic-bezier(.4, 0, 1, 1);--ease-modal:cubic-bezier(.32, .72, 0, 1);--ease-spring:cubic-bezier(.5, 1.5, .5, 1);--ease-overshoot:cubic-bezier(.34, 1.56, .64, 1);--ease-in-out:cubic-bezier(.65, 0, .35, 1);--dur-fast:.12s;--dur-base:.18s;--dur-slow:.28s;--ring-focus:#5e6ad273;--shadow-elev-2:0 4px 12px #0006, 0 1px 2px #0000004d;--shadow-card:0 0 0 1px #0000000f, 0 1px 2px #0003, 0 8px 24px -8px #0006, inset 0 1px 0 #ffffff0d;--shadow-card-hover:0 0 0 1px var(--accent), 0 2px 4px #0003, 0 16px 40px -12px #00000080, inset 0 1px 0 #ffffff12}@supports (color:color-mix(in lab,red,red)){:root{--shadow-card-hover:0 0 0 1px color-mix(in oklab, var(--accent) 35%, transparent), 0 2px 4px #0003, 0 16px 40px -12px #00000080, inset 0 1px 0 #ffffff12}}:root{color-scheme:dark}html,body{font-feature-settings:"tnum" 1,"cv11" 1,"ss01" 1;-moz-osx-font-smoothing:grayscale;caret-color:var(--accent)}::selection{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){::selection{background:color-mix(in oklab,var(--accent) 32%,transparent)}}::selection{color:var(--text-primary)}html,body{background:var(--bg-0);height:100%;color:var(--text-primary);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;margin:0;padding:0;font-family:Inter,system-ui,-apple-system,Segoe UI,sans-serif;font-size:13px;line-height:1.4;overflow:hidden}#root{height:100%}.mono{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,monospace}.bg-0{background:var(--bg-0)}.bg-1{background:var(--bg-1)}.bg-2{background:var(--bg-2)}.bg-3{background:var(--bg-3)}.bg-crust{background:var(--bg-crust)}.text-pri{color:var(--text-primary)}.text-sec{color:var(--text-secondary)}.text-ter{color:var(--text-tertiary)}.border-d{border-color:var(--border)}.border-b1{border-color:var(--border-bright)}.accent{color:var(--accent)}.bg-accent{background:var(--accent)}.scroll-y{overflow-y:auto}.scroll-y::-webkit-scrollbar{width:8px;height:8px}.scroll-y::-webkit-scrollbar-thumb{background:var(--bg-3);border-radius:4px}.scroll-y::-webkit-scrollbar-track{background:0 0}.ws-row{transition:background var(--dur-fast) var(--ease-out),box-shadow var(--dur-fast) var(--ease-out);cursor:pointer;position:relative}.ws-row:hover{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.ws-row:hover{background:color-mix(in oklab,var(--accent) 4%,var(--bg-1))}}.ws-row.active{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.ws-row.active{background:color-mix(in oklab,var(--accent) 8%,var(--bg-1))}}.ws-row.active{box-shadow:inset 3px 0 0 var(--accent)}.ws-row.active:after{content:"";pointer-events:none;border-radius:0;position:absolute;inset:0;box-shadow:inset 0 1px #ffffff0a}.ws-row-delete:hover{background:var(--status-red)}@supports (color:color-mix(in lab,red,red)){.ws-row-delete:hover{background:color-mix(in oklab,var(--status-red) 14%,transparent)}}.ws-add{transition:background var(--dur-fast) var(--ease-out),border-color var(--dur-fast) var(--ease-out),color var(--dur-fast) var(--ease-out);background:0 0;box-shadow:inset 0 1px #ffffff08}.ws-add:hover{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.ws-add:hover{background:color-mix(in oklab,var(--accent) 6%,transparent)}}.ws-add:hover{border-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.ws-add:hover{border-color:color-mix(in oklab,var(--accent) 50%,var(--border-bright))}}.ws-add:hover{color:var(--text-primary)}.workspace-sidebar{container:ws-sidebar/inline-size}@container ws-sidebar (max-width:140px){.ws-row__path,.ws-add__label{display:none}.ws-add{padding-left:8px;padding-right:8px}}.workspace-sidebar-resizer{z-index:20;cursor:col-resize;touch-action:none;border:0;outline:none;width:8px;height:100%;margin:0;position:absolute;top:0;right:-4px}.workspace-sidebar-resizer:before{content:"";width:1px;transition:background var(--dur-fast) var(--ease-out),box-shadow var(--dur-fast) var(--ease-out);background:0 0;position:absolute;top:0;bottom:0;left:3px}.workspace-sidebar-resizer:hover:before,.workspace-sidebar-resizer:focus-visible:before,.workspace-sidebar-resizer[data-resizing=true]:before{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.workspace-sidebar-resizer:hover:before,.workspace-sidebar-resizer:focus-visible:before,.workspace-sidebar-resizer[data-resizing=true]:before{background:color-mix(in oklab,var(--accent) 68%,var(--border-bright))}}.workspace-sidebar-resizer:hover:before,.workspace-sidebar-resizer:focus-visible:before,.workspace-sidebar-resizer[data-resizing=true]:before{box-shadow:0 0 0 2px var(--accent)}@supports (color:color-mix(in lab,red,red)){.workspace-sidebar-resizer:hover:before,.workspace-sidebar-resizer:focus-visible:before,.workspace-sidebar-resizer[data-resizing=true]:before{box-shadow:0 0 0 2px color-mix(in oklab,var(--accent) 12%,transparent)}}.dot{vertical-align:middle;border-radius:50%;width:7px;height:7px;display:inline-block}.pulse-green{background:var(--status-green);animation:1.6s ease-in-out infinite hive-pulse}.pulse-orange{background:var(--status-orange);animation:1.6s ease-in-out infinite hive-pulse}@keyframes hive-pulse{0%,to{opacity:1}50%{opacity:.45}}.status-dot{vertical-align:middle;width:8px;height:8px;transition:background var(--dur-base) var(--ease-out);border-radius:50%;flex-shrink:0;display:inline-block}.status-dot--working{background:var(--status-green);animation:hive-ripple-green 1.8s var(--ease-in-out) infinite}.status-dot--idle{background:var(--text-tertiary);box-shadow:0 0 0 2px var(--text-tertiary)}@supports (color:color-mix(in lab,red,red)){.status-dot--idle{box-shadow:0 0 0 2px color-mix(in oklab,var(--text-tertiary) 18%,transparent)}}.status-dot--queued{background:var(--status-orange);animation:hive-ripple-orange 1.8s var(--ease-in-out) infinite}.status-dot--stopped{background:var(--status-red);box-shadow:0 0 0 2px var(--status-red)}@supports (color:color-mix(in lab,red,red)){.status-dot--stopped{box-shadow:0 0 0 2px color-mix(in oklab,var(--status-red) 22%,transparent)}}.status-dot--stopped{opacity:.85}@keyframes hive-ripple-green{0%,to{box-shadow:0 0 0 3px color-mix(in oklab,var(--status-green) 22%,transparent)}50%{box-shadow:0 0 0 7px color-mix(in oklab,var(--status-green) 6%,transparent)}}@keyframes hive-ripple-orange{0%,to{box-shadow:0 0 0 3px color-mix(in oklab,var(--status-orange) 22%,transparent)}50%{box-shadow:0 0 0 7px color-mix(in oklab,var(--status-orange) 6%,transparent)}}@media(prefers-reduced-motion:reduce){.status-dot--working,.status-dot--queued{animation:none}}.status-pill{letter-spacing:.1px;white-space:nowrap;border:1px solid #0000;border-radius:999px;align-items:center;gap:6px;padding:1px 8px 1px 6px;font-size:11px;font-weight:500;display:inline-flex}.status-pill--working{color:var(--status-green);border-color:var(--status-green)}@supports (color:color-mix(in lab,red,red)){.status-pill--working{border-color:color-mix(in oklab,var(--status-green) 35%,transparent)}}.status-pill--working{background:var(--status-green)}@supports (color:color-mix(in lab,red,red)){.status-pill--working{background:color-mix(in oklab,var(--status-green) 12%,transparent)}}.status-pill--idle{color:var(--text-secondary);border-color:var(--border);background:var(--bg-3)}.status-pill--queued{color:var(--status-orange);border-color:var(--status-orange)}@supports (color:color-mix(in lab,red,red)){.status-pill--queued{border-color:color-mix(in oklab,var(--status-orange) 35%,transparent)}}.status-pill--queued{background:var(--status-orange)}@supports (color:color-mix(in lab,red,red)){.status-pill--queued{background:color-mix(in oklab,var(--status-orange) 12%,transparent)}}.status-pill--stopped{color:var(--status-red);border-color:var(--status-red)}@supports (color:color-mix(in lab,red,red)){.status-pill--stopped{border-color:color-mix(in oklab,var(--status-red) 32%,transparent)}}.status-pill--stopped{background:var(--status-red)}@supports (color:color-mix(in lab,red,red)){.status-pill--stopped{background:color-mix(in oklab,var(--status-red) 10%,transparent)}}.queue-badge{letter-spacing:.1px;white-space:nowrap;color:var(--status-orange);border:1px solid var(--status-orange);border-radius:999px;align-items:center;gap:5px;padding:0 6px 0 4px;font-size:10px;font-weight:500;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.queue-badge{border:1px solid color-mix(in oklab,var(--status-orange) 35%,transparent)}}.queue-badge{background:var(--status-orange)}@supports (color:color-mix(in lab,red,red)){.queue-badge{background:color-mix(in oklab,var(--status-orange) 10%,transparent)}}.icon-btn{color:var(--text-secondary);border:1px solid var(--border);background:var(--bg-2);cursor:pointer;transition:background var(--dur-fast) var(--ease-out),color var(--dur-fast) var(--ease-out),border-color var(--dur-fast) var(--ease-out),transform 80ms var(--ease-out),box-shadow var(--dur-fast) var(--ease-out);border-radius:6px;align-items:center;gap:4px;padding:4px 8px;font-size:11px;display:inline-flex;box-shadow:inset 0 1px #ffffff0a,0 1px 1px #0003}.icon-btn:hover{background:var(--bg-3);color:var(--text-primary);border-color:var(--border-bright);box-shadow:inset 0 1px #ffffff0f,0 1px 2px #0000004d}.icon-btn:active{transform:scale(.97)}.icon-btn:disabled{opacity:.5;cursor:not-allowed;transform:none}.icon-btn--primary{background:var(--accent);color:var(--text-primary);border-color:#fff}@supports (color:color-mix(in lab,red,red)){.icon-btn--primary{border-color:color-mix(in oklab,#fff 12%,var(--accent))}}.icon-btn--primary{box-shadow:inset 0 1px #ffffff2e,0 1px 2px #00000059}.icon-btn--primary:hover{background:var(--accent-hover);border-color:#fff}@supports (color:color-mix(in lab,red,red)){.icon-btn--primary:hover{border-color:color-mix(in oklab,#fff 18%,var(--accent-hover))}}.icon-btn--danger{color:var(--status-red)}.icon-btn--danger:hover{background:var(--status-red)}@supports (color:color-mix(in lab,red,red)){.icon-btn--danger:hover{background:color-mix(in oklab,var(--status-red) 14%,transparent)}}.icon-btn--danger:hover{border-color:var(--status-red)}@supports (color:color-mix(in lab,red,red)){.icon-btn--danger:hover{border-color:color-mix(in oklab,var(--status-red) 40%,transparent)}}.icon-btn--danger:hover{color:var(--status-red)}.card{background:var(--bg-2);border:1px solid var(--border);box-shadow:var(--shadow-card);transition:border-color var(--dur-base) var(--ease-out),background var(--dur-base) var(--ease-out),box-shadow var(--dur-base) var(--ease-out),transform var(--dur-base) var(--ease-out);border-radius:8px;position:relative}.card--interactive{cursor:pointer}.card--interactive:hover{border-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.card--interactive:hover{border-color:color-mix(in oklab,var(--accent) 50%,var(--border-bright))}}.card--interactive:hover{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.card--interactive:hover{background:color-mix(in oklab,var(--accent) 4%,var(--bg-2))}}.card--interactive:hover{box-shadow:var(--shadow-card-hover)}.role-badge{letter-spacing:.3px;text-transform:uppercase;white-space:nowrap;border-radius:3px;flex-shrink:0;padding:1px 6px;font-size:10px;font-weight:500;display:inline-block}.role-badge--coder{background:var(--status-blue)}@supports (color:color-mix(in lab,red,red)){.role-badge--coder{background:color-mix(in oklab,var(--status-blue) 22%,var(--bg-2))}}.role-badge--coder{color:var(--status-blue)}.role-badge--tester{background:var(--status-orange)}@supports (color:color-mix(in lab,red,red)){.role-badge--tester{background:color-mix(in oklab,var(--status-orange) 22%,var(--bg-2))}}.role-badge--tester{color:var(--status-orange)}.role-badge--reviewer{background:var(--status-purple)}@supports (color:color-mix(in lab,red,red)){.role-badge--reviewer{background:color-mix(in oklab,var(--status-purple) 22%,var(--bg-2))}}.role-badge--reviewer{color:var(--status-purple)}.role-badge--orch,.role-badge--custom{background:var(--bg-3);color:var(--text-secondary)}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.drawer{transition:transform .25s ease-out;transform:translate(100%)}.drawer.open{transform:translate(0)}.task-summary{border:1px solid var(--border);background:linear-gradient(135deg,var(--accent),transparent 58%),var(--bg-2);border-radius:8px;padding:12px}@supports (color:color-mix(in lab,red,red)){.task-summary{background:linear-gradient(135deg,color-mix(in oklab,var(--accent) 12%,transparent),transparent 58%),var(--bg-2)}}.task-progress{background:var(--bg-3);border-radius:999px;height:6px;margin-top:10px;overflow:hidden}.task-progress>span{border-radius:inherit;background:linear-gradient(90deg,var(--accent),var(--status-green));height:100%;transition:width .18s ease-out;display:block}.task-list{flex-direction:column;gap:2px;display:flex}.task-node{position:relative}.task-children{margin-left:10px;padding-left:10px;position:relative}.task-children:before{content:"";background:var(--border-bright);width:1px;position:absolute;top:0;bottom:6px;left:10px}.task-status-open{color:var(--text-tertiary);background:var(--bg-3)}.task-status-done{color:var(--status-green);background:var(--status-green)}@supports (color:color-mix(in lab,red,red)){.task-status-done{background:color-mix(in oklab,var(--status-green) 13%,transparent)}}.task-mention{border:1px solid var(--status-blue);align-items:center;height:18px;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.task-mention{border:1px solid color-mix(in oklab,var(--status-blue) 30%,transparent)}}.task-mention{color:var(--status-blue);background:var(--status-blue);border-radius:999px;padding:0 7px}@supports (color:color-mix(in lab,red,red)){.task-mention{background:color-mix(in oklab,var(--status-blue) 10%,transparent)}}.task-mention{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10px}.task-child-count{height:18px;color:var(--text-tertiary);background:var(--bg-3);border-radius:999px;align-items:center;gap:1px;padding:0 6px 0 4px;font-size:10px;display:inline-flex}.task-empty{border:1px dashed var(--border-bright);color:var(--text-tertiary);background:var(--bg-2);border-radius:8px;align-items:flex-start;gap:10px;padding:14px;display:flex}.modal-backdrop{background:var(--bg-overlay)}.app-overlay{background:var(--bg-overlay);-webkit-backdrop-filter:blur(10px)saturate(140%);backdrop-filter:blur(10px)saturate(140%)}.elev-1{box-shadow:inset 0 1px #ffffff0d,0 2px 6px #00000059}.elev-2{box-shadow:inset 0 1px #ffffff0f,0 12px 28px #00000073,0 4px 10px #00000059}.input{width:100%;color:var(--text-primary);background:var(--bg-1);border:1px solid var(--border-bright);transition:border-color var(--dur-fast) var(--ease-out),box-shadow var(--dur-fast) var(--ease-out),background var(--dur-fast) var(--ease-out);border-radius:6px;outline:none;padding:8px 12px;font-size:13px;display:block;box-shadow:inset 0 1px 2px #00000040}.input::placeholder{color:var(--text-tertiary)}.input:hover:not(:focus){border-color:var(--text-tertiary)}.input:focus-visible{border-color:var(--accent);box-shadow:inset 0 1px 2px #00000040,0 0 0 3px var(--ring-focus)}.input--readonly{background:var(--bg-0);color:var(--text-secondary);cursor:default}@keyframes dialog-overlay-in{0%{opacity:0}to{opacity:1}}@keyframes dialog-overlay-out{0%{opacity:1}to{opacity:0}}@keyframes dialog-pop-in{0%{opacity:0;transform:translate(-50%,-50%)scale(.94)}to{opacity:1;transform:translate(-50%,-50%)scale(1)}}@keyframes dialog-pop-out{0%{opacity:1;transform:translate(-50%,-50%)scale(1)}to{opacity:0;transform:translate(-50%,-50%)scale(.97)}}@keyframes dialog-scale-pop-in{0%{opacity:0;transform:scale(.94)}to{opacity:1;transform:scale(1)}}@keyframes dialog-scale-pop-out{0%{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.97)}}@keyframes drawer-pop-in{0%{opacity:0;transform:translate(24px)}to{opacity:1;transform:translate(0)}}@keyframes drawer-pop-out{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(24px)}}.app-overlay[data-state=open]{animation:dialog-overlay-in .18s var(--ease-out)}.app-overlay[data-state=closed]{animation:dialog-overlay-out .14s var(--ease-in)}.dialog-pop[data-state=open]{animation:dialog-pop-in .2s var(--ease-out) both}.dialog-pop[data-state=closed]{animation:dialog-pop-out .14s var(--ease-in) both}.dialog-scale-pop[data-state=open]{animation:dialog-scale-pop-in .2s var(--ease-out) both}.dialog-scale-pop[data-state=closed]{animation:dialog-scale-pop-out .14s var(--ease-in) both}.drawer-pop[data-state=open]{animation:drawer-pop-in .22s var(--ease-modal) both}.drawer-pop[data-state=closed]{animation:drawer-pop-out .16s var(--ease-in) both}@media(prefers-reduced-motion:reduce){.app-overlay[data-state=open],.app-overlay[data-state=closed],.dialog-pop[data-state=open],.dialog-pop[data-state=closed],.dialog-scale-pop[data-state=open],.dialog-scale-pop[data-state=closed],.drawer-pop[data-state=open],.drawer-pop[data-state=closed]{animation:none}}@keyframes toast-in{0%{opacity:0;transform:translateY(16px)scale(.95)}to{opacity:1;transform:translateY(0)scale(1)}}.toast-pop{animation:toast-in .32s var(--ease-overshoot)}@media(prefers-reduced-motion:reduce){.toast-pop{animation:none}}.float-action{border:1px solid var(--border-bright);border-radius:8px;justify-content:center;align-items:center;width:30px;height:30px;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.float-action{border:1px solid color-mix(in oklab,var(--border-bright) 80%,transparent)}}.float-action{background:var(--bg-1)}@supports (color:color-mix(in lab,red,red)){.float-action{background:color-mix(in oklab,var(--bg-1) 70%,transparent)}}.float-action{color:var(--text-secondary);-webkit-backdrop-filter:blur(10px)saturate(140%);backdrop-filter:blur(10px)saturate(140%);cursor:pointer;transition:background var(--dur-fast) var(--ease-out),color var(--dur-fast) var(--ease-out),border-color var(--dur-fast) var(--ease-out),transform 80ms var(--ease-out);box-shadow:inset 0 1px #ffffff0a,0 2px 6px #0000004d}.float-action:hover{background:var(--bg-2)}@supports (color:color-mix(in lab,red,red)){.float-action:hover{background:color-mix(in oklab,var(--bg-2) 85%,transparent)}}.float-action:hover{border-color:var(--border-bright);color:var(--text-primary)}.float-action:active{transform:scale(.95)}.float-action:focus-visible{border-color:var(--accent);box-shadow:inset 0 1px #ffffff0a,0 2px 6px #0000004d,0 0 0 3px var(--ring-focus);outline:none}.float-action:disabled{opacity:.5;cursor:not-allowed;transform:none}.float-action[data-variant=primary]{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.float-action[data-variant=primary]{background:color-mix(in oklab,var(--accent) 88%,transparent)}}.float-action[data-variant=primary]{color:var(--text-primary);border-color:#fff}@supports (color:color-mix(in lab,red,red)){.float-action[data-variant=primary]{border-color:color-mix(in oklab,#fff 20%,var(--accent))}}.float-action[data-variant=primary]{box-shadow:inset 0 1px #ffffff2e,0 2px 6px #00000059}.float-action[data-variant=primary]:hover{background:var(--accent-hover)}.float-action[data-variant=danger]{color:var(--status-red)}.float-action[data-variant=danger]:hover{background:var(--status-red)}@supports (color:color-mix(in lab,red,red)){.float-action[data-variant=danger]:hover{background:color-mix(in oklab,var(--status-red) 18%,transparent)}}.float-action[data-variant=danger]:hover{border-color:var(--status-red)}@supports (color:color-mix(in lab,red,red)){.float-action[data-variant=danger]:hover{border-color:color-mix(in oklab,var(--status-red) 50%,var(--border-bright))}}.float-action[data-variant=danger]:hover{color:var(--status-red)}.float-action-divider{background:var(--border-bright);width:1px;height:18px;margin:0 4px}@supports (color:color-mix(in lab,red,red)){.float-action-divider{background:color-mix(in oklab,var(--border-bright) 80%,transparent)}}.worker-card-grid{grid-template-columns:repeat(auto-fill,minmax(min(200px,100%),1fr));gap:10px;display:grid}.worker-card-shell{position:relative}.worker-card__status{letter-spacing:.1px;white-space:nowrap;border:1px solid #0000;border-radius:999px;align-self:flex-start;align-items:center;gap:6px;padding:3px 8px 3px 7px;font-size:11px;font-weight:500;display:inline-flex}.worker-card__status--working{color:var(--status-green);background:var(--status-green)}@supports (color:color-mix(in lab,red,red)){.worker-card__status--working{background:color-mix(in oklab,var(--status-green) 10%,transparent)}}.worker-card__status--working{border-color:var(--status-green)}@supports (color:color-mix(in lab,red,red)){.worker-card__status--working{border-color:color-mix(in oklab,var(--status-green) 24%,transparent)}}.worker-card__status--queued{color:var(--status-orange);background:var(--status-orange)}@supports (color:color-mix(in lab,red,red)){.worker-card__status--queued{background:color-mix(in oklab,var(--status-orange) 10%,transparent)}}.worker-card__status--queued{border-color:var(--status-orange)}@supports (color:color-mix(in lab,red,red)){.worker-card__status--queued{border-color:color-mix(in oklab,var(--status-orange) 24%,transparent)}}.worker-card__status--idle{color:var(--text-secondary);background:var(--bg-3)}.worker-card__status--stopped{color:var(--status-red);background:var(--status-red)}@supports (color:color-mix(in lab,red,red)){.worker-card__status--stopped{background:color-mix(in oklab,var(--status-red) 10%,transparent)}}.worker-card__status--stopped{border-color:var(--status-red)}@supports (color:color-mix(in lab,red,red)){.worker-card__status--stopped{border-color:color-mix(in oklab,var(--status-red) 24%,transparent)}}.worker-card__queue{letter-spacing:.1px;font-feature-settings:"tnum" 1;height:20px;color:var(--status-orange);background:var(--status-orange);border-radius:999px;align-items:center;padding:0 8px;font-size:10px;font-weight:600;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.worker-card__queue{background:color-mix(in oklab,var(--status-orange) 12%,transparent)}}.worker-card__queue{border:1px solid var(--status-orange)}@supports (color:color-mix(in lab,red,red)){.worker-card__queue{border:1px solid color-mix(in oklab,var(--status-orange) 32%,transparent)}}.worker-card__queue{pointer-events:none;white-space:nowrap;transition:opacity var(--dur-fast) var(--ease-out);box-shadow:inset 0 1px #ffffff0d}.worker-card-shell:hover .worker-card__queue,.worker-card-shell:focus-within .worker-card__queue{opacity:0}.worker-card-shell:hover .worker-card__actions,.worker-card-shell:focus-within .worker-card__actions{opacity:1;pointer-events:auto;transform:translateY(0)}.worker-card__actions{opacity:0;transition:opacity var(--dur-fast) var(--ease-out),transform var(--dur-fast) var(--ease-out);pointer-events:none;z-index:2;align-items:center;gap:4px;display:flex;position:absolute;top:8px;right:8px;transform:translateY(-2px)}.worker-card__action{border:1px solid var(--border-bright);background:var(--bg-2);border-radius:6px;justify-content:center;align-items:center;width:24px;height:24px;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.worker-card__action{background:color-mix(in oklab,var(--bg-2) 92%,transparent)}}.worker-card__action{color:var(--text-secondary);cursor:pointer;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);transition:background var(--dur-fast) var(--ease-out),border-color var(--dur-fast) var(--ease-out),color var(--dur-fast) var(--ease-out),transform 80ms var(--ease-out);box-shadow:inset 0 1px #ffffff0d,0 1px 2px #00000040}.worker-card__action:hover{background:var(--bg-3);border-color:var(--text-tertiary);color:var(--text-primary)}.worker-card__action:active{transform:scale(.94)}.worker-card__action:disabled{opacity:.5;cursor:not-allowed;transform:none}.worker-card__action[data-variant=primary]{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.worker-card__action[data-variant=primary]{background:color-mix(in oklab,var(--accent) 88%,transparent)}}.worker-card__action[data-variant=primary]{border-color:#fff}@supports (color:color-mix(in lab,red,red)){.worker-card__action[data-variant=primary]{border-color:color-mix(in oklab,#fff 18%,var(--accent))}}.worker-card__action[data-variant=primary]{color:var(--text-primary);box-shadow:inset 0 1px #ffffff2e,0 1px 2px #0000004d}.worker-card__action[data-variant=primary]:hover{background:var(--accent-hover);border-color:#fff}@supports (color:color-mix(in lab,red,red)){.worker-card__action[data-variant=primary]:hover{border-color:color-mix(in oklab,#fff 24%,var(--accent-hover))}}.worker-card__action[data-variant=danger]:hover{background:var(--status-red)}@supports (color:color-mix(in lab,red,red)){.worker-card__action[data-variant=danger]:hover{background:color-mix(in oklab,var(--status-red) 14%,transparent)}}.worker-card__action[data-variant=danger]:hover{border-color:var(--status-red)}@supports (color:color-mix(in lab,red,red)){.worker-card__action[data-variant=danger]:hover{border-color:color-mix(in oklab,var(--status-red) 40%,var(--border-bright))}}.worker-card__action[data-variant=danger]:hover{color:var(--status-red)}.modal-resize-handle{cursor:ew-resize;z-index:6;-webkit-user-select:none;user-select:none;touch-action:none;outline:none;width:8px;position:absolute;top:0;bottom:0}.modal-resize-handle--left{left:-4px}.modal-resize-handle--right{right:-4px}.modal-resize-handle:before{content:"";width:1px;transition:background var(--dur-fast) var(--ease-out),box-shadow var(--dur-fast) var(--ease-out);background:0 0;position:absolute;top:0;bottom:0}.modal-resize-handle--left:before{left:4px}.modal-resize-handle--right:before{right:4px}.modal-resize-handle:hover:before,.modal-resize-handle[data-resizing]:before{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.modal-resize-handle:hover:before,.modal-resize-handle[data-resizing]:before{background:color-mix(in oklab,var(--accent) 68%,var(--border-bright))}}.modal-resize-handle:hover:before,.modal-resize-handle[data-resizing]:before{box-shadow:0 0 0 2px var(--accent)}@supports (color:color-mix(in lab,red,red)){.modal-resize-handle:hover:before,.modal-resize-handle[data-resizing]:before{box-shadow:0 0 0 2px color-mix(in oklab,var(--accent) 12%,transparent)}}.pane-splitter{cursor:col-resize;z-index:5;-webkit-user-select:none;user-select:none;touch-action:none;background:0 0;outline:none;width:8px;position:absolute;top:0;bottom:0}.pane-splitter:before{content:"";width:1px;transition:background var(--dur-fast) var(--ease-out),box-shadow var(--dur-fast) var(--ease-out);background:0 0;position:absolute;top:0;bottom:0;left:3px}.pane-splitter:hover:before,.pane-splitter:focus-visible:before,.pane-splitter[data-dragging]:before{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.pane-splitter:hover:before,.pane-splitter:focus-visible:before,.pane-splitter[data-dragging]:before{background:color-mix(in oklab,var(--accent) 68%,var(--border-bright))}}.pane-splitter:hover:before,.pane-splitter:focus-visible:before,.pane-splitter[data-dragging]:before{box-shadow:0 0 0 2px var(--accent)}@supports (color:color-mix(in lab,red,red)){.pane-splitter:hover:before,.pane-splitter:focus-visible:before,.pane-splitter[data-dragging]:before{box-shadow:0 0 0 2px color-mix(in oklab,var(--accent) 12%,transparent)}}.cli-select{background:var(--bg-1);border:1px solid var(--border-bright);transition:border-color var(--dur-fast) var(--ease-out),box-shadow var(--dur-fast) var(--ease-out);border-radius:6px;align-items:center;display:flex;position:relative;box-shadow:inset 0 1px 2px #00000040}.cli-select:hover{border-color:var(--text-tertiary)}.cli-select:focus-within{border-color:var(--accent);box-shadow:inset 0 1px 2px #00000040,0 0 0 3px var(--ring-focus)}.cli-select__leading{color:var(--text-tertiary);pointer-events:none;position:absolute;left:10px}.cli-select__trailing{color:var(--text-secondary);pointer-events:none;transition:transform var(--dur-fast) var(--ease-out);position:absolute;right:10px}.cli-select:focus-within .cli-select__trailing{transform:translateY(1px)}.cli-select__field{appearance:none;width:100%;color:var(--text-primary);cursor:pointer;background:0 0;border:0;outline:none;padding:8px 32px;font-family:inherit;font-size:13px;font-weight:500}.cli-select__field:disabled{color:var(--text-tertiary);cursor:not-allowed}.cli-select__field option{background:var(--bg-elevated);color:var(--text-primary)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}.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;inset:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.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;inset:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{font-family:monospace;-webkit-user-select:text;user-select:text;white-space:pre}.xterm .xterm-accessibility-tree>div{transform-origin:left;width:fit-content}.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}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;background:#0000;transition:opacity .1s linear;z-index:11}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{position:absolute;display:none}.xterm .xterm-scrollable-element>.shadow.top{display:block;top:0;left:3px;height:3px;width:100%;box-shadow:var(--vscode-scrollbar-shadow, #000) 0 6px 6px -6px inset}.xterm .xterm-scrollable-element>.shadow.left{display:block;top:3px;left:0;height:100%;width:3px;box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}.xterm .xterm-scrollable-element>.shadow.top-left-corner{display:block;top:0;left:0;height:3px;width:3px}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow, #000) 6px 0 6px -6px inset}
|