hob-bot 1.0.4 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +76 -6
- package/README.zh-CN.md +76 -6
- package/dist/web/assets/DesktopView-CEBJFAIN.js +5 -0
- package/dist/web/assets/index-Di5lyTHO.css +1 -0
- package/dist/web/assets/index-y09i1RGd.js +267 -0
- package/dist/web/assets/{math-zZ4JA8eM.js → math-weKGDUmL.js} +2 -2
- package/dist/web/index.html +2 -2
- package/dist/web/mock/desktop.jpg +0 -0
- package/dist/web/mock/photo.jpg +0 -0
- package/dist/web/mock/photo2.jpg +0 -0
- package/dist/web/mock/sunset.html +90 -0
- package/package.json +7 -1
- package/server/src/actions.ts +16 -56
- package/server/src/assistant-skills.ts +215 -0
- package/server/src/boot.ts +1 -0
- package/server/src/claude-status.ts +47 -0
- package/server/src/config.ts +3 -1
- package/server/src/delegations.ts +21 -11
- package/server/src/desktop-control.ts +152 -0
- package/server/src/desktop-events.ts +63 -0
- package/server/src/desktop-public.ts +43 -0
- package/server/src/desktop-tools.ts +161 -0
- package/server/src/desktop.ts +76 -0
- package/server/src/embedding.ts +52 -0
- package/server/src/files.ts +63 -43
- package/server/src/http.ts +325 -13
- package/server/src/job-view.ts +52 -0
- package/server/src/jobs.ts +326 -44
- package/server/src/knowledge-index.ts +123 -0
- package/server/src/knowledge-tools.ts +94 -0
- package/server/src/knowledge.ts +451 -0
- package/server/src/lore-entry.ts +10 -0
- package/server/src/main.ts +6 -0
- package/server/src/mcp.ts +745 -0
- package/server/src/memory.ts +11 -4
- package/server/src/now.ts +33 -0
- package/server/src/overview.ts +4 -4
- package/server/src/pages.ts +1 -1
- package/server/src/pi.ts +92 -16
- package/server/src/prompt.ts +51 -156
- package/server/src/providers.ts +3 -2
- package/server/src/push.ts +39 -5
- package/server/src/router-activity.ts +6 -0
- package/server/src/router-tools.ts +184 -39
- package/server/src/router.ts +154 -17
- package/server/src/routines.ts +14 -4
- package/server/src/runtime.ts +15 -0
- package/server/src/settings.ts +43 -1
- package/server/src/store.ts +4 -3
- package/server/src/transcript.ts +57 -4
- package/server/src/worker-tools.ts +14 -12
- package/shared/knowledge.ts +92 -0
- package/shared/mcp.ts +91 -0
- package/shared/skills.ts +18 -0
- package/shared/types.ts +104 -20
- package/vendor/claude-bridge/HOB-PATCH.md +10 -0
- package/vendor/claude-bridge/LICENSE +21 -0
- package/vendor/claude-bridge/package.json +62 -0
- package/vendor/claude-bridge/src/agents-md.ts +14 -0
- package/vendor/claude-bridge/src/askclaude-schema.ts +92 -0
- package/vendor/claude-bridge/src/askclaude-ui.ts +90 -0
- package/vendor/claude-bridge/src/attachments.ts +135 -0
- package/vendor/claude-bridge/src/config.ts +105 -0
- package/vendor/claude-bridge/src/convert.ts +222 -0
- package/vendor/claude-bridge/src/extract-tool-results.ts +47 -0
- package/vendor/claude-bridge/src/index.ts +2503 -0
- package/vendor/claude-bridge/src/log-paths.ts +19 -0
- package/vendor/claude-bridge/src/mcp-server.ts +169 -0
- package/vendor/claude-bridge/src/models.ts +164 -0
- package/vendor/claude-bridge/src/prompt-capture.ts +420 -0
- package/vendor/claude-bridge/src/prompt-stream.ts +102 -0
- package/vendor/claude-bridge/src/query-state.ts +118 -0
- package/vendor/claude-bridge/src/rate-limit.ts +48 -0
- package/vendor/claude-bridge/src/session-cwd.ts +38 -0
- package/vendor/claude-bridge/src/session-verify.ts +38 -0
- package/vendor/claude-bridge/src/skills.ts +20 -0
- package/vendor/claude-bridge/src/transcript.ts +86 -0
- package/vendor/claude-bridge/src/usage.ts +53 -0
- package/vendor/lore-pi-extension/package.json +1 -1
- package/vendor/lore-pi-extension/tools.ts +8 -5
- package/dist/web/assets/index-BCGEZvgg.css +0 -1
- package/dist/web/assets/index-BqkIAlk9.js +0 -258
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// Claude Code reports plan usage as SDK rate_limit_event messages, not HTTP
|
|
2
|
+
// headers. Rebuilding the unified headers it can supply lets pi's
|
|
3
|
+
// after_provider_response consumers read the bridge like the built-in provider.
|
|
4
|
+
|
|
5
|
+
import type { ProviderResponse } from "@earendil-works/pi-ai";
|
|
6
|
+
|
|
7
|
+
const HEADER_PREFIX = "anthropic-ratelimit-unified";
|
|
8
|
+
const HTTP_OK = 200;
|
|
9
|
+
|
|
10
|
+
/** Claude Code's own window-name → header-abbreviation table. */
|
|
11
|
+
const WINDOW_ABBREVIATIONS: Readonly<Record<string, string>> = {
|
|
12
|
+
five_hour: "5h",
|
|
13
|
+
seven_day: "7d",
|
|
14
|
+
seven_day_overage_included: "7d_oi",
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
type UsageWindow = { utilization?: number; resetsAt?: number };
|
|
18
|
+
|
|
19
|
+
export type RateLimitInfo = {
|
|
20
|
+
status?: string;
|
|
21
|
+
resetsAt?: number;
|
|
22
|
+
rateLimitType?: string;
|
|
23
|
+
overageStatus?: string;
|
|
24
|
+
overageResetsAt?: number;
|
|
25
|
+
unifiedWindows?: Record<string, UsageWindow | undefined>;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/** Always 200: a "rejected" status can still be served from overage, so only the status header says so. */
|
|
29
|
+
export function rateLimitResponse(info: RateLimitInfo): ProviderResponse {
|
|
30
|
+
const headers: Record<string, string> = {};
|
|
31
|
+
const set = (name: string, value: string | number | undefined) => {
|
|
32
|
+
if (value !== undefined) headers[`${HEADER_PREFIX}-${name}`] = String(value);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
set("status", info.status);
|
|
36
|
+
set("reset", info.resetsAt);
|
|
37
|
+
set("representative-claim", info.rateLimitType);
|
|
38
|
+
set("overage-status", info.overageStatus);
|
|
39
|
+
set("overage-reset", info.overageResetsAt);
|
|
40
|
+
|
|
41
|
+
for (const [name, window] of Object.entries(info.unifiedWindows ?? {})) {
|
|
42
|
+
const abbreviation = WINDOW_ABBREVIATIONS[name] ?? name;
|
|
43
|
+
set(`${abbreviation}-utilization`, window?.utilization);
|
|
44
|
+
set(`${abbreviation}-reset`, window?.resetsAt);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return { status: HTTP_OK, headers };
|
|
48
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// Pi session id -> cwd. In the pi CLI process.cwd() is the session's cwd, but a
|
|
2
|
+
// host serving many sessions from one process (pi-web) has a single process cwd,
|
|
3
|
+
// so Claude Code would run in, and load project instructions from, the host's
|
|
4
|
+
// directory. Kept on globalThis because every module instance's session_start
|
|
5
|
+
// only sees its own session while the first instance's streamSimple serves all.
|
|
6
|
+
const SESSION_CWDS_KEY = Symbol.for("claude-bridge:sessionCwds");
|
|
7
|
+
const SUMMARY_SESSIONS_KEY = Symbol.for("claude-bridge:summarySessions");
|
|
8
|
+
|
|
9
|
+
function summarySessions(): WeakMap<AbortSignal, string> {
|
|
10
|
+
const g = globalThis as Record<symbol, unknown>;
|
|
11
|
+
return (g[SUMMARY_SESSIONS_KEY] ??= new WeakMap<AbortSignal, string>()) as WeakMap<AbortSignal, string>;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// Pi forwards the operation's signal from the before hook to every summary call.
|
|
15
|
+
export function rememberSummarySession(signal: AbortSignal, sessionId: string): void {
|
|
16
|
+
summarySessions().set(signal, sessionId);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function summarySessionFor(signal: AbortSignal | undefined): string | undefined {
|
|
20
|
+
return signal ? summarySessions().get(signal) : undefined;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function store(): Map<string, string> {
|
|
24
|
+
const g = globalThis as Record<symbol, unknown>;
|
|
25
|
+
return (g[SESSION_CWDS_KEY] ??= new Map<string, string>()) as Map<string, string>;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function rememberSessionCwd(sessionId: string, cwd: string): void {
|
|
29
|
+
store().set(sessionId, cwd);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function forgetSessionCwd(sessionId: string): void {
|
|
33
|
+
store().delete(sessionId);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function sessionCwdFor(sessionId: string | null | undefined): string {
|
|
37
|
+
return (sessionId ? store().get(sessionId) : undefined) ?? process.cwd();
|
|
38
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// Pure session-file integrity check. Returns an array of warning strings;
|
|
2
|
+
// callers decide how to surface them (debug log, piUI, diagDump, etc.).
|
|
3
|
+
// Extracted from index.ts so tests can import without activating the extension.
|
|
4
|
+
|
|
5
|
+
import { statSync, readFileSync } from "fs";
|
|
6
|
+
|
|
7
|
+
export function verifyWrittenSession(jsonlPath: string, expectedSessionId: string, expectedRecordCount: number): string[] {
|
|
8
|
+
const warnings = [];
|
|
9
|
+
let st;
|
|
10
|
+
try {
|
|
11
|
+
st = statSync(jsonlPath);
|
|
12
|
+
} catch (e) {
|
|
13
|
+
warnings.push(`file missing after save — path=${jsonlPath} err=${e.message}`);
|
|
14
|
+
return warnings;
|
|
15
|
+
}
|
|
16
|
+
let content;
|
|
17
|
+
try {
|
|
18
|
+
content = readFileSync(jsonlPath, "utf8");
|
|
19
|
+
} catch (e) {
|
|
20
|
+
warnings.push(`file unreadable — path=${jsonlPath} size=${st.size} err=${e.message}`);
|
|
21
|
+
return warnings;
|
|
22
|
+
}
|
|
23
|
+
const lines = content.split("\n").filter((l) => l.trim().length > 0);
|
|
24
|
+
if (lines.length !== expectedRecordCount) {
|
|
25
|
+
warnings.push(`record count mismatch — expected=${expectedRecordCount} actual=${lines.length} path=${jsonlPath} bytes=${content.length}`);
|
|
26
|
+
return warnings;
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
const firstRec = JSON.parse(lines[0]);
|
|
30
|
+
const lastRec = JSON.parse(lines[lines.length - 1]);
|
|
31
|
+
if (firstRec.sessionId !== expectedSessionId || lastRec.sessionId !== expectedSessionId) {
|
|
32
|
+
warnings.push(`sessionId drift — expected=${expectedSessionId} first=${firstRec.sessionId} last=${lastRec.sessionId}`);
|
|
33
|
+
}
|
|
34
|
+
} catch (e) {
|
|
35
|
+
warnings.push(`malformed JSONL — path=${jsonlPath} err=${e.message}`);
|
|
36
|
+
}
|
|
37
|
+
return warnings;
|
|
38
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { formatSkillsForPrompt, type Skill } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
|
|
3
|
+
export const MCP_SERVER_NAME = "custom-tools";
|
|
4
|
+
export const MCP_TOOL_PREFIX = `mcp__${MCP_SERVER_NAME}__`;
|
|
5
|
+
|
|
6
|
+
export type SkillReadTool = "mcp" | "native" | "none";
|
|
7
|
+
|
|
8
|
+
export function renderSkillsBlock(skills: Skill[], readTool: SkillReadTool): string | undefined {
|
|
9
|
+
if (readTool === "none" || skills.length === 0) return undefined;
|
|
10
|
+
const block = formatSkillsForPrompt(skills).trim();
|
|
11
|
+
if (!block) return undefined;
|
|
12
|
+
return readTool === "mcp" ? rewriteSkillsBlock(block) : block;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function rewriteSkillsBlock(skillsBlock: string): string {
|
|
16
|
+
return skillsBlock.replace(
|
|
17
|
+
"Use the read tool to load a skill's file",
|
|
18
|
+
`Use the read tool (mcp__${MCP_SERVER_NAME}__read) to load a skill's file`,
|
|
19
|
+
);
|
|
20
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Translate pi's transcript-shaped provider input into the prompt/tools fields used by
|
|
3
|
+
* the bridge's downstream consumers.
|
|
4
|
+
*
|
|
5
|
+
* System messages carry the base prompt and tool set plus later section patches and tool
|
|
6
|
+
* deltas. pi-ai replays that state, but preserves section replay order. Prompt capture
|
|
7
|
+
* keys come from pi's canonical section builder, so a deleted and re-added section must
|
|
8
|
+
* be ranked back into canonical order before the bridge performs its exact-key lookup.
|
|
9
|
+
* Custom sections — anything an extension set through `systemPromptOptions.sections`, such
|
|
10
|
+
* as the `mcp_servers` section pi's own MCP extension adds — rank last, where the builder
|
|
11
|
+
* puts them.
|
|
12
|
+
*/
|
|
13
|
+
import {
|
|
14
|
+
contentText,
|
|
15
|
+
getCurrentSystemMessage,
|
|
16
|
+
getCurrentTools,
|
|
17
|
+
type Context,
|
|
18
|
+
type SystemMessage,
|
|
19
|
+
} from "@earendil-works/pi-ai";
|
|
20
|
+
|
|
21
|
+
/** pi's canonical built-in section order. A name absent from the table is a custom
|
|
22
|
+
* section, which the builder renders after every built-in; see stableRanked.
|
|
23
|
+
* Known limitation: customs keep their replayed relative order here, while the builder
|
|
24
|
+
* takes theirs from `systemPromptOptions.sections`. The two agree unless a custom moves
|
|
25
|
+
* without its content changing — pi's section diff then emits nothing for it, the replay
|
|
26
|
+
* keeps the stale position, and the exact-key capture lookup throws on that legitimate
|
|
27
|
+
* turn. */
|
|
28
|
+
const SECTION_RANK = new Map<string, number>([
|
|
29
|
+
["preamble", 0], ["tools", 1], ["rules", 2], ["docs", 3], ["addendum", 4],
|
|
30
|
+
["project_context", 5], ["skills", 6], ["cwd", 7],
|
|
31
|
+
]);
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* The map's entries, stably sorted by canonical rank. A name absent from the rank table is
|
|
35
|
+
* a custom section, which pi's builder renders after every built-in, so it sorts last here
|
|
36
|
+
* no matter which patch introduced it. Array.prototype.sort is stable, so customs keep
|
|
37
|
+
* their replayed relative order among themselves.
|
|
38
|
+
*
|
|
39
|
+
* A future pi built-in section not listed in SECTION_RANK therefore sorts last too, and if
|
|
40
|
+
* the builder places it elsewhere the exact-key capture lookup throws loudly until the
|
|
41
|
+
* table learns the name. A loud failure beats silently misordering the custom sections
|
|
42
|
+
* that are in the prompt today.
|
|
43
|
+
*/
|
|
44
|
+
function stableRanked(sections: Map<string, string>, ranks: Map<string, number>): Map<string, string> {
|
|
45
|
+
// One past the last built-in, so customs land after `cwd` no matter where the replay
|
|
46
|
+
// inserted them.
|
|
47
|
+
const customRank = Math.max(...ranks.values()) + 1;
|
|
48
|
+
const ranked = [...sections].map(([name, value]) => {
|
|
49
|
+
const rank = ranks.get(name) ?? customRank;
|
|
50
|
+
return { name, value, rank };
|
|
51
|
+
});
|
|
52
|
+
ranked.sort((a, b) => a.rank - b.rank);
|
|
53
|
+
return new Map(ranked.map(({ name, value }) => [name, value]));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Render replayed system state in the same section order as pi's prompt builder. */
|
|
57
|
+
function canonicalSystemPrompt(message: SystemMessage | undefined): string | undefined {
|
|
58
|
+
if (!message) return undefined;
|
|
59
|
+
const sections = new Map<string, string>(
|
|
60
|
+
Object.entries(message.sections ?? {}).filter((entry): entry is [string, string] => entry[1] !== null),
|
|
61
|
+
);
|
|
62
|
+
const parts = [contentText(message.content), ...stableRanked(sections, SECTION_RANK).values()]
|
|
63
|
+
.filter((part) => part.length > 0);
|
|
64
|
+
return parts.length > 0 ? parts.join("\n\n") : undefined;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Restore the prompt and tools fields expected by the bridge and remove prompt-state
|
|
69
|
+
* messages from conversation history. Contexts without system messages are returned
|
|
70
|
+
* unchanged because systemless one-off calls already use the bridge-compatible shape.
|
|
71
|
+
*/
|
|
72
|
+
export function toBridgeContext(context: Context): Context {
|
|
73
|
+
if (!context.messages.some((message) => message.role === "system")) return context;
|
|
74
|
+
const tools = getCurrentTools(context.messages);
|
|
75
|
+
return {
|
|
76
|
+
...context,
|
|
77
|
+
systemPrompt: canonicalSystemPrompt(getCurrentSystemMessage(context.messages)),
|
|
78
|
+
tools: tools.length > 0 ? tools : undefined,
|
|
79
|
+
messages: nonSystemMessages(context.messages),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** `messages` with every prompt-state system message removed from conversation history. */
|
|
84
|
+
export function nonSystemMessages<T extends { role: string }>(messages: readonly T[]): T[] {
|
|
85
|
+
return messages.filter((message) => message.role !== "system");
|
|
86
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// Token accounting: map Claude Code's SDK usage counters onto pi's AssistantMessage.
|
|
2
|
+
// Logging-free like convert.ts — it returns what it derived and index.ts logs it.
|
|
3
|
+
// Extracted from index.ts so tests can reach it without activating the extension.
|
|
4
|
+
|
|
5
|
+
import { calculateCost, type Api, type AssistantMessage, type Model } from "@earendil-works/pi-ai";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The usage counters Claude Code reports, mirroring `Usage` / `MessageDeltaUsage` in
|
|
9
|
+
* @anthropic-ai/sdk. Every field is optional because `message_start`, `message_delta` and a
|
|
10
|
+
* complete assistant message each carry a different subset.
|
|
11
|
+
*
|
|
12
|
+
* Not `Record<string, number | undefined>`: an index signature makes every property access
|
|
13
|
+
* typecheck, which is what hid a read of `usage.reasoning_tokens` — a field no SDK version
|
|
14
|
+
* has — for months.
|
|
15
|
+
*/
|
|
16
|
+
export type SdkUsage = {
|
|
17
|
+
input_tokens?: number | null;
|
|
18
|
+
output_tokens?: number | null;
|
|
19
|
+
cache_read_input_tokens?: number | null;
|
|
20
|
+
cache_creation_input_tokens?: number | null;
|
|
21
|
+
output_tokens_details?: { thinking_tokens?: number | null } | null;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/** What updateUsage derived but does not store on the message, for the debug line in index.ts. */
|
|
25
|
+
export type UsageReport = {
|
|
26
|
+
/** Cache-read share of the prompt, rounded to a whole percentage; 0 when the prompt is empty. */
|
|
27
|
+
cachePct: number;
|
|
28
|
+
/** Thinking tokens carried by THIS frame, absent when it carried none. Distinct from
|
|
29
|
+
* `output.usage.reasoning`, which keeps the last value seen across frames. */
|
|
30
|
+
reasoning?: number;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Applies one SDK usage frame onto `output.usage`, then recomputes the token total and cost.
|
|
35
|
+
*
|
|
36
|
+
* Counters the frame omits keep their previous value, so the partial frames the three call
|
|
37
|
+
* sites deliver never zero out what an earlier one set.
|
|
38
|
+
*/
|
|
39
|
+
export function updateUsage(output: AssistantMessage, usage: SdkUsage, model: Model<Api>): UsageReport {
|
|
40
|
+
if (usage.input_tokens != null) output.usage.input = usage.input_tokens;
|
|
41
|
+
if (usage.output_tokens != null) output.usage.output = usage.output_tokens;
|
|
42
|
+
if (usage.cache_read_input_tokens != null) output.usage.cacheRead = usage.cache_read_input_tokens;
|
|
43
|
+
if (usage.cache_creation_input_tokens != null) output.usage.cacheWrite = usage.cache_creation_input_tokens;
|
|
44
|
+
// A subset of output_tokens, never a separate addend in the total or in cost.
|
|
45
|
+
const reasoning = usage.output_tokens_details?.thinking_tokens;
|
|
46
|
+
if (reasoning != null) output.usage.reasoning = reasoning;
|
|
47
|
+
output.usage.totalTokens = output.usage.input + output.usage.output + output.usage.cacheRead + output.usage.cacheWrite;
|
|
48
|
+
calculateCost(model, output.usage);
|
|
49
|
+
const promptTokens = output.usage.input + output.usage.cacheRead + output.usage.cacheWrite;
|
|
50
|
+
const report: UsageReport = { cachePct: promptTokens > 0 ? Math.round(output.usage.cacheRead / promptTokens * 100) : 0 };
|
|
51
|
+
if (reasoning != null) report.reasoning = reasoning;
|
|
52
|
+
return report;
|
|
53
|
+
}
|
|
@@ -261,22 +261,25 @@ export function registerTools(pi: any, pluginCfg: any, skillsSession?: SkillsSes
|
|
|
261
261
|
let path = '';
|
|
262
262
|
try {
|
|
263
263
|
({ domain, path } = resolveMemoryLocator(params, { defaultDomain: pluginCfg.defaultDomain, pathKey: '__unused_path', allowEmptyPath: false, label: 'uri' }));
|
|
264
|
-
|
|
264
|
+
// Models often fill unused optional fields with "": old_text and new_text both empty means no targeted edit,
|
|
265
|
+
// and an empty content or disclosure means "leave it unchanged", never "blank the node".
|
|
266
|
+
const oldText = typeof params?.old_text === 'string' && (params.old_text || params?.new_text) ? params.old_text : null;
|
|
267
|
+
const content = typeof params?.content === 'string' && params.content ? params.content : null;
|
|
265
268
|
const body: any = {};
|
|
266
269
|
if (oldText !== null) {
|
|
267
270
|
if (oldText.length === 0) throw new Error('old_text must not be empty');
|
|
268
|
-
if (
|
|
271
|
+
if (content !== null) throw new Error('Pass either content or old_text/new_text, not both');
|
|
269
272
|
const current = await fetchJson(pluginCfg, `/browse/node?${new URLSearchParams({ domain, path }).toString()}`, { method: 'GET' });
|
|
270
273
|
const currentContent = String(current?.node?.content ?? '');
|
|
271
274
|
const occurrences = currentContent.split(oldText).length - 1;
|
|
272
275
|
if (occurrences === 0) throw new Error('old_text not found');
|
|
273
276
|
if (occurrences > 1) throw new Error(`old_text found ${occurrences} times`);
|
|
274
277
|
body.content = currentContent.replace(oldText, typeof params?.new_text === 'string' ? params.new_text : '');
|
|
275
|
-
} else if (
|
|
276
|
-
body.content =
|
|
278
|
+
} else if (content !== null) {
|
|
279
|
+
body.content = content;
|
|
277
280
|
}
|
|
278
281
|
if (Number.isFinite(params?.priority)) body.priority = params.priority;
|
|
279
|
-
if (typeof params?.disclosure === 'string') body.disclosure = params.disclosure;
|
|
282
|
+
if (typeof params?.disclosure === 'string' && params.disclosure) body.disclosure = params.disclosure;
|
|
280
283
|
if (glossaryAdd.length > 0) body.glossary_add = glossaryAdd;
|
|
281
284
|
if (glossaryRemove.length > 0) body.glossary_remove = glossaryRemove;
|
|
282
285
|
const qs = new URLSearchParams({ domain, path });
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.markdown-body{--base-size-16: 1rem;--base-size-24: 1.5rem;--base-size-4: .25rem;--base-size-40: 2.5rem;--base-size-8: .5rem;--base-text-weight-medium: 500;--base-text-weight-normal: 400;--base-text-weight-semibold: 600;--fontStack-monospace: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace;--fontStack-sansSerif: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";--fgColor-accent: Highlight}@media(prefers-color-scheme:dark){.markdown-body,[data-theme=dark]{color-scheme:dark;--fgColor-accent: #4493f8;--bgColor-attention-muted: #bb800926;--bgColor-default: #0d1117;--bgColor-muted: #151b23;--bgColor-neutral-muted: #656c7633;--borderColor-accent-emphasis: #1f6feb;--borderColor-attention-emphasis: #9e6a03;--borderColor-danger-emphasis: #da3633;--borderColor-default: #3d444d;--borderColor-done-emphasis: #8957e5;--borderColor-success-emphasis: #238636;--color-prettylights-syntax-brackethighlighter-angle: #9198a1;--color-prettylights-syntax-brackethighlighter-unmatched: #f85149;--color-prettylights-syntax-carriage-return-bg: #b62324;--color-prettylights-syntax-carriage-return-text: #f0f6fc;--color-prettylights-syntax-comment: #9198a1;--color-prettylights-syntax-constant: #79c0ff;--color-prettylights-syntax-constant-other-reference-link: #a5d6ff;--color-prettylights-syntax-entity: #d2a8ff;--color-prettylights-syntax-entity-tag: #7ee787;--color-prettylights-syntax-keyword: #ff7b72;--color-prettylights-syntax-markup-bold: #f0f6fc;--color-prettylights-syntax-markup-changed-bg: #5a1e02;--color-prettylights-syntax-markup-changed-text: #ffdfb6;--color-prettylights-syntax-markup-deleted-bg: #67060c;--color-prettylights-syntax-markup-deleted-text: #ffdcd7;--color-prettylights-syntax-markup-heading: #1f6feb;--color-prettylights-syntax-markup-ignored-bg: #1158c7;--color-prettylights-syntax-markup-ignored-text: #f0f6fc;--color-prettylights-syntax-markup-inserted-bg: #033a16;--color-prettylights-syntax-markup-inserted-text: #aff5b4;--color-prettylights-syntax-markup-italic: #f0f6fc;--color-prettylights-syntax-markup-list: #f2cc60;--color-prettylights-syntax-meta-diff-range: #d2a8ff;--color-prettylights-syntax-storage-modifier-import: #f0f6fc;--color-prettylights-syntax-string: #a5d6ff;--color-prettylights-syntax-string-regexp: #7ee787;--color-prettylights-syntax-sublimelinter-gutter-mark: #3d444d;--color-prettylights-syntax-variable: #ffa657;--fgColor-attention: #d29922;--fgColor-danger: #f85149;--fgColor-default: #f0f6fc;--fgColor-done: #ab7df8;--fgColor-muted: #9198a1;--fgColor-success: #3fb950;--borderColor-muted: #3d444db3;--color-prettylights-syntax-invalid-illegal-bg: var(--bgColor-danger-muted);--color-prettylights-syntax-invalid-illegal-text: var(--fgColor-danger);--focus-outlineColor: var(--borderColor-accent-emphasis);--borderColor-neutral-muted: var(--borderColor-muted)}}@media(prefers-color-scheme:light){.markdown-body,[data-theme=light]{color-scheme:light;--fgColor-danger: #d1242f;--bgColor-attention-muted: #fff8c5;--bgColor-muted: #f6f8fa;--bgColor-neutral-muted: #818b981f;--borderColor-accent-emphasis: #0969da;--borderColor-attention-emphasis: #9a6700;--borderColor-danger-emphasis: #cf222e;--borderColor-default: #d1d9e0;--borderColor-done-emphasis: #8250df;--borderColor-success-emphasis: #1a7f37;--color-prettylights-syntax-brackethighlighter-angle: #59636e;--color-prettylights-syntax-brackethighlighter-unmatched: #82071e;--color-prettylights-syntax-carriage-return-bg: #cf222e;--color-prettylights-syntax-carriage-return-text: #f6f8fa;--color-prettylights-syntax-comment: #59636e;--color-prettylights-syntax-constant: #0550ae;--color-prettylights-syntax-constant-other-reference-link: #0a3069;--color-prettylights-syntax-entity: #6639ba;--color-prettylights-syntax-entity-tag: #0550ae;--color-prettylights-syntax-invalid-illegal-text: var(--fgColor-danger);--color-prettylights-syntax-keyword: #cf222e;--color-prettylights-syntax-markup-changed-bg: #ffd8b5;--color-prettylights-syntax-markup-changed-text: #953800;--color-prettylights-syntax-markup-deleted-bg: #ffebe9;--color-prettylights-syntax-markup-deleted-text: #82071e;--color-prettylights-syntax-markup-heading: #0550ae;--color-prettylights-syntax-markup-ignored-bg: #0550ae;--color-prettylights-syntax-markup-ignored-text: #d1d9e0;--color-prettylights-syntax-markup-inserted-bg: #dafbe1;--color-prettylights-syntax-markup-inserted-text: #116329;--color-prettylights-syntax-markup-list: #3b2300;--color-prettylights-syntax-meta-diff-range: #8250df;--color-prettylights-syntax-string: #0a3069;--color-prettylights-syntax-string-regexp: #116329;--color-prettylights-syntax-sublimelinter-gutter-mark: #818b98;--color-prettylights-syntax-variable: #953800;--fgColor-accent: #0969da;--fgColor-attention: #9a6700;--fgColor-done: #8250df;--fgColor-muted: #59636e;--fgColor-success: #1a7f37;--bgColor-default: #ffffff;--borderColor-muted: #d1d9e0b3;--color-prettylights-syntax-invalid-illegal-bg: var(--bgColor-danger-muted);--color-prettylights-syntax-markup-bold: #1f2328;--color-prettylights-syntax-markup-italic: #1f2328;--color-prettylights-syntax-storage-modifier-import: #1f2328;--fgColor-default: #1f2328;--focus-outlineColor: var(--borderColor-accent-emphasis);--borderColor-neutral-muted: var(--borderColor-muted)}}.markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0;font-weight:var(--base-text-weight-normal, 400);color:var(--fgColor-default);background-color:var(--bgColor-default);font-family:var(--fontStack-sansSerif, -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji");font-size:16px;line-height:1.5;word-wrap:break-word}.markdown-body a{text-decoration:underline;text-underline-offset:.2rem}.markdown-body .octicon{display:inline-block;fill:currentColor;vertical-align:text-bottom}.markdown-body h1:hover .anchor .octicon-link:before,.markdown-body h2:hover .anchor .octicon-link:before,.markdown-body h3:hover .anchor .octicon-link:before,.markdown-body h4:hover .anchor .octicon-link:before,.markdown-body h5:hover .anchor .octicon-link:before,.markdown-body h6:hover .anchor .octicon-link:before{width:16px;height:16px;content:" ";display:inline-block;background-color:currentColor;-webkit-mask-image:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg>");mask-image:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' version='1.1' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg>")}.markdown-body details,.markdown-body figcaption,.markdown-body figure{display:block}.markdown-body summary{display:list-item}.markdown-body [hidden]{display:none!important}.markdown-body a{background-color:#0000;color:var(--fgColor-accent);text-decoration:none}.markdown-body abbr[title]{border-bottom:none;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.markdown-body b,.markdown-body strong{font-weight:var(--base-text-weight-semibold, 600)}.markdown-body dfn{font-style:italic}.markdown-body h1{margin:.67em 0;font-weight:var(--base-text-weight-semibold, 600);padding-bottom:.3em;font-size:2em;border-bottom:1px solid var(--borderColor-muted)}.markdown-body mark{background-color:var(--bgColor-attention-muted);color:var(--fgColor-default)}.markdown-body small{font-size:90%}.markdown-body sub,.markdown-body sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}.markdown-body sub{bottom:-.25em}.markdown-body sup{top:-.5em}.markdown-body img{border-style:none;max-width:100%;box-sizing:content-box}.markdown-body code,.markdown-body kbd,.markdown-body pre,.markdown-body samp{font-family:monospace;font-size:1em}.markdown-body figure{margin:1em var(--base-size-40)}.markdown-body hr{box-sizing:content-box;overflow:hidden;background:#0000;border-bottom:1px solid var(--borderColor-muted);height:.25em;padding:0;margin:var(--base-size-24) 0;background-color:var(--borderColor-default);border:0}.markdown-body input{font:inherit;margin:0;overflow:visible;font-family:inherit;font-size:inherit;line-height:inherit}.markdown-body [type=button],.markdown-body [type=reset],.markdown-body [type=submit]{-webkit-appearance:button;-moz-appearance:button;appearance:button}.markdown-body [type=checkbox],.markdown-body [type=radio]{box-sizing:border-box;padding:0}.markdown-body [type=number]::-webkit-inner-spin-button,.markdown-body [type=number]::-webkit-outer-spin-button{height:auto}.markdown-body [type=search]::-webkit-search-cancel-button,.markdown-body [type=search]::-webkit-search-decoration{-webkit-appearance:none;-moz-appearance:none;appearance:none}.markdown-body ::-webkit-input-placeholder{color:inherit;opacity:.54}.markdown-body ::-webkit-file-upload-button{-webkit-appearance:button;-moz-appearance:button;appearance:button;font:inherit}.markdown-body a:hover{text-decoration:underline}.markdown-body ::placeholder{color:var(--fgColor-muted);opacity:1}.markdown-body hr:before{display:table;content:""}.markdown-body hr:after{display:table;clear:both;content:""}.markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;font-variant:tabular-nums}.markdown-body td,.markdown-body th{padding:0}.markdown-body details summary{cursor:pointer}.markdown-body a:focus,.markdown-body [role=button]:focus,.markdown-body input[type=radio]:focus,.markdown-body input[type=checkbox]:focus{outline:2px solid var(--focus-outlineColor);outline-offset:-2px;box-shadow:none}.markdown-body a:focus:not(:focus-visible),.markdown-body [role=button]:focus:not(:focus-visible),.markdown-body input[type=radio]:focus:not(:focus-visible),.markdown-body input[type=checkbox]:focus:not(:focus-visible){outline:solid 1px rgba(0,0,0,0)}.markdown-body a:focus-visible,.markdown-body [role=button]:focus-visible,.markdown-body input[type=radio]:focus-visible,.markdown-body input[type=checkbox]:focus-visible{outline:2px solid var(--focus-outlineColor);outline-offset:-2px;box-shadow:none}.markdown-body a:not([class]):focus,.markdown-body a:not([class]):focus-visible,.markdown-body input[type=radio]:focus,.markdown-body input[type=radio]:focus-visible,.markdown-body input[type=checkbox]:focus,.markdown-body input[type=checkbox]:focus-visible{outline-offset:0}.markdown-body kbd{display:inline-block;padding:var(--base-size-4);font:11px var(--fontStack-monospace, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace);line-height:10px;color:var(--fgColor-default);vertical-align:middle;background-color:var(--bgColor-muted);border:solid 1px var(--borderColor-neutral-muted);border-bottom-color:var(--borderColor-neutral-muted);border-radius:6px;box-shadow:inset 0 -1px 0 var(--borderColor-neutral-muted)}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-top:var(--base-size-24);margin-bottom:var(--base-size-16);font-weight:var(--base-text-weight-semibold, 600);line-height:1.25}.markdown-body h2{font-weight:var(--base-text-weight-semibold, 600);padding-bottom:.3em;font-size:1.5em;border-bottom:1px solid var(--borderColor-muted)}.markdown-body h3{font-weight:var(--base-text-weight-semibold, 600);font-size:1.25em}.markdown-body h4{font-weight:var(--base-text-weight-semibold, 600);font-size:1em}.markdown-body h5{font-weight:var(--base-text-weight-semibold, 600);font-size:.875em}.markdown-body h6{font-weight:var(--base-text-weight-semibold, 600);font-size:.85em;color:var(--fgColor-muted)}.markdown-body p{margin-top:0;margin-bottom:10px}.markdown-body blockquote{margin:0;padding:0 1em;color:var(--fgColor-muted);border-left:.25em solid var(--borderColor-default)}.markdown-body ul,.markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em}.markdown-body ol ol,.markdown-body ul ol{list-style-type:lower-roman}.markdown-body ul ul ol,.markdown-body ul ol ol,.markdown-body ol ul ol,.markdown-body ol ol ol{list-style-type:lower-alpha}.markdown-body dd{margin-left:0}.markdown-body tt,.markdown-body code,.markdown-body samp{font-family:var(--fontStack-monospace, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace);font-size:12px}.markdown-body pre{margin-top:0;margin-bottom:0;font-family:var(--fontStack-monospace, ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, Liberation Mono, monospace);font-size:12px;word-wrap:normal}.markdown-body .octicon{display:inline-block;overflow:visible!important;vertical-align:text-bottom;fill:currentColor}.markdown-body input::-webkit-outer-spin-button,.markdown-body input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.markdown-body .mr-2{margin-right:var(--base-size-8, 8px)!important}.markdown-body:before{display:table;content:""}.markdown-body:after{display:table;clear:both;content:""}.markdown-body>*:first-child{margin-top:0!important}.markdown-body>*:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .absent{color:var(--fgColor-danger)}.markdown-body .anchor{float:left;padding-right:var(--base-size-4);margin-left:-20px;line-height:1}.markdown-body .anchor:focus{outline:none}.markdown-body p,.markdown-body blockquote,.markdown-body ul,.markdown-body ol,.markdown-body dl,.markdown-body table,.markdown-body pre,.markdown-body details{margin-top:0;margin-bottom:var(--base-size-16)}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:var(--fgColor-default);vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1 tt,.markdown-body h1 code,.markdown-body h2 tt,.markdown-body h2 code,.markdown-body h3 tt,.markdown-body h3 code,.markdown-body h4 tt,.markdown-body h4 code,.markdown-body h5 tt,.markdown-body h5 code,.markdown-body h6 tt,.markdown-body h6 code{padding:0 .2em;font-size:inherit}.markdown-body summary h1,.markdown-body summary h2,.markdown-body summary h3,.markdown-body summary h4,.markdown-body summary h5,.markdown-body summary h6{display:inline-block}.markdown-body summary h1 .anchor,.markdown-body summary h2 .anchor,.markdown-body summary h3 .anchor,.markdown-body summary h4 .anchor,.markdown-body summary h5 .anchor,.markdown-body summary h6 .anchor{margin-left:-40px}.markdown-body summary h1,.markdown-body summary h2{padding-bottom:0;border-bottom:0}.markdown-body ul.no-list,.markdown-body ol.no-list{padding:0;list-style-type:none}.markdown-body ol[type="a s"]{list-style-type:lower-alpha}.markdown-body ol[type="A s"]{list-style-type:upper-alpha}.markdown-body ol[type="i s"]{list-style-type:lower-roman}.markdown-body ol[type="I s"]{list-style-type:upper-roman}.markdown-body ol[type="1"]{list-style-type:decimal}.markdown-body div>ol:not([type]){list-style-type:decimal}.markdown-body ul ul,.markdown-body ul ol,.markdown-body ol ol,.markdown-body ol ul{margin-top:0;margin-bottom:0}.markdown-body li>p{margin-top:var(--base-size-16)}.markdown-body li+li{margin-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{padding:0;margin-top:var(--base-size-16);font-size:1em;font-style:italic;font-weight:var(--base-text-weight-semibold, 600)}.markdown-body dl dd{padding:0 var(--base-size-16);margin-bottom:var(--base-size-16)}.markdown-body table th{font-weight:var(--base-text-weight-semibold, 600)}.markdown-body table th,.markdown-body table td{padding:6px 13px;border:1px solid var(--borderColor-default)}.markdown-body table td>:last-child{margin-bottom:0}.markdown-body table tr{background-color:var(--bgColor-default);border-top:1px solid var(--borderColor-muted)}.markdown-body table tr:nth-child(2n){background-color:var(--bgColor-muted)}.markdown-body table img{background-color:#0000}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body .emoji{max-width:none;vertical-align:text-top;background-color:#0000}.markdown-body span.frame{display:block;overflow:hidden}.markdown-body span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid var(--borderColor-default)}.markdown-body span.frame span img{display:block;float:left}.markdown-body span.frame span span{display:block;padding:5px 0 0;clear:both;color:var(--fgColor-default)}.markdown-body span.align-center{display:block;overflow:hidden;clear:both}.markdown-body span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown-body span.align-center span img{margin:0 auto;text-align:center}.markdown-body span.align-right{display:block;overflow:hidden;clear:both}.markdown-body span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown-body span.align-right span img{margin:0;text-align:right}.markdown-body span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown-body span.float-left span{margin:13px 0 0}.markdown-body span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown-body span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown-body code,.markdown-body tt{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;background-color:var(--bgColor-neutral-muted);border-radius:6px}.markdown-body code br,.markdown-body tt br{display:none}.markdown-body del code{text-decoration:inherit}.markdown-body samp{font-size:85%}.markdown-body pre code{font-size:100%}.markdown-body pre>code{padding:0;margin:0;word-break:normal;white-space:pre;background:#0000;border:0}.markdown-body .highlight{margin-bottom:var(--base-size-16)}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre,.markdown-body pre{padding:var(--base-size-16);overflow:auto;font-size:85%;line-height:1.45;color:var(--fgColor-default);background-color:var(--bgColor-muted);border-radius:6px}.markdown-body pre code,.markdown-body pre tt{display:inline;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:#0000;border:0}.markdown-body .csv-data td,.markdown-body .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown-body .csv-data .blob-num{padding:10px var(--base-size-8) 9px;text-align:right;background:var(--bgColor-default);border:0}.markdown-body .csv-data tr{border-top:0}.markdown-body .csv-data th{font-weight:var(--base-text-weight-semibold, 600);background:var(--bgColor-muted);border-top:0}.markdown-body [data-footnote-ref]:before{content:"["}.markdown-body [data-footnote-ref]:after{content:"]"}.markdown-body .footnotes{font-size:12px;color:var(--fgColor-muted);border-top:1px solid var(--borderColor-default)}.markdown-body .footnotes ol{padding-left:var(--base-size-16)}.markdown-body .footnotes ol ul{display:inline-block;padding-left:var(--base-size-16);margin-top:var(--base-size-16)}.markdown-body .footnotes li{position:relative}.markdown-body .footnotes li:target:before{position:absolute;top:calc(var(--base-size-8)*-1);right:calc(var(--base-size-8)*-1);bottom:calc(var(--base-size-8)*-1);left:calc(var(--base-size-24)*-1);pointer-events:none;content:"";border:2px solid var(--borderColor-accent-emphasis);border-radius:6px}.markdown-body .footnotes li:target{color:var(--fgColor-default)}.markdown-body .footnotes .data-footnote-backref g-emoji{font-family:monospace}.markdown-body .pl-c{color:var(--color-prettylights-syntax-comment)}.markdown-body .pl-c1,.markdown-body .pl-s .pl-v{color:var(--color-prettylights-syntax-constant)}.markdown-body .pl-e,.markdown-body .pl-en{color:var(--color-prettylights-syntax-entity)}.markdown-body .pl-smi,.markdown-body .pl-s .pl-s1{color:var(--color-prettylights-syntax-storage-modifier-import)}.markdown-body .pl-ent{color:var(--color-prettylights-syntax-entity-tag)}.markdown-body .pl-k{color:var(--color-prettylights-syntax-keyword)}.markdown-body .pl-s,.markdown-body .pl-pds,.markdown-body .pl-s .pl-pse .pl-s1,.markdown-body .pl-sr,.markdown-body .pl-sr .pl-cce,.markdown-body .pl-sr .pl-sre,.markdown-body .pl-sr .pl-sra{color:var(--color-prettylights-syntax-string)}.markdown-body .pl-v,.markdown-body .pl-smw{color:var(--color-prettylights-syntax-variable)}.markdown-body .pl-bu{color:var(--color-prettylights-syntax-brackethighlighter-unmatched)}.markdown-body .pl-ii{color:var(--color-prettylights-syntax-invalid-illegal-text);background-color:var(--color-prettylights-syntax-invalid-illegal-bg)}.markdown-body .pl-c2{color:var(--color-prettylights-syntax-carriage-return-text);background-color:var(--color-prettylights-syntax-carriage-return-bg)}.markdown-body .pl-sr .pl-cce{font-weight:700;color:var(--color-prettylights-syntax-string-regexp)}.markdown-body .pl-ml{color:var(--color-prettylights-syntax-markup-list)}.markdown-body .pl-mh,.markdown-body .pl-mh .pl-en,.markdown-body .pl-ms{font-weight:700;color:var(--color-prettylights-syntax-markup-heading)}.markdown-body .pl-mi{font-style:italic;color:var(--color-prettylights-syntax-markup-italic)}.markdown-body .pl-mb{font-weight:700;color:var(--color-prettylights-syntax-markup-bold)}.markdown-body .pl-md{color:var(--color-prettylights-syntax-markup-deleted-text);background-color:var(--color-prettylights-syntax-markup-deleted-bg)}.markdown-body .pl-mi1{color:var(--color-prettylights-syntax-markup-inserted-text);background-color:var(--color-prettylights-syntax-markup-inserted-bg)}.markdown-body .pl-mc{color:var(--color-prettylights-syntax-markup-changed-text);background-color:var(--color-prettylights-syntax-markup-changed-bg)}.markdown-body .pl-mi2{color:var(--color-prettylights-syntax-markup-ignored-text);background-color:var(--color-prettylights-syntax-markup-ignored-bg)}.markdown-body .pl-mdr{font-weight:700;color:var(--color-prettylights-syntax-meta-diff-range)}.markdown-body .pl-ba{color:var(--color-prettylights-syntax-brackethighlighter-angle)}.markdown-body .pl-sg{color:var(--color-prettylights-syntax-sublimelinter-gutter-mark)}.markdown-body .pl-corl{text-decoration:underline;color:var(--color-prettylights-syntax-constant-other-reference-link)}.markdown-body [role=button]:focus:not(:focus-visible),.markdown-body [role=tabpanel][tabindex="0"]:focus:not(:focus-visible),.markdown-body button:focus:not(:focus-visible),.markdown-body summary:focus:not(:focus-visible),.markdown-body a:focus:not(:focus-visible){outline:none;box-shadow:none}.markdown-body [tabindex="0"]:focus:not(:focus-visible),.markdown-body details-dialog:focus:not(:focus-visible){outline:none}.markdown-body g-emoji{display:inline-block;min-width:1ch;font-family:"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol;font-size:1em;font-style:normal!important;font-weight:var(--base-text-weight-normal, 400);line-height:1;vertical-align:-.075em}.markdown-body g-emoji img{width:1em;height:1em}.markdown-body a:has(>p,>div,>pre,>blockquote){display:block}.markdown-body a:has(>p,>div,>pre,>blockquote):not(:has(.snippet-clipboard-content,>pre)){width:fit-content}.markdown-body a:has(>p,>div,>pre,>blockquote):has(.snippet-clipboard-content,>pre):focus-visible{outline:2px solid var(--focus-outlineColor);outline-offset:2px}.markdown-body .task-list-item{list-style-type:none}.markdown-body .task-list-item label{font-weight:var(--base-text-weight-normal, 400)}.markdown-body .task-list-item.enabled label{cursor:pointer}.markdown-body .task-list-item+.task-list-item{margin-top:var(--base-size-4)}.markdown-body .task-list-item .handle{display:none}.markdown-body .task-list-item-checkbox{margin:0 .2em .25em -1.4em;vertical-align:middle}.markdown-body ul:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}.markdown-body ol:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}.markdown-body .contains-task-list:hover .task-list-item-convert-container,.markdown-body .contains-task-list:focus-within .task-list-item-convert-container{display:block;width:auto;height:24px;overflow:visible;clip-path:none}.markdown-body ::-webkit-calendar-picker-indicator{filter:invert(50%)}.markdown-body .markdown-alert{padding:var(--base-size-8) var(--base-size-16);margin-bottom:var(--base-size-16);color:inherit;border-left:.25em solid var(--borderColor-default)}.markdown-body .markdown-alert>:first-child{margin-top:0}.markdown-body .markdown-alert>:last-child{margin-bottom:0}.markdown-body .markdown-alert .markdown-alert-title{display:flex;font-weight:var(--base-text-weight-medium, 500);align-items:center;line-height:1}.markdown-body .markdown-alert.markdown-alert-note{border-left-color:var(--borderColor-accent-emphasis)}.markdown-body .markdown-alert.markdown-alert-note .markdown-alert-title{color:var(--fgColor-accent)}.markdown-body .markdown-alert.markdown-alert-important{border-left-color:var(--borderColor-done-emphasis)}.markdown-body .markdown-alert.markdown-alert-important .markdown-alert-title{color:var(--fgColor-done)}.markdown-body .markdown-alert.markdown-alert-warning{border-left-color:var(--borderColor-attention-emphasis)}.markdown-body .markdown-alert.markdown-alert-warning .markdown-alert-title{color:var(--fgColor-attention)}.markdown-body .markdown-alert.markdown-alert-tip{border-left-color:var(--borderColor-success-emphasis)}.markdown-body .markdown-alert.markdown-alert-tip .markdown-alert-title{color:var(--fgColor-success)}.markdown-body .markdown-alert.markdown-alert-caution{border-left-color:var(--borderColor-danger-emphasis)}.markdown-body .markdown-alert.markdown-alert-caution .markdown-alert-title{color:var(--fgColor-danger)}.markdown-body>*:first-child>.heading-element:first-child{margin-top:0!important}.markdown-body .highlight pre:has(+.zeroclipboard-container){min-height:52px}@font-face{font-family:Inter;src:url(/fonts/inter-latin.woff2) format("woff2");font-weight:100 900;font-style:normal;font-display:swap}@font-face{font-family:JetBrains Mono;src:url(/fonts/jetbrains-mono-latin.woff2) format("woff2");font-weight:400 700;font-style:normal;font-display:swap}*{box-sizing:border-box;margin:0;padding:0}:root{--t-fast: .12s;--t-mid: .18s;--t-slow: .24s;--ease-in: cubic-bezier(.22, 1, .36, 1);--ease-out: cubic-bezier(.4, 0, 1, 1);--bg: #ffffff;--side: #f6f6f4;--sel: #eaeae6;--panel: #fafaf8;--line: #ececea;--text: #18181a;--text2: #6d6d72;--text3: #a4a4a9;--bubble: #f1f1ef;--card: #ffffff;--field: #efefec;--user: #18181a;--utext: #ffffff;--accent: #ff6a2b;--ok: #22a065;--danger: #d92d20;--stage: #ecebe7}.dark{--bg: #151516;--side: #1b1b1d;--sel: #2a2a2d;--panel: #18181a;--line: #262629;--text: #ececed;--text2: #a1a1a7;--text3: #6b6b71;--bubble: #232326;--card: #2c2c30;--field: #232326;--user: #f1f1ef;--utext: #151516;--danger: #ff6b5e;--stage: #0e0e0f}html,body,#root{height:100%}html,body{background:var(--status-background, var(--side));overflow:hidden;overscroll-behavior:none}html{-webkit-text-size-adjust:100%;text-size-adjust:100%;-webkit-tap-highlight-color:transparent}body{touch-action:manipulation;font-family:Inter,Noto Sans CJK SC,PingFang SC,system-ui,sans-serif;color:var(--text);-webkit-font-smoothing:antialiased;font-size:15px}button{font:inherit;color:inherit;background:none;border:0;padding:0;cursor:pointer;text-align:left;transition:transform var(--t-mid) var(--ease-in)}input,textarea{font:inherit;color:inherit;background:none;border:0;outline:none}a{color:inherit}svg.i{display:block;flex:none}.mono{font-family:JetBrains Mono,Noto Sans Mono CJK SC,monospace}.muted{color:var(--text2)}.link{color:var(--text);text-decoration:underline;text-decoration-color:var(--text3);text-underline-offset:3px;cursor:pointer}.app{position:fixed;top:0;right:0;bottom:0;left:0;display:flex;overflow:hidden;background:var(--bg);color:var(--text)}.side{width:296px;flex:none;background:var(--side);border-right:1px solid var(--line);display:flex;flex-direction:column;padding:14px 12px 12px;min-height:0}.side-top{display:flex;gap:6px;align-items:center}.search{flex:1;min-width:0;height:34px;border-radius:10px;background:var(--field);display:flex;align-items:center;gap:8px;padding:0 11px;color:var(--text3);font-size:14px}.search input{flex:1;min-width:0;color:var(--text);font-size:14px}.search input::placeholder{color:var(--text3)}.ib{width:34px;height:34px;border-radius:10px;display:grid;place-items:center;color:var(--text2);flex:none}@media(hover:hover){.ib:hover{background:var(--sel)}}.pins,.mpins{display:flex;flex-wrap:wrap;justify-content:center}.pins{margin:14px 0 4px}.pins>.srow,.mpins>.pin{width:33.333%}.pins.n2>.srow,.mpins.n2>.pin{width:40%}.pins.n1>.srow,.mpins.n1>.pin{width:56%}.n1 .pin .nm,.n2 .pin .nm{font-size:14px}.n1 .pin .sub,.n2 .pin .sub{font-size:12px}.n1 .badge{left:calc(50% + 24px)}.n2 .badge{left:calc(50% + 20px)}.pin{position:relative;display:flex;flex-direction:column;align-items:center;width:100%;min-width:0;padding:12px 6px 10px;border-radius:14px}.pin.sel{background:var(--sel)}@media(hover:hover){.pin:hover{background:var(--sel)}}.pin .nm,.pin .sub{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pin .nm{margin-top:8px;font-size:13px;font-weight:500}.pin .sub{margin-top:1px;font-size:11.5px;color:var(--text3)}.badge{position:absolute;top:6px;left:calc(50% + 12px);min-width:19px;height:19px;padding:0 5px;border-radius:10px;background:var(--accent);border:2px solid var(--side);color:#fff;font-size:11px;font-weight:600;line-height:15px;text-align:center}.pin.sel .badge{border-color:var(--sel)}.pin,.row{-webkit-user-select:none;user-select:none;-webkit-touch-callout:none}.gt{display:flex;justify-content:space-between;font-size:12px;color:var(--text3);padding:14px 8px 6px}.side-scroll{flex:1;min-height:0;overflow-y:auto}.row{display:flex;gap:11px;align-items:center;padding:9px 8px;border-radius:12px;width:100%}.row.sel{background:var(--sel)}@media(hover:hover){.row:hover{background:var(--sel)}}.row .main{flex:1;min-width:0}.row .l1{display:flex;justify-content:space-between;align-items:baseline;gap:8px}.row .nm{font-size:14px;font-weight:500}.row .tm{font-size:12px;color:var(--text3);flex:none}.row .pv{font-size:13px;color:var(--text2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:2px}.row.job{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:baseline;column-gap:11px;row-gap:2px}.row.job>:first-child{grid-area:1 / 1 / span 2 / span 1;align-self:center}.row.job .nm{grid-area:1 / 2;min-width:0}.row.job .tm{grid-area:1 / 3;justify-self:end}.row.job .pv{grid-area:2 / 2;min-width:0;margin-top:0}.row.job .jt-st{grid-area:2 / 3;justify-self:end;display:block;position:relative;padding-left:17px}.row.job .jt-st .i{position:absolute;left:0;top:0;bottom:0;margin:auto 0}.row .new{font-size:11px;color:var(--accent);font-weight:500;margin-left:6px}.fold{display:flex;justify-content:space-between;align-items:center;padding:10px 8px;font-size:13px;color:var(--text3);width:100%}.side-foot{margin-top:auto;padding-top:6px;display:flex;flex-direction:column;gap:2px}.frow{display:flex;align-items:center;gap:10px;padding:8px;border-radius:10px;font-size:14px;color:var(--text2);width:100%}@media(hover:hover){.frow:hover{background:var(--sel)}}.frow .sp{flex:1}.av{width:var(--av-size);height:var(--av-size);display:grid;place-items:center;flex:none;border-radius:50%;background:var(--av-bg)}.av svg{width:78%;height:78%}.av-free{background:none;border-radius:0}.av-free svg{width:96%;height:96%}.av-marked{position:relative}.av-mark{--m: max(15px, calc(var(--av-size) * .36));position:absolute;right:-2px;bottom:-2px;width:var(--m);height:var(--m);border-radius:50%;display:grid;place-items:center;box-shadow:0 0 0 2px var(--mark-ring, var(--bg));color:#fff;font:800 calc(var(--m) * .7) / 1 system-ui,sans-serif}.av-mark.busy{background:#5aaeff}.av-mark svg{width:70%;fill:currentColor}.av-mark.ask{background:#f5a524}.av-mark.stuck{background:var(--danger)}.side{--mark-ring: var(--side)}.row.sel,.pin.sel{--mark-ring: var(--sel)}.av-motion .av-eyes,.av-motion .av-blink{transform-box:fill-box;transform-origin:center;animation-delay:var(--eye-delay, 0s);animation-iteration-count:infinite;animation-timing-function:cubic-bezier(.25,.8,.25,1)}.av-think .av-eyes{animation-name:eye-think;animation-duration:11s}.av-think .av-blink{animation-name:lid-think;animation-duration:6.1s}.av-work .av-eyes{animation-name:eye-work;animation-duration:6s}.av-work .av-blink{animation-name:lid-work;animation-duration:4.7s}.av-home .av-eyes{animation-name:eye-home;animation-duration:14s}.av-home .av-blink{animation-name:lid-home;animation-duration:7.3s}@keyframes eye-think{0%,10.9%{transform:translate(0)}12.3%,30.9%{transform:translate(1px,-.9px)}31.8%{transform:translate(.7px,-1px)}38.2%{transform:translate(.7px,-1px);animation-timing-function:cubic-bezier(.45,0,.55,1)}47.3%,58.2%{transform:translate(-1px,-.9px)}59.3%,62.7%{transform:translate(0)}63.6%,71.8%{transform:translate(-1.3px,.7px)}73.2%,87.3%{transform:translate(.4px,-.9px)}88.6%,to{transform:translate(0)}}@keyframes lid-think{0%,38%{transform:scaleY(1)}40%{transform:scaleY(.1)}42%,70%{transform:scaleY(1)}73%,80%{transform:scaleY(.6)}83%,to{transform:scaleY(1)}}@keyframes eye-work{0%{transform:translate(-1.4px,.8px)}5%{transform:translate(-1.4px,.8px);animation-timing-function:cubic-bezier(.4,0,.6,1)}20%,23.3%{transform:translate(1.3px,.8px)}25%{transform:translate(-1.4px,1px)}28.3%{transform:translate(-1.4px,1px);animation-timing-function:cubic-bezier(.4,0,.6,1)}43.3%,48.3%{transform:translate(1.3px,1px)}50%,60%{transform:translateY(-.3px)}61.7%,71.7%{transform:translate(1.2px,.6px)}73.3%,80%{transform:translate(-1px,.9px)}81.7%,to{transform:translate(-1.4px,.8px)}}@keyframes lid-work{0%,30%{transform:scaleY(1)}33%,52%{transform:scaleY(.6)}55%,84%{transform:scaleY(1)}86%{transform:scaleY(.1)}88%,to{transform:scaleY(1)}}@keyframes eye-home{0%,22%{transform:translate(0)}23%,36%{transform:translate(-1.3px)}37.5%{transform:translate(0)}50%{transform:translate(0);animation-timing-function:cubic-bezier(.45,0,.55,1)}55%,62%{transform:translate(1px,-.8px)}63%,75%{transform:translate(0)}76%,79%{transform:translate(1.3px,.3px)}80%,84%{transform:translate(-1.3px,.3px)}85.5%,to{transform:translate(0)}}@keyframes lid-home{0%,46%{transform:scaleY(1)}48%{transform:scaleY(.1)}50%,88%{transform:scaleY(1)}89.5%{transform:scaleY(.1)}91%{transform:scaleY(1)}92.5%{transform:scaleY(.1)}94%,to{transform:scaleY(1)}}.av-peek .av-eyes{animation-name:eye-peek;animation-duration:30s}.av-peek .av-blink{animation-name:lid-peek;animation-duration:30s}@keyframes eye-peek{0%{transform:translate(0)}1%,4%{transform:translate(-1.3px)}5%{transform:translate(0)}6.5%{transform:translate(0);animation-timing-function:cubic-bezier(.45,0,.55,1)}8%,10.5%{transform:translate(1px,-.8px)}12%,to{transform:translate(0)}}@keyframes lid-peek{0%,5%{transform:scaleY(1)}5.6%{transform:scaleY(.1)}6.2%,12.4%{transform:scaleY(1)}12.9%{transform:scaleY(.1)}13.4%{transform:scaleY(1)}13.9%{transform:scaleY(.1)}14.4%,to{transform:scaleY(1)}}.activity-line{display:flex;align-items:center;gap:10px;margin-top:8px;color:var(--text2);font-size:14px}.activity-line .activity-shimmer{min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.activity-shimmer{background:linear-gradient(100deg,var(--text2) 25%,var(--text) 45%,var(--text2) 65%);background-size:220% 100%;color:transparent;-webkit-background-clip:text;background-clip:text;animation:activity-shimmer 2s linear infinite}@keyframes activity-shimmer{to{background-position:-220% 0}}.boot-loading{display:flex;flex-direction:column;align-items:center;gap:16px}@media(prefers-reduced-motion:reduce){.av-motion .av-eyes,.av-motion .av-blink,.activity-shimmer{animation:none}.activity-shimmer{color:var(--text2)}}.chat{flex:1;min-width:0;display:flex;flex-direction:column;position:relative}.compwrap,.mcomp-wrap{position:absolute;left:0;right:0;bottom:0;pointer-events:none}.comp,.mcomp{pointer-events:auto;background:color-mix(in srgb,var(--field) 80%,transparent);-webkit-backdrop-filter:blur(18px) saturate(1.5);backdrop-filter:blur(18px) saturate(1.5);box-shadow:0 0 0 .5px var(--line),0 8px 28px #00000014}.dark .comp,.dark .mcomp{box-shadow:0 0 0 .5px var(--line),0 8px 28px #00000073}.head{height:54px;flex:none;display:flex;align-items:center;gap:9px;padding:0 18px 0 22px;border-bottom:1px solid var(--line)}.head .nm{font-size:15px;font-weight:500}.head .sp{flex:1}.msgs{flex:1;min-height:0;overflow-y:auto;scrollbar-gutter:stable;display:flex;flex-direction:column;padding-bottom:calc(var(--comp-h, 80px) + 6px)}.msgs .col{margin-top:auto}.msgs .col.mid,.mmsgs .col.mid{margin-bottom:auto}.hello{display:flex;flex-direction:column;align-items:center;text-align:center;padding:24px 0}.hello .t{margin-top:14px;font-size:17px;font-weight:600}.hello .d{margin-top:8px;max-width:420px;text-wrap:pretty;font-size:14px;line-height:1.65;color:var(--text2)}.hello .ex{display:flex;flex-wrap:wrap;justify-content:center;gap:8px;margin-top:20px;max-width:520px}.hello .ex .btn{background:var(--bubble);font-weight:400;color:var(--text2)}.hello .setup{margin-top:20px;padding:14px 16px;max-width:420px;border-radius:14px;background:var(--bubble);font-size:13.5px;line-height:1.6;color:var(--text2);display:flex;flex-direction:column;align-items:center;gap:12px}.col{width:100%;max-width:724px;margin:0 auto;padding:0 34px;display:flex;flex-direction:column;--card-w: 380px}.div{align-self:center;font-size:12px;color:var(--text3);margin:22px 0 12px}.sys{align-self:center;display:flex;align-items:center;gap:6px;font-size:12.5px;color:var(--text3);margin:10px 0;max-width:100%}.b,.u{font-size:15px;line-height:1.62;border-radius:18px;padding:9px 14px;margin-top:8px}.b{align-self:flex-start;max-width:548px;background:var(--bubble);overflow-wrap:anywhere}.u{align-self:flex-end;max-width:500px;background:var(--user);color:var(--utext);overflow-wrap:anywhere}.g{height:12px}.b ul{list-style:none}.b li{position:relative;padding-left:22px}.b li:before{content:"✓";position:absolute;left:0;top:0;color:var(--text2);font-size:13px;line-height:1.85}.b ol{list-style:none;counter-reset:n}.b ol>li{counter-increment:n;padding-left:26px}.b ol>li:before{content:counter(n) ".";width:20px;text-align:right;font-size:14px;line-height:1.75}.b ul>li:before{content:"✓"}.b p+p,.b ul+p,.b ol+p,.b pre+p{margin-top:6px}.b p+ul,.b p+ol{margin-top:4px}.b strong{font-weight:600}.b code{font-family:JetBrains Mono,Noto Sans Mono CJK SC,monospace;font-size:13px;background:var(--field);border-radius:5px;padding:1px 5px}.b pre{background:var(--field);border-radius:10px;padding:9px 11px;overflow-x:auto;margin-top:6px}.b pre code{background:none;padding:0;font-size:12.5px;line-height:1.6}.b a{color:var(--text);text-decoration:underline;text-decoration-color:var(--text3);text-underline-offset:3px}.qt{font-weight:500}.qs{font-size:13.5px;color:var(--text2);margin-top:1px}.opts{margin:10px 0 4px;background:var(--card);border-radius:12px;overflow:hidden}.opt{display:flex;align-items:center;gap:10px;padding:10px 12px;font-size:14.5px;line-height:1.4;border-top:1px solid var(--line);width:100%}.opt:first-child,.optrow:first-child .opt{border-top:0}@media(hover:hover){.opt:hover{background:var(--field)}}.key{width:20px;height:20px;border-radius:6px;background:var(--bubble);color:var(--text3);font-size:11px;font-weight:600;display:grid;place-items:center;flex:none}.opt.chosen{color:var(--text2)}.opt .ck{margin-left:auto;color:var(--text2)}.other{display:flex;align-items:center;gap:4px;border-top:1px solid var(--line);padding:2px 6px 2px 12px}.other input{flex:1;min-width:0;height:34px;border:0;background:transparent;color:var(--text);font-size:14px;outline:none}.other input::placeholder{color:var(--text3)}.other-send{color:var(--accent)}.tt{display:flex;align-items:center;gap:10px;font-weight:500;min-width:min(404px,100%)}.st{margin-left:auto;display:flex;align-items:center;gap:6px;font-size:13px;font-weight:400;color:var(--text2);white-space:nowrap}.st .i{color:var(--accent)}.st.done .i{color:var(--ok)}.st.done{color:var(--text2)}.meta{font-size:13px;color:var(--text2);margin-top:3px}.acts{display:flex;gap:8px;margin:10px 0 3px}.jobcard .acts .btn{height:30px;padding:0 12px;font-size:13px;font-weight:500}.jobcard .job-reply{background:color-mix(in srgb,var(--text) 7%,transparent)}.jobcard .job-reply.selected{background:color-mix(in srgb,var(--text) 11%,transparent)}.jobcard .job-stop{color:var(--danger);background:color-mix(in srgb,var(--danger) 12%,transparent)}@media(hover:hover){.jobcard .job-reply:hover{background:color-mix(in srgb,var(--text) 11%,transparent)}.jobcard .job-stop:hover{background:color-mix(in srgb,var(--danger) 18%,transparent)}}.btn{height:32px;padding:0 13px;border-radius:999px;background:var(--card);font-size:13.5px;font-weight:500;display:inline-flex;align-items:center;gap:6px;color:var(--text);flex:none}@media(hover:hover){.btn:hover{filter:brightness(.97)}}.btn.solid{background:var(--user);color:var(--utext)}.btn.ghost{background:transparent;color:var(--text2);padding:0 6px}.btn:disabled{opacity:.55;cursor:default}.att{display:flex;align-items:center;gap:11px;background:var(--bubble);border-radius:12px;padding:10px 12px;margin:8px 0 3px}.att .ico{width:34px;height:40px;border-radius:7px;background:var(--card);display:grid;place-items:center;color:var(--text2);flex:none}.att .n{font-size:14px;font-weight:500}.att .m{font-size:12.5px;color:var(--text2)}.att.plain{background:var(--bubble);margin-top:4px;width:100%}.filecard{width:340px;max-width:100%;margin-top:4px}.filecard.bad .ico,.filecard.bad .m{color:var(--danger)}.col>.filecard,.col>.imgcard,.col>.media-audio,.col>.media-video{width:var(--card-w);max-width:100%;margin:8px 0 0}.col>.b.q{padding:12px 14px}.col>.hov:has(>.b.jobcard:not(.delegation-card)){width:var(--card-w);max-width:100%}.col>.filecard{gap:12px;padding:12px 14px;border-radius:18px;text-align:left}.col>.filecard .ico{width:40px;height:40px;border-radius:12px}.col>.filecard>span:last-child{min-width:0}.col>.filecard .n{font-size:14.5px;line-height:1.45;overflow-wrap:anywhere}.col>.filecard .m{display:block;margin-top:1px;line-height:1.45}.code-block{position:relative;margin-top:6px;border-radius:10px;background:var(--field)}.code-block+p{margin-top:6px}.code-head{padding:7px 44px 0 11px;font:11px/16px JetBrains Mono,monospace;color:var(--text3)}.b .code-block pre,.fp-md .code-block pre{margin:0;background:none;padding-right:40px}.b .code-head+pre,.fp-md .code-head+pre{padding-top:3px}.code-copy{position:absolute;top:3px;right:3px;width:30px;height:30px;display:grid;place-items:center;border:0;border-radius:8px;background:none;color:var(--text2);cursor:pointer;opacity:0;transition:opacity .15s}.code-copy:hover{color:var(--text)}.code-block:hover .code-copy,.code-copy:focus-visible{opacity:1}@media(hover:none){.code-copy{opacity:1}}.math-display{overflow-x:auto;overflow-y:hidden;margin:6px 0}.media-audio{display:flex;align-items:center;gap:12px;width:320px;max-width:100%;padding:12px 14px;border-radius:18px;background:var(--bubble);color:var(--text)}.audio-play{flex:none;width:40px;height:40px;display:grid;place-items:center;border:0;border-radius:50%;background:var(--accent);color:#fff;cursor:pointer}.audio-main{flex:1;min-width:0}.audio-name{display:block;max-width:100%;padding:0;border:0;background:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px;color:var(--text2);cursor:pointer}.audio-track{position:relative;height:26px;display:flex;align-items:center}.audio-track input{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;opacity:0;cursor:pointer}.audio-bars{width:100%;height:100%;display:flex;align-items:center;gap:2px}.audio-bars i{flex:1;min-width:1px;border-radius:2px;background:var(--text3)}.audio-bars i.played{background:var(--accent)}.audio-line{height:4px;width:100%;background:var(--text3);border-radius:4px}.audio-line i{display:block;height:100%;background:var(--accent);border-radius:4px}.audio-time{font-size:11px;white-space:nowrap;color:var(--text2);font-variant-numeric:tabular-nums}.audio-rate{flex:none;padding:2px 7px;border:0;border-radius:999px;background:var(--field);font-size:11px;color:var(--text2);cursor:pointer}.media-video{width:320px;max-width:100%;overflow:hidden;border-radius:18px;background:var(--bubble)}.media-video video{display:block;width:100%;max-height:360px;background:#000}.media-video button{display:block;width:100%;padding:7px 12px;border:0;background:none;text-align:left;font-size:11px;color:var(--text2);cursor:pointer}.imgcard{display:block;width:320px;max-width:100%;margin:8px 0 3px;padding:0;border:0;background:none;cursor:zoom-in;border-radius:18px;overflow:hidden}.imgcard img{display:block;width:100%;max-height:320px;object-fit:cover;border-radius:18px;background:var(--bubble)}.imgcard.testshot{width:320px;max-width:100%;margin:0}.mmsgs .col{--card-w: 88%}.lightbox{position:fixed;top:0;right:0;bottom:0;left:0;z-index:40;display:grid;place-items:center;padding:24px;background:#000000b8;cursor:zoom-out;animation:enter-fade var(--t-mid) var(--ease-in)}.lightbox img{max-width:100%;max-height:100%;border-radius:10px;box-shadow:0 24px 60px #00000059}.quote{border-left:2px solid currentColor;opacity:.62;padding-left:9px;font-size:13px;line-height:1.5;margin:2px 0 5px}.quote-flash{animation:quote-flash 1s ease-out}@keyframes quote-flash{0%,to{box-shadow:0 0 0 0 transparent}25%{background-color:color-mix(in srgb,var(--accent) 25%,var(--bubble));box-shadow:0 0 0 5px color-mix(in srgb,var(--accent) 45%,transparent)}}.message-row{position:relative;width:100%;display:flex;justify-content:flex-start}.message-row.right{justify-content:flex-end}.message-row .quote{display:block;cursor:pointer}.tag{display:flex;align-items:center;gap:5px;font-size:12px;color:var(--text3);margin:2px 0 0 4px}.hov{position:relative;align-self:flex-start;max-width:548px}.hov.right{align-self:flex-end}.tablecard{max-width:100%;overflow-x:auto;border-radius:18px;background:var(--bubble);-webkit-overflow-scrolling:touch}.hov.msg>.tablecard+.b,.hov.msg>.b+.tablecard,.hov.msg>.tablecard+.tablecard{margin-top:8px}.tablecard table{border-collapse:collapse;min-width:100%;font-size:14px;line-height:1.5}.tablecard th,.tablecard td{padding:11px 16px;min-width:9.5em;max-width:20em;text-align:left;vertical-align:top}.tablecard th{font-weight:600;white-space:nowrap}.tablecard tr+tr td,.tablecard thead+tbody tr td{border-top:1px solid var(--line)}.tools{position:absolute;left:100%;bottom:0;padding-left:4px;display:flex;gap:2px;opacity:0;pointer-events:none;transition:opacity var(--t-fast) var(--ease-in)}.hov.right .tools{left:auto;right:100%;padding:0 4px 0 0}.hov.msg:focus-within .tools:not(.menu),.tools.menu{opacity:1;pointer-events:auto}.tools button{width:26px;height:26px;display:grid;place-items:center;border-radius:7px;color:var(--text3)}.tools button.copied{color:var(--ok)}.tools button:focus-visible{outline:2px solid var(--accent);outline-offset:1px}@media(min-width:768px){.col{max-width:1040px}.hov{max-width:min(80%,46em)}.hov.right{max-width:min(70%,46em)}.b,.u{max-width:100%}.col>.b{max-width:min(80%,46em)}.col>.b.q,.col>.b.wide,.hov:has(>.b.wide),.hov:has(>.delegation-card){width:min(80%,46em)}.delegation-card{width:100%}}@media(hover:hover){.hov.msg:hover .tools{opacity:1;pointer-events:auto}.tools button:hover{background:var(--field);color:var(--text2)}}.compwrap{padding:8px 0 20px;overflow-y:hidden;scrollbar-gutter:stable}.comp{display:flex;flex-direction:column;gap:2px;border-radius:26px;padding:6px 8px;min-height:52px;justify-content:center}.comp-main{display:flex;align-items:center;gap:10px}.comp .pl{width:34px;height:34px;border-radius:50%;display:grid;place-items:center;color:var(--text2);flex:none}.comp .sendbtn{width:36px;height:36px;border-radius:50%;background:var(--user);color:var(--utext);display:grid;place-items:center;flex:none}.comp .ta{flex:1;min-width:0;display:block;font-size:15px;line-height:1.5;padding:7px 0;max-height:180px;resize:none;overflow-y:auto}.comp .ta::placeholder{color:var(--text3)}.comp-quote{display:flex;align-items:flex-start;gap:8px;padding:4px 4px 0 10px;font-size:13px;color:var(--text2)}.comp-quote .quote{flex:1;margin:0;max-height:3em;overflow:hidden}.comp-files{display:flex;gap:8px;padding:6px 6px 2px;overflow-x:auto;scrollbar-width:none}.comp-files::-webkit-scrollbar{display:none}.comp-thumb{position:relative;flex:none;width:64px;height:64px}.comp-thumb img{display:block;width:100%;height:100%;object-fit:cover;border-radius:12px;background:var(--field)}.comp-thumb button{position:absolute;top:-5px;right:-5px;width:20px;height:20px;display:grid;place-items:center;border-radius:50%;background:color-mix(in srgb,var(--text) 78%,transparent);color:var(--bg);border:2px solid var(--field)}.filechip{flex:none;display:inline-flex;align-items:center;gap:8px;max-width:220px;height:64px;padding:0 8px 0 10px;border-radius:12px;background:var(--bg);font-size:13px;color:var(--text)}.filechip .fi{flex:none;width:36px;height:36px;display:grid;place-items:center;border-radius:10px;background:var(--field);color:var(--text2)}.filechip .fn{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.filechip button{flex:none;width:22px;height:22px;display:grid;place-items:center;border-radius:50%;color:var(--text3)}.cur{display:inline-block;width:7px;height:14px;background:var(--text2);vertical-align:-2px;animation:blink 1s steps(2) infinite}.b.thinking{display:inline-flex;align-items:center;gap:5px;padding:13px 15px}.b.thinking .dot{width:6px;height:6px;border-radius:50%;background:var(--text3);animation:thinking 1.2s ease-in-out infinite}.b.thinking .dot:nth-child(2){animation-delay:.15s}.b.thinking .dot:nth-child(3){animation-delay:.3s}.draft{background:var(--card);border-radius:14px;padding:16px 16px 14px;margin:10px 0 4px}.draft .kv .line{display:block}.draft .top{display:flex;gap:12px;align-items:center;margin-bottom:10px}.draft .dn{font-size:16px;font-weight:600}.draft .ds{font-size:12.5px;color:var(--text3);margin-top:1px}.kv{display:flex;gap:14px;padding:8px 0;border-top:1px solid var(--line);font-size:14px;line-height:1.5}.kv .k{width:5.5em;white-space:nowrap;flex:none;color:var(--text3);font-size:13px;padding-top:1px}.kv .none{color:var(--text3)}.panel{width:344px;flex:none;background:var(--panel);border-left:1px solid var(--line);display:flex;flex-direction:column;padding:0 20px 20px;overflow-y:auto}.phead{height:54px;flex:none;display:flex;align-items:center;gap:4px;margin:0 -8px 6px;color:var(--text2);position:sticky;top:0;background:var(--panel);z-index:2}.phead .t{position:absolute;left:50%;transform:translate(-50%);max-width:calc(100% - 128px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none;font-size:14.5px;font-weight:500;color:var(--text)}.screen{background:#141416;border-radius:12px;height:186px;padding:13px 14px;font-size:12px;line-height:1.75;color:#c7c7cc;overflow:hidden;font-family:JetBrains Mono,Noto Sans Mono CJK SC,monospace;flex:none}.dark .screen{background:#0d0d0e;box-shadow:inset 0 0 0 1px #262629}.screen div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.screen .p{color:#ff8a4c}.screen .d{color:#76767c}.screen .v{display:inline-block;width:3em;color:#76767c}.screen .cur{display:inline-block;width:7px;height:14px;background:#ff8a4c;vertical-align:-2px;animation:blink 1.1s steps(2) infinite}.screen.idle div:not(.end){opacity:.45}.screen.idle .p{color:inherit}.screen .end{color:#76767c}.cap{text-align:center;font-size:12px;color:var(--text3);margin:9px 0 22px}.caprow{display:flex;align-items:baseline;gap:12px;margin:9px 0 22px}.caprow .cap{flex:1;min-width:0;margin:0;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.caprow .more{flex:none;font-size:12px;color:var(--text2)}.slot.pslot{margin:0 0 22px}.sech{display:flex;justify-content:space-between;align-items:center;font-size:13px;font-weight:500;color:var(--text2);margin-bottom:4px}.rt{display:flex;gap:11px;padding:9px 0;width:100%}@media(hover:hover){.rt:hover .n{color:var(--text)}}.rt .i{color:var(--ok);margin-top:2px}.rt.paused .i{color:var(--text3)}.rt .n{font-size:14px}.rt .s{font-size:12.5px;color:var(--text2);margin-top:1px}.lbl{font-size:12.5px;color:var(--text2);margin:16px 0 6px}.field{background:var(--field);border-radius:10px;padding:9px 12px;font-size:14px;line-height:1.6;display:block;width:100%}.field input,.field textarea{display:block;width:100%;font-size:14px;line-height:1.6;resize:none;overflow:hidden}.ctl{display:flex;align-items:center;gap:10px;margin-top:2px}.tog{width:38px;height:22px;border-radius:999px;background:var(--text);position:relative;flex:none;transition:transform var(--t-mid) var(--ease-in)}.tog:after{content:"";position:absolute;top:3px;left:3px;width:16px;height:16px;border-radius:50%;background:var(--bg);transform:translate(16px);transition:transform var(--t-mid) var(--ease-in)}.tog.off{background:var(--text3)}.tog.off:after{transform:translate(0)}.ctl .sp{flex:1}.pbtn{height:30px;padding:0 12px;border-radius:9px;background:var(--field);font-size:13px;font-weight:500;display:inline-flex;align-items:center;flex:none}@media(hover:hover){.pbtn:hover{filter:brightness(.97)}}.pbtn.solid{background:var(--user);color:var(--utext)}.pbtn:disabled{opacity:.4;cursor:default;filter:none}.when{background:var(--field);border-radius:10px;padding:2px 12px}.when .w{display:flex;align-items:center;gap:8px;padding:8px 0;font-size:14px;width:100%}.when .w+.w{border-top:1px solid var(--line);color:var(--text2);font-size:13px}.run{display:flex;justify-content:space-between;align-items:center;padding:8px 0;font-size:13.5px;border-top:1px solid var(--line);width:100%;color:var(--text)}.run:first-of-type{border-top:0}.run .i{color:var(--ok)}.run.bad .i{color:var(--accent)}.rule{display:flex;align-items:center;justify-content:space-between;padding:8px 0;font-size:14px;border-top:1px solid var(--line);gap:10px}.rule-wrap:first-child .rule{border-top:0}.rule-text,.rule-input{flex:1;min-width:0;text-align:left;overflow-wrap:anywhere}.rule-text,.rule-mode{cursor:pointer}.rule-text:hover,.rule-mode:hover{color:var(--accent)}.rule-confirm{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding-bottom:8px;font-size:12px}.rule-add,.rule-new{border-top:1px solid var(--line);padding:8px 0;width:100%}.rule-add{text-align:left;color:var(--text2);cursor:pointer}.rule-new .rule-input{background:var(--bg);border-radius:8px;padding:6px 10px}.rule-new .ctl{margin-top:8px}.rule .v{font-size:13px;color:var(--text2);display:flex;gap:6px;align-items:center}.phead .t+.ib{margin-left:auto}.rule .del{display:grid;flex:none;width:22px;height:22px;place-items:center;color:var(--text3);cursor:pointer;opacity:.35}.rule:hover .del,.rule:focus-within .del{opacity:1}@media(hover:none){.rule .del,.chip .del{display:grid}}.chips{display:flex;flex-wrap:wrap;gap:6px}.chip{background:var(--field);border-radius:8px;padding:5px 9px;font-size:13px;display:inline-flex;align-items:center;gap:5px}.chip .del{display:none;color:var(--text3);cursor:pointer}.chip:hover .del{display:grid}.note{font-size:12px;color:var(--text3);margin-top:8px}.bigav{display:flex;justify-content:center;margin:4px 0 2px}.bigav .av{cursor:pointer}.sprite-pick{display:flex;flex-wrap:wrap;gap:10px 12px;justify-content:center;max-width:264px;margin:12px auto 0}.sprite-pick button,.sprite-colors button:not(.pbtn){border-radius:50%;outline:2px solid transparent;outline-offset:2px}@media(hover:hover){.sprite-pick button:hover,.sprite-colors button:not(.pbtn):hover{outline-color:var(--line)}}.sprite-pick button.on,.sprite-colors button.on{outline-color:var(--accent)}.sprite-colors{display:flex;align-items:center;justify-content:center;gap:10px;margin-top:14px}.sprite-colors button:not(.pbtn){width:18px;height:18px}.sprite-colors .pbtn{margin-left:6px}.mergebar{display:flex;flex-direction:column;align-items:flex-start;gap:8px;margin-top:18px}.mergeconfirm{background:var(--field);border-radius:10px;padding:10px 12px;font-size:13px;line-height:1.6;color:var(--text2)}.mergeconfirm .acts{display:flex;gap:8px;margin-top:10px}.wl{font-size:12.5px;color:var(--text3);line-height:1.55;display:flex;gap:8px;padding:3px 0}.wl .t{flex:none;color:var(--text3);min-width:84px}.wlgroup{margin-top:22px}.pgroup+.pgroup{margin-top:26px}.pgroup>.sech+.lbl{margin-top:10px}.empty{font-size:13px;color:var(--text3);padding:6px 0}.err{margin:10px 0;padding:10px 12px;border-radius:10px;background:#ff6a2b1a;color:var(--accent);font-size:13px;line-height:1.5}.login{position:fixed;top:0;right:0;bottom:0;left:0;display:grid;place-items:center;background:var(--side)}.login .card{width:340px;background:var(--bg);border:1px solid var(--line);border-radius:18px;padding:24px 22px 20px;display:flex;flex-direction:column;align-items:center}.login .card .nm{font-size:17px;font-weight:600;margin-top:10px}.login .card .ds{font-size:12.5px;color:var(--text3);margin-top:2px}.login .field{margin:18px 0 12px}.login .btn{width:100%;justify-content:center;height:38px;border-radius:11px}.mapp{position:fixed;top:0;right:0;bottom:0;left:0;background:var(--bg);overflow:hidden}.mpane{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;flex-direction:column;min-height:0;background:var(--bg)}.mhead{display:flex;align-items:center;gap:8px;padding:calc(10px + env(safe-area-inset-top,0px)) calc(18px + env(safe-area-inset-right,0px)) 4px calc(18px + env(safe-area-inset-left,0px))}.mhead .sp{flex:1}.me{width:32px;height:32px;border-radius:50%;background:var(--field);display:grid;place-items:center;color:var(--text2)}.mpins{padding:8px 10px 6px}.mpins .pin{padding:10px 4px 8px}.mlist{padding:0 8px;overflow-y:auto;flex:1}.mlist .row{padding:10px}.mlist .gt{padding:18px 10px 4px}.gt .more{font-size:12px;color:var(--text2)}.row .pv .jt-st{margin-right:6px}.slot{margin:2px 10px 0;height:56px;display:grid;place-items:center;border:1.5px dashed color-mix(in srgb,var(--text3) 50%,transparent);border-radius:14px;font-size:12.5px;color:var(--text3)}.mlist .fold{padding:12px 10px}.fold>span:last-child{display:inline-flex;align-items:center;gap:4px}.mchat-head{display:flex;align-items:center;gap:8px;padding:calc(8px + env(safe-area-inset-top,0px)) calc(14px + env(safe-area-inset-right,0px)) 10px calc(14px + env(safe-area-inset-left,0px));border-bottom:1px solid var(--line)}.mchat-head .nm{font-size:16px;font-weight:500}.mchat-head .sp{flex:1}.mmsgs{flex:1;min-height:0;overflow-y:auto;display:flex;flex-direction:column;padding:0 14px calc(var(--comp-h, 80px) + 6px)}.mmsgs .hov{max-width:88%}.mmsgs .hov.right{max-width:80%}.mmsgs .b,.mmsgs .u{font-size:14.5px;max-width:100%}.mmsgs .col>.b.q,.mmsgs .hov:has(>.b.wide){width:88%;max-width:88%}.mmsgs .b.wide{max-width:100%}.mmsgs .draft{width:auto;padding:14px 12px 12px}.mmsgs .kv{gap:10px}.mmsgs .opt{font-size:14px;padding:10px 11px}.mmsgs .col{padding:0;margin-top:auto}.mmsgs .tt{min-width:0}.mcomp-wrap{padding:0 0 calc(22px + env(safe-area-inset-bottom,0px))}.mcomp{display:flex;flex-direction:column;gap:2px;border-radius:23px;margin:6px 12px 0;padding:6px;min-height:46px;justify-content:center}.mcomp .comp-main{display:flex;align-items:center;gap:8px}.mcomp .ta{flex:1;min-width:0;font-size:14.5px;line-height:1.5;padding:6px 0;max-height:120px;resize:none}.mcomp .ta::placeholder{color:var(--text3)}.mcomp .pl{width:32px;height:32px;display:grid;place-items:center;color:var(--text2);flex:none}.mcomp .sendbtn{width:34px;height:34px;border-radius:50%;background:var(--user);color:var(--utext);display:grid;place-items:center;flex:none}.mfull{position:fixed;top:0;right:0;bottom:0;left:0;background:var(--panel);z-index:20;overflow-y:auto}.mfull .panel{width:100%;border-left:0;min-height:100%}.mfull .phead{background:var(--panel);height:auto;min-height:calc(54px + env(safe-area-inset-top,0px));padding-top:env(safe-area-inset-top,0px)}.mtools{display:flex;align-items:center;gap:4px}.msearch{flex:1;height:34px;border-radius:10px;background:var(--field);display:flex;align-items:center;gap:8px;padding:0 11px;color:var(--text3);font-size:14px}.msearch input{flex:1;min-width:0;font-size:14px}@keyframes blink{0%,to{opacity:1}50%{opacity:0}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes thinking{0%,60%,to{opacity:.35;transform:translateY(0)}30%{opacity:1;transform:translateY(-3px)}}.spin{animation:spin 1.1s linear infinite}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-thumb{background:var(--line);border-radius:4px}::-webkit-scrollbar-track{background:transparent}.side-scroll::-webkit-scrollbar-thumb{background:transparent}.side-scroll:hover::-webkit-scrollbar-thumb{background:var(--line)}.u .ufile{display:flex;align-items:center;gap:10px;width:100%;margin-top:6px;font-size:14px;color:inherit;text-align:left}.u .ufile:first-child{margin-top:0}.u .ufile .fi{flex:none;width:36px;height:36px;display:grid;place-items:center;border-radius:10px;background:color-mix(in srgb,currentColor 14%,transparent)}.u .ufile .fn{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.u-solo{display:flex;justify-content:flex-end;margin-top:8px}.u-album{display:flex;align-items:center;justify-content:flex-end;gap:12px}.send-failed,.send-progress{flex:none;align-self:center;width:22px;height:22px;margin-right:8px;display:grid;place-items:center;border-radius:50%}.send-failed{background:var(--danger);color:#fff;font-size:14px;font-weight:700;line-height:1}.send-progress{color:var(--text3)}.send-status{display:flex;justify-content:flex-end;align-items:center;gap:10px;margin-top:4px;font-size:12px;color:var(--danger)}.send-status button{font-size:12px;color:var(--text2)}.send-status button:first-of-type{color:var(--accent)}.comp-thumb .att-spin,.comp-thumb .att-bad{position:absolute;top:0;right:0;bottom:0;left:0;display:grid;place-items:center;border-radius:12px;background:#00000052;color:#fff}.comp-thumb .att-bad{background:color-mix(in srgb,var(--danger) 55%,transparent);font-weight:700}.u-album+.u,.u-solo+.u{width:fit-content;margin:4px 0 0 auto}.album-pill{flex:none;padding:6px 14px;border-radius:999px;background:var(--bubble);color:var(--text2);font-size:13.5px}.album-stack{--w: 180px;position:relative;isolation:isolate;width:calc(var(--w) + 24px);height:calc(var(--w) * 4 / 3 + 14px);cursor:pointer;touch-action:pan-y;user-select:none;-webkit-user-select:none}.album-stack img{position:absolute;left:0;top:2px;width:var(--w);aspect-ratio:3 / 4;object-fit:cover;border-radius:14px;border:2px solid var(--bg);background:var(--bubble);box-shadow:0 2px 10px #00000024;transform-origin:30% 100%;transform:translate(calc(var(--d) * 11px + var(--dx)),calc(var(--d) * 4px)) rotate(calc(var(--d) * 3.5deg + var(--rot))) scale(calc(1 - var(--d) * .04));transition:transform .32s cubic-bezier(.2,.8,.2,1);-webkit-user-drag:none}.album-stack.dragging img{transition:none}.album-list{display:flex;flex-direction:column;align-items:flex-end;gap:4px}.album-item{display:block;padding:0;cursor:zoom-in;width:220px;border-radius:18px;overflow:hidden}.album-item img{display:block;width:100%;max-height:340px;object-fit:cover}.u-album.open{align-items:flex-start}@media(min-width:768px){.album-stack{--w: 200px}.album-item{width:260px}}.mmsgs .album-item img{max-height:300px}.replybox{display:flex;align-items:center;gap:8px;margin-top:8px;background:var(--field);border-radius:999px;padding:4px 6px 4px 14px}.replybox input{flex:1;min-width:0;font-size:13.5px;padding:5px 0}.field textarea{overflow:auto}.sched-edit{flex-wrap:wrap;gap:6px}.sched-edit select,.sched-edit input{height:26px;border-radius:7px;background:var(--card);border:1px solid var(--line);padding:0 6px;font-size:13px}.sched-edit input[type=number]{width:56px}.sched-edit .rawcron{flex:1;min-width:120px;font-family:JetBrains Mono,Noto Sans Mono CJK SC,monospace}.when select,.when input{color:var(--text)}.boot{position:fixed;top:0;right:0;bottom:0;left:0;display:grid;place-items:center;background:var(--side);color:var(--text3);font-size:14px}.boot-card{background:var(--bg);border:1px solid var(--line);border-radius:16px;padding:22px;width:360px;text-align:center}.boot-card .t{font-size:15px;font-weight:600;color:var(--text)}.boot-card .d{font-size:13px;line-height:1.6;margin:8px 0 16px;color:var(--text2);word-break:break-word}.boot-card .btn{margin:0 auto}.boot-card .raw{margin-top:14px;font-size:12px;line-height:1.5;color:var(--text3);word-break:break-word}.toast{position:fixed;left:50%;bottom:calc(26px + env(safe-area-inset-bottom,0px));transform:translate(-50%);background:var(--user);color:var(--utext);font-size:13px;line-height:1.5;border-radius:12px;padding:9px 14px;max-width:520px;box-shadow:0 6px 24px #00000024;z-index:40}.upd{position:fixed;top:calc(58px + env(safe-area-inset-top,0px));left:50%;transform:translate(-50%);background:var(--user);color:var(--utext);font-size:13px;line-height:1.5;border-radius:999px;padding:8px 16px;box-shadow:0 6px 24px #0000002e;z-index:60;white-space:nowrap}@keyframes enter-rise{0%{opacity:0;transform:translateY(6px)}}@keyframes enter-side{0%{opacity:0;transform:translateY(6px)}}@keyframes enter-fade{0%{opacity:0}}@keyframes pick{0%{opacity:.6}to{opacity:1}}@keyframes icon-in{0%{opacity:0;transform:scale(.8)}}@keyframes badge-in{0%{opacity:0;transform:scale(0)}}@keyframes check-pop{0%{transform:scale(.6)}60%{transform:scale(1.08)}to{transform:scale(1)}}@keyframes row-open{0%{grid-template-rows:0fr;opacity:0}}@keyframes unfold{0%{grid-template-rows:0fr;opacity:0}}@keyframes panel-in-right{0%{opacity:0;transform:translate(12px)}}@keyframes panel-in-left{0%{opacity:0;transform:translate(-12px)}}@keyframes page-in{0%{opacity:0;transform:translate(100%)}}@keyframes popup-in{0%{opacity:0;transform:scale(.96)}}@keyframes toast-in{0%{opacity:0;transform:translate(-50%,8px) scale(.96)}}@keyframes drawer-out{to{opacity:0;transform:translate(26px)}}@keyframes sheet-out{to{opacity:0;transform:translateY(40px)}}@keyframes sheet-up{0%{opacity:0;transform:translateY(40px)}}@keyframes drawer-in{0%{transform:translate(26px);opacity:.5}}@keyframes shake{0%,to{transform:translate(0)}16%,50%,83%{transform:translate(-4px)}33%,66%{transform:translate(4px)}}.hov.enter{animation:enter-rise var(--t-mid) var(--ease-in)}.hov.enter-right{animation:enter-side var(--t-mid) var(--ease-in)}.b.enter,.att.enter,.imgcard.enter{animation:enter-rise var(--t-mid) var(--ease-in)}.enter-fade{animation:enter-fade var(--t-mid) var(--ease-in)}.sys.enter-fade .i{animation:icon-in var(--t-mid) var(--ease-in)}.think{animation:enter-fade var(--t-fast) var(--ease-in)}.think.leaving{opacity:0;transition:opacity var(--t-mid) var(--ease-out)}.optrow{display:grid;grid-template-rows:1fr;transition:grid-template-rows var(--t-mid) var(--ease-out),opacity var(--t-mid) var(--ease-out)}.optrow.away{grid-template-rows:0fr;opacity:0}.optclip{overflow:hidden;min-height:0}.opt{transition:transform var(--t-mid) var(--ease-in)}.optrow .opt.chosen{animation:pick var(--t-slow) var(--ease-in)}.optrow .opt.chosen .ck{animation:enter-fade var(--t-fast) var(--ease-in) var(--t-fast) both}.stico{position:relative;width:14px;height:14px;flex:none}.stico .i{position:absolute;top:0;right:0;bottom:0;left:0}.stico .stspin{transition:opacity var(--t-fast) var(--ease-out)}.stspin.off{opacity:0}.stic.anim{animation:enter-fade var(--t-fast) var(--ease-in)}.st.done .stic.anim{animation:check-pop var(--t-slow) var(--ease-in)}.replywrap{display:grid;grid-template-rows:1fr;animation:unfold var(--t-mid) var(--ease-in)}.replywrap.leaving{grid-template-rows:0fr;opacity:0;transition:grid-template-rows var(--t-mid) var(--ease-out),opacity var(--t-mid) var(--ease-out)}.replyclip{overflow:hidden;min-height:0}.acts.swap{display:grid;justify-items:start}.acts.swap>div{grid-area:1 / 1;display:flex;gap:8px;transition:opacity var(--t-mid) var(--ease-in)}.acts.swap>div.off{opacity:0;pointer-events:none}@media(hover:none){.message-row{touch-action:pan-y}.hov.msg>.u,.hov.msg>.b{user-select:none;-webkit-user-select:none;-webkit-touch-callout:none;position:relative;transition:transform .3s var(--ease-out)}.swipe-reply{position:absolute;right:0;top:8px;color:var(--text);pointer-events:none}.swipe-reply-inner{display:grid;place-items:center;width:34px;height:34px;border-radius:50%;background:color-mix(in srgb,var(--text) 12%,transparent)}.swipe-reply.ready .swipe-reply-inner{animation:swipe-pop .24s var(--ease-out)}.hov.msg>.tools:not(.menu){display:none}.message-popup{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;pointer-events:none}.message-shade{position:fixed;background:#0000007a;pointer-events:auto}.message-popup-bubble{position:fixed;pointer-events:none;transform:scale(1.02);filter:drop-shadow(0 6px 14px rgba(0,0,0,.25))}.message-popup-bubble>.u,.message-popup-bubble>.b{width:100%;max-width:none;font-size:14.5px}.message-popup-menu{position:fixed;width:160px;pointer-events:auto}.message-popup-menu .tools.menu{position:static;display:flex;flex-direction:column;gap:0;padding:4px;border:1px solid var(--line);border-radius:14px;background:var(--card);box-shadow:0 6px 24px #0000003d;animation:popup-in var(--t-fast) var(--ease-in)}.message-popup-menu .tools.menu button{display:flex;gap:12px;width:100%;height:40px;padding:0 12px;color:var(--text);white-space:nowrap}}@keyframes swipe-pop{50%{transform:scale(1.12)}}.panelwrap{position:relative;width:344px;flex:none;height:100%}.panelwrap.off{width:0}.panelwrap.detail{width:min(560px,45vw)}.panelwrap .panel{position:absolute;right:0;height:100%;transition:transform var(--t-slow) var(--ease-in),opacity var(--t-slow) var(--ease-in)}.panelwrap.off .panel{transform:translate(100%);opacity:0;pointer-events:none;transition-duration:var(--t-mid);transition-timing-function:var(--ease-out)}.pbody{flex:none}.pbody.from-right{animation:panel-in-right var(--t-mid) var(--ease-in)}.pbody.from-left{animation:panel-in-left var(--t-mid) var(--ease-in)}.screen div.new{animation:enter-fade var(--t-mid) var(--ease-in)}.screen .cur{animation:blink 1s steps(2) infinite}.srow,.rtrow{display:grid;grid-template-rows:1fr}.srow.enter,.rtrow.enter{animation:row-open var(--t-mid) var(--ease-in)}.srow.leave,.rtrow.leave{grid-template-rows:0fr;opacity:0;transition:grid-template-rows var(--t-mid) var(--ease-out),opacity var(--t-mid) var(--ease-out)}.srowclip,.rtclip{overflow:hidden;min-height:0}.badge{animation:badge-in var(--t-mid) var(--ease-in)}.row,.pin,.ib,.frow,.tools button,.btn,.pbtn,.rt,.comp .sendbtn,.mcomp .sendbtn{transition:transform var(--t-mid) var(--ease-in),opacity var(--t-fast) var(--ease-in)}.sendbtn.stop svg{fill:currentColor}.comp .sendbtn:disabled,.mcomp .sendbtn:disabled{background:var(--sel);color:var(--text3);cursor:default;transform:none}.comp-quote{animation:enter-rise var(--t-mid) var(--ease-in)}.comp-quote.leaving{opacity:0;transform:translateY(6px);transition:opacity var(--t-mid) var(--ease-out),transform var(--t-mid) var(--ease-out)}button:not(:disabled):active{transform:scale(.97);transition-timing-function:var(--ease-out)}.upd:not(:disabled):active{transform:translate(-50%) scale(.97)}.mpane.list,.mpane.chat{will-change:transform}.mpane.list{transition:transform var(--t-slow) var(--ease-in)}.mpane.list.back{transform:translate(-30%)}.mpane.chat{animation:page-in var(--t-slow) var(--ease-in)}.mpane.chat.out{opacity:0;transform:translate(100%);transition:transform var(--t-mid) var(--ease-out),opacity var(--t-mid) var(--ease-out)}.mfull{animation:sheet-up var(--t-slow) var(--ease-in)}.mfull.leaving{pointer-events:none;animation:sheet-out var(--t-mid) var(--ease-out) forwards}.setpage{position:fixed;top:0;right:0;bottom:0;left:0;display:flex;background:var(--bg);animation:page-in var(--t-slow) var(--ease-in)}.setpage.leaving{pointer-events:none;animation:drawer-out var(--t-mid) var(--ease-out) forwards}.setnav{width:216px;flex:none;display:flex;flex-direction:column;gap:2px;padding:22px 12px 16px;border-right:1px solid var(--line)}.setnavtitle{font-size:17px;font-weight:600;padding:0 10px 14px}.setnav .sp{flex:1}.navrow{display:flex;align-items:center;gap:6px;height:34px;padding:0 10px;border-radius:9px;font-size:14px;color:var(--text);background:transparent;text-align:left}@media(hover:hover){.navrow:hover{background:var(--field)}}.navrow.sel{background:var(--field);font-weight:500}.setmain{flex:1;min-width:0;overflow-y:auto;padding:26px 30px 60px}.setmain>*{max-width:640px}.setmain .lbl:first-child{margin-top:0}.setintro{margin-bottom:24px}.setintro .h{font-size:18px;font-weight:600}.setintro .d{margin-top:6px;font-size:13px;line-height:1.65;color:var(--text2)}.group{display:flex;flex-direction:column;gap:8px}.group+.group{margin-top:24px}.group>.lbl,.group>.note,.group>.ctl{margin:0}.group>.lbl:not(:first-child){margin-top:8px}.lbl.sub{font-size:12px;color:var(--text3)}.lblrow{display:flex;align-items:baseline;justify-content:space-between;gap:10px}.lblrow .lbl{margin:0}.lblrow .link{font-size:12.5px;color:var(--text2)}.sline{font-size:13px;color:var(--text2)}.srow{display:flex;flex-direction:column;gap:6px}.formcard{background:var(--field);border-radius:10px;padding:12px}.formcard .field{background:var(--bg)}.formcard .pbtn:not(.solid){background:var(--bg)}.sfoot{display:flex;align-items:center;gap:10px;margin-top:24px}.sfoot .sp{flex:1}.okline{font-size:12.5px;color:var(--ok)}.badline{font-size:12.5px;color:var(--accent)}.savetoast{position:fixed;top:calc(14px + env(safe-area-inset-top,0px));right:18px;z-index:60;padding:6px 12px;border-radius:999px;background:var(--card);box-shadow:0 4px 16px #0000001f;animation:enter-fade var(--t-fast) var(--ease-in)}.setpage.narrow .setintro .h{display:none}.sethead{display:flex;align-items:center;gap:6px;min-height:calc(52px + env(safe-area-inset-top,0px));padding:env(safe-area-inset-top,0px) calc(10px + env(safe-area-inset-right,0px)) 0 calc(10px + env(safe-area-inset-left,0px));border-bottom:1px solid var(--line)}.sethead .t{font-size:15px;font-weight:600}.setpage.narrow{flex-direction:column}.setpage.narrow .sethead{flex:none}.setpage.narrow .setbody,.setpage.narrow .setmain{flex:1;overflow-y:auto;padding:8px 12px 40px}.setitem{display:flex;align-items:center;justify-content:space-between;width:100%;height:46px;padding:0 12px;border-radius:10px;font-size:15px;background:transparent;color:var(--text);text-align:left}@media(hover:hover){.setitem:hover{background:var(--field)}}.setitem svg{color:var(--text3)}.setpage.narrow .setbody{padding:16px 16px 40px}.setpage.narrow .setbody>.setitem{position:relative;height:48px;padding:0 14px 0 16px;border-radius:0;background:var(--field)}.setpage.narrow .setbody>.setitem:first-child{border-radius:12px 12px 0 0}.setpage.narrow .setbody>.setitem:last-child{border-radius:0 0 12px 12px}.setpage.narrow .setbody>.setitem+.setitem:before{content:"";position:absolute;left:16px;right:0;top:0;height:1px;background:var(--line)}.setpage.narrow .setbody>.setitem:active{background:var(--sel)}.dev{display:flex;align-items:center;gap:10px;padding:10px 2px;border-top:1px solid var(--line)}.dev:first-of-type{border-top:0}.dev .n{font-size:14px;font-weight:500}.dev .tm{font-size:12.5px;color:var(--text3)}.dev .sp{flex:1}.dev .del{font-size:12.5px;color:var(--text2)}@media(hover:hover){.dev .del:hover{color:var(--danger)}}.tog:disabled{opacity:.5;cursor:default}.tz{position:relative}.tzlist,.amenu{padding:4px;border-radius:10px;background:var(--bg);box-shadow:0 8px 28px #00000029;border:1px solid var(--line)}.tzlist,.amenu{transform-origin:top left;animation:popup-in var(--t-mid) var(--ease-in)}.toast{animation:toast-in var(--t-mid) var(--ease-in)}.tzlist{position:absolute;z-index:5;top:calc(100% + 4px);left:0;right:0;max-height:240px;overflow-y:auto}.amenu{position:fixed;z-index:50;min-width:160px}.tzlist button,.amenu button{display:block;width:100%;padding:7px 10px;border-radius:7px;font-size:13.5px;text-align:left;background:transparent;color:var(--text)}.tzlist button.sel,.amenu button.sel{background:var(--field)}@media(hover:hover){.tzlist button:hover,.amenu button:hover{background:var(--field)}}.pick{height:32px;min-width:72px;padding:0 10px;border-radius:9px;background-color:var(--field);color:var(--text);font-size:14px;border:none}select.pick{padding-right:28px;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%238e8e93' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 10px center;-webkit-appearance:none;-moz-appearance:none;appearance:none;text-overflow:ellipsis}.setmain .pick{height:40px;border-radius:10px;padding-left:12px}.seg{position:relative;display:inline-grid;grid-template-columns:repeat(var(--seg-count),minmax(0,1fr));align-self:flex-start;max-width:100%;gap:2px;padding:3px;border-radius:10px;background:var(--field)}.seg:before{content:"";position:absolute;top:3px;bottom:3px;left:3px;width:calc((100% - 6px - (var(--seg-count) - 1) * 2px) / var(--seg-count));border-radius:8px;background:var(--card);box-shadow:0 1px 2px #0000001a;transform:translate(calc(var(--seg-index) * (100% + 2px)));transition:transform var(--t-slow) var(--ease-in)}.dark .seg:before{background:#3a3a3e}.seg>button{position:relative;text-align:center;height:34px;padding:0 14px;border-radius:8px;font-size:13.5px;color:var(--text2);white-space:nowrap;transition:transform var(--t-mid) var(--ease-in)}.seg>button.on{color:var(--text);font-weight:500}.seg>button:disabled{cursor:default}.field.ro{color:var(--text2)}.kvcard{background:var(--field);border-radius:12px;padding:0 14px}.kvrow{display:flex;align-items:baseline;justify-content:space-between;gap:16px;padding:12px 0;font-size:14px}.kvrow+.kvrow{border-top:1px solid var(--line)}.kvrow .k{flex:none;color:var(--text2)}.kvrow .v{min-width:0;text-align:right;overflow-wrap:anywhere}.field.mono{font-family:var(--mono, ui-monospace, SFMono-Regular, Menlo, monospace);font-size:12.5px;word-break:break-all}.pick.grow{flex:1;min-width:0}.roster{background:var(--field);border-radius:10px;padding:2px 12px}.rrow{display:flex;gap:10px;padding:10px 0;width:100%}.rrow+.rrow{border-top:1px solid var(--line)}.rbtn{text-align:left}.rclamp{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.rrow>.tog,.rrow>.rmove,.rrow>.rorder{align-self:center}.rrow>.rmove{width:28px;height:28px;color:var(--text3)}.rrow>.rmove:disabled{opacity:.35;cursor:default}.rmove .up{transform:rotate(180deg)}.rorder{flex:none;width:20px;height:20px;border-radius:50%;background:var(--bg);color:var(--text2);font-size:11.5px;font-weight:600;display:grid;place-items:center}.rempty{padding:12px 0;font-size:13px;color:var(--text3)}.roster>.rempty+.maddrow{border-top:1px solid var(--line)}.lbl-aside{margin-left:8px;color:var(--text3)}a.lbl-aside{color:var(--accent)}.score-row{margin-top:6px}.score-head{display:flex;justify-content:space-between;font-size:14px}.score-head span{color:var(--text2);font-size:13px;font-variant-numeric:tabular-nums}.score-range{display:block;width:100%;margin:8px 0 0;accent-color:var(--accent)}.score-ticks{position:relative;height:26px;margin:0 8px}.score-ticks button{position:absolute;top:2px;transform:translate(-50%);font-size:12px;color:var(--text3);white-space:nowrap;padding:2px 4px}.score-ticks button.first{transform:translate(-8px)}.score-ticks button.last{transform:translate(calc(-100% + 8px))}.score-ticks button[aria-pressed=true]{color:var(--accent);font-weight:600}.skill-doc h1,.skill-doc h2{font-size:16px;margin:0 0 8px}.skill-doc>:first-child{margin-top:0}.skill-doc{margin-top:16px;padding:16px 18px;border-radius:10px;background:var(--field);font-size:14px}.skill-overwrite{gap:8px;font-size:13.5px;margin-top:4px}.skill-overwrite .rcheck{margin:0}.rrow>.rgo{flex:none;color:var(--text3);margin-top:2px}.roster>.maddrow:not(:first-child){border-top:1px solid var(--line)}.rcheck{flex:none;width:15px;height:15px;margin:4px 0 0;accent-color:var(--accent)}.rrow.gone{opacity:.6}.rremove{flex:none;width:22px;height:22px;margin-top:2px;border-radius:6px;display:grid;place-items:center;color:var(--text3)}@media(hover:hover){.rremove:hover{color:var(--accent);background:var(--bg)}}.rmain{min-width:0;flex:1}.rname{font-size:14px;display:flex;align-items:center;gap:6px;flex-wrap:wrap}.rtags{display:inline-flex;gap:4px;flex-wrap:wrap}.rtag{font-size:11.5px;color:var(--text2);background:var(--bg);border-radius:6px;padding:1px 6px}.rtag.bad{color:var(--accent)}.rprov{display:block;font-size:12px;color:var(--text3);margin-top:2px}.rfoot{display:flex;gap:8px;align-items:center;margin-top:8px}.think-levels{margin-top:10px;background:var(--bg);border-radius:9px;padding:2px 10px 10px}.thinkhead{display:flex;align-items:center;gap:8px;width:100%;padding:8px 0 4px;text-align:left}.thinkhead .lbl{margin:0}.thinkhead .note{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.thinkrows{display:grid;gap:2px}.thinkrow{display:flex;align-items:center;gap:8px}.thinkrow .tname{flex:none;width:40px;font-size:12.5px;color:var(--text2)}.thinkrow .ttext{flex:1;min-width:0;background:var(--field);border-radius:8px;padding:6px 10px;font-size:13px}.thinkrow .rremove{margin-top:0}.thinkrow .rremove.still{cursor:default}.mcard{background:var(--field);border-radius:12px;padding:0 14px}.mcard>*+*{border-top:1px solid var(--line)}.mline{display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:46px;font-size:14px}.mline .k{flex:none}.mrow{display:flex;flex-direction:column;gap:3px;width:100%;padding:11px 0 10px;text-align:left}.mtop{display:flex;align-items:center;gap:8px;min-width:0}.mtop .sp{flex:1}.mtop>.i{flex:none;color:var(--text3)}.mname{min-width:0;font-size:14px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mrole{display:inline-block;margin-right:6px;padding:0 6px;border-radius:5px;background:var(--bg);font-size:11px;line-height:18px;vertical-align:1px;color:var(--text2)}.mbad{flex:none;font-size:12px;color:var(--accent)}.mprev{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font-size:13px;line-height:1.5;color:var(--text2)}.model-use-inline{padding:0 16px 16px 32px}.model-use-warning{color:var(--accent);font-size:12px;margin-left:8px}@media(max-width:600px){.model-use-inline{padding-left:16px}}.mrow.gone .mname,.mrow.gone .mprev{color:var(--text3)}.caps{flex:none;display:inline-flex;align-items:center;gap:7px;color:var(--text3)}.caps>span{display:inline-flex}.caps .ctx{font-size:11.5px;font-variant-numeric:tabular-nums}.maddrow{display:flex;align-items:center;gap:8px;width:100%;min-height:46px;font-size:14px}.maddrow .i{color:var(--text2)}.mline .vals{display:flex;align-items:center;justify-content:flex-end;gap:14px;min-width:0}.pbtn.danger{color:var(--accent)}.mline.danger{width:100%;justify-content:center;color:var(--accent)}.mline.danger:disabled{opacity:.4;cursor:default}.subback{display:inline-flex;align-items:center;gap:2px;margin:-6px 0 14px -6px;padding:4px 8px 4px 4px;border-radius:8px;font-size:13px;color:var(--text2)}@media(hover:hover){.subback:hover{background:var(--field)}}.setpage.narrow .subback{display:none}.kvrow .k.kicon{display:inline-flex;align-items:center;gap:6px}.kvrow .k.kicon .i{color:var(--text3)}.mfind{display:flex;align-items:center;gap:8px;height:44px;color:var(--text3)}.mfind input{flex:1;min-width:0;height:100%;border:0;background:transparent;color:var(--text);font-size:14px;outline:none}.mempty{padding:12px 0;font-size:13px;color:var(--text3)}.mgroup{display:flex;align-items:center;gap:8px;width:100%;min-height:44px;font-size:14px;text-align:left}.mgroup .n{flex:1;min-width:0}.mgroup .c{font-size:13px;color:var(--text3)}.mgroup .i{color:var(--text3)}.madd{display:flex;align-items:center;gap:10px;width:100%;padding:11px 0 11px 14px;text-align:left}.madd .mname{flex:1;font-weight:400}.madd .mtog{flex:none;color:var(--text3)}.madd.on .mtog{color:var(--accent)}.madd:disabled{cursor:default}.madd:disabled .mtog{opacity:.5}@media(hover:hover){.mgroup:hover .i,.madd:not(:disabled):hover .mtog{color:var(--text)}.madd.on:not(:disabled):hover .mtog{color:var(--accent)}}.pmctx{width:92px;height:26px;padding:0 8px;border-radius:7px;background:var(--bg);color:var(--text);font-size:12.5px}.testrow{display:flex;align-items:center;flex-wrap:wrap;gap:10px;margin-top:12px}.testout{display:flex;flex-direction:column;gap:8px;min-width:0}.chip.on{background:var(--user);color:var(--utext)}.login .card{animation:enter-rise var(--t-slow) var(--ease-in)}.login .field.shake{animation:shake var(--t-slow) var(--ease-out)}.b.jobcard .tt{display:grid;grid-template-columns:auto minmax(0,1fr);grid-template-areas:"av title" "av st";column-gap:12px;row-gap:2px;align-items:center}.b.jobcard .jav{grid-area:av;display:flex}.b.jobcard .jt{grid-area:title;line-height:1.45}.b.jobcard .tt .st{grid-area:st;margin-left:0;justify-self:start;font-size:12.5px}.b.jobcard{width:100%;padding:12px 14px;cursor:pointer;transition:transform var(--t-mid) var(--ease-in)}.b.jobcard:active{transform:scale(.99)}@media(hover:hover){.b.jobcard:hover{background:var(--field)}}.b.jobcard:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.meta.bad{color:var(--accent)}button.screen,.cap.jd-open{display:block;width:100%;text-align:left;cursor:pointer}.cap.jd-open{text-align:center}@media(hover:hover){.screen.jd-open:hover{background:#1b1b1e}}@media(hover:hover){.cap.jd-open:hover{color:var(--text2)}}.jd-allrow{display:flex;justify-content:center;margin:-14px 0 18px}.jd-all{display:inline-flex;align-items:center;gap:2px;font-size:12.5px;color:var(--text3)}@media(hover:hover){.jd-all:hover{color:var(--text)}}.expand{display:grid;grid-template-rows:0fr;opacity:0;transition:grid-template-rows var(--t-mid) var(--ease-out),opacity var(--t-mid) var(--ease-out)}.expand.open{grid-template-rows:1fr;opacity:1;transition-timing-function:var(--ease-in)}.expand>div{min-height:0;overflow:hidden}.jd-embedded{height:100%;animation:panel-in-right var(--t-fast) var(--ease-in)}.jd-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:30;display:flex;justify-content:flex-end}.jd{width:100%;height:100%;background:var(--bg);border-left:1px solid var(--line);display:flex;flex-direction:column}.jd-overlay .jd{width:min(560px,55vw);box-shadow:-18px 0 48px #0000001a;animation:drawer-in var(--t-slow) var(--ease-in)}.jd-overlay.leaving,.fpwrap.leaving{pointer-events:none;opacity:0;transition:opacity var(--t-mid) var(--ease-out)}.jd-overlay.leaving .jd,.fpwrap.leaving .fp{animation:drawer-out var(--t-mid) var(--ease-out) forwards}.jdhead{height:54px;flex:none;display:flex;align-items:center;gap:4px;padding:0 12px 0 10px;border-bottom:1px solid var(--line);color:var(--text2)}.jdhead .t{flex:1;text-align:center;font-size:14.5px;font-weight:500;color:var(--text)}.jdbody{flex:1;min-height:0;overflow-y:auto;padding:18px 24px 28px}.jd-title{font-size:19px;font-weight:600;line-height:1.4}.jd-meta{display:flex;flex-wrap:wrap;align-items:center;gap:4px 14px;font-size:13px;color:var(--text2);margin-top:7px}.jd-meta.dim{color:var(--text3);font-size:12.5px}.jd-owner{display:inline-flex;align-items:center;gap:5px}.jt-st{display:inline-flex;align-items:center;gap:4px;font-size:12.5px;color:var(--text2);white-space:nowrap}.jt-st .i{color:var(--text3)}.jt-st.live .i{color:var(--accent)}.jt-st.ok .i{color:var(--ok)}.jt-st.bad,.jt-st.bad .i{color:var(--accent)}.jd-reason{font-size:13.5px;color:var(--accent);margin-top:6px}.jd-instruction{font-size:14px;line-height:1.62;color:var(--text2);background:var(--bubble);border-radius:12px;padding:9px 12px;margin-top:12px;white-space:pre-wrap;overflow-wrap:anywhere}.jd-timeline{display:flex;flex-direction:column;gap:2px;margin-top:16px}.lbl+.jd-instruction,.lbl+.jd-timeline{margin-top:0}.jd-timeline>.jd-text,.jd-timeline>.jd-textrow{margin:6px 0}.jd-text{font-size:15px;line-height:1.62;overflow-wrap:anywhere}.jd-mine.queued{opacity:.75}.jd-mine-note{margin-top:2px;font-size:12px;color:var(--text2)}.jd-mine{align-self:flex-end;max-width:86%;background:var(--field);border-radius:12px;padding:6px 11px;font-size:14px;line-height:1.55;white-space:pre-wrap;overflow-wrap:anywhere}.jd-think>button,.jd-tool-head{display:flex;align-items:center;gap:9px;width:calc(100% + 16px);margin:0 -8px;padding:7px 8px;border-radius:8px;font-size:13.5px;line-height:1.4;color:var(--text2);text-align:left;transition:transform var(--t-mid) var(--ease-in)}.jd-think>button{color:var(--text3)}.jd-think-head{display:flex;align-items:center;gap:6px;font-size:12.5px;line-height:1.4;color:var(--text3);text-align:left}.jd-think-head .ico{display:grid;place-items:center;width:14px;flex:none}@media(hover:hover){.jd-think-head:hover{color:var(--text2)}}.jd-tool-head .blb{flex:none;display:grid;place-items:center;color:var(--text3)}.jd-think-body{font-size:13px;line-height:1.6;color:var(--text2);border-left:2px solid var(--line);padding:2px 0 2px 14px;margin:2px 0 6px 6px;white-space:pre-wrap;overflow-wrap:anywhere}.jd-textrow .jd-think-in{margin-bottom:4px}.jd-tool{border-radius:10px}@media(hover:hover){.jd-think>button:hover,.jd-tool-head:hover{background:var(--bubble)}}.jd-think .ico,.jd-tool .ico{display:grid;place-items:center;width:14px;color:var(--text3);flex:none}.jd-tool.bad .ico{color:var(--accent)}.jd-think .tt,.jd-tool-head .tt{display:block;flex:1;min-width:0;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.jd-tool-head .mono{font-size:12.5px}.jd-tool-head .tt>span+.mono{margin-left:3px}.jd-tool-head .tm{flex:none;font-size:12px;color:var(--text3)}.jd-tool.open .jd-tool-body{padding:2px 0 8px 23px;display:flex;flex-direction:column;gap:6px}.jd-arg,.jd-out{background:var(--field);border-radius:8px;padding:8px 10px;font-size:12.5px;line-height:1.6;overflow:auto;white-space:pre-wrap;overflow-wrap:anywhere}.jd-out{color:var(--text2)}.jd-kv{display:flex;gap:10px;font-size:12.5px;color:var(--text2)}.jd-kv.jd-path{align-self:flex-start;max-width:100%;text-decoration:underline;text-decoration-color:var(--text3);text-underline-offset:3px;overflow-wrap:anywhere}.jd-kv.jd-path:hover{color:var(--text)}.jd-kv-wrap{display:flex;align-items:baseline;gap:10px;font-size:12.5px;color:var(--text2)}.jd-kv-len{flex:none}.jd-diff{background:var(--field);border-radius:8px;padding:6px 0;overflow:hidden}.jd-diff .dl{display:flex;gap:5px;padding:0 10px;font-size:12.5px;line-height:1.55;white-space:pre-wrap;overflow-wrap:anywhere}.jd-diff .sg{flex:none;width:8px;color:var(--text3);font-family:JetBrains Mono,monospace}.jd-diff .del{background:#e5484d1f}.jd-diff .del .sg{color:#c33236}.jd-diff .add{background:#22a06524}.jd-diff .add .sg{color:var(--ok)}.jd-more{font-size:12.5px;color:var(--text2);padding:3px 0 0}@media(hover:hover){.jd-more:hover{color:var(--text)}}.jd-file{display:inline-flex;align-items:center;gap:5px;font-size:12.5px;color:var(--text2);text-decoration:underline;text-decoration-color:var(--text3);text-underline-offset:3px}.jd-report{font-size:14px;line-height:1.65;overflow-wrap:anywhere}.jd-report h1,.jd-report h2,.jd-report h3{font-size:14px;font-weight:600;margin:12px 0 4px}.jd-report p+p,.jd-report ul+p,.jd-report pre+p{margin-top:6px}.jd-report ul,.jd-report ol{padding-left:18px;margin-top:4px}.jd-report code{font-family:JetBrains Mono,monospace;font-size:12.5px;background:var(--field);border-radius:5px;padding:1px 5px}.jd-report pre{background:var(--field);border-radius:10px;padding:9px 11px;overflow-x:auto;margin-top:6px}.jd-report pre code{background:none;padding:0}.jd-report a{text-decoration:underline;text-decoration-color:var(--text3);text-underline-offset:3px}.jd-foot{flex:none;display:flex;align-items:center;gap:8px;padding:12px 24px 18px;border-top:1px solid var(--line)}.jd-foot input{flex:1;min-width:0;height:34px;border-radius:10px;background:var(--field);padding:0 12px;font-size:14px}.jd-filters{display:flex;align-items:center;gap:8px;margin-bottom:12px}.jd-filters .sp{flex:1}.jd-filters .pick{height:30px;font-size:13px}.jd-filters .dim{font-size:12.5px;color:var(--text3)}.jd-rows{display:grid;grid-template-columns:26px minmax(0,1fr) auto auto auto;column-gap:10px}.jd-row{grid-column:1 / -1;display:grid;grid-template-columns:subgrid;align-items:center;gap:10px;padding:9px 8px;border-radius:10px;border-top:1px solid var(--line);transition:transform var(--t-mid) var(--ease-in)}.jd-row:first-child{border-top:0}@media(hover:hover){.jd-row:hover{background:var(--bubble)}}.jd-row .n{font-size:14px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.jd-row .tm,.jd-row .du{font-size:12.5px;color:var(--text3);white-space:nowrap}.jd-row .du{min-width:52px;text-align:right}.jd-morebtn{margin-top:14px}.fpwrap{position:fixed;top:0;right:0;bottom:0;left:0;z-index:40;display:flex;justify-content:flex-end;background:transparent;animation:enter-fade var(--t-mid) var(--ease-in)}.fp{width:55%;min-width:520px;max-width:920px;height:100%;background:var(--bg);border-left:1px solid var(--line);box-shadow:-18px 0 48px #0000001a;display:flex;flex-direction:column;animation:drawer-in var(--t-slow) var(--ease-in)}.fp.full{width:100%;max-width:none}.fphead{height:54px;flex:none;display:flex;align-items:center;gap:2px;padding:0 10px;border-bottom:1px solid var(--line)}.fp-file-icon{flex:none;color:var(--text2);margin:0 8px}.fphead .fpt{flex:1;min-width:0}.fphead .n{font-size:14px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.fphead .m{font-size:12px;color:var(--text2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:1px}.fp-act{color:var(--text2)}.fp-body{flex:1;min-height:0;overflow-y:auto;padding:14px 18px 24px;display:flex;flex-direction:column;gap:10px}.fp-body.center,.fp-center{align-items:center;justify-content:center;flex:1}.fp-nofile{display:flex;flex-direction:column;align-items:center;gap:10px;color:var(--text2);font-size:13.5px;text-align:center;padding:28px 12px}.fp-note{flex:none;font-size:12.5px;color:var(--text2);background:var(--bubble);border-radius:8px;padding:6px 10px}.fp-img{display:flex;justify-content:center}.fp-img button{position:relative;max-width:100%}.fp-img-loading .fp-img-thumb{width:100vw}.fp-img img{display:block;max-width:100%;height:auto;border-radius:8px}.fp-frame{flex:1;width:100%;border:1px solid var(--line);border-radius:10px;background:var(--panel)}.fp-md.markdown-body{--fgColor-default: var(--text);--fgColor-muted: var(--text2);--fgColor-accent: var(--text);--bgColor-default: transparent;--bgColor-muted: var(--field);--bgColor-neutral-muted: var(--field);--borderColor-default: var(--line);--borderColor-muted: var(--line);--borderColor-neutral-muted: var(--line);color-scheme:inherit;font-family:inherit;font-size:15px;line-height:1.7;overflow-wrap:anywhere}.fp-md.markdown-body a{text-decoration-color:var(--text3)}.fp-md.markdown-body hr{height:1px}.fp-codebar{flex:none;display:flex;align-items:center;gap:10px;font-size:12.5px}.fp-codebar .pbtn{height:24px;padding:0 10px;font-size:12px}.fp-code{flex:none;font-size:12.5px;line-height:1.6;background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:8px 0;overflow-x:auto}.fp-code .cl{display:flex;align-items:flex-start}.fp-code .ln{flex:none;width:44px;text-align:right;padding-right:10px;color:var(--text3);-webkit-user-select:none;user-select:none;font-variant-numeric:tabular-nums}.fp-code .ct{white-space:pre;min-width:0;padding-right:12px}.fp-code.wrap .ct{white-space:pre-wrap;overflow-wrap:break-word}.fp-table-wrap{flex:none;min-width:0;overflow:auto;border:1px solid var(--line);border-radius:10px;max-height:100%}.fp-table{width:100%;border-collapse:collapse;font-size:12.5px;white-space:nowrap}.fp-table th,.fp-table td{border-bottom:1px solid var(--line);padding:5px 12px;text-align:left}.fp-table th{position:sticky;top:0;background:var(--panel);color:var(--text2);font-weight:500}.fp-table td{font-family:JetBrains Mono,Noto Sans Mono CJK SC,monospace}.fp-table .numeric{text-align:right}@media(max-width:767px){.jd-overlay{background:var(--bg)}.jd-overlay .jd{width:100%;min-width:0;max-width:none;border-left:0;box-shadow:none;animation:sheet-up var(--t-slow) var(--ease-in)}.jdbody{padding:14px 16px 26px}.jdhead{height:auto;min-height:calc(54px + env(safe-area-inset-top,0px));padding-top:env(safe-area-inset-top,0px)}.jdhead .t{text-align:left;font-size:15px;font-weight:600}.fpwrap{background:var(--bg)}.fp{width:100%;min-width:0;max-width:none;border-left:0;box-shadow:none;animation:sheet-up var(--t-slow) var(--ease-in)}.jd-overlay.leaving .jd,.fpwrap.leaving .fp{animation:sheet-out var(--t-mid) var(--ease-out) forwards}.fp-wide-btn{display:none}.fphead{height:auto;min-height:calc(54px + env(safe-area-inset-top,0px));padding-top:env(safe-area-inset-top,0px)}.fp-body{padding:12px 14px 22px}.jd-foot{padding:10px 14px calc(16px + env(safe-area-inset-bottom,0px))}.jd-rows{grid-template-columns:26px minmax(0,1fr) auto}.jd-row{row-gap:2px}.jd-row .tm,.jd-row .du{grid-column:2 / 4}.setmain .pbtn{height:36px;padding:0 14px;border-radius:10px}}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation:none!important;transition-property:opacity!important;transition-duration:var(--t-fast)!important;transition-timing-function:linear!important;transition-delay:0s!important}button:not(:disabled):active,.b.jobcard:active,.message-popup-bubble{transform:none}.upd:not(:disabled):active{transform:translate(-50%)}.mpane.chat:not(.out),.setpage:not(.leaving),.mfull:not(.leaving),.jd-overlay:not(.leaving) .jd,.jd-embedded,.fpwrap:not(.leaving) .fp,.tools.menu,.amenu,.tzlist,.toast,.hov.enter,.hov.enter-right,.b.enter,.att.enter,.imgcard.enter{animation:enter-fade var(--t-fast) linear!important}.spin{animation:spin 1.1s linear infinite!important}}.delegation-card .delegation-text{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;color:var(--text2);margin-top:10px;line-height:1.55;overflow-wrap:anywhere;width:100%}.delegation-card .delegation-text.expanded{display:block;white-space:pre-wrap}.delegation-card .delegation-job{display:flex;align-items:center;gap:8px;width:100%;margin-top:10px;padding:9px 12px;border-radius:10px;background:var(--card);color:var(--text);font-size:13.5px;text-align:left}.delegation-card .delegation-job>span{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.delegation-card .delegation-job>svg{flex:none;color:var(--text3)}.delegation-card .delegation-job.running>svg:first-child{color:var(--accent)}.delegation-card .delegation-job.done>svg:first-child{color:var(--ok)}.delegation-card .delegation-job.waiting>svg:first-child{color:var(--accent)}.delegation-card .delegation-job:is(.stuck,.failed)>svg:first-child{color:var(--danger)}.delegation-card .b.q{width:100%;margin-top:10px;padding:12px;background:var(--card)}.delegation-actions{display:flex;flex-wrap:wrap;gap:16px;margin-top:12px;color:var(--accent);font-size:13px}.delegation-card .st.bad{color:var(--danger)}.forward-label{display:flex;align-items:center;gap:5px;color:var(--accent);font-size:12px;font-weight:600;margin-bottom:5px}.delegation-panel{display:flex;align-items:center;gap:6px;width:100%;padding:10px 4px;color:var(--text2);font-size:13px;border-bottom:1px solid var(--line)}.side-scroll,.msgs,.comp .ta,.panel,.mlist,.mmsgs,.mfull,.setmain,.tzlist,.jdbody{overscroll-behavior:contain}.msgs,.mmsgs{overflow-x:hidden}
|