linkshell-cli 0.5.19 → 0.5.21
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/dist/cli/src/runtime/acp/agent-workspace.js +64 -4
- package/dist/cli/src/runtime/acp/agent-workspace.js.map +1 -1
- package/dist/cli/src/runtime/acp/claude-sdk-client.d.ts +21 -0
- package/dist/cli/src/runtime/acp/claude-sdk-client.js +138 -14
- package/dist/cli/src/runtime/acp/claude-sdk-client.js.map +1 -1
- package/dist/cli/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/runtime/acp/agent-workspace.ts +69 -4
- package/src/runtime/acp/claude-sdk-client.ts +143 -13
- package/web/assets/{index-Cxv9bt2l.css → index-BF_KJjhI.css} +1 -1
- package/web/assets/{index-yxFH4TkI.js → index-C6jrt3Ma.js} +13 -13
- package/web/index.html +2 -2
|
@@ -945,6 +945,8 @@ const CLAUDE_REMOTE_HIDDEN_COMMANDS = new Set([
|
|
|
945
945
|
"resume",
|
|
946
946
|
"rewind",
|
|
947
947
|
"settings",
|
|
948
|
+
"setup-bedrock",
|
|
949
|
+
"setup-vertex",
|
|
948
950
|
"statusline",
|
|
949
951
|
"stickers",
|
|
950
952
|
"tasks",
|
|
@@ -994,6 +996,7 @@ const CLAUDE_BUILT_IN_COMMANDS: Array<{ name: string; description: string; argsM
|
|
|
994
996
|
{ name: "bug", description: "Alias for /feedback" },
|
|
995
997
|
{ name: "fewer-permission-prompts", description: "Reduce common permission prompts", argsMode: "none" },
|
|
996
998
|
{ name: "focus", description: "Toggle the focus view", argsMode: "none" },
|
|
999
|
+
{ name: "goal", description: "Set or clear a session goal the agent works toward", argsMode: "raw" },
|
|
997
1000
|
{ name: "heapdump", description: "Write a JavaScript heap snapshot for diagnostics", argsMode: "none" },
|
|
998
1001
|
{ name: "help", description: "Show help and available commands", argsMode: "none" },
|
|
999
1002
|
{ name: "hooks", description: "View hook configurations", argsMode: "none" },
|
|
@@ -1226,7 +1229,20 @@ function mergeCommands(...groups: Array<AgentCommandDescriptor[] | undefined>):
|
|
|
1226
1229
|
map.set(key, {
|
|
1227
1230
|
...existing,
|
|
1228
1231
|
...command,
|
|
1232
|
+
// Preserve curated metadata the discovered set doesn't carry: the SDK's
|
|
1233
|
+
// SlashCommand has no destructive/category/argsMode/executionKind
|
|
1234
|
+
// fields, and runtimeCommands hardcodes argsMode:"raw" + executionKind:
|
|
1235
|
+
// "prompt". The merge order is (curated, discovered), so without these
|
|
1236
|
+
// a discovered /clear would clobber the curated destructive flag
|
|
1237
|
+
// (red-dot warning), the grouping, AND the curated argsMode:"none" that
|
|
1238
|
+
// makes the web palette execute it on pick (vs insert-and-wait). For
|
|
1239
|
+
// Codex it would also flip native commands to "prompt". Curated wins on
|
|
1240
|
+
// collision; genuinely new discovered commands fall through to "raw".
|
|
1241
|
+
destructive: command.destructive ?? existing?.destructive,
|
|
1242
|
+
category: command.category ?? existing?.category,
|
|
1229
1243
|
disabledReason: command.disabledReason ?? existing?.disabledReason,
|
|
1244
|
+
argsMode: existing?.argsMode ?? command.argsMode,
|
|
1245
|
+
executionKind: existing?.executionKind ?? command.executionKind,
|
|
1230
1246
|
});
|
|
1231
1247
|
}
|
|
1232
1248
|
}
|
|
@@ -1272,7 +1288,7 @@ function runtimeCommands(provider: AgentProvider, value: unknown): AgentCommandD
|
|
|
1272
1288
|
.filter((entry): entry is AgentCommandDescriptor => Boolean(entry));
|
|
1273
1289
|
}
|
|
1274
1290
|
|
|
1275
|
-
function parseModelListCapabilities(value: unknown): ProviderRuntimeCapabilities | undefined {
|
|
1291
|
+
function parseModelListCapabilities(provider: AgentProvider, value: unknown): ProviderRuntimeCapabilities | undefined {
|
|
1276
1292
|
const raw = asRecord(value);
|
|
1277
1293
|
const modelsValue =
|
|
1278
1294
|
Array.isArray(value) ? value :
|
|
@@ -1326,11 +1342,13 @@ function parseModelListCapabilities(value: unknown): ProviderRuntimeCapabilities
|
|
|
1326
1342
|
const reasoningEfforts = efforts.size
|
|
1327
1343
|
? ALL_REASONING_EFFORTS.filter((effort) => efforts.has(effort))
|
|
1328
1344
|
: undefined;
|
|
1329
|
-
|
|
1345
|
+
const commands = raw && Array.isArray(raw.commands) ? runtimeCommands(provider, raw.commands) : undefined;
|
|
1346
|
+
if (models.length === 0 && !defaultModel && !reasoningEfforts?.length && !commands?.length) return undefined;
|
|
1330
1347
|
return {
|
|
1331
1348
|
...(models.length > 0 ? { models } : {}),
|
|
1332
1349
|
...(defaultModel ? { defaultModel } : {}),
|
|
1333
1350
|
...(reasoningEfforts?.length ? { reasoningEfforts } : {}),
|
|
1351
|
+
...(commands?.length ? { commands } : {}),
|
|
1334
1352
|
};
|
|
1335
1353
|
}
|
|
1336
1354
|
|
|
@@ -1353,6 +1371,7 @@ function parseRemoteSessions(value: unknown): Array<{
|
|
|
1353
1371
|
createdAt?: number;
|
|
1354
1372
|
lastActivityAt?: number;
|
|
1355
1373
|
usage?: unknown;
|
|
1374
|
+
status?: AgentStatus;
|
|
1356
1375
|
}> {
|
|
1357
1376
|
const raw = asRecord(value);
|
|
1358
1377
|
const sessionsValue =
|
|
@@ -1370,6 +1389,7 @@ function parseRemoteSessions(value: unknown): Array<{
|
|
|
1370
1389
|
createdAt?: number;
|
|
1371
1390
|
lastActivityAt?: number;
|
|
1372
1391
|
usage?: unknown;
|
|
1392
|
+
status?: AgentStatus;
|
|
1373
1393
|
}> = [];
|
|
1374
1394
|
for (const entry of sessionsValue) {
|
|
1375
1395
|
const session = asRecord(entry);
|
|
@@ -1381,6 +1401,12 @@ function parseRemoteSessions(value: unknown): Array<{
|
|
|
1381
1401
|
const source = nestedThread ?? session;
|
|
1382
1402
|
const id = firstString(source, ["id", "threadId", "sessionId", "agentSessionId"]);
|
|
1383
1403
|
if (!id) continue;
|
|
1404
|
+
// Only accept a transcript-derived status the provider actually reported
|
|
1405
|
+
// (Claude's listSessions sets "running"/"idle" from the on-disk transcript).
|
|
1406
|
+
// Anything else is left undefined so the sync site keeps its own status.
|
|
1407
|
+
const reportedStatus = firstString(source, ["status"]);
|
|
1408
|
+
const status: AgentStatus | undefined =
|
|
1409
|
+
reportedStatus === "running" || reportedStatus === "idle" ? reportedStatus : undefined;
|
|
1384
1410
|
result.push({
|
|
1385
1411
|
id,
|
|
1386
1412
|
cwd: firstString(source, ["cwd", "workingDirectory", "workspacePath"]),
|
|
@@ -1389,6 +1415,7 @@ function parseRemoteSessions(value: unknown): Array<{
|
|
|
1389
1415
|
createdAt: parseTimestamp(source.createdAt ?? source.created_at),
|
|
1390
1416
|
lastActivityAt: parseTimestamp(source.lastActivityAt ?? source.updatedAt ?? source.modifiedAt ?? source.lastModified ?? source.updated_at),
|
|
1391
1417
|
usage: source.usage,
|
|
1418
|
+
...(status ? { status } : {}),
|
|
1392
1419
|
});
|
|
1393
1420
|
}
|
|
1394
1421
|
return result;
|
|
@@ -1988,7 +2015,7 @@ export class AgentWorkspaceProxy {
|
|
|
1988
2015
|
if (typeof listModels === "function") {
|
|
1989
2016
|
try {
|
|
1990
2017
|
const result = await listModels.call(client);
|
|
1991
|
-
runtimeCapabilities = parseModelListCapabilities(result);
|
|
2018
|
+
runtimeCapabilities = parseModelListCapabilities(provider, result);
|
|
1992
2019
|
} catch (error) {
|
|
1993
2020
|
if (this.input.verbose) {
|
|
1994
2021
|
process.stderr.write(`[agent:v2] model/list failed for ${provider}: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
@@ -2047,6 +2074,26 @@ export class AgentWorkspaceProxy {
|
|
|
2047
2074
|
const usage: AgentConversationUsage | undefined = usageFields
|
|
2048
2075
|
? { ...usageFields, updatedAt: remote.lastActivityAt ?? now }
|
|
2049
2076
|
: existing?.usage;
|
|
2077
|
+
// Status precedence. While LinkShell is driving a turn for this
|
|
2078
|
+
// conversation, the in-memory status is authoritative — the transcript
|
|
2079
|
+
// lags (the SDK hasn't flushed the in-flight turn to disk), so trusting
|
|
2080
|
+
// it would flicker a live "running" turn back to idle. Otherwise the
|
|
2081
|
+
// transcript-derived remote.status is authoritative for Claude (it
|
|
2082
|
+
// reports running/idle straight from disk): surface "running" while an
|
|
2083
|
+
// external process drives it, and let its "idle" clear a previously
|
|
2084
|
+
// observed "running" once the external turn finishes. We only fall
|
|
2085
|
+
// back to the existing status to keep error/waiting_permission sticky
|
|
2086
|
+
// across a re-sync — deriveTranscriptStatus never emits those, so they
|
|
2087
|
+
// live only in `existing`; defaulting everything else to idle avoids a
|
|
2088
|
+
// purely-external session getting stuck at "running" forever.
|
|
2089
|
+
const linkshellDriving = this.currentTurnIds.has(conversationId);
|
|
2090
|
+
const status: AgentStatus = linkshellDriving
|
|
2091
|
+
? existing?.status ?? "running"
|
|
2092
|
+
: remote.status === "running"
|
|
2093
|
+
? "running"
|
|
2094
|
+
: existing?.status === "error" || existing?.status === "waiting_permission"
|
|
2095
|
+
? existing.status
|
|
2096
|
+
: "idle";
|
|
2050
2097
|
const conversation: AgentConversation = {
|
|
2051
2098
|
id: conversationId,
|
|
2052
2099
|
agentSessionId,
|
|
@@ -2057,7 +2104,7 @@ export class AgentWorkspaceProxy {
|
|
|
2057
2104
|
reasoningEffort: existing?.reasoningEffort,
|
|
2058
2105
|
permissionMode: existing?.permissionMode,
|
|
2059
2106
|
collaborationMode: existing?.collaborationMode,
|
|
2060
|
-
status
|
|
2107
|
+
status,
|
|
2061
2108
|
archived: existing?.archived ?? false,
|
|
2062
2109
|
lastMessagePreview: existing?.lastMessagePreview,
|
|
2063
2110
|
lastActivityAt: remote.lastActivityAt ?? existing?.lastActivityAt ?? now,
|
|
@@ -2152,6 +2199,24 @@ export class AgentWorkspaceProxy {
|
|
|
2152
2199
|
const model = firstString(thread, ["model", "modelId", "currentModel"]);
|
|
2153
2200
|
if (model && !conversation.model) conversation.model = model;
|
|
2154
2201
|
|
|
2202
|
+
// Seed a scroll-back cursor for Claude, which hydrates via readSession (full
|
|
2203
|
+
// transcript) yet pages via listTurns. The timeline only keeps the last
|
|
2204
|
+
// MAX_TIMELINE_ITEMS, so anything older is dropped here but reachable via
|
|
2205
|
+
// agent.v2.history.request. Cursor = total turn count (end-exclusive): the
|
|
2206
|
+
// first page overlaps the displayed tail (harmlessly deduped by the client's
|
|
2207
|
+
// mergeTimeline) and each subsequent page walks strictly older, terminating
|
|
2208
|
+
// when the cursor reaches 0. This integer-index cursor is Claude-specific —
|
|
2209
|
+
// Codex uses an opaque string cursor captured by the listTurns branch above,
|
|
2210
|
+
// so gate strictly on the provider rather than on listTurns presence (Codex
|
|
2211
|
+
// also exposes listTurns) to avoid poisoning Codex's cursor.
|
|
2212
|
+
if (
|
|
2213
|
+
conversation.provider === "claude" &&
|
|
2214
|
+
!this.historyCursors.has(conversation.id)
|
|
2215
|
+
) {
|
|
2216
|
+
const turnCount = Array.isArray(thread?.turns) ? thread.turns.length : 0;
|
|
2217
|
+
if (turnCount > 0) this.historyCursors.set(conversation.id, String(turnCount));
|
|
2218
|
+
}
|
|
2219
|
+
|
|
2155
2220
|
const hydratedItems = timelineItemsFromProviderThread(source, conversation.id);
|
|
2156
2221
|
if (hydratedItems.length === 0) return;
|
|
2157
2222
|
const existing = this.timelines.get(conversation.id) ?? [];
|
|
@@ -389,10 +389,55 @@ export function parseClaudeJsonlSession(input: {
|
|
|
389
389
|
};
|
|
390
390
|
}
|
|
391
391
|
|
|
392
|
+
/** Derive whether an on-disk Claude transcript is being actively driven RIGHT
|
|
393
|
+
* NOW by some process (LinkShell or an external `claude` terminal), purely from
|
|
394
|
+
* the file. Combines a structural signal (the last record) with a freshness
|
|
395
|
+
* signal (mtime), so it neither misses a live external turn nor sticks at
|
|
396
|
+
* "running" forever if that process dies mid-turn.
|
|
397
|
+
*
|
|
398
|
+
* - last record is a completed assistant turn (stop_reason "end_turn") → idle,
|
|
399
|
+
* regardless of mtime (the turn is definitively done).
|
|
400
|
+
* - otherwise the structure is mid-turn (awaiting an assistant response, an
|
|
401
|
+
* assistant still calling tools, or a half-written trailing line). If the
|
|
402
|
+
* file changed within FRESH_MS, a process is appending → running; if it's
|
|
403
|
+
* stale, the driver is gone → idle.
|
|
404
|
+
* Verified against real transcripts: mid-turn+fresh→running, mid-turn+stale→
|
|
405
|
+
* idle, end_turn+fresh→idle, half-written-line+fresh→running. */
|
|
406
|
+
function deriveTranscriptStatus(text: string, mtimeMs: number, nowMs: number): "running" | "idle" {
|
|
407
|
+
const FRESH_MS = 10_000;
|
|
408
|
+
const fresh = nowMs - mtimeMs < FRESH_MS;
|
|
409
|
+
const lines = text.split(/\r?\n/);
|
|
410
|
+
let last: Record<string, unknown> | undefined;
|
|
411
|
+
let sawUnparseableTail = false;
|
|
412
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
413
|
+
const ln = lines[i];
|
|
414
|
+
if (!ln || !ln.trim()) continue;
|
|
415
|
+
try {
|
|
416
|
+
last = asRecord(JSON.parse(ln));
|
|
417
|
+
break;
|
|
418
|
+
} catch {
|
|
419
|
+
// A trailing half-written line means a writer is mid-append.
|
|
420
|
+
sawUnparseableTail = true;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
if (!last) return "idle";
|
|
424
|
+
const message = asRecord(last.message);
|
|
425
|
+
const role = stringField(message, ["role"]) ?? stringField(last, ["type"]);
|
|
426
|
+
const stop = message ? message.stop_reason ?? null : null;
|
|
427
|
+
if (role === "assistant" && stop === "end_turn") return "idle";
|
|
428
|
+
const midTurn =
|
|
429
|
+
role === "user" ||
|
|
430
|
+
last.type === "user" ||
|
|
431
|
+
(role === "assistant" && (stop === "tool_use" || stop === null)) ||
|
|
432
|
+
sawUnparseableTail;
|
|
433
|
+
return midTurn && fresh ? "running" : "idle";
|
|
434
|
+
}
|
|
435
|
+
|
|
392
436
|
function claudeSessionMetadataFromFile(filePath: string, cwd: string, sessionId: string): Record<string, unknown> {
|
|
393
437
|
const stat = statSync(filePath);
|
|
438
|
+
const text = readFileSync(filePath, "utf8");
|
|
394
439
|
const parsed = parseClaudeJsonlSession({
|
|
395
|
-
text
|
|
440
|
+
text,
|
|
396
441
|
cwd,
|
|
397
442
|
sessionId,
|
|
398
443
|
fallbackUpdatedAt: stat.mtimeMs,
|
|
@@ -407,6 +452,10 @@ function claudeSessionMetadataFromFile(filePath: string, cwd: string, sessionId:
|
|
|
407
452
|
lastActivityAt: parseTimestamp(thread.updatedAt) ?? stat.mtimeMs,
|
|
408
453
|
lastModified: stat.mtimeMs,
|
|
409
454
|
usage: asRecord(thread.usage),
|
|
455
|
+
// Live status read straight from the transcript, so a session another
|
|
456
|
+
// `claude` process is actively driving shows as "running" in the list
|
|
457
|
+
// rather than the hardcoded "idle" the workspace would otherwise assign.
|
|
458
|
+
status: deriveTranscriptStatus(text, stat.mtimeMs, Date.now()),
|
|
410
459
|
};
|
|
411
460
|
}
|
|
412
461
|
|
|
@@ -453,6 +502,13 @@ const FALLBACK_MODEL_LABELS: Record<string, string> = {
|
|
|
453
502
|
"opus[1m]": "Opus 1M",
|
|
454
503
|
};
|
|
455
504
|
|
|
505
|
+
// Canonical Claude Code model aliases, used whenever live model discovery
|
|
506
|
+
// (supportedModels()) returns nothing. Hoisted so the two listModels() fallback
|
|
507
|
+
// branches stay in sync — a new alias added here reaches both.
|
|
508
|
+
const DEFAULT_FALLBACK_MODELS = ["default", "sonnet", "opus", "opusplan", "haiku", "sonnet[1m]", "opus[1m]"];
|
|
509
|
+
const toModelEntries = (ids: string[]): { id: string; label: string }[] =>
|
|
510
|
+
ids.map((id) => ({ id, label: FALLBACK_MODEL_LABELS[id] ?? id }));
|
|
511
|
+
|
|
456
512
|
export class ClaudeSdkClient {
|
|
457
513
|
private query: ClaudeQuery | undefined;
|
|
458
514
|
private startup: ((params?: { options?: Record<string, unknown>; initializeTimeoutMs?: number }) => Promise<{ query(prompt: string): AsyncGenerator<unknown> & { supportedModels(): Promise<{ value: string; displayName: string }[]>; interrupt(): Promise<void> }; close(): void }>) | undefined;
|
|
@@ -506,14 +562,8 @@ export class ClaudeSdkClient {
|
|
|
506
562
|
}
|
|
507
563
|
|
|
508
564
|
async readSession(input: { sessionId: string; includeTurns?: boolean }): Promise<unknown> {
|
|
509
|
-
|
|
510
|
-
if (!
|
|
511
|
-
const match = claudeProjectDirs(this.input.cwd)
|
|
512
|
-
.map((dir) => join(dir, `${input.sessionId}.jsonl`))
|
|
513
|
-
.find((candidate) => existsSync(candidate));
|
|
514
|
-
if (match) filePath = match;
|
|
515
|
-
}
|
|
516
|
-
if (!existsSync(filePath)) {
|
|
565
|
+
const filePath = this.resolveSessionFile(input.sessionId);
|
|
566
|
+
if (!filePath) {
|
|
517
567
|
return {
|
|
518
568
|
thread: {
|
|
519
569
|
id: input.sessionId,
|
|
@@ -532,6 +582,65 @@ export class ClaudeSdkClient {
|
|
|
532
582
|
});
|
|
533
583
|
}
|
|
534
584
|
|
|
585
|
+
/** Resolve the on-disk JSONL transcript for a session, preferring the cwd's
|
|
586
|
+
* project dir and falling back to a scan of sibling project dirs. */
|
|
587
|
+
private resolveSessionFile(sessionId: string): string | undefined {
|
|
588
|
+
const preferred = join(claudeProjectDir(this.input.cwd), `${sessionId}.jsonl`);
|
|
589
|
+
if (existsSync(preferred)) return preferred;
|
|
590
|
+
return claudeProjectDirs(this.input.cwd)
|
|
591
|
+
.map((dir) => join(dir, `${sessionId}.jsonl`))
|
|
592
|
+
.find((candidate) => existsSync(candidate));
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
/** Page OLDER transcript turns for scroll-back, mirroring Codex's
|
|
596
|
+
* thread/turns/list. The whole transcript lives on disk and is already
|
|
597
|
+
* parsed by parseClaudeJsonlSession, so we slice a window of chronological
|
|
598
|
+
* turns by an integer end-exclusive cursor.
|
|
599
|
+
*
|
|
600
|
+
* Cursor = the exclusive upper-bound turn index for the page. No cursor =
|
|
601
|
+
* start at the end (total turn count). A page returns turns [lo, hi) where
|
|
602
|
+
* lo = max(0, hi - limit); nextCursor = String(lo) while lo > 0, else absent
|
|
603
|
+
* (start of history reached). The web client's mergeTimeline dedupes by id
|
|
604
|
+
* and re-sorts by createdAt, so any overlap between this page and what the
|
|
605
|
+
* client already shows is harmless. */
|
|
606
|
+
async listTurns(input: {
|
|
607
|
+
sessionId: string;
|
|
608
|
+
limit?: number;
|
|
609
|
+
cursor?: string;
|
|
610
|
+
sortDirection?: "asc" | "desc";
|
|
611
|
+
itemsView?: "summary" | "full";
|
|
612
|
+
}): Promise<unknown> {
|
|
613
|
+
const empty = { sessionId: input.sessionId, turns: [], sortDirection: "asc" as const };
|
|
614
|
+
const filePath = this.resolveSessionFile(input.sessionId);
|
|
615
|
+
if (!filePath) return empty;
|
|
616
|
+
|
|
617
|
+
const stat = statSync(filePath);
|
|
618
|
+
const parsed = parseClaudeJsonlSession({
|
|
619
|
+
text: readFileSync(filePath, "utf8"),
|
|
620
|
+
cwd: this.input.cwd,
|
|
621
|
+
sessionId: input.sessionId,
|
|
622
|
+
fallbackUpdatedAt: stat.mtimeMs,
|
|
623
|
+
});
|
|
624
|
+
const thread = asRecord(parsed.thread);
|
|
625
|
+
const allTurns = Array.isArray(thread?.turns) ? thread.turns : [];
|
|
626
|
+
const total = allTurns.length;
|
|
627
|
+
if (total === 0) return empty;
|
|
628
|
+
|
|
629
|
+
const limit = input.limit && input.limit > 0 ? Math.floor(input.limit) : 50;
|
|
630
|
+
// Parse the end-exclusive cursor; default to the end of history. Clamp into
|
|
631
|
+
// [0, total] so a stale/garbage cursor can't slice out of bounds.
|
|
632
|
+
const parsedCursor = input.cursor !== undefined ? Number.parseInt(input.cursor, 10) : total;
|
|
633
|
+
const hi = Number.isFinite(parsedCursor) ? Math.max(0, Math.min(total, parsedCursor)) : total;
|
|
634
|
+
const lo = Math.max(0, hi - limit);
|
|
635
|
+
const page = allTurns.slice(lo, hi);
|
|
636
|
+
return {
|
|
637
|
+
sessionId: input.sessionId,
|
|
638
|
+
turns: page, // already chronological (ascending)
|
|
639
|
+
sortDirection: "asc" as const,
|
|
640
|
+
...(lo > 0 ? { nextCursor: String(lo) } : {}),
|
|
641
|
+
};
|
|
642
|
+
}
|
|
643
|
+
|
|
535
644
|
async prompt(input: {
|
|
536
645
|
sessionId?: string;
|
|
537
646
|
content: unknown[];
|
|
@@ -729,6 +838,18 @@ export class ClaudeSdkClient {
|
|
|
729
838
|
const q = warm.query("");
|
|
730
839
|
try {
|
|
731
840
|
const sdkModels: { value: string; displayName: string }[] = await (q as unknown as { supportedModels(): Promise<{ value: string; displayName: string }[]> }).supportedModels();
|
|
841
|
+
// Discover the REAL slash-command set for the installed Claude Code
|
|
842
|
+
// (built-ins like /goal + project/user custom commands), instead of a
|
|
843
|
+
// hardcoded list that drifts out of sync. Best-effort: an older SDK
|
|
844
|
+
// without supportedCommands() just leaves commands undefined and the
|
|
845
|
+
// static defaults still apply.
|
|
846
|
+
let commands: { name: string; description?: string; argumentHint?: string }[] | undefined;
|
|
847
|
+
try {
|
|
848
|
+
const sdkCommands = await (q as unknown as { supportedCommands?: () => Promise<{ name: string; description?: string; argumentHint?: string }[]> }).supportedCommands?.();
|
|
849
|
+
if (Array.isArray(sdkCommands) && sdkCommands.length > 0) commands = sdkCommands;
|
|
850
|
+
} catch {
|
|
851
|
+
// supportedCommands() unavailable or failed — fall back to static defaults.
|
|
852
|
+
}
|
|
732
853
|
if (sdkModels.length > 0) {
|
|
733
854
|
// Filter to admin-configured allowlist if present, then map to our format.
|
|
734
855
|
const allow = availableModels;
|
|
@@ -738,6 +859,17 @@ export class ClaudeSdkClient {
|
|
|
738
859
|
return {
|
|
739
860
|
defaultModel,
|
|
740
861
|
models: filtered.map((m) => ({ id: m.value, label: m.displayName || m.value })),
|
|
862
|
+
...(commands ? { commands } : {}),
|
|
863
|
+
};
|
|
864
|
+
}
|
|
865
|
+
// No models surfaced, but commands may still be present — return them
|
|
866
|
+
// so the command palette stays in sync even when the model list is empty.
|
|
867
|
+
if (commands) {
|
|
868
|
+
const fallbackModels = availableModels ?? DEFAULT_FALLBACK_MODELS;
|
|
869
|
+
return {
|
|
870
|
+
defaultModel,
|
|
871
|
+
models: toModelEntries(fallbackModels),
|
|
872
|
+
commands,
|
|
741
873
|
};
|
|
742
874
|
}
|
|
743
875
|
} catch {
|
|
@@ -752,12 +884,10 @@ export class ClaudeSdkClient {
|
|
|
752
884
|
}
|
|
753
885
|
|
|
754
886
|
// Fallback: admin-configured allowlist, or the full Claude Code alias set.
|
|
755
|
-
const fallbackModels = availableModels ??
|
|
756
|
-
"default", "sonnet", "opus", "opusplan", "haiku", "sonnet[1m]", "opus[1m]",
|
|
757
|
-
];
|
|
887
|
+
const fallbackModels = availableModels ?? DEFAULT_FALLBACK_MODELS;
|
|
758
888
|
return {
|
|
759
889
|
defaultModel,
|
|
760
|
-
models: fallbackModels
|
|
890
|
+
models: toModelEntries(fallbackModels),
|
|
761
891
|
};
|
|
762
892
|
}
|
|
763
893
|
|
|
@@ -30,4 +30,4 @@
|
|
|
30
30
|
* has been extended to include xterm CSI codes, among
|
|
31
31
|
* other features.
|
|
32
32
|
*/.xterm{cursor:text;position:relative;-moz-user-select:none;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;right:0;left:0;top:0;bottom:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm .xterm-scroll-area{visibility:hidden}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{position:absolute;left:0;top:0;bottom:0;right:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::-moz-selection{color:transparent}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{-webkit-user-select:text;-moz-user-select:text;user-select:text;white-space:pre}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{-webkit-text-decoration:double underline;text-decoration:double underline}.xterm-underline-3{-webkit-text-decoration:wavy underline;text-decoration:wavy underline}.xterm-underline-4{-webkit-text-decoration:dotted underline;text-decoration:dotted underline}.xterm-underline-5{-webkit-text-decoration:dashed underline;text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{-webkit-text-decoration:overline double underline;text-decoration:overline double underline}.xterm-overline.xterm-underline-3{-webkit-text-decoration:overline wavy underline;text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{-webkit-text-decoration:overline dotted underline;text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{-webkit-text-decoration:overline dashed underline;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}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com
|
|
33
|
-
*/*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter,system-ui,-apple-system,Segoe UI,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}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;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root,[data-theme=dark]{color-scheme:dark;--c-canvas: 11 13 15;--c-surface: 22 24 28;--c-surface-raised: 28 31 36;--c-surface-overlay: 35 38 44;--c-border: 42 46 53;--c-border-strong: 56 62 70;--c-content-primary: 233 235 238;--c-content-secondary: 158 165 173;--c-content-muted: 112 118 126;--c-content-faint: 78 83 90;--c-brand: 59 107 97;--c-brand-light: 78 138 126;--c-brand-dark: 42 79 71;--c-accent: 45 212 191;--c-accent-dim: 31 148 136;--c-diff-add: 31 61 43;--c-diff-add-text: 95 211 138;--c-diff-remove: 61 31 36;--c-diff-remove-text: 240 112 127;--c-success: 16 185 129;--c-warning: 245 158 11;--c-danger: 239 68 68;--glass-bg: 18 20 23;--body-wash-1: rgba(45, 212, 191, .05);--body-wash-2: rgba(59, 107, 97, .04)}[data-theme=light]{color-scheme:light;--c-canvas: 255 255 255;--c-surface: 255 255 255;--c-surface-raised: 248 248 247;--c-surface-overlay: 241 241 239;--c-border: 229 229 226;--c-border-strong: 212 212 208;--c-content-primary: 33 33 33;--c-content-secondary: 90 90 88;--c-content-muted: 130 130 126;--c-content-faint: 168 168 163;--c-brand: 47 92 83;--c-brand-light: 62 120 109;--c-brand-dark: 36 70 63;--c-accent: 17 122 110;--c-accent-dim: 15 105 95;--c-diff-add: 230 246 235;--c-diff-add-text: 30 120 78;--c-diff-remove: 252 230 232;--c-diff-remove-text: 188 50 64;--c-success: 22 128 84;--c-warning: 176 110 20;--c-danger: 196 48 48;--glass-bg: 255 255 255;--body-wash-1: transparent;--body-wash-2: transparent}html,body,#root{height:100%}body{--tw-bg-opacity: 1;background-color:rgb(var(--c-canvas) / var(--tw-bg-opacity, 1));font-family:Inter,system-ui,-apple-system,Segoe UI,sans-serif;--tw-text-opacity: 1;color:rgb(var(--c-content-primary) / var(--tw-text-opacity, 1));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-image:radial-gradient(120% 80% at 50% -10%,var(--body-wash-1),transparent 60%),radial-gradient(100% 60% at 100% 100%,var(--body-wash-2),transparent 55%);background-attachment:fixed}::-moz-selection{background:rgb(var(--c-accent) / .25)}::selection{background:rgb(var(--c-accent) / .25)}*{scrollbar-width:thin;scrollbar-color:rgb(var(--c-border-strong)) transparent}*::-webkit-scrollbar{width:8px;height:8px}*::-webkit-scrollbar-thumb{background:rgb(var(--c-border-strong));border-radius:9999px;border:2px solid transparent;background-clip:content-box}*::-webkit-scrollbar-thumb:hover{background:rgb(var(--c-content-faint));background-clip:content-box}*::-webkit-scrollbar-track{background:transparent}.container{width:100%}@media(min-width:640px){.container{max-width:640px}}@media(min-width:768px){.container{max-width:768px}}@media(min-width:1024px){.container{max-width:1024px}}@media(min-width:1280px){.container{max-width:1280px}}@media(min-width:1536px){.container{max-width:1536px}}.codex-card{border-radius:.75rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(var(--c-border) / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(var(--c-surface) / var(--tw-bg-opacity, 1));box-shadow:0 1px rgb(var(--c-content-primary) / .03) inset,0 1px 2px #0000002e}.codex-card-raised{border-radius:.75rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(var(--c-border) / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(var(--c-surface-raised) / var(--tw-bg-opacity, 1));box-shadow:0 1px rgb(var(--c-content-primary) / .04) inset,0 8px 28px -8px #00000047}.glass-bar{background:rgb(var(--glass-bg) / .6);backdrop-filter:saturate(140%) blur(12px);-webkit-backdrop-filter:saturate(140%) blur(12px)}.codex-input{width:100%;border-radius:.75rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(var(--c-border) / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(var(--c-surface-raised) / var(--tw-bg-opacity, 1));padding:.625rem .875rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(var(--c-content-primary) / var(--tw-text-opacity, 1))}.codex-input::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(var(--c-content-muted) / var(--tw-placeholder-opacity, 1))}.codex-input::placeholder{--tw-placeholder-opacity: 1;color:rgb(var(--c-content-muted) / var(--tw-placeholder-opacity, 1))}.codex-input{outline:2px solid transparent;outline-offset:2px;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.codex-input:focus{--tw-border-opacity: 1;border-color:rgb(var(--c-accent-dim) / var(--tw-border-opacity, 1));--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-color: rgb(var(--c-accent) / .2)}.codex-btn-primary{display:inline-flex;height:2.25rem;cursor:pointer;align-items:center;justify-content:center;gap:.375rem;border-radius:.5rem;padding-left:.875rem;padding-right:.875rem;font-size:.875rem;line-height:1.25rem;font-weight:500;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.codex-btn-primary:focus-visible{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-color: rgb(var(--c-accent) / .4)}.codex-btn-primary:disabled{pointer-events:none;opacity:.4}.codex-btn-primary{--tw-bg-opacity: 1;background-color:rgb(var(--c-accent-dim) / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.codex-btn-primary:hover{--tw-bg-opacity: 1;background-color:rgb(var(--c-accent) / var(--tw-bg-opacity, 1))}.codex-btn-primary{box-shadow:0 1px 2px #0000001f}.codex-btn-ghost{display:inline-flex;height:2.25rem;cursor:pointer;align-items:center;justify-content:center;gap:.375rem;border-radius:.5rem;padding-left:.875rem;padding-right:.875rem;font-size:.875rem;line-height:1.25rem;font-weight:500;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.codex-btn-ghost:focus-visible{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-color: rgb(var(--c-accent) / .4)}.codex-btn-ghost:disabled{pointer-events:none;opacity:.4}.codex-btn-ghost{--tw-text-opacity: 1;color:rgb(var(--c-content-secondary) / var(--tw-text-opacity, 1))}.codex-btn-ghost:hover{--tw-bg-opacity: 1;background-color:rgb(var(--c-surface-overlay) / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(var(--c-content-primary) / var(--tw-text-opacity, 1))}.codex-btn-outline{display:inline-flex;height:2.25rem;cursor:pointer;align-items:center;justify-content:center;gap:.375rem;border-radius:.5rem;padding-left:.875rem;padding-right:.875rem;font-size:.875rem;line-height:1.25rem;font-weight:500;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.codex-btn-outline:focus-visible{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-color: rgb(var(--c-accent) / .4)}.codex-btn-outline:disabled{pointer-events:none;opacity:.4}.codex-btn-outline{border-width:1px;--tw-border-opacity: 1;border-color:rgb(var(--c-border) / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(var(--c-surface) / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(var(--c-content-secondary) / var(--tw-text-opacity, 1))}.codex-btn-outline:hover{--tw-border-opacity: 1;border-color:rgb(var(--c-border-strong) / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(var(--c-surface-overlay) / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(var(--c-content-primary) / var(--tw-text-opacity, 1))}.tree-row{display:flex;width:100%;cursor:pointer;align-items:center;gap:.625rem;border-radius:.5rem;padding:.5rem .75rem;text-align:left;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.tree-row:hover{--tw-bg-opacity: 1;background-color:rgb(var(--c-surface-overlay) / var(--tw-bg-opacity, 1))}.tree-row-active{--tw-bg-opacity: 1;background-color:rgb(var(--c-surface-overlay) / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(var(--c-content-primary) / var(--tw-text-opacity, 1))}.codex-chip{display:inline-flex;align-items:center;gap:.25rem;border-radius:9999px;border-width:1px;--tw-border-opacity: 1;border-color:rgb(var(--c-border) / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(var(--c-surface-raised) / var(--tw-bg-opacity, 1));padding:.125rem .5rem;font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.6875rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(var(--c-content-secondary) / var(--tw-text-opacity, 1))}.xterm-host,.xterm-host .xterm,.xterm-host .xterm-viewport{height:100%;width:100%}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{top:0;bottom:0}.-right-1\.5{right:-.375rem}.-top-1\.5{top:-.375rem}.bottom-4{bottom:1rem}.bottom-full{bottom:100%}.left-0{left:0}.right-0{right:0}.right-1\.5{right:.375rem}.right-2{right:.5rem}.right-4{right:1rem}.top-0{top:0}.top-1\.5{top:.375rem}.top-2{top:.5rem}.top-9{top:2.25rem}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[60\]{z-index:60}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.-mt-1{margin-top:-.25rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-auto{margin-left:auto}.mr-2{margin-right:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-2\.5{margin-top:.625rem}.mt-3{margin-top:.75rem}.line-clamp-1{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-\[100dvh\]{height:100dvh}.h-full{height:100%}.h-px{height:1px}.max-h-32{max-height:8rem}.max-h-40{max-height:10rem}.max-h-48{max-height:12rem}.max-h-60{max-height:15rem}.max-h-72{max-height:18rem}.max-h-\[50vh\]{max-height:50vh}.max-h-\[80vh\]{max-height:80vh}.min-h-0{min-height:0px}.min-h-screen{min-height:100vh}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-2\.5{width:.625rem}.w-28{width:7rem}.w-3{width:.75rem}.w-36{width:9rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-\[390px\]{width:390px}.w-\[82\%\]{width:82%}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[8rem\]{min-width:8rem}.max-w-3xl{max-width:48rem}.max-w-5xl{max-width:64rem}.max-w-\[200px\]{max-width:200px}.max-w-\[46rem\]{max-width:46rem}.max-w-\[7rem\]{max-width:7rem}.max-w-\[85\%\]{max-width:85%}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.basis-full{flex-basis:100%}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes drawer-in{0%{transform:translate(-100%)}to{transform:translate(0)}}.animate-drawer-in{animation:drawer-in .24s cubic-bezier(.16,1,.3,1)}@keyframes fade-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.animate-fade-in{animation:fade-in .2s ease-out}@keyframes panel-in-right{0%{opacity:0;transform:translate(30px)}to{opacity:1;transform:translate(0)}}.animate-panel-in-right{animation:panel-in-right .22s cubic-bezier(.16,1,.3,1) both}@keyframes panel-in-up{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}.animate-panel-in-up{animation:panel-in-up .24s cubic-bezier(.16,1,.3,1) both}@keyframes panel-out-down{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(100%)}}.animate-panel-out-down{animation:panel-out-down .24s cubic-bezier(.16,1,.3,1) both}@keyframes panel-out-right{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(30px)}}.animate-panel-out-right{animation:panel-out-right .22s cubic-bezier(.16,1,.3,1) both}@keyframes pulse-dot{0%,to{opacity:.4}50%{opacity:1}}.animate-pulse-dot{animation:pulse-dot 1.2s ease-in-out infinite}@keyframes slide-in{0%{opacity:0;transform:translate(8px)}to{opacity:1;transform:translate(0)}}.animate-slide-in{animation:slide-in .22s cubic-bezier(.16,1,.3,1)}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-col-resize{cursor:col-resize}.cursor-crosshair{cursor:crosshair}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.cursor-row-resize{cursor:row-resize}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.resize{resize:both}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-\[3px\]{gap:3px}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-y-1\.5{row-gap:.375rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse: 0;border-right-width:calc(1px * var(--tw-divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}.divide-border>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(var(--c-border) / var(--tw-divide-opacity, 1))}.self-start{align-self:flex-start}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-\[2px\]{border-radius:2px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-x{border-left-width:1px;border-right-width:1px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-accent{--tw-border-opacity: 1;border-color:rgb(var(--c-accent) / var(--tw-border-opacity, 1))}.border-accent-dim\/40{border-color:rgb(var(--c-accent-dim) / .4)}.border-accent\/30{border-color:rgb(var(--c-accent) / .3)}.border-border{--tw-border-opacity: 1;border-color:rgb(var(--c-border) / var(--tw-border-opacity, 1))}.border-border-strong{--tw-border-opacity: 1;border-color:rgb(var(--c-border-strong) / var(--tw-border-opacity, 1))}.border-content-faint{--tw-border-opacity: 1;border-color:rgb(var(--c-content-faint) / var(--tw-border-opacity, 1))}.border-danger\/30{border-color:rgb(var(--c-danger) / .3)}.border-danger\/40{border-color:rgb(var(--c-danger) / .4)}.border-success\/30{border-color:rgb(var(--c-success) / .3)}.border-warning\/40{border-color:rgb(var(--c-warning) / .4)}.border-t-accent{--tw-border-opacity: 1;border-top-color:rgb(var(--c-accent) / var(--tw-border-opacity, 1))}.bg-accent{--tw-bg-opacity: 1;background-color:rgb(var(--c-accent) / var(--tw-bg-opacity, 1))}.bg-accent-dim{--tw-bg-opacity: 1;background-color:rgb(var(--c-accent-dim) / var(--tw-bg-opacity, 1))}.bg-accent\/10{background-color:rgb(var(--c-accent) / .1)}.bg-black\/60{background-color:#0009}.bg-border{--tw-bg-opacity: 1;background-color:rgb(var(--c-border) / var(--tw-bg-opacity, 1))}.bg-canvas{--tw-bg-opacity: 1;background-color:rgb(var(--c-canvas) / var(--tw-bg-opacity, 1))}.bg-canvas\/60{background-color:rgb(var(--c-canvas) / .6)}.bg-canvas\/80{background-color:rgb(var(--c-canvas) / .8)}.bg-canvas\/95{background-color:rgb(var(--c-canvas) / .95)}.bg-content-faint{--tw-bg-opacity: 1;background-color:rgb(var(--c-content-faint) / var(--tw-bg-opacity, 1))}.bg-current{background-color:currentColor}.bg-danger{--tw-bg-opacity: 1;background-color:rgb(var(--c-danger) / var(--tw-bg-opacity, 1))}.bg-danger\/10{background-color:rgb(var(--c-danger) / .1)}.bg-diff-add{--tw-bg-opacity: 1;background-color:rgb(var(--c-diff-add) / var(--tw-bg-opacity, 1))}.bg-diff-remove{--tw-bg-opacity: 1;background-color:rgb(var(--c-diff-remove) / var(--tw-bg-opacity, 1))}.bg-success{--tw-bg-opacity: 1;background-color:rgb(var(--c-success) / var(--tw-bg-opacity, 1))}.bg-success\/10{background-color:rgb(var(--c-success) / .1)}.bg-surface{--tw-bg-opacity: 1;background-color:rgb(var(--c-surface) / var(--tw-bg-opacity, 1))}.bg-surface-overlay{--tw-bg-opacity: 1;background-color:rgb(var(--c-surface-overlay) / var(--tw-bg-opacity, 1))}.bg-surface-raised{--tw-bg-opacity: 1;background-color:rgb(var(--c-surface-raised) / var(--tw-bg-opacity, 1))}.bg-surface-raised\/60{background-color:rgb(var(--c-surface-raised) / .6)}.bg-transparent{background-color:transparent}.bg-warning{--tw-bg-opacity: 1;background-color:rgb(var(--c-warning) / var(--tw-bg-opacity, 1))}.bg-warning\/10{background-color:rgb(var(--c-warning) / .1)}.bg-warning\/15{background-color:rgb(var(--c-warning) / .15)}.bg-warning\/30{background-color:rgb(var(--c-warning) / .3)}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-3\.5{padding:.875rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.px-0{padding-left:0;padding-right:0}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-1{padding-bottom:.25rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pl-1{padding-left:.25rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-5{padding-left:1.25rem}.pl-7{padding-left:1.75rem}.pr-1{padding-right:.25rem}.pr-3{padding-right:.75rem}.pr-9{padding-right:2.25rem}.pt-1\.5{padding-top:.375rem}.pt-2{padding-top:.5rem}.pt-2\.5{padding-top:.625rem}.pt-\[12vh\]{padding-top:12vh}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.text-2xs{font-size:.6875rem;line-height:1rem}.text-\[10px\]{font-size:10px}.text-\[13px\]{font-size:13px}.text-\[15px\]{font-size:15px}.text-base{font-size:1rem;line-height:1.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.leading-\[1\.6\]{line-height:1.6}.leading-relaxed{line-height:1.625}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-accent{--tw-text-opacity: 1;color:rgb(var(--c-accent) / var(--tw-text-opacity, 1))}.text-accent-dim{--tw-text-opacity: 1;color:rgb(var(--c-accent-dim) / var(--tw-text-opacity, 1))}.text-content-faint{--tw-text-opacity: 1;color:rgb(var(--c-content-faint) / var(--tw-text-opacity, 1))}.text-content-muted{--tw-text-opacity: 1;color:rgb(var(--c-content-muted) / var(--tw-text-opacity, 1))}.text-content-primary{--tw-text-opacity: 1;color:rgb(var(--c-content-primary) / var(--tw-text-opacity, 1))}.text-content-secondary{--tw-text-opacity: 1;color:rgb(var(--c-content-secondary) / var(--tw-text-opacity, 1))}.text-danger{--tw-text-opacity: 1;color:rgb(var(--c-danger) / var(--tw-text-opacity, 1))}.text-diff-addText{--tw-text-opacity: 1;color:rgb(var(--c-diff-add-text) / var(--tw-text-opacity, 1))}.text-diff-removeText{--tw-text-opacity: 1;color:rgb(var(--c-diff-remove-text) / var(--tw-text-opacity, 1))}.text-success{--tw-text-opacity: 1;color:rgb(var(--c-success) / var(--tw-text-opacity, 1))}.text-warning{--tw-text-opacity: 1;color:rgb(var(--c-warning) / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.line-through{text-decoration-line:line-through}.underline-offset-2{text-underline-offset:2px}.placeholder-content-muted::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(var(--c-content-muted) / var(--tw-placeholder-opacity, 1))}.placeholder-content-muted::placeholder{--tw-placeholder-opacity: 1;color:rgb(var(--c-content-muted) / var(--tw-placeholder-opacity, 1))}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.blur{--tw-blur: blur(8px);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)}.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)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-150{transition-duration:.15s}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}@media(hover:none)and (pointer:coarse){[class*="group-hover:opacity-100"]{opacity:1!important}}.focus-within\:border-border-strong:focus-within{--tw-border-opacity: 1;border-color:rgb(var(--c-border-strong) / var(--tw-border-opacity, 1))}.hover\:border-border-strong:hover{--tw-border-opacity: 1;border-color:rgb(var(--c-border-strong) / var(--tw-border-opacity, 1))}.hover\:border-danger:hover{--tw-border-opacity: 1;border-color:rgb(var(--c-danger) / var(--tw-border-opacity, 1))}.hover\:bg-accent:hover{--tw-bg-opacity: 1;background-color:rgb(var(--c-accent) / var(--tw-bg-opacity, 1))}.hover\:bg-accent-dim\/50:hover{background-color:rgb(var(--c-accent-dim) / .5)}.hover\:bg-danger\/10:hover{background-color:rgb(var(--c-danger) / .1)}.hover\:bg-surface-overlay:hover{--tw-bg-opacity: 1;background-color:rgb(var(--c-surface-overlay) / var(--tw-bg-opacity, 1))}.hover\:bg-surface-overlay\/60:hover{background-color:rgb(var(--c-surface-overlay) / .6)}.hover\:bg-surface-raised:hover{--tw-bg-opacity: 1;background-color:rgb(var(--c-surface-raised) / var(--tw-bg-opacity, 1))}.hover\:text-accent:hover{--tw-text-opacity: 1;color:rgb(var(--c-accent) / var(--tw-text-opacity, 1))}.hover\:text-content-primary:hover{--tw-text-opacity: 1;color:rgb(var(--c-content-primary) / var(--tw-text-opacity, 1))}.hover\:text-content-secondary:hover{--tw-text-opacity: 1;color:rgb(var(--c-content-secondary) / var(--tw-text-opacity, 1))}.hover\:text-danger:hover{--tw-text-opacity: 1;color:rgb(var(--c-danger) / var(--tw-text-opacity, 1))}.focus\:border-accent-dim:focus{--tw-border-opacity: 1;border-color:rgb(var(--c-accent-dim) / var(--tw-border-opacity, 1))}.disabled\:cursor-default:disabled{cursor:default}.disabled\:bg-surface-overlay:disabled{--tw-bg-opacity: 1;background-color:rgb(var(--c-surface-overlay) / var(--tw-bg-opacity, 1))}.disabled\:text-content-faint:disabled{--tw-text-opacity: 1;color:rgb(var(--c-content-faint) / var(--tw-text-opacity, 1))}.disabled\:opacity-40:disabled{opacity:.4}.group\/code:hover .group-hover\/code\:opacity-100,.group\/out:hover .group-hover\/out\:opacity-100,.group:hover .group-hover\:opacity-100{opacity:1}@media(min-width:640px){.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.sm\:gap-3{gap:.75rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}}@media(min-width:768px){.md\:text-\[15px\]{font-size:15px}}
|
|
33
|
+
*/*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Inter,system-ui,-apple-system,Segoe UI,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}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;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root,[data-theme=dark]{color-scheme:dark;--c-canvas: 11 13 15;--c-surface: 22 24 28;--c-surface-raised: 28 31 36;--c-surface-overlay: 35 38 44;--c-border: 42 46 53;--c-border-strong: 56 62 70;--c-content-primary: 233 235 238;--c-content-secondary: 158 165 173;--c-content-muted: 112 118 126;--c-content-faint: 78 83 90;--c-brand: 59 107 97;--c-brand-light: 78 138 126;--c-brand-dark: 42 79 71;--c-accent: 45 212 191;--c-accent-dim: 31 148 136;--c-diff-add: 31 61 43;--c-diff-add-text: 95 211 138;--c-diff-remove: 61 31 36;--c-diff-remove-text: 240 112 127;--c-success: 16 185 129;--c-warning: 245 158 11;--c-danger: 239 68 68;--glass-bg: 18 20 23;--body-wash-1: rgba(45, 212, 191, .05);--body-wash-2: rgba(59, 107, 97, .04)}[data-theme=light]{color-scheme:light;--c-canvas: 255 255 255;--c-surface: 255 255 255;--c-surface-raised: 248 248 247;--c-surface-overlay: 241 241 239;--c-border: 229 229 226;--c-border-strong: 212 212 208;--c-content-primary: 33 33 33;--c-content-secondary: 90 90 88;--c-content-muted: 130 130 126;--c-content-faint: 168 168 163;--c-brand: 47 92 83;--c-brand-light: 62 120 109;--c-brand-dark: 36 70 63;--c-accent: 17 122 110;--c-accent-dim: 15 105 95;--c-diff-add: 230 246 235;--c-diff-add-text: 30 120 78;--c-diff-remove: 252 230 232;--c-diff-remove-text: 188 50 64;--c-success: 22 128 84;--c-warning: 176 110 20;--c-danger: 196 48 48;--glass-bg: 255 255 255;--body-wash-1: transparent;--body-wash-2: transparent}html,body,#root{height:100%}body{--tw-bg-opacity: 1;background-color:rgb(var(--c-canvas) / var(--tw-bg-opacity, 1));font-family:Inter,system-ui,-apple-system,Segoe UI,sans-serif;--tw-text-opacity: 1;color:rgb(var(--c-content-primary) / var(--tw-text-opacity, 1));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-image:radial-gradient(120% 80% at 50% -10%,var(--body-wash-1),transparent 60%),radial-gradient(100% 60% at 100% 100%,var(--body-wash-2),transparent 55%);background-attachment:fixed}::-moz-selection{background:rgb(var(--c-accent) / .25)}::selection{background:rgb(var(--c-accent) / .25)}*{scrollbar-width:thin;scrollbar-color:rgb(var(--c-border-strong)) transparent}*::-webkit-scrollbar{width:8px;height:8px}*::-webkit-scrollbar-thumb{background:rgb(var(--c-border-strong));border-radius:9999px;border:2px solid transparent;background-clip:content-box}*::-webkit-scrollbar-thumb:hover{background:rgb(var(--c-content-faint));background-clip:content-box}*::-webkit-scrollbar-track{background:transparent}.container{width:100%}@media(min-width:640px){.container{max-width:640px}}@media(min-width:768px){.container{max-width:768px}}@media(min-width:1024px){.container{max-width:1024px}}@media(min-width:1280px){.container{max-width:1280px}}@media(min-width:1536px){.container{max-width:1536px}}.codex-card{border-radius:.75rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(var(--c-border) / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(var(--c-surface) / var(--tw-bg-opacity, 1));box-shadow:0 1px rgb(var(--c-content-primary) / .03) inset,0 1px 2px #0000002e}.codex-card-raised{border-radius:.75rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(var(--c-border) / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(var(--c-surface-raised) / var(--tw-bg-opacity, 1));box-shadow:0 1px rgb(var(--c-content-primary) / .04) inset,0 8px 28px -8px #00000047}.glass-bar{background:rgb(var(--glass-bg) / .6);backdrop-filter:saturate(140%) blur(12px);-webkit-backdrop-filter:saturate(140%) blur(12px)}.codex-input{width:100%;border-radius:.75rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(var(--c-border) / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(var(--c-surface-raised) / var(--tw-bg-opacity, 1));padding:.625rem .875rem;font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(var(--c-content-primary) / var(--tw-text-opacity, 1))}.codex-input::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(var(--c-content-muted) / var(--tw-placeholder-opacity, 1))}.codex-input::placeholder{--tw-placeholder-opacity: 1;color:rgb(var(--c-content-muted) / var(--tw-placeholder-opacity, 1))}.codex-input{outline:2px solid transparent;outline-offset:2px;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.codex-input:focus{--tw-border-opacity: 1;border-color:rgb(var(--c-accent-dim) / var(--tw-border-opacity, 1));--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-color: rgb(var(--c-accent) / .2)}.codex-btn-primary{display:inline-flex;height:2.25rem;cursor:pointer;align-items:center;justify-content:center;gap:.375rem;border-radius:.5rem;padding-left:.875rem;padding-right:.875rem;font-size:.875rem;line-height:1.25rem;font-weight:500;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.codex-btn-primary:focus-visible{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-color: rgb(var(--c-accent) / .4)}.codex-btn-primary:disabled{pointer-events:none;opacity:.4}.codex-btn-primary{--tw-bg-opacity: 1;background-color:rgb(var(--c-accent-dim) / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.codex-btn-primary:hover{--tw-bg-opacity: 1;background-color:rgb(var(--c-accent) / var(--tw-bg-opacity, 1))}.codex-btn-primary{box-shadow:0 1px 2px #0000001f}.codex-btn-ghost{display:inline-flex;height:2.25rem;cursor:pointer;align-items:center;justify-content:center;gap:.375rem;border-radius:.5rem;padding-left:.875rem;padding-right:.875rem;font-size:.875rem;line-height:1.25rem;font-weight:500;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.codex-btn-ghost:focus-visible{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-color: rgb(var(--c-accent) / .4)}.codex-btn-ghost:disabled{pointer-events:none;opacity:.4}.codex-btn-ghost{--tw-text-opacity: 1;color:rgb(var(--c-content-secondary) / var(--tw-text-opacity, 1))}.codex-btn-ghost:hover{--tw-bg-opacity: 1;background-color:rgb(var(--c-surface-overlay) / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(var(--c-content-primary) / var(--tw-text-opacity, 1))}.codex-btn-outline{display:inline-flex;height:2.25rem;cursor:pointer;align-items:center;justify-content:center;gap:.375rem;border-radius:.5rem;padding-left:.875rem;padding-right:.875rem;font-size:.875rem;line-height:1.25rem;font-weight:500;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.codex-btn-outline:focus-visible{outline:2px solid transparent;outline-offset:2px;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-color: rgb(var(--c-accent) / .4)}.codex-btn-outline:disabled{pointer-events:none;opacity:.4}.codex-btn-outline{border-width:1px;--tw-border-opacity: 1;border-color:rgb(var(--c-border) / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(var(--c-surface) / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(var(--c-content-secondary) / var(--tw-text-opacity, 1))}.codex-btn-outline:hover{--tw-border-opacity: 1;border-color:rgb(var(--c-border-strong) / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(var(--c-surface-overlay) / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(var(--c-content-primary) / var(--tw-text-opacity, 1))}.tree-row{display:flex;width:100%;cursor:pointer;align-items:center;gap:.625rem;border-radius:.5rem;padding:.5rem .75rem;text-align:left;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.tree-row:hover{--tw-bg-opacity: 1;background-color:rgb(var(--c-surface-overlay) / var(--tw-bg-opacity, 1))}.tree-row-active{--tw-bg-opacity: 1;background-color:rgb(var(--c-surface-overlay) / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(var(--c-content-primary) / var(--tw-text-opacity, 1))}.codex-chip{display:inline-flex;align-items:center;gap:.25rem;border-radius:9999px;border-width:1px;--tw-border-opacity: 1;border-color:rgb(var(--c-border) / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(var(--c-surface-raised) / var(--tw-bg-opacity, 1));padding:.125rem .5rem;font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.6875rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(var(--c-content-secondary) / var(--tw-text-opacity, 1))}.xterm-host,.xterm-host .xterm,.xterm-host .xterm-viewport{height:100%;width:100%}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{top:0;bottom:0}.-right-1\.5{right:-.375rem}.-top-1\.5{top:-.375rem}.bottom-4{bottom:1rem}.bottom-full{bottom:100%}.left-0{left:0}.right-0{right:0}.right-1\.5{right:.375rem}.right-2{right:.5rem}.right-4{right:1rem}.top-0{top:0}.top-1\.5{top:.375rem}.top-2{top:.5rem}.top-9{top:2.25rem}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[60\]{z-index:60}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.-mt-1{margin-top:-.25rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-auto{margin-left:auto}.mr-2{margin-right:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-2\.5{margin-top:.625rem}.mt-3{margin-top:.75rem}.line-clamp-1{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-\[100dvh\]{height:100dvh}.h-full{height:100%}.h-px{height:1px}.max-h-32{max-height:8rem}.max-h-40{max-height:10rem}.max-h-48{max-height:12rem}.max-h-60{max-height:15rem}.max-h-72{max-height:18rem}.max-h-\[50vh\]{max-height:50vh}.max-h-\[80vh\]{max-height:80vh}.min-h-0{min-height:0px}.min-h-screen{min-height:100vh}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-2\.5{width:.625rem}.w-28{width:7rem}.w-3{width:.75rem}.w-36{width:9rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-\[390px\]{width:390px}.w-\[82\%\]{width:82%}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[8rem\]{min-width:8rem}.max-w-3xl{max-width:48rem}.max-w-5xl{max-width:64rem}.max-w-\[200px\]{max-width:200px}.max-w-\[46rem\]{max-width:46rem}.max-w-\[7rem\]{max-width:7rem}.max-w-\[85\%\]{max-width:85%}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.basis-full{flex-basis:100%}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes drawer-in{0%{transform:translate(-100%)}to{transform:translate(0)}}.animate-drawer-in{animation:drawer-in .24s cubic-bezier(.16,1,.3,1)}@keyframes fade-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.animate-fade-in{animation:fade-in .2s ease-out}@keyframes panel-in-right{0%{opacity:0;transform:translate(30px)}to{opacity:1;transform:translate(0)}}.animate-panel-in-right{animation:panel-in-right .22s cubic-bezier(.16,1,.3,1) both}@keyframes panel-in-up{0%{opacity:0;transform:translateY(100%)}to{opacity:1;transform:translateY(0)}}.animate-panel-in-up{animation:panel-in-up .24s cubic-bezier(.16,1,.3,1) both}@keyframes panel-out-down{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(100%)}}.animate-panel-out-down{animation:panel-out-down .24s cubic-bezier(.16,1,.3,1) both}@keyframes panel-out-right{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(30px)}}.animate-panel-out-right{animation:panel-out-right .22s cubic-bezier(.16,1,.3,1) both}@keyframes pulse-dot{0%,to{opacity:.4}50%{opacity:1}}.animate-pulse-dot{animation:pulse-dot 1.2s ease-in-out infinite}@keyframes slide-in{0%{opacity:0;transform:translate(8px)}to{opacity:1;transform:translate(0)}}.animate-slide-in{animation:slide-in .22s cubic-bezier(.16,1,.3,1)}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-col-resize{cursor:col-resize}.cursor-crosshair{cursor:crosshair}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.cursor-row-resize{cursor:row-resize}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.resize{resize:both}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-y-1\.5{row-gap:.375rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse: 0;border-right-width:calc(1px * var(--tw-divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}.divide-border>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(var(--c-border) / var(--tw-divide-opacity, 1))}.self-start{align-self:flex-start}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-\[3px\]{border-radius:3px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-x{border-left-width:1px;border-right-width:1px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-accent{--tw-border-opacity: 1;border-color:rgb(var(--c-accent) / var(--tw-border-opacity, 1))}.border-accent-dim\/40{border-color:rgb(var(--c-accent-dim) / .4)}.border-accent\/30{border-color:rgb(var(--c-accent) / .3)}.border-border{--tw-border-opacity: 1;border-color:rgb(var(--c-border) / var(--tw-border-opacity, 1))}.border-border-strong{--tw-border-opacity: 1;border-color:rgb(var(--c-border-strong) / var(--tw-border-opacity, 1))}.border-content-faint{--tw-border-opacity: 1;border-color:rgb(var(--c-content-faint) / var(--tw-border-opacity, 1))}.border-danger\/30{border-color:rgb(var(--c-danger) / .3)}.border-danger\/40{border-color:rgb(var(--c-danger) / .4)}.border-success\/30{border-color:rgb(var(--c-success) / .3)}.border-warning\/40{border-color:rgb(var(--c-warning) / .4)}.border-t-accent{--tw-border-opacity: 1;border-top-color:rgb(var(--c-accent) / var(--tw-border-opacity, 1))}.bg-accent{--tw-bg-opacity: 1;background-color:rgb(var(--c-accent) / var(--tw-bg-opacity, 1))}.bg-accent-dim{--tw-bg-opacity: 1;background-color:rgb(var(--c-accent-dim) / var(--tw-bg-opacity, 1))}.bg-accent\/10{background-color:rgb(var(--c-accent) / .1)}.bg-black\/60{background-color:#0009}.bg-border{--tw-bg-opacity: 1;background-color:rgb(var(--c-border) / var(--tw-bg-opacity, 1))}.bg-canvas{--tw-bg-opacity: 1;background-color:rgb(var(--c-canvas) / var(--tw-bg-opacity, 1))}.bg-canvas\/60{background-color:rgb(var(--c-canvas) / .6)}.bg-canvas\/80{background-color:rgb(var(--c-canvas) / .8)}.bg-canvas\/95{background-color:rgb(var(--c-canvas) / .95)}.bg-content-faint{--tw-bg-opacity: 1;background-color:rgb(var(--c-content-faint) / var(--tw-bg-opacity, 1))}.bg-current{background-color:currentColor}.bg-danger{--tw-bg-opacity: 1;background-color:rgb(var(--c-danger) / var(--tw-bg-opacity, 1))}.bg-danger\/10{background-color:rgb(var(--c-danger) / .1)}.bg-diff-add{--tw-bg-opacity: 1;background-color:rgb(var(--c-diff-add) / var(--tw-bg-opacity, 1))}.bg-diff-remove{--tw-bg-opacity: 1;background-color:rgb(var(--c-diff-remove) / var(--tw-bg-opacity, 1))}.bg-success{--tw-bg-opacity: 1;background-color:rgb(var(--c-success) / var(--tw-bg-opacity, 1))}.bg-success\/10{background-color:rgb(var(--c-success) / .1)}.bg-surface{--tw-bg-opacity: 1;background-color:rgb(var(--c-surface) / var(--tw-bg-opacity, 1))}.bg-surface-overlay{--tw-bg-opacity: 1;background-color:rgb(var(--c-surface-overlay) / var(--tw-bg-opacity, 1))}.bg-surface-raised{--tw-bg-opacity: 1;background-color:rgb(var(--c-surface-raised) / var(--tw-bg-opacity, 1))}.bg-surface-raised\/60{background-color:rgb(var(--c-surface-raised) / .6)}.bg-transparent{background-color:transparent}.bg-warning{--tw-bg-opacity: 1;background-color:rgb(var(--c-warning) / var(--tw-bg-opacity, 1))}.bg-warning\/10{background-color:rgb(var(--c-warning) / .1)}.bg-warning\/15{background-color:rgb(var(--c-warning) / .15)}.bg-warning\/30{background-color:rgb(var(--c-warning) / .3)}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-3\.5{padding:.875rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.px-0{padding-left:0;padding-right:0}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-1{padding-bottom:.25rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pl-1{padding-left:.25rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-5{padding-left:1.25rem}.pl-7{padding-left:1.75rem}.pr-1{padding-right:.25rem}.pr-3{padding-right:.75rem}.pr-9{padding-right:2.25rem}.pt-1\.5{padding-top:.375rem}.pt-2{padding-top:.5rem}.pt-2\.5{padding-top:.625rem}.pt-\[12vh\]{padding-top:12vh}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}.text-2xs{font-size:.6875rem;line-height:1rem}.text-\[10px\]{font-size:10px}.text-\[13px\]{font-size:13px}.text-\[15px\]{font-size:15px}.text-base{font-size:1rem;line-height:1.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.leading-\[1\.6\]{line-height:1.6}.leading-relaxed{line-height:1.625}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-accent{--tw-text-opacity: 1;color:rgb(var(--c-accent) / var(--tw-text-opacity, 1))}.text-accent-dim{--tw-text-opacity: 1;color:rgb(var(--c-accent-dim) / var(--tw-text-opacity, 1))}.text-content-faint{--tw-text-opacity: 1;color:rgb(var(--c-content-faint) / var(--tw-text-opacity, 1))}.text-content-muted{--tw-text-opacity: 1;color:rgb(var(--c-content-muted) / var(--tw-text-opacity, 1))}.text-content-primary{--tw-text-opacity: 1;color:rgb(var(--c-content-primary) / var(--tw-text-opacity, 1))}.text-content-secondary{--tw-text-opacity: 1;color:rgb(var(--c-content-secondary) / var(--tw-text-opacity, 1))}.text-danger{--tw-text-opacity: 1;color:rgb(var(--c-danger) / var(--tw-text-opacity, 1))}.text-diff-addText{--tw-text-opacity: 1;color:rgb(var(--c-diff-add-text) / var(--tw-text-opacity, 1))}.text-diff-removeText{--tw-text-opacity: 1;color:rgb(var(--c-diff-remove-text) / var(--tw-text-opacity, 1))}.text-success{--tw-text-opacity: 1;color:rgb(var(--c-success) / var(--tw-text-opacity, 1))}.text-warning{--tw-text-opacity: 1;color:rgb(var(--c-warning) / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.line-through{text-decoration-line:line-through}.underline-offset-2{text-underline-offset:2px}.placeholder-content-muted::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(var(--c-content-muted) / var(--tw-placeholder-opacity, 1))}.placeholder-content-muted::placeholder{--tw-placeholder-opacity: 1;color:rgb(var(--c-content-muted) / var(--tw-placeholder-opacity, 1))}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.blur{--tw-blur: blur(8px);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)}.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)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-150{transition-duration:.15s}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}@media(hover:none)and (pointer:coarse){[class*="group-hover:opacity-100"]{opacity:1!important}}.focus-within\:border-border-strong:focus-within{--tw-border-opacity: 1;border-color:rgb(var(--c-border-strong) / var(--tw-border-opacity, 1))}.hover\:border-border-strong:hover{--tw-border-opacity: 1;border-color:rgb(var(--c-border-strong) / var(--tw-border-opacity, 1))}.hover\:border-danger:hover{--tw-border-opacity: 1;border-color:rgb(var(--c-danger) / var(--tw-border-opacity, 1))}.hover\:bg-accent:hover{--tw-bg-opacity: 1;background-color:rgb(var(--c-accent) / var(--tw-bg-opacity, 1))}.hover\:bg-accent-dim\/50:hover{background-color:rgb(var(--c-accent-dim) / .5)}.hover\:bg-danger\/10:hover{background-color:rgb(var(--c-danger) / .1)}.hover\:bg-surface-overlay:hover{--tw-bg-opacity: 1;background-color:rgb(var(--c-surface-overlay) / var(--tw-bg-opacity, 1))}.hover\:bg-surface-overlay\/60:hover{background-color:rgb(var(--c-surface-overlay) / .6)}.hover\:bg-surface-raised:hover{--tw-bg-opacity: 1;background-color:rgb(var(--c-surface-raised) / var(--tw-bg-opacity, 1))}.hover\:text-accent:hover{--tw-text-opacity: 1;color:rgb(var(--c-accent) / var(--tw-text-opacity, 1))}.hover\:text-content-primary:hover{--tw-text-opacity: 1;color:rgb(var(--c-content-primary) / var(--tw-text-opacity, 1))}.hover\:text-content-secondary:hover{--tw-text-opacity: 1;color:rgb(var(--c-content-secondary) / var(--tw-text-opacity, 1))}.hover\:text-danger:hover{--tw-text-opacity: 1;color:rgb(var(--c-danger) / var(--tw-text-opacity, 1))}.focus\:border-accent-dim:focus{--tw-border-opacity: 1;border-color:rgb(var(--c-accent-dim) / var(--tw-border-opacity, 1))}.disabled\:cursor-default:disabled{cursor:default}.disabled\:bg-surface-overlay:disabled{--tw-bg-opacity: 1;background-color:rgb(var(--c-surface-overlay) / var(--tw-bg-opacity, 1))}.disabled\:text-content-faint:disabled{--tw-text-opacity: 1;color:rgb(var(--c-content-faint) / var(--tw-text-opacity, 1))}.disabled\:opacity-40:disabled{opacity:.4}.group\/code:hover .group-hover\/code\:opacity-100,.group\/out:hover .group-hover\/out\:opacity-100,.group:hover .group-hover\:opacity-100{opacity:1}@media(min-width:640px){.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.sm\:gap-3{gap:.75rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}}@media(min-width:768px){.md\:text-\[15px\]{font-size:15px}}
|