castle-web-cli 0.4.185 → 0.4.187
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent.js +66 -13
- package/dist/metering.d.ts +10 -3
- package/dist/metering.js +54 -5
- package/dist/shell/assets/index-CMoHf5L9.css +1 -0
- package/dist/shell/assets/{index-BMu42DTS.js → index-DS9bSm5p.js} +1 -1
- package/dist/shell/index.html +2 -2
- package/package.json +1 -1
- package/dist/shell/assets/index-BHWfx7Tz.css +0 -1
package/dist/agent.js
CHANGED
|
@@ -31,7 +31,7 @@ import { applyPlanOps, buildRouterPromptParts, buildTaskPrompt, parsePlanOps, pl
|
|
|
31
31
|
import { readCastleJson } from './castleJson.js';
|
|
32
32
|
import { checkOpenrouterKey, checkOpenrouterModel, primeOpenrouterCatalog, } from './openrouter-catalog.js';
|
|
33
33
|
import { classifyProviderError, failureCopy, setReaderTimeZone, } from './agent-failures.js';
|
|
34
|
-
import { castleCreditsExhausted, createRefreshQueue, fetchAiCredits, fetchBudget, freeRolesFor, freeTierForRoles, meteringHeaders, modelIsFree, newAgentSessionId, spendableMicros, withCustomHeaders, } from './metering.js';
|
|
34
|
+
import { castleCreditsExhausted, createBudgetRefreshRetry, createRefreshQueue, fetchAiCredits, fetchBudget, freeRolesFor, freeTierForRoles, meteringHeaders, modelIsFree, newAgentSessionId, spendableMicros, withCustomHeaders, } from './metering.js';
|
|
35
35
|
import { anthropicKeyHelperCommand, resolveAnthropicAuth, userKey, ANTHROPIC_CREDENTIAL_ENV, ANTHROPIC_PROXY_ENV, CASTLE_USER_KEYS_PATH, } from './byo-auth.js';
|
|
36
36
|
import { accountsSnapshot, loginProviderFor, watchCredentials, writeCredential, } from './byo-accounts.js';
|
|
37
37
|
import { cancelLogin, logout, startLogin, submitLoginCode } from './byo-login.js';
|
|
@@ -1536,18 +1536,26 @@ function usageFrame(budget, credits, settings) {
|
|
|
1536
1536
|
function createUsageFeed(opts) {
|
|
1537
1537
|
let latest = null;
|
|
1538
1538
|
let credits = null;
|
|
1539
|
+
let budget = null;
|
|
1539
1540
|
let budgetPolls = 0;
|
|
1540
|
-
|
|
1541
|
+
let stopped = false;
|
|
1542
|
+
async function readUsage(refreshCredits = false, allowFollowUp = true) {
|
|
1541
1543
|
const settings = opts.settings();
|
|
1544
|
+
// Cached credits and budget survive a spell on the user's own keys: when a
|
|
1545
|
+
// role comes back to Castle's, recompute() can publish a credits-plan frame
|
|
1546
|
+
// at once instead of the legacy daily meter, and the refresh reconciles.
|
|
1542
1547
|
if (!anyRoleIsCastlePaid(settings)) {
|
|
1543
|
-
|
|
1544
|
-
return null;
|
|
1548
|
+
return { usage: null, refreshAfterMs: null, allowFollowUp };
|
|
1545
1549
|
}
|
|
1546
1550
|
// Budget is the authoritative spendable amount and its read can force a
|
|
1547
1551
|
// stale proxy gate to sync after a purchase. Read credits second so the
|
|
1548
1552
|
// descriptive fields (plan, rate, reload state) describe that same or a
|
|
1549
1553
|
// newer account snapshot instead of racing ahead of the gate refresh.
|
|
1550
|
-
|
|
1554
|
+
// Only a full credit-state refresh asks the host to sync its held budget. Cheap polls and
|
|
1555
|
+
// spend preflight stay local to the proxy, so control-plane health cannot delay a run.
|
|
1556
|
+
const nextBudget = await fetchBudget(refreshCredits);
|
|
1557
|
+
if (nextBudget)
|
|
1558
|
+
budget = nextBudget;
|
|
1551
1559
|
if (refreshCredits) {
|
|
1552
1560
|
const nextCredits = await fetchAiCredits();
|
|
1553
1561
|
// Once the richer field has loaded, a transient GraphQL failure should
|
|
@@ -1555,7 +1563,11 @@ function createUsageFeed(opts) {
|
|
|
1555
1563
|
if (nextCredits)
|
|
1556
1564
|
credits = nextCredits;
|
|
1557
1565
|
}
|
|
1558
|
-
return
|
|
1566
|
+
return {
|
|
1567
|
+
usage: usageFrame(nextBudget, credits, settings),
|
|
1568
|
+
refreshAfterMs: nextBudget?.refreshAfterMs ?? null,
|
|
1569
|
+
allowFollowUp,
|
|
1570
|
+
};
|
|
1559
1571
|
}
|
|
1560
1572
|
function publishUsage(next) {
|
|
1561
1573
|
if (JSON.stringify(next ?? null) === JSON.stringify(latest ?? null))
|
|
@@ -1563,11 +1575,39 @@ function createUsageFeed(opts) {
|
|
|
1563
1575
|
latest = next;
|
|
1564
1576
|
opts.broadcast({ type: 'usage', usage: next });
|
|
1565
1577
|
}
|
|
1578
|
+
function publishRead(read) {
|
|
1579
|
+
if (stopped)
|
|
1580
|
+
return;
|
|
1581
|
+
publishUsage(read.usage);
|
|
1582
|
+
if (!read.allowFollowUp || read.refreshAfterMs === null)
|
|
1583
|
+
return;
|
|
1584
|
+
budgetRetry.schedule(read.refreshAfterMs);
|
|
1585
|
+
}
|
|
1586
|
+
function recompute() {
|
|
1587
|
+
if (stopped)
|
|
1588
|
+
return;
|
|
1589
|
+
const settings = opts.settings();
|
|
1590
|
+
if (!anyRoleIsCastlePaid(settings)) {
|
|
1591
|
+
publishUsage(null);
|
|
1592
|
+
return;
|
|
1593
|
+
}
|
|
1594
|
+
if (!budget)
|
|
1595
|
+
return;
|
|
1596
|
+
// Settings-dependent fields must not wait on the network: the client
|
|
1597
|
+
// renders both the picker and the credits guard from them, and a settings
|
|
1598
|
+
// frame is about to follow this usage frame.
|
|
1599
|
+
publishUsage(usageFrame(budget, credits, settings));
|
|
1600
|
+
}
|
|
1566
1601
|
// Focus, host relay, popover-open and run-finished can all arrive together.
|
|
1567
|
-
const refreshQueue = createRefreshQueue({ read: readUsage, publish:
|
|
1568
|
-
const
|
|
1569
|
-
|
|
1570
|
-
|
|
1602
|
+
const refreshQueue = createRefreshQueue({ read: readUsage, publish: publishRead });
|
|
1603
|
+
const budgetRetry = createBudgetRefreshRetry(() => requestRefresh(true, false, false));
|
|
1604
|
+
function requestRefresh(withCredits, allowFollowUp = withCredits, supersedeRetry = allowFollowUp) {
|
|
1605
|
+
if (stopped)
|
|
1606
|
+
return;
|
|
1607
|
+
if (supersedeRetry)
|
|
1608
|
+
budgetRetry.cancel();
|
|
1609
|
+
void refreshQueue.request(withCredits, allowFollowUp);
|
|
1610
|
+
}
|
|
1571
1611
|
const refresh = () => requestRefresh(true);
|
|
1572
1612
|
const stopRunWatch = onAgentRunFinished(refresh);
|
|
1573
1613
|
const timer = setInterval(() => {
|
|
@@ -1580,10 +1620,13 @@ function createUsageFeed(opts) {
|
|
|
1580
1620
|
refresh();
|
|
1581
1621
|
return {
|
|
1582
1622
|
latest: () => latest,
|
|
1623
|
+
recompute,
|
|
1583
1624
|
refresh,
|
|
1584
1625
|
stop: () => {
|
|
1626
|
+
stopped = true;
|
|
1585
1627
|
stopRunWatch();
|
|
1586
1628
|
clearInterval(timer);
|
|
1629
|
+
budgetRetry.dispose();
|
|
1587
1630
|
},
|
|
1588
1631
|
};
|
|
1589
1632
|
}
|
|
@@ -3058,6 +3101,11 @@ function applyAgentSettings(incoming, ctx) {
|
|
|
3058
3101
|
if (changes.length === 0)
|
|
3059
3102
|
return;
|
|
3060
3103
|
atomicWriteFileSync(ctx.settingsPath, serializeAgentSettings(settings));
|
|
3104
|
+
// Publish recomputed usage first. Muse -> OpenRouter stays Muse while the old
|
|
3105
|
+
// slug still equals the free model, then the settings frame flips it;
|
|
3106
|
+
// OpenRouter -> Muse flips at once through freeRoles, and settings agrees.
|
|
3107
|
+
// Settings first would show a stale free verdict until the network answers.
|
|
3108
|
+
ctx.onChanged?.();
|
|
3061
3109
|
// The value is saved and broadcast IMMEDIATELY -- validation never gates a
|
|
3062
3110
|
// write. The verdict follows in a second frame once the catalog answers.
|
|
3063
3111
|
ctx.broadcast({ type: 'settings', settings });
|
|
@@ -3687,9 +3735,14 @@ export function createAgentServer(opts) {
|
|
|
3687
3735
|
},
|
|
3688
3736
|
});
|
|
3689
3737
|
const applySettings = (incoming) => {
|
|
3690
|
-
applyAgentSettings(incoming, {
|
|
3691
|
-
|
|
3692
|
-
|
|
3738
|
+
applyAgentSettings(incoming, {
|
|
3739
|
+
settings,
|
|
3740
|
+
settingsPath,
|
|
3741
|
+
broadcast,
|
|
3742
|
+
onChanged: () => usageFeed.recompute(),
|
|
3743
|
+
});
|
|
3744
|
+
// The synchronous recompute makes settings-derived fields immediate; the
|
|
3745
|
+
// network read still reconciles the balance and dedups an unchanged frame.
|
|
3693
3746
|
usageFeed.refresh();
|
|
3694
3747
|
};
|
|
3695
3748
|
const taskFeeds = createTaskFeeds(broadcast, tasksDir);
|
package/dist/metering.d.ts
CHANGED
|
@@ -20,6 +20,7 @@ export interface CastleBudget {
|
|
|
20
20
|
limitMicros: number | null;
|
|
21
21
|
resetAtMs: number;
|
|
22
22
|
blocked: boolean;
|
|
23
|
+
refreshAfterMs?: number;
|
|
23
24
|
blockedModelPrefixes: string[];
|
|
24
25
|
freeModelPrefixes: string[];
|
|
25
26
|
}
|
|
@@ -84,10 +85,16 @@ export declare function freeRolesFor(spends: readonly RoleSpend[], prefixes: rea
|
|
|
84
85
|
* calls: a cheap poll cannot downgrade a pending user-requested full refresh.
|
|
85
86
|
*/
|
|
86
87
|
export declare function createRefreshQueue<T>(opts: {
|
|
87
|
-
read: (withFullState: boolean) => Promise<T>;
|
|
88
|
+
read: (withFullState: boolean, allowFollowUp: boolean) => Promise<T>;
|
|
88
89
|
publish: (value: T) => void;
|
|
89
90
|
}): {
|
|
90
|
-
request: (withFullState: boolean) => Promise<void>;
|
|
91
|
+
request: (withFullState: boolean, allowFollowUp?: boolean) => Promise<void>;
|
|
92
|
+
};
|
|
93
|
+
export declare function budgetRefreshDelay(value: unknown): number | null;
|
|
94
|
+
export declare function createBudgetRefreshRetry(run: () => void): {
|
|
95
|
+
schedule: (afterMs: unknown) => void;
|
|
96
|
+
cancel: () => void;
|
|
97
|
+
dispose: () => void;
|
|
91
98
|
};
|
|
92
99
|
export declare function castleCreditsExhausted(budget: CastleBudget, credits: AiCredits | null): boolean;
|
|
93
100
|
/** Rich credit state, or null when ghost/proxy cannot provide the new field. */
|
|
@@ -102,7 +109,7 @@ export declare function fetchAiCredits(): Promise<AiCredits | null>;
|
|
|
102
109
|
* sentence instead of a spawned agent failing against a 403, and so the editor
|
|
103
110
|
* can show the bar. Neither is worth failing a run over.
|
|
104
111
|
*/
|
|
105
|
-
export declare function fetchBudget(): Promise<CastleBudget | null>;
|
|
112
|
+
export declare function fetchBudget(forceRefresh?: boolean): Promise<CastleBudget | null>;
|
|
106
113
|
export declare function meteringHeaders(opts: {
|
|
107
114
|
deckDir: string;
|
|
108
115
|
sessionId: string;
|
package/dist/metering.js
CHANGED
|
@@ -63,6 +63,7 @@ const CASTLE_BUDGET_PATH = "/castle/budget";
|
|
|
63
63
|
const CASTLE_API_PATH = "/castle/api/graphql";
|
|
64
64
|
// Read before a run starts, so it must not be able to hold one up for long.
|
|
65
65
|
const BUDGET_FETCH_TIMEOUT_MS = 5_000;
|
|
66
|
+
const MAX_BUDGET_REFRESH_AFTER_MS = 5_000;
|
|
66
67
|
export function spendableMicros(budget) {
|
|
67
68
|
if (budget.limitMicros === null)
|
|
68
69
|
return null;
|
|
@@ -130,23 +131,34 @@ export function freeRolesFor(spends, prefixes) {
|
|
|
130
131
|
export function createRefreshQueue(opts) {
|
|
131
132
|
let queued = false;
|
|
132
133
|
let queuedFullState = false;
|
|
134
|
+
let queuedFollowUp = false;
|
|
133
135
|
let active = null;
|
|
134
|
-
const request = (withFullState) => {
|
|
136
|
+
const request = (withFullState, allowFollowUp = true) => {
|
|
135
137
|
queued = true;
|
|
136
138
|
queuedFullState ||= withFullState;
|
|
139
|
+
queuedFollowUp ||= allowFollowUp;
|
|
137
140
|
if (active)
|
|
138
141
|
return active;
|
|
139
142
|
active = (async () => {
|
|
140
143
|
while (queued) {
|
|
141
144
|
const fullState = queuedFullState;
|
|
145
|
+
const followUp = queuedFollowUp;
|
|
142
146
|
queued = false;
|
|
143
147
|
queuedFullState = false;
|
|
144
|
-
|
|
148
|
+
queuedFollowUp = false;
|
|
149
|
+
const value = await opts.read(fullState, followUp);
|
|
145
150
|
// If another trigger arrived while this read was in flight, its result
|
|
146
151
|
// is already the one the caller wants. Skip the older intermediate
|
|
147
152
|
// frame instead of flashing it before the trailing refresh completes.
|
|
148
|
-
|
|
153
|
+
// Preserve its stronger intent, though: a cheap poll queued behind a
|
|
154
|
+
// full read must not swallow that read's retry hint.
|
|
155
|
+
if (queued) {
|
|
156
|
+
queuedFullState ||= fullState;
|
|
157
|
+
queuedFollowUp ||= followUp;
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
149
160
|
opts.publish(value);
|
|
161
|
+
}
|
|
150
162
|
}
|
|
151
163
|
})().finally(() => {
|
|
152
164
|
active = null;
|
|
@@ -155,6 +167,40 @@ export function createRefreshQueue(opts) {
|
|
|
155
167
|
};
|
|
156
168
|
return { request };
|
|
157
169
|
}
|
|
170
|
+
export function budgetRefreshDelay(value) {
|
|
171
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value <= 0)
|
|
172
|
+
return null;
|
|
173
|
+
return Math.min(MAX_BUDGET_REFRESH_AFTER_MS, Math.ceil(value));
|
|
174
|
+
}
|
|
175
|
+
export function createBudgetRefreshRetry(run) {
|
|
176
|
+
let timer = null;
|
|
177
|
+
let disposed = false;
|
|
178
|
+
const cancel = () => {
|
|
179
|
+
if (timer)
|
|
180
|
+
clearTimeout(timer);
|
|
181
|
+
timer = null;
|
|
182
|
+
};
|
|
183
|
+
return {
|
|
184
|
+
schedule: (afterMs) => {
|
|
185
|
+
if (disposed)
|
|
186
|
+
return;
|
|
187
|
+
const delay = budgetRefreshDelay(afterMs);
|
|
188
|
+
cancel();
|
|
189
|
+
if (delay === null)
|
|
190
|
+
return;
|
|
191
|
+
timer = setTimeout(() => {
|
|
192
|
+
timer = null;
|
|
193
|
+
run();
|
|
194
|
+
}, delay + 50);
|
|
195
|
+
timer.unref?.();
|
|
196
|
+
},
|
|
197
|
+
cancel,
|
|
198
|
+
dispose: () => {
|
|
199
|
+
disposed = true;
|
|
200
|
+
cancel();
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
}
|
|
158
204
|
const EXHAUSTED_BALANCE_CREDITS = 50;
|
|
159
205
|
export function castleCreditsExhausted(budget, credits) {
|
|
160
206
|
if (!budget.blocked || credits?.plan !== "credits")
|
|
@@ -246,13 +292,14 @@ export async function fetchAiCredits() {
|
|
|
246
292
|
* sentence instead of a spawned agent failing against a 403, and so the editor
|
|
247
293
|
* can show the bar. Neither is worth failing a run over.
|
|
248
294
|
*/
|
|
249
|
-
export async function fetchBudget() {
|
|
295
|
+
export async function fetchBudget(forceRefresh = false) {
|
|
250
296
|
const base = process.env.CASTLE_LLM_PROXY_URL;
|
|
251
297
|
const token = process.env.CASTLE_LLM_PROXY_TOKEN;
|
|
252
298
|
if (!base || !token)
|
|
253
299
|
return null;
|
|
254
300
|
try {
|
|
255
|
-
const
|
|
301
|
+
const suffix = forceRefresh ? '?refresh=1' : '';
|
|
302
|
+
const resp = await fetch(`${base}${CASTLE_BUDGET_PATH}${suffix}`, {
|
|
256
303
|
headers: { authorization: `Bearer ${token}` },
|
|
257
304
|
signal: AbortSignal.timeout(BUDGET_FETCH_TIMEOUT_MS),
|
|
258
305
|
});
|
|
@@ -262,11 +309,13 @@ export async function fetchBudget() {
|
|
|
262
309
|
if (typeof body?.usedMicros !== "number" || typeof body.blocked !== "boolean") {
|
|
263
310
|
return null;
|
|
264
311
|
}
|
|
312
|
+
const refreshAfterMs = budgetRefreshDelay(body.refreshAfterMs);
|
|
265
313
|
return {
|
|
266
314
|
usedMicros: body.usedMicros,
|
|
267
315
|
limitMicros: typeof body.limitMicros === "number" ? body.limitMicros : null,
|
|
268
316
|
resetAtMs: typeof body.resetAtMs === "number" ? body.resetAtMs : 0,
|
|
269
317
|
blocked: body.blocked,
|
|
318
|
+
...(refreshAfterMs !== null ? { refreshAfterMs } : {}),
|
|
270
319
|
blockedModelPrefixes: Array.isArray(body.blockedModelPrefixes)
|
|
271
320
|
? body.blockedModelPrefixes.filter((p) => typeof p === "string")
|
|
272
321
|
: [],
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{--castle-font-body:baltomobile, Balto, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--castle-font-display:Basteleur, Georgia, "Times New Roman", serif;--castle-font-mono:ui-monospace, SFMono-Regular, Menlo, monospace;--castle-text-size-small:11px;--castle-text-size-base:13px;--castle-text-size-large:15px;--castle-text-style-smallcaps-size:var(--castle-text-size-small);--castle-text-style-smallcaps-letter-spacing:.05em;--castle-text-style-smallcaps-transform:uppercase;--castle-text-primary:#e6e6e6;--castle-text-secondary:#b3b3b3;--castle-text-muted:#888;--castle-text-dim:#525252;--castle-text-dark:#111;--castle-surface-1:#000;--castle-surface-2:#0c0c0c;--castle-surface-3:#181818;--castle-surface-4:#242424;--castle-surface-5:#303030;--castle-surface-6:#3c3c3c;--castle-surface-light:#e6e6e6;--castle-border-1:#2a2a2a;--castle-border-2:#6a6a6a;--castle-border-3:#3a3a3a;--castle-border-4:#e6e6e6;--castle-accent:#793a80;--castle-danger-text:#e86a73;--castle-danger-surface:#73172d;--castle-danger-surface-hover:#b4202a;--castle-warn-text:#e8b25a;--castle-warn-surface:#5a3d0a;--castle-space-small:3px;--castle-space-base:6px;--castle-space-large:12px;--castle-radius-small:4px;--castle-radius-base:8px;--castle-radius-large:16px;--castle-radius-pill:999px;--castle-button-height:24px;--castle-button-icon-size:16px;--castle-button-height-large:36px;--castle-button-icon-size-large:24px;--castle-icon-size-inline:12px;--castle-panel-header-height:36px;--castle-panel-header-height-mobile:48px}.text-style-smallcaps{font-size:var(--castle-text-style-smallcaps-size);letter-spacing:var(--castle-text-style-smallcaps-letter-spacing);text-transform:var(--castle-text-style-smallcaps-transform)}.icon-inline{flex:0 0 var(--castle-icon-size-inline);width:var(--castle-icon-size-inline);height:var(--castle-icon-size-inline);font-size:var(--castle-icon-size-inline)}.icon-slot{flex:0 0 var(--castle-button-icon-size);width:var(--castle-button-icon-size);height:var(--castle-button-icon-size);justify-content:center;align-items:center;display:flex}.icon-cell{flex:0 0 var(--castle-button-height);width:var(--castle-button-height);height:var(--castle-button-height);color:var(--castle-text-dim);pointer-events:none;justify-content:center;align-items:center;display:inline-flex}.icon-slot svg,.icon-slot iconify-icon,.icon-cell svg,.icon-cell iconify-icon{flex:0 0 var(--castle-button-icon-size);width:var(--castle-button-icon-size);height:var(--castle-button-icon-size);font-size:var(--castle-button-icon-size)}.button{justify-content:center;align-items:center;gap:var(--castle-space-base);max-width:100%;height:var(--castle-button-height);padding:0 var(--castle-space-base);border-radius:var(--castle-radius-small);background:var(--castle-surface-4);color:var(--castle-text-primary);font-family:var(--castle-font-body);font-size:var(--castle-text-size-base);white-space:nowrap;cursor:pointer;border:0;line-height:1.3;display:inline-flex}.button:not(.button-icon){min-width:0}.button>span{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.button:hover,.button.is-hover{background:var(--castle-surface-5)}.button:active,.button.is-pressed{background:var(--castle-surface-3)}.button:focus-visible,.button.is-focus{outline:1px solid var(--castle-border-2);outline-offset:2px}.button[aria-pressed=true],.button[aria-pressed=true]:hover,.button[aria-pressed=true]:active{background:var(--castle-surface-light);color:var(--castle-text-dark)}.button:disabled{opacity:.4;cursor:default}.button-icon{width:var(--castle-button-height);padding:0}.button-icon-large{width:var(--castle-button-height-large);height:var(--castle-button-height-large)}.button-danger{background:var(--castle-danger-surface);color:var(--castle-text-primary)}.button-danger:hover,.button-danger.is-hover{background:var(--castle-danger-surface-hover)}.button-danger:active,.button-danger.is-pressed{background:var(--castle-danger-surface)}.button-quiet{color:var(--castle-text-dim);background:0 0}.button-quiet:hover,.button-quiet.is-hover{background:var(--castle-surface-5);color:var(--castle-text-primary)}.button-quiet:active,.button-quiet.is-pressed{background:var(--castle-surface-3)}.button-quiet[aria-pressed=true],.button-quiet[aria-pressed=true]:hover,.button-quiet[aria-pressed=true]:active{background:var(--castle-surface-5);color:var(--castle-text-primary)}.composer-action{border-radius:var(--castle-radius-pill);color:var(--castle-text-muted);box-shadow:inset 0 0 0 1px var(--castle-border-2);background:0 0}.composer-action:disabled{opacity:1;color:var(--castle-text-muted);box-shadow:inset 0 0 0 1px var(--castle-border-1);background:0 0}.composer-action:not(:disabled),.composer-action:not(:disabled):hover,.composer-action:not(:disabled):active,.composer-action:not(:disabled).is-hover,.composer-action:not(:disabled).is-pressed{background:var(--castle-surface-light);color:var(--castle-text-dark);box-shadow:none}.button svg,.button iconify-icon{width:var(--castle-button-icon-size);height:var(--castle-button-icon-size);font-size:var(--castle-button-icon-size)}.button-icon-large svg,.button-icon-large iconify-icon{width:var(--castle-button-icon-size-large);height:var(--castle-button-icon-size-large);font-size:var(--castle-button-icon-size-large)}.button-badge{min-width:16px;height:16px;padding:0 var(--castle-space-small);border-radius:var(--castle-radius-pill);background:var(--castle-surface-5);color:var(--castle-text-secondary);font-size:var(--castle-text-size-small);font-variant-numeric:tabular-nums;text-align:center;text-overflow:clip;flex:none;line-height:16px;overflow:hidden}.button>.button-badge{text-overflow:clip;min-width:16px;overflow:hidden}.text-field{min-width:0;height:var(--castle-button-height);padding:0 var(--castle-space-base);border:1px solid var(--castle-border-3);border-radius:var(--castle-radius-small);background:var(--castle-surface-3);color:var(--castle-text-primary);font-family:var(--castle-font-body);font-size:var(--castle-text-size-base);cursor:text;outline:0}.text-field::placeholder{color:var(--castle-text-muted)}.text-field:hover,.text-field.is-hover{background:var(--castle-surface-4)}.text-field:focus,.text-field:focus-visible,.text-field.is-focus{outline:1px solid var(--castle-border-2);outline-offset:2px}.text-field:disabled{opacity:.4;cursor:default}.select{min-width:0;height:var(--castle-button-height);padding:0 var(--castle-space-base);border:1px solid var(--castle-border-3);border-radius:var(--castle-radius-small);background:var(--castle-surface-3);color:var(--castle-text-primary);font-family:var(--castle-font-body);font-size:var(--castle-text-size-base);cursor:pointer;outline:0}.select:hover,.select.is-hover{background:var(--castle-surface-4)}.select:focus,.select:focus-visible,.select.is-focus{outline:1px solid var(--castle-border-2);outline-offset:2px}.select:disabled{opacity:.4;cursor:default}.dock-control{justify-content:center;align-items:center;gap:var(--castle-space-base);max-width:100%;height:var(--castle-panel-header-height);padding:0 var(--castle-space-large);border:1px solid var(--castle-border-1);border-radius:var(--castle-radius-base);background:var(--castle-surface-3);color:var(--castle-text-primary);font-family:var(--castle-font-body);font-size:var(--castle-text-size-base);white-space:nowrap;cursor:pointer;font-weight:600;line-height:1;display:inline-flex}.dock-control:not(.dock-control-icon){min-width:0}.dock-control>span{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.dock-control-icon{width:var(--castle-panel-header-height);padding:0}.dock-control-quiet{background:0 0;border-color:#0000;justify-content:flex-start;min-width:0}.dock-control-mark{background:var(--castle-surface-1)}.dock-control-group{cursor:default;box-shadow:inset 0 0 0 1px var(--castle-border-1);border:none;justify-content:flex-start;align-items:stretch;gap:0;padding:0;overflow:hidden}button.dock-control:hover,button.dock-control.is-hover{background:var(--castle-surface-4);border-color:var(--castle-border-3)}button.dock-control:active,button.dock-control.is-pressed{background:var(--castle-surface-2)}button.dock-control-quiet:active,button.dock-control-quiet.is-pressed{background:var(--castle-surface-3)}button.dock-control:focus-visible,button.dock-control.is-focus{outline:1px solid var(--castle-border-2);outline-offset:2px}.dock-control:disabled{opacity:.4;cursor:default}button.dock-control:disabled:hover,button.dock-control:disabled.is-hover{background:var(--castle-surface-3);border-color:var(--castle-border-1)}button.dock-control-quiet:disabled:hover,button.dock-control-quiet:disabled.is-hover{background:0 0;border-color:#0000}button.dock-control-mark:disabled:hover,button.dock-control-mark:disabled.is-hover{background:var(--castle-surface-1)}.dock-control svg,.dock-control iconify-icon{width:var(--castle-button-icon-size);height:var(--castle-button-icon-size);font-size:var(--castle-button-icon-size);flex-shrink:0}.dock-control-mark svg,.dock-control-mark img{width:20px;height:20px}.dock-control-mark img{object-fit:contain;display:block}.dock-segment{flex:0 0 var(--castle-panel-header-height);width:var(--castle-panel-header-height);height:var(--castle-panel-header-height);color:var(--castle-text-muted);cursor:pointer;background:0 0;border:none;border-radius:0;justify-content:center;align-items:center;padding:0;display:inline-flex}.dock-segment iconify-icon,.dock-segment svg{width:var(--castle-button-icon-size);height:var(--castle-button-icon-size);font-size:var(--castle-button-icon-size)}@media (hover:hover){.dock-segment:hover:not(.is-active){color:var(--castle-text-primary);background:var(--castle-surface-5)}}.dock-segment.is-hover:not(.is-active){color:var(--castle-text-primary);background:var(--castle-surface-5)}.dock-segment.is-active{color:var(--castle-text-dark);background:var(--castle-surface-light)}.dock-segment.is-drag-origin{opacity:0;pointer-events:none;flex:0 0 0;width:0;min-width:0;max-width:0;padding:0;overflow:hidden}.dock-segment-slot{flex:0 0 var(--castle-panel-header-height);width:var(--castle-panel-header-height);height:var(--castle-panel-header-height);color:var(--castle-text-primary);background:var(--castle-surface-6);pointer-events:none;justify-content:center;align-items:center;display:inline-flex}.dock-segment-slot iconify-icon,.dock-segment-slot svg{width:var(--castle-button-icon-size);height:var(--castle-button-icon-size);font-size:var(--castle-button-icon-size)}.dock-segment-ghost{border-radius:var(--castle-radius-small);pointer-events:none;box-shadow:0 8px 24px #00000073}.dock-segment:has(.dock-badge){position:relative}.dock-segment .dock-badge{top:var(--castle-space-small);right:var(--castle-space-small);z-index:1;background:var(--castle-surface-light);color:var(--castle-text-dark);pointer-events:none;transform-origin:50%;position:absolute}.dock-segment .dock-badge:not(.is-appearing){visibility:hidden;opacity:0;transform:scale(.45)}.dock-segment .dock-badge.is-appearing{visibility:visible;animation:.28s cubic-bezier(.2,.8,.2,1) both dock-badge-appear}@keyframes dock-badge-appear{0%{opacity:0;transform:scale(.45)}70%{opacity:1;transform:scale(1.08)}to{opacity:1;transform:scale(1)}}@media (prefers-reduced-motion:reduce){.dock-segment .dock-badge.is-appearing{animation:none}}.menu{gap:var(--castle-space-small);width:max-content;min-width:144px;padding:var(--castle-space-small);border:1px solid var(--castle-border-3);border-radius:var(--castle-radius-base);background:var(--castle-surface-5);flex-direction:column;display:flex;box-shadow:0 8px 24px #0000008c}.menu-item{align-items:center;gap:var(--castle-space-base);width:100%;height:26px;padding:0 var(--castle-space-base);border-radius:var(--castle-radius-small);color:var(--castle-text-primary);font-family:var(--castle-font-body);font-size:var(--castle-text-size-base);cursor:pointer;background:0 0;border:0;display:flex}.menu-icon{flex:0 0 16px;width:16px;height:16px;font-size:16px}svg.menu-icon,iconify-icon.menu-icon{fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5px}.menu-icon svg,.menu-icon iconify-icon{width:16px;height:16px;font-size:16px}.menu-item:hover:not(:disabled),.menu-item.is-hover:not(:disabled){background:var(--castle-surface-6)}.menu-item:disabled{opacity:.4;cursor:default}.menu-item-label{text-overflow:ellipsis;white-space:nowrap;text-align:left;flex:auto;min-width:0;overflow:hidden}.menu-check{color:var(--castle-text-primary);flex:none}.menu-keys{margin-left:var(--castle-space-large);color:var(--castle-text-muted);font-size:var(--castle-text-size-small);white-space:nowrap;flex:none}.menu-item:disabled .menu-keys{color:inherit}.menu-item-danger{color:var(--castle-danger-text)}.menu-separator{height:1px;margin:var(--castle-space-small) 0;background:var(--castle-border-3)}.menu-header{padding:var(--castle-space-small) var(--castle-space-base);color:var(--castle-text-muted);font-size:var(--castle-text-size-small);letter-spacing:.04em;text-transform:uppercase}.menu-confirm{gap:var(--castle-space-base);min-width:180px;padding:var(--castle-space-small) var(--castle-space-base);flex-direction:column;display:flex}.menu-confirm-text{color:var(--castle-text-primary);font-size:var(--castle-text-size-base);margin:0}.menu-confirm-actions{justify-content:flex-end;gap:var(--castle-space-base);display:flex}.menu-error{padding:var(--castle-space-small) var(--castle-space-base);color:var(--castle-danger-text);font-size:var(--castle-text-size-small);margin:0}.feedback-quiet{--castle-feedback-text:var(--castle-text-muted);--castle-feedback-surface:var(--castle-surface-3);--castle-feedback-border:var(--castle-border-3)}.feedback-warn{--castle-feedback-text:var(--castle-warn-text);--castle-feedback-surface:var(--castle-warn-surface);--castle-feedback-surface-hover:color-mix(in srgb, var(--castle-warn-text) 35%, var(--castle-warn-surface));--castle-feedback-border:color-mix(in srgb, var(--castle-warn-text), var(--castle-warn-surface))}.feedback-danger{--castle-feedback-text:var(--castle-danger-text);--castle-feedback-surface:var(--castle-danger-surface);--castle-feedback-surface-hover:var(--castle-danger-surface-hover);--castle-feedback-border:color-mix(in srgb, var(--castle-danger-text), var(--castle-danger-surface))}.feedback-note{color:var(--castle-feedback-text);margin:0}.feedback-banner{align-items:center;gap:var(--castle-space-base);min-height:var(--castle-panel-header-height);padding:var(--castle-space-base);border-bottom:1px solid var(--castle-feedback-border);background:var(--castle-feedback-surface);color:var(--castle-feedback-text);font-size:var(--castle-text-size-base);display:flex}.feedback-banner>span:not(.icon-cell){flex:auto;min-width:0}.feedback-banner .icon-cell{color:inherit}.feedback-warn .button,.feedback-danger .button{border:1px solid var(--castle-feedback-border);background:var(--castle-feedback-surface);color:var(--castle-text-primary)}.feedback-warn .button:hover,.feedback-warn .button.is-hover,.feedback-danger .button:hover,.feedback-danger .button.is-hover{background:var(--castle-feedback-surface-hover)}.feedback-warn .button:active,.feedback-warn .button.is-pressed,.feedback-danger .button:active,.feedback-danger .button.is-pressed{background:var(--castle-feedback-surface)}.feedback-takeover{padding:calc(var(--castle-space-large) * 2);border:1px solid var(--castle-feedback-border);border-radius:var(--castle-radius-base);background:var(--castle-feedback-surface);color:var(--castle-feedback-text);font-size:var(--castle-text-size-base);text-align:center;justify-content:center;align-items:center;display:flex}.panel{border:1px solid var(--castle-border-1);border-radius:var(--castle-radius-base);background:var(--castle-surface-2);color:var(--castle-text-primary);font-family:var(--castle-font-body);transition:border-color .12s;position:relative;overflow:hidden}@media (hover:hover){.panel:hover{border-color:var(--castle-border-3)}}.panel.is-hover{border-color:var(--castle-border-3)}.panel.is-active,.panel.is-active:hover,.panel.is-active.is-hover{border-color:var(--castle-border-2)}.panel.is-dragging,.panel.is-dragging:hover,.panel.is-dragging.is-hover,.panel.is-dragging.is-active{border-color:var(--castle-border-4)}.panel-header,.panel-tabs-header{height:var(--castle-panel-header-height);padding:0 var(--castle-space-base);border-bottom:1px solid var(--castle-border-1);background:var(--castle-surface-3);align-items:center;display:flex}@media (hover:hover){.panel-header:hover,.panel-tabs-header:hover{background:var(--castle-surface-4);cursor:grab}}.panel-header.is-hover,.panel-tabs-header.is-hover{background:var(--castle-surface-4);cursor:grab}.panel-header:active,.panel-header.is-pressed,.panel-tabs-header:active,.panel-tabs-header.is-pressed{cursor:grabbing}.panel-tabs-header{align-items:stretch;gap:var(--castle-space-base)}.panel-title{align-items:center;gap:var(--castle-space-base);min-width:0;padding:0 var(--castle-space-base);color:var(--castle-text-primary);font-family:var(--castle-font-display);font-size:var(--castle-text-size-base);margin:0 auto 0 0;font-weight:700;line-height:1.5;display:inline-flex}.panel-title svg,.panel-title iconify-icon{width:var(--castle-button-icon-size);height:var(--castle-button-icon-size);font-size:var(--castle-button-icon-size);flex-shrink:0}.panel-header-actions{align-items:center;gap:var(--castle-space-small);margin-left:auto;display:flex}.panel-type-toggle{align-items:center;gap:var(--castle-space-base);min-width:0;max-width:100%;height:var(--castle-button-height);padding:0 var(--castle-space-base);border-radius:var(--castle-radius-small);color:var(--castle-text-primary);font-family:var(--castle-font-display);font-size:var(--castle-text-size-base);white-space:nowrap;cursor:pointer;background:0 0;border:0;align-self:center;font-weight:700;display:inline-flex}.panel-type-toggle:hover,.panel-type-toggle.is-hover,.panel-type-toggle[aria-pressed=true]{background:var(--castle-surface-5)}.panel-type-toggle svg,.panel-type-toggle iconify-icon{width:var(--castle-button-icon-size);height:var(--castle-button-icon-size);font-size:var(--castle-button-icon-size);flex-shrink:0}.panel-tabs{align-items:center;gap:var(--castle-space-base);flex:auto;min-width:0;display:flex}.panel-tab{max-width:160px;height:var(--castle-button-height);padding:var(--castle-space-small) var(--castle-space-base);border-radius:var(--castle-radius-small);color:var(--castle-text-dim);font-family:var(--castle-font-body);font-size:var(--castle-text-size-base);white-space:nowrap;cursor:pointer;background:0 0;border:0;align-items:center;line-height:18px;display:flex;position:relative;overflow:hidden}.panel-tab>span{text-overflow:ellipsis;min-width:0;overflow:hidden}.panel-tab:hover,.panel-tab.is-hover{background:var(--castle-surface-5);color:var(--castle-text-secondary)}.panel-tab.is-active{background:var(--castle-surface-5);color:var(--castle-text-primary)}.panel-tab:hover>span,.panel-tab.is-hover>span{-webkit-mask-image:linear-gradient(to right, #000 calc(100% - (var(--castle-button-icon-size) + var(--castle-space-large))), transparent 100%);mask-image:linear-gradient(to right, #000 calc(100% - (var(--castle-button-icon-size) + var(--castle-space-large))), transparent 100%)}.panel-tab.is-narrow:not(.is-active):hover>span,.panel-tab.is-narrow:not(.is-active).is-hover>span{-webkit-mask-image:none;mask-image:none}.panel-tab-close{z-index:1;top:var(--castle-space-small);right:var(--castle-space-small);width:calc(var(--castle-button-icon-size) + var(--castle-space-large));height:var(--castle-button-icon-size);border-radius:var(--castle-radius-small);background:linear-gradient(to right, transparent, var(--castle-surface-3) 45%);color:currentColor;cursor:pointer;opacity:0;pointer-events:none;border:0;justify-content:flex-end;align-items:center;padding:0;display:inline-flex;position:absolute}.panel-tab-close svg,.panel-tab-close iconify-icon{width:var(--castle-button-icon-size);height:var(--castle-button-icon-size);font-size:var(--castle-button-icon-size)}.panel-tab:hover .panel-tab-close,.panel-tab.is-hover .panel-tab-close,.panel-tab:focus-within .panel-tab-close{opacity:1;pointer-events:auto;background:linear-gradient(to right, transparent, var(--castle-surface-5) 45%)}.panel-tab.is-active .panel-tab-close{background:linear-gradient(to right, transparent, var(--castle-surface-5) 45%)}.panel-tab-close:hover,.panel-tab-close.is-hover{background:linear-gradient(to right, transparent, var(--castle-surface-5) 45%);color:var(--castle-text-primary)}.panel-tab.is-narrow:not(.is-active):hover .panel-tab-close,.panel-tab.is-narrow:not(.is-active).is-hover .panel-tab-close{opacity:0;pointer-events:none}.panel-tab.is-drag-origin{opacity:0;pointer-events:none;border:0;width:0;min-width:0;max-width:0;padding:0}.panel-tab-insert{width:2px;height:var(--castle-button-height);border-radius:var(--castle-radius-pill);background:var(--castle-border-4);pointer-events:none;flex:0 0 2px}.panel-tab-ghost{padding:var(--castle-space-base) var(--castle-space-large);border:1px solid var(--castle-border-1);border-radius:var(--castle-radius-small);background:var(--castle-surface-3);color:var(--castle-text-primary);font-size:var(--castle-text-size-base);pointer-events:none;box-shadow:0 8px 24px #00000073}.panel-mobile-current{justify-content:center;align-self:center;align-items:center;gap:var(--castle-space-base);min-width:0;max-width:100%;height:var(--castle-button-height-large);padding:0 var(--castle-space-base);border-radius:var(--castle-radius-small);color:var(--castle-text-primary);font-family:var(--castle-font-body);font-size:var(--castle-text-size-base);cursor:pointer;background:0 0;border:0;display:inline-flex}.panel-mobile-current:hover,.panel-mobile-current.is-hover{background:var(--castle-surface-5)}.panel-mobile-current-text{align-items:baseline;gap:var(--castle-space-small);min-width:0;display:flex}.panel-mobile-current-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.panel-mobile-current strong,.panel-mobile-current-type{font-family:var(--castle-font-display);flex-shrink:0;font-weight:700}.panel-mobile-current svg,.panel-mobile-current iconify-icon{width:var(--castle-button-icon-size-large);height:var(--castle-button-icon-size-large);font-size:var(--castle-button-icon-size-large);flex:none}.segmented{border-radius:var(--castle-radius-small);flex-wrap:wrap;align-items:stretch;display:flex;overflow:hidden}.segmented>.button{border-radius:0}.feedback-banner.is-inset{border-radius:var(--castle-radius-small);border-bottom:none}.feedback-banner.is-inset .button{flex:none;width:auto}.popover{width:max-content;max-width:calc(100vw - 24px);max-height:calc(100vh - 16px);padding:var(--castle-space-large);border:1px solid var(--castle-border-3);border-radius:var(--castle-radius-base);background:var(--castle-surface-4);color:var(--castle-text-primary);font-family:var(--castle-font-body);font-size:var(--castle-text-size-base);flex-direction:column;display:flex;overflow:auto;box-shadow:0 8px 24px #0000008c}.popover .button:not(.button-quiet){background:var(--castle-surface-5)}.popover .button:not(.button-quiet):hover,.popover .button:not(.button-quiet).is-hover{background:var(--castle-surface-6)}.popover .button:not(.button-quiet):active,.popover .button:not(.button-quiet).is-pressed{background:var(--castle-surface-4)}.popover .button[aria-pressed=true],.popover .button[aria-pressed=true]:hover,.popover .button[aria-pressed=true]:active{background:var(--castle-surface-light);color:var(--castle-text-dark)}.popover .feedback-warn .button:not(.button-quiet),.popover .feedback-danger .button:not(.button-quiet){border:1px solid var(--castle-feedback-border);background:var(--castle-feedback-surface);color:var(--castle-text-primary)}.popover .feedback-warn .button:not(.button-quiet):hover,.popover .feedback-warn .button:not(.button-quiet).is-hover,.popover .feedback-danger .button:not(.button-quiet):hover,.popover .feedback-danger .button:not(.button-quiet).is-hover{background:var(--castle-feedback-surface-hover)}.popover .feedback-warn .button:not(.button-quiet):active,.popover .feedback-warn .button:not(.button-quiet).is-pressed,.popover .feedback-danger .button:not(.button-quiet):active,.popover .feedback-danger .button:not(.button-quiet).is-pressed{background:var(--castle-feedback-surface)}:root{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--v2-gutter:#000;--v2-surface:#0d0d0d;--v2-raised:#161616;--v2-hover:#1d1d1d;--v2-fg:#e6e6e6;--v2-head:#e8e8e8;--v2-secondary:#b3b3b3;--v2-muted:#888;--v2-dim:#525252;--v2-placeholder:#666;--v2-ink:#111;--v2-white:#fff;--v2-border:#2a2a2a;--v2-accent:var(--castle-accent);--v2-accent-hover:color-mix(in srgb, var(--castle-accent) 84%, #fff);--v2-error-bg:#5a2b2b;--v2-warn:#e2c08d;--v2-error:#e08c8c;--v2-overlay-scrim:#00000059;--v2-overlay-code:#00000038;--v2-overlay-code-block:#00000047;--v2-overlay-task:#141414eb;--v2-overlay-feed-code:#7878784d;--v2-overlay-white-subtle:#ffffff0f;--v2-overlay-white-hover:#ffffff14;--v2-overlay-white-border:#ffffff24;--v2-overlay-white-quote:#fff6;--v2-overlay-white-dim:#ffffffd9;--v2-shadow-pop:0 10px 24px -10px #000000e6;--v2-selection:#e6e6e62e;--v2-mono:ui-monospace, SFMono-Regular, Menlo, monospace;--panel-gutter:10px;--panel-chrome-radius:8px}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{color:var(--v2-fg);background:var(--v2-surface);font-family:baltomobile,Balto,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;overflow:hidden}.panel-error{height:100%;color:var(--v2-muted);flex-direction:column;align-items:flex-start;gap:8px;padding:14px 16px;font-size:13px;display:flex;overflow:auto}.panel-error-title{color:var(--v2-fg)}.panel-error-msg{white-space:pre-wrap;word-break:break-word;max-width:100%;color:var(--v2-muted);margin:0;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}.panel-error-retry{font:inherit;border:1px solid var(--v2-border);background:var(--v2-raised);color:var(--v2-fg);cursor:pointer;border-radius:4px;padding:3px 10px;font-size:12px}.panel-error-retry:hover{background:var(--v2-hover)}.editor-panel-root{flex-direction:column;width:100%;height:100%;min-height:0;display:flex}.editor-shell{flex:auto;min-height:0;display:flex}.editor-panel-body{flex-direction:column;flex:auto;min-width:0;min-height:0;display:flex}.editor-panel-view{flex:auto;min-width:0;min-height:0;position:relative}.editor-import-banner{background:var(--flow-surface,#181818);border-bottom:1px solid var(--v2-border,#2a2a2a);color:var(--v2-muted,#888);flex:none;align-items:center;gap:8px;padding:8px;font:12px ui-sans-serif,system-ui,sans-serif;display:flex}.editor-import-chip{border:1px solid var(--v2-border,#2a2a2a);background:var(--v2-raised,#161616);color:var(--v2-muted,#888);letter-spacing:.02em;border-radius:999px;flex:none;align-items:center;padding:2px 8px;font-size:12px;line-height:1.4;display:inline-flex}.editor-import-banner-text{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.editor-import-banner-action{border:1px solid var(--v2-border,#2a2a2a);background:var(--v2-raised,#161616);color:var(--v2-text,#ddd);font:inherit;cursor:pointer;border-radius:4px;flex:none;margin-left:auto;padding:2px 10px}.editor-import-banner-action:hover{border-color:var(--v2-muted,#888)}.editor-import-chip.editor-fork-chip{color:var(--v2-text,#ddd)}.editor-fork-modal-scrim{z-index:40;background:#00000080;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.editor-fork-modal{border:1px solid var(--v2-border,#2a2a2a);background:var(--flow-surface,#181818);max-width:420px;color:var(--v2-text,#ddd);border-radius:6px;padding:16px;font:13px ui-sans-serif,system-ui,sans-serif}.editor-fork-modal-title{margin-bottom:8px;font-weight:600}.editor-fork-modal-body{color:var(--v2-muted,#888);line-height:1.5}.editor-fork-modal-actions{justify-content:flex-end;gap:8px;margin-top:16px;display:flex}.editor-fork-modal-actions button{border:1px solid var(--v2-border,#2a2a2a);background:var(--v2-raised,#161616);color:var(--v2-text,#ddd);font:inherit;cursor:pointer;border-radius:4px;padding:4px 12px}.editor-fork-modal-actions button:hover{border-color:var(--v2-muted,#888)}.editor-contextbar{background:var(--v2-gutter,#0d0d0d);border-bottom:1px solid var(--v2-border,#2a2a2a);flex:none;align-items:center;gap:8px;padding:5px 8px;display:flex}.editor-drawer-toggle{width:26px;height:24px;color:var(--v2-muted,#888);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:6px;flex:none;justify-content:center;align-items:center;display:inline-flex}.editor-drawer-toggle:hover{color:var(--v2-fg,#e7e7ef);background:var(--v2-surface,#1b1b2b)}.editor-drawer-toggle.on{color:var(--v2-fg,#e7e7ef);background:var(--v2-surface,#1b1b2b);border-color:var(--v2-border,#3a3a52)}.editor-drawer{background:var(--v2-gutter,#0d0d0d);border-right:1px solid var(--v2-border,#2a2a2a);flex:none;width:190px;padding:6px 4px;overflow-y:auto}.editor-drawer-folder{letter-spacing:.03em;text-transform:uppercase;color:var(--v2-muted,#888);padding:6px 8px 2px;font:10px ui-sans-serif,system-ui,sans-serif}.editor-drawer-item{width:100%;color:var(--v2-secondary,#b3b3b3);cursor:pointer;text-align:left;text-overflow:ellipsis;white-space:nowrap;background:0 0;border:none;border-radius:6px;padding:5px 8px;font:12px ui-sans-serif,system-ui,sans-serif;display:block;overflow:hidden}.editor-drawer-item:hover{background:var(--v2-surface,#1b1b2b);color:var(--v2-fg,#e7e7ef)}.editor-drawer-item.current{color:var(--v2-fg,#e7e7ef);background:#ffffff1a}.editor-drawer-empty{color:var(--v2-muted,#888);padding:10px 8px;font-size:12px}.editor-view-picker{background:var(--v2-surface,#1b1b2b);color:var(--v2-fg,#e7e7ef);border:1px solid var(--v2-border,#3a3a52);cursor:pointer;border-radius:6px;flex:none;padding:3px 6px;font:12px system-ui,sans-serif}.editor-contextbar-path{text-overflow:ellipsis;white-space:nowrap;color:var(--v2-muted,#888);flex:auto;font:11px ui-monospace,SFMono-Regular,Menlo,monospace;overflow:hidden}.editor-contextbar-reload{width:22px;height:22px;color:var(--v2-muted,#888);cursor:pointer;background:0 0;border:none;border-radius:5px;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.editor-contextbar-reload:hover{color:var(--v2-white,#fff);background:var(--v2-overlay-white-hover,#ffffff14)}.editor-contextbar-reload svg{width:13px;height:13px}.deck-panel{background:var(--v2-surface);width:100%;height:100%}.deck-frame{border:0;width:100%;height:100%;display:block}.play-panel{background:var(--castle-surface-2);flex-direction:column;width:100%;height:100%;display:flex}.play-scene-picker{padding:0 var(--castle-space-large) var(--castle-space-large);flex:none;justify-content:center;align-items:center;display:flex}.play-stage{min-height:0;padding:var(--castle-space-large);flex:auto;justify-content:center;align-items:center;display:flex;container-type:size}.play-stage:has(+.play-scene-picker){padding-bottom:var(--castle-space-base)}.play-frame-shell{aspect-ratio:5/7;border-radius:4%/2.85714%;width:min(100cqw,71.4286cqh);height:min(100cqh,140cqw);position:relative;overflow:hidden}.play-frame-shell .deck-frame{width:100%;height:100%}.play-logs{border-top:1px solid var(--castle-border-1);background:var(--castle-surface-2);color:var(--castle-text-secondary);flex:none;position:relative}.play-logs.is-open{--play-logs-height:160px;flex:0 0 var(--play-logs-height);height:var(--play-logs-height);flex-direction:column;min-height:0;display:flex;overflow:hidden}.play-logs-resize{z-index:2;cursor:row-resize;touch-action:none;height:12px;display:none;position:absolute;top:-6px;left:0;right:0}.play-logs.is-open>.play-logs-resize{display:block}body.play-logs-resizing,body.play-logs-resizing *{cursor:row-resize!important;-webkit-user-select:none!important;user-select:none!important}.play-logs-header{min-height:calc(var(--castle-button-height) + 2 * var(--castle-space-base));padding:var(--castle-space-base);align-items:center;column-gap:var(--castle-space-base);cursor:pointer;flex:none;grid-template-columns:minmax(0,1fr) minmax(0,max-content) max-content;display:grid;position:relative}.play-logs-header:hover{background:var(--castle-surface-3)}.play-logs-expand{z-index:0;cursor:pointer;background:0 0;border:0;padding:0;position:absolute;inset:0}.play-logs-expand:focus{outline:none}.play-logs-expand:focus-visible{outline:2px solid var(--castle-border-2);outline-offset:-2px}.play-logs-label{align-items:center;gap:var(--castle-space-base);min-width:0;color:var(--castle-text-dim);pointer-events:none;justify-self:start;display:inline-flex}.play-logs-header:hover .play-logs-label{color:var(--castle-text-primary)}.play-logs-label svg{flex:0 0 var(--castle-button-icon-size);width:var(--castle-button-icon-size);height:var(--castle-button-icon-size);font-size:var(--castle-button-icon-size)}.play-logs-pending{min-width:0;color:var(--castle-text-muted);font-size:var(--castle-text-size-small);text-overflow:ellipsis;white-space:nowrap;pointer-events:none;grid-column:2;margin:0;line-height:1.4;overflow:hidden}.play-logs-restart{z-index:1;grid-column:3;justify-self:end;min-width:max-content;position:relative}.play-logs-restart.is-pending,.play-logs-restart.is-pending:hover,.play-logs-restart.is-pending:active{color:var(--castle-warn-text)}.play-logs-restart-icon{line-height:1;display:inline-flex}.play-logs-restart-icon.is-spinning{animation:.6s linear infinite play-logs-spin}@keyframes play-logs-spin{to{transform:rotate(360deg)}}.play-logs-toolbar{align-items:center;gap:var(--castle-space-base);padding:var(--castle-space-base);border-top:1px solid var(--castle-border-1);flex-wrap:wrap;flex:none;display:flex}.play-logs-body{min-height:0;padding:var(--castle-space-base) var(--castle-space-large);border-top:1px solid var(--castle-border-1);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:var(--castle-text-size-small);flex:auto;line-height:1.5;overflow-y:auto}.play-logs-line{white-space:pre-wrap;word-break:break-word}.play-logs-warn{color:var(--castle-warn-text)}.play-logs-error{color:var(--castle-danger-text)}.play-logs-empty{color:var(--castle-text-dim)}.flow-root.is-mobile .play-panel{--castle-text-size-small:14px;--castle-text-size-base:16px;--castle-text-style-smallcaps-size:var(--castle-text-size-small);--castle-button-height:var(--castle-button-height-large)}.flow-root.is-mobile .play-panel .button:not(.button-icon){padding-left:var(--castle-space-large);padding-right:var(--castle-space-large)}.flow-root.is-mobile .play-logs.is-open{--play-logs-height:200px}.flow-root.is-mobile .play-logs-header:hover{background:0 0}.flow-root.is-mobile .play-logs-header:hover .play-logs-label{color:var(--castle-text-dim)}.flow-root.is-mobile .play-stage{padding:var(--castle-space-small)}.term-panel{width:100%;height:100%;position:relative}.term-host{overscroll-behavior:contain;padding:6px;position:absolute;inset:0}.shell-root{--operator-pad:var(--castle-space-large);--operator-col-fit:min(var(--operator-col,400px), 100%);background:var(--v2-gutter);height:100%;position:relative}#chat-host{width:var(--operator-col-fit);background:var(--v2-gutter);color:var(--v2-fg);z-index:10;flex-direction:column;font-family:Balto,system-ui,-apple-system,sans-serif;display:flex;position:absolute;top:0;bottom:0;left:0;overflow:hidden}.settings-popover{z-index:2147483000;width:390px;position:fixed}.settings-popover .settings-row{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:6px 10px;display:flex}.settings-popover .settings-row+.settings-row{margin-top:8px}.settings-popover .settings-label{white-space:nowrap}.settings-popover .settings-row-stack{flex-direction:column;align-items:stretch;gap:4px;display:flex}.settings-popover .settings-row-main{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:6px 10px;display:flex}.settings-popover .settings-model-picker{grid-template-columns:minmax(0,1fr) max-content;justify-content:normal;align-items:center;gap:8px 10px;display:grid}.settings-popover .settings-model-picker>.settings-row-main{display:contents}.settings-popover .settings-model-picker .settings-model-family{grid-column:2}.settings-popover .settings-model-picker>.settings-warning{grid-column:1/-1}.settings-popover .settings-free-chip{border-radius:var(--castle-radius-small);background:var(--castle-surface-1);height:14px;color:var(--castle-text-primary);letter-spacing:.06em;text-transform:uppercase;flex:none;padding:0 4px;font-size:9px;font-weight:500;line-height:14px;overflow:visible}.settings-popover .settings-model-picker .settings-model-detail>.segmented{grid-column:2;width:100%}.settings-popover .settings-model-picker .settings-model-detail>.segmented>.button{flex:1 1 0}.settings-popover .settings-model-picker .settings-model-detail>.text-field{width:100%;min-width:0;max-width:none}.settings-popover .settings-text-warn{border-color:var(--v2-warn)}.settings-popover .settings-warning{color:var(--v2-warn);text-align:right;font-size:11px;line-height:1.35}.settings-popover .settings-warning-suggest{appearance:none;font:inherit;color:var(--v2-warn);cursor:pointer;background:0 0;border:none;margin:0;padding:0;text-decoration:underline}.settings-popover .settings-warning-suggest:hover{color:var(--castle-text-primary)}.settings-popover .settings-group+.settings-group{border-top:1px solid var(--castle-border-1);margin-top:12px;padding-top:12px}.settings-popover .settings-credits{margin-top:var(--castle-space-base);color:var(--castle-text-secondary);font-size:var(--castle-text-size-base)}.settings-popover .settings-usage-subtext{margin-top:var(--castle-space-small);color:var(--castle-text-muted);font-size:var(--castle-text-size-small)}.settings-popover .settings-usage-subtext.feedback-note{color:var(--castle-feedback-text)}.settings-popover .settings-split{justify-content:space-between;align-items:center;gap:var(--castle-space-large);margin-top:var(--castle-space-base);display:flex}.settings-popover .settings-group>.settings-split:first-child{margin-top:0}.settings-popover .settings-split-copy,.settings-popover .settings-split>.settings-credits{flex:auto;min-width:0}.settings-popover .settings-split .settings-credits{margin-top:0}.settings-popover .settings-split .button{flex:none;width:auto;margin-left:auto}.settings-popover .settings-group>.feedback-banner.is-inset{margin-top:var(--castle-space-base)}.settings-popover .text-field{flex:auto}.settings-popover .settings-usage-bar{height:4px;margin-top:var(--castle-space-base);background:var(--castle-surface-5);border-radius:2px;overflow:hidden}.settings-popover .settings-usage-fill{background:var(--castle-accent);height:100%}.settings-popover .settings-usage-fill.blocked{background:var(--castle-danger-text)}.castle-key-heading{margin-bottom:4px;font-weight:600}.castle-key-subtitle{color:#9a9a9a;margin-bottom:14px;font-size:12px;line-height:1.5}.castle-key-tabs{border:1px solid #3a3a3a;border-radius:4px;margin-bottom:12px;display:flex;overflow:hidden}.castle-key-tab{color:#9a9a9a;font:inherit;cursor:pointer;background:#2e2e2e;border:0;flex:1;padding:6px 10px;font-size:12px}.castle-key-tab+.castle-key-tab{border-left:1px solid #3a3a3a}.castle-key-tab:hover{color:#e8e8e8}.castle-key-tab.active{color:#e8e8e8;background:#3a3a3a}.castle-key-input{box-sizing:border-box;color:#e8e8e8;width:100%;font:inherit;background:#1b1b1b;border:1px solid #3a3a3a;border-radius:4px;outline:none;padding:7px 9px;font-size:12px;display:block}.castle-key-input:focus{border-color:#4a4a4a}.castle-key-input::placeholder{color:#6a6a6a}.castle-key-stored{color:#8a8a8a;margin-top:8px;font-size:11px}.castle-key-error{color:#e8705a;margin-top:8px;font-size:11px;line-height:1.4}.castle-key-row{color:#c8c8c8;justify-content:space-between;align-items:center;gap:10px;margin-bottom:12px;display:flex}.castle-key-row button{color:#e8e8e8;font:inherit;cursor:pointer;background:#2e2e2e;border:1px solid #3a3a3a;border-radius:4px;padding:5px 12px;font-size:12px}.castle-key-row button:hover{background:#383838}.castle-key-login{margin-bottom:12px}.castle-key-signin{color:#e8e8e8;width:100%;font:inherit;cursor:pointer;background:#2e2e2e;border:1px solid #3a3a3a;border-radius:4px;padding:9px 12px;font-size:13px;display:block}.castle-key-signin:hover{background:#383838}.castle-key-or{color:#7a7a7a;letter-spacing:.08em;text-transform:uppercase;align-items:center;gap:10px;margin:14px 0;font-size:11px;display:flex}.castle-key-or:before,.castle-key-or:after{content:"";background:#3a3a3a;flex:1;height:1px}.castle-key-field-label{color:#c8c8c8;margin-bottom:6px;font-size:12px}.castle-key-url{color:#7aa2f7;word-break:break-all;-webkit-user-select:all;user-select:all;background:#1b1b1b;border:1px solid #3a3a3a;border-radius:4px;padding:8px 9px;font-size:11px;line-height:1.4;display:block}#chat-messages{overflow-anchor:none;min-height:0;font-size:var(--castle-text-size-base);scrollbar-width:none;-ms-overflow-style:none;flex-direction:column;flex:1 1 0;padding:0;line-height:1.5;display:flex;overflow-y:auto}#chat-messages .chat-thread{gap:var(--castle-space-large);padding-bottom:var(--castle-space-large);opacity:0;flex-direction:column;transition:opacity .12s;display:flex}#chat-messages .chat-thread.ready{opacity:1}.shell-root.docked #chat-messages{padding:0}.shell-root.docked #chat-messages>:first-child{margin-top:auto}#chat-messages::-webkit-scrollbar{width:0;height:0}#chat-empty{color:var(--castle-text-muted)}#chat-host .msg{margin:0}#chat-host .msg.user{text-align:right}#chat-host .msg.user span:not(.msg-image){background:var(--castle-surface-light);color:var(--castle-text-dark);padding:var(--castle-space-base) var(--castle-space-large);border-radius:var(--castle-radius-large);text-align:left;white-space:pre-wrap;word-break:break-word;max-width:85%;display:inline-block}#chat-host .msg-image{border:1px solid var(--castle-border-1);border-radius:var(--castle-radius-base);max-width:220px;max-height:150px;margin:0 0 var(--castle-space-base) auto;display:block}#chat-host .assistant-turn{align-items:flex-start;gap:var(--castle-space-base);flex-direction:column;margin:0;display:flex}#chat-host .assistant-turn .feedback-note{max-width:85%}#chat-host .msg.assistant{background:var(--castle-accent);width:fit-content;color:var(--castle-surface-light);padding:var(--castle-space-base) var(--castle-space-large);border-radius:var(--castle-radius-large);word-break:break-word;max-width:85%;margin:0}#chat-host .msg.assistant.errbubble{background:var(--castle-danger-surface);color:var(--castle-danger-text)}#chat-host .msg.assistant.streaming:after{content:"▌";opacity:.6;animation:1s step-end infinite chat-blink}@keyframes chat-blink{50%{opacity:0}}#chat-host .msg.toolline{color:var(--castle-text-muted);font-size:var(--castle-text-size-base);font-family:var(--castle-font-mono);word-break:break-word}#chat-host .msg-error-detail{font-size:var(--castle-text-size-base);color:var(--castle-text-muted)}#chat-host .msg-error-detail summary{cursor:pointer;-webkit-user-select:none;user-select:none}#chat-host .msg-error-detail pre{margin:var(--castle-space-small) 0 0;padding:var(--castle-space-base);background:var(--castle-surface-1);border-radius:var(--castle-radius-small);font-size:var(--castle-text-size-small);white-space:pre-wrap;word-break:break-word;max-height:160px;overflow-y:auto}#chat-host .operator-line,#chat-host .msg-thinking{color:var(--castle-text-muted);font-size:var(--castle-text-size-base)}#chat-host .operator-line{align-items:center;gap:var(--castle-space-base);display:flex}#chat-host .operator-line .icon-inline{flex:0 0 var(--castle-icon-size-inline)}#chat-host .operator-line .icon-inline:not(:first-child){color:var(--castle-text-dim)}#chat-host .operator-line-link{color:inherit;font:inherit;text-underline-offset:2px;cursor:pointer;background:0 0;border:0;padding:0;text-decoration:underline}#chat-host .operator-line-link:hover{color:var(--castle-text-primary)}#chat-host .msg-thinking summary{cursor:pointer;-webkit-user-select:none;user-select:none;list-style:none}#chat-host .msg-thinking summary::-webkit-details-marker{display:none}#chat-host .msg-thinking .thinking-caret{transform-origin:50%;transition:transform .12s}#chat-host .msg-thinking[open] .thinking-caret{transform:rotate(90deg)}#chat-host .msg-thinking.is-active .thinking-label{background-image:linear-gradient(90deg, var(--castle-text-muted) 20%, var(--castle-text-primary) 50%, var(--castle-text-muted) 80%);color:#0000;-webkit-text-fill-color:transparent;background-size:200% 100%;-webkit-background-clip:text;background-clip:text;animation:1.6s linear infinite thinking-shimmer;display:inline-block}@keyframes thinking-shimmer{0%{background-position:100% 0}to{background-position:-100% 0}}@media (prefers-reduced-motion:reduce){#chat-host .msg-thinking.is-active .thinking-label{color:var(--castle-text-muted);-webkit-text-fill-color:currentColor;background:0 0;animation:none}}#chat-host .msg-thinking-body{max-height:160px;padding:0 var(--castle-space-large) 0 calc(var(--castle-icon-size-inline) + var(--castle-space-base));border-radius:var(--castle-radius-small);background:var(--castle-surface-1);color:var(--castle-text-muted);font-size:var(--castle-text-size-base);overflow-y:auto}#chat-host .msg.md>:first-child,#chat-host .task-notes>:first-child{margin-top:0}#chat-host .msg.md>:last-child,#chat-host .task-notes>:last-child{margin-bottom:0}#chat-host .msg.md p:empty{display:none}#chat-host .msg.md p,#chat-host .task-notes p{margin:.4em 0}#chat-host .msg.md ul,#chat-host .msg.md ol,#chat-host .task-notes ul,#chat-host .task-notes ol{margin:.4em 0;padding-left:1.3em}#chat-host .task-notes li,#chat-host .msg.md li{margin:.1em 0}#chat-host .msg.md h1,#chat-host .msg.md h2,#chat-host .msg.md h3{margin:.5em 0 .3em;font-weight:700;line-height:1.25}#chat-host .msg.md h1{font-size:1.2em}#chat-host .msg.md h2{font-size:1.12em}#chat-host .msg.md h3{font-size:1.05em}#chat-host .msg.md a:not(.msg-link),#chat-host .msg-thinking-body a:not(.msg-link),#chat-host .task-notes a:not(.msg-link),#chat-host .task-feed-msg a:not(.msg-link){color:var(--castle-surface-light);text-underline-offset:2px;text-decoration:underline}#chat-host .msg-link{border-radius:var(--castle-radius-small);color:inherit;font-family:var(--castle-font-mono);-webkit-text-decoration-color:color-mix(in srgb, currentColor 40%, transparent);text-decoration-color:color-mix(in srgb, currentColor 40%, transparent);text-underline-offset:2px;margin:0 -.35em;padding:.1em .35em}#chat-host .msg-link:hover{background:var(--castle-surface-4);color:var(--castle-text-primary);text-decoration-color:currentColor}#chat-host .msg.assistant .msg-link:hover{background:color-mix(in srgb, var(--castle-accent) 84%, #fff)}#chat-host .msg.md code{font-family:var(--castle-font-mono);font-size:var(--castle-text-size-small);background:color-mix(in srgb, var(--castle-accent) 78%, #000);border-radius:var(--castle-radius-small);padding:.1em .35em}#chat-host .msg.md pre{margin:var(--castle-space-base) 0;padding:var(--castle-space-base) var(--castle-space-large);background:color-mix(in srgb, var(--castle-accent) 72%, #000);border-radius:var(--castle-radius-small);white-space:pre-wrap;word-break:break-word;font-family:var(--castle-font-mono);font-size:var(--castle-text-size-small);line-height:1.4;overflow-x:auto}#chat-host .msg.md pre code{background:0 0;border-radius:0;padding:0}#chat-host .msg.md blockquote{margin:var(--castle-space-base) 0;padding-left:var(--castle-space-large);border-left:3px solid color-mix(in srgb, var(--castle-accent) 60%, #fff)}.shell-root.docked #chat-host .operator-inset{min-height:0;padding:0 var(--operator-pad);flex-direction:column;flex:1 1 0;display:flex;overflow:hidden}.shell-root.docked #chat-host .chat-divider{margin:0 calc(-1 * var(--operator-pad));background:var(--castle-border-1);flex:0 0 1px}.task-stack{gap:var(--castle-space-small);flex-direction:column;display:flex}#task-board{min-height:0;margin-inline:calc(-1 * var(--castle-space-base));padding-inline:var(--castle-space-base);padding-top:0;padding-bottom:var(--castle-space-base);scrollbar-width:thin;scrollbar-color:transparent transparent;flex-direction:column;flex:0 auto;max-height:40vh;display:flex;overflow:hidden auto}#task-board.scrolling{scrollbar-color:var(--castle-text-dim) transparent}#task-board::-webkit-scrollbar{width:6px}#task-board::-webkit-scrollbar-track{background:0 0}#task-board::-webkit-scrollbar-thumb{background:0 0;border-radius:3px;transition:background .25s}#task-board.scrolling::-webkit-scrollbar-thumb{background:var(--castle-text-dim)}#chat-host .task{margin:0 calc(-1 * var(--castle-space-base));border-radius:var(--castle-radius-small);cursor:pointer;transition:background .12s,box-shadow .12s}#chat-host .task.open{background:var(--castle-surface-2);box-shadow:inset 0 0 0 1px var(--castle-border-1)}#chat-host .task:hover{background:var(--castle-surface-3)}#chat-host .task-row{align-items:center;gap:var(--castle-space-large);padding:var(--castle-space-small) var(--castle-space-base);display:flex;position:relative}#chat-host .pie{background:conic-gradient(var(--castle-surface-light) calc(var(--pct,0) * 3.6deg), var(--castle-surface-5) 0deg);border-radius:50%;flex:0 0 32px;width:32px;height:32px;padding:2px;display:flex;position:relative}#chat-host .pie .avatar{background:var(--castle-surface-3);width:100%;height:100%;color:var(--castle-text-dark);border-radius:50%;justify-content:center;align-items:center;display:flex;overflow:hidden}#chat-host .pie .avatar .avatar-icon-wrap{justify-content:center;align-items:center;width:16px;height:16px;font-size:16px;display:flex}#chat-host .pie .avatar .avatar-icon-wrap svg{width:16px;height:16px;display:block}#chat-host .task-meta{flex:1;min-width:0}#chat-host .task-name{color:var(--castle-text-muted);font-size:var(--castle-text-size-base);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}#chat-host .task-name .tn{color:var(--castle-text-primary);font-weight:600}#chat-host .task-sub{color:var(--castle-text-muted);font-size:var(--castle-text-size-small);text-overflow:ellipsis;white-space:nowrap;font-variant-numeric:tabular-nums;overflow:hidden}#chat-host .task-actions{align-items:center;gap:var(--castle-space-small);visibility:hidden;flex:none;margin-left:auto;display:flex}#chat-host .task:hover .task-actions,#chat-host .task.open .task-actions{visibility:visible}#chat-host .task-board-header{z-index:1;justify-content:space-between;align-items:center;gap:var(--castle-space-base);margin-inline:calc(-1 * var(--castle-space-base));padding:var(--castle-space-large) var(--castle-space-base) var(--castle-space-base);background:var(--castle-surface-1);display:flex;position:sticky;top:0}#chat-host .task-body{padding:0 var(--castle-space-base) var(--castle-space-base) calc(var(--castle-space-base) + 32px + var(--castle-space-large));font-size:var(--castle-text-size-base);color:var(--castle-text-secondary);display:none}#chat-host .task.open .task-body{display:block}#chat-host .task-notes{margin-top:var(--castle-space-small);font-size:var(--castle-text-size-base);color:var(--castle-text-secondary);word-break:break-word}#chat-host .task-body>.feedback-note{margin-top:var(--castle-space-small)}#chat-host .task-notes code{border-radius:var(--castle-radius-small);font-family:var(--castle-font-mono);padding:1px 4px;font-size:12px}#chat-host .task-playtest-frames{margin-top:var(--castle-space-base)}#chat-host .task-playtest-frames-label{font-size:var(--castle-text-size-small);color:var(--castle-text-muted);margin-bottom:var(--castle-space-small)}#chat-host .task-playtest-frames-row{gap:var(--castle-space-base);flex-wrap:wrap;display:flex}#chat-host .task-playtest-frame{object-fit:cover;border:1px solid var(--castle-border-1);background:var(--castle-text-dark);border-radius:4px;width:64px;height:90px;display:block}#chat-host .task-feed{margin-top:var(--castle-space-base);scrollbar-width:none;-ms-overflow-style:none;max-height:96px;font-size:var(--castle-text-size-base);color:var(--castle-text-secondary);cursor:default;word-break:break-word;line-height:1.5;overflow:hidden auto;-webkit-mask-image:linear-gradient(#0000,#000 8px 100%);mask-image:linear-gradient(#0000,#000 8px 100%)}#chat-host .task-feed::-webkit-scrollbar{width:0;height:0}#chat-host .task-feed-tool{padding-left:var(--castle-space-large);color:var(--castle-text-muted);font-family:var(--castle-font-mono);white-space:pre-wrap;font-size:12px}#chat-host .task-feed-msg{margin:0}#chat-host .task-feed-msg>:first-child{margin-top:0}#chat-host .task-feed-msg>:last-child{margin-bottom:0}#chat-host .task-feed-msg p{margin:0}#chat-host .task-feed-msg code{font-family:var(--castle-font-mono);font-size:var(--castle-text-size-base)}#chat-host .task-page{min-height:0;margin-inline:calc(-1 * var(--operator-pad));flex-direction:column;flex:1 1 0;display:flex}#chat-host .task-page-header{padding:var(--castle-space-large) var(--operator-pad);border-bottom:1px solid var(--castle-border-1);flex:none}#chat-host .task-page-header .task-row{padding:0}#chat-host .task-page-header .tn{color:var(--castle-text-primary)}#chat-host .task-page-body{min-height:0;padding:var(--castle-space-large) var(--operator-pad);flex:1 1 0;overflow:auto}#chat-host .task-page-body .task-feed{max-height:none;margin-top:0;overflow:visible;-webkit-mask-image:none;mask-image:none}#chat-host .task-page-body:not(.task-board-page) .task-notes{margin-top:var(--castle-space-large);padding-top:var(--castle-space-large);border-top:1px solid var(--castle-border-1)}#chat-host .task-page-body:not(.task-board-page) .task-notes:first-child{border-top:0;margin-top:0;padding-top:0}#chat-host .task-report-label{margin:0 0 var(--castle-space-small);color:var(--castle-text-primary);font-weight:700}#chat-host .task-page-empty{color:var(--castle-text-muted);margin:0}#chat-host .task-board-page{min-height:0;margin-inline:calc(-1 * var(--operator-pad));padding:var(--castle-space-large) var(--operator-pad);flex-direction:column;flex:1 1 0;display:flex;overflow:auto}#chat-host .task-archive{margin-top:var(--castle-space-base);padding-top:var(--castle-space-large);border-top:1px solid var(--castle-border-1)}#chat-host .task-archive:first-child{border-top:0;margin-top:0;padding-top:0}#chat-host .task-archive-heading{margin:0 0 var(--castle-space-large);color:var(--castle-text-muted)}#chat-host .operator-composer{flex-direction:column;flex:0 auto;min-height:0;max-height:50%;display:flex;overflow:auto}.chat-input{padding:0 var(--operator-pad) var(--operator-pad);flex:none;position:relative}#chat-host .chat-input .ta{width:100%;min-height:60px;padding:var(--castle-space-base) var(--castle-space-small);border:1px solid var(--castle-border-1);border-radius:var(--castle-radius-base);background:var(--castle-surface-2);cursor:text;flex-direction:column;display:flex;overflow:hidden}#chat-input{width:100%;min-height:21px;max-height:120px;padding:0 var(--castle-space-base);color:var(--castle-text-primary);font:inherit;font-size:var(--castle-text-size-base);resize:none;scrollbar-width:none;-ms-overflow-style:none;background:0 0;border:none;outline:none;line-height:1.5;display:block;overflow-y:auto}#chat-input::-webkit-scrollbar{width:0;height:0}#chat-input::placeholder{color:var(--castle-text-muted)}#chat-host .chat-input .ta-bottom{justify-content:space-between;align-items:center;gap:var(--castle-space-base);min-width:0;display:flex}#chat-host .composer-settings{flex:auto;min-width:0}#chat-host .composer-settings .button{min-width:0;max-width:100%;font-size:var(--castle-text-size-small);justify-content:flex-start}#chat-host .composer-settings .operator-usage-warn,#chat-host .composer-settings .operator-usage-warn:hover,#chat-host .composer-settings .operator-usage-warn[aria-pressed=true]{color:var(--castle-warn-text)}#chat-host .composer-settings .operator-usage-blocked,#chat-host .composer-settings .operator-usage-blocked:hover,#chat-host .composer-settings .operator-usage-blocked[aria-pressed=true]{color:var(--castle-danger-text)}#chat-host .queue-row .button,#chat-host .ta-bottom .button-icon{flex-shrink:0}#chat-host .composer-action{margin-right:var(--castle-space-small)}#chat-pending{gap:var(--castle-space-base);padding:0 var(--operator-pad) var(--castle-space-base);flex:none;display:flex}#chat-pending .operator-thumb{object-fit:cover;border:1px solid var(--castle-border-1);border-radius:var(--castle-radius-small);cursor:pointer;width:64px;height:44px;margin:0;display:block}#chat-host .chat-input .chat-queue{gap:var(--castle-space-small);margin-bottom:var(--castle-space-base);flex-direction:column;display:flex}#chat-host .chat-input .queue-row{align-items:center;gap:var(--castle-space-base);padding:var(--castle-space-base) var(--castle-space-base) var(--castle-space-base) var(--castle-space-large);border:1px dashed var(--castle-border-1);border-radius:var(--castle-radius-base);background:var(--castle-surface-1);color:var(--castle-text-muted);font-size:var(--castle-text-size-base);display:flex}#chat-host .chat-input .queue-snippet{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}#chat-host .picker{gap:var(--castle-space-large);width:100%;padding:var(--castle-space-large);border:1px solid var(--castle-border-1);border-radius:var(--castle-radius-base);background:var(--castle-surface-3);flex-direction:column;align-self:stretch;margin:0;display:flex}#chat-host .picker-q{border:none;min-width:0;margin:0;padding:0}#chat-host .picker-q-label{margin:0 0 var(--castle-space-base);color:var(--castle-text-primary);font-size:var(--castle-text-size-base);font-weight:inherit;padding:0}#chat-host .picker-options{gap:var(--castle-space-small);flex-direction:column;display:flex}#chat-host .picker-option{align-items:center;gap:var(--castle-space-base);padding:var(--castle-space-small) var(--castle-space-base);border-radius:var(--castle-radius-small);color:var(--castle-text-secondary);cursor:pointer;display:flex}#chat-host .picker-option input{appearance:none;border:1px solid var(--castle-border-2);border-radius:var(--castle-radius-small);background:var(--castle-surface-3);width:12px;height:12px;cursor:inherit;flex:none;place-content:center;margin:0;display:grid}#chat-host .picker-option input[type=radio]{border-radius:var(--castle-radius-pill)}#chat-host .picker-option input:checked{border-color:var(--castle-surface-light);background:var(--castle-surface-light)}#chat-host .picker-option input:before{content:"";display:block}#chat-host .picker-option input[type=radio]:checked:before{border-radius:var(--castle-radius-pill);background:var(--castle-text-dark);width:4px;height:4px}#chat-host .picker-option input[type=checkbox]:checked:before{border-left:1.5px solid var(--castle-text-dark);border-bottom:1.5px solid var(--castle-text-dark);width:6px;height:3px;margin-top:-2px;transform:rotate(-45deg)}#chat-host .picker:not(.picker-locked) .picker-option:hover,#chat-host .picker-option.is-checked{background:var(--castle-surface-5);color:var(--castle-text-primary)}#chat-host .picker-option:has(input:checked){background:var(--castle-surface-5);color:var(--castle-text-primary)}#chat-host .picker-locked{opacity:.72}#chat-host .picker-locked .picker-option{cursor:default}#chat-host .picker-actions{justify-content:flex-end;display:flex}#chat-host .chips{justify-content:flex-end;align-self:flex-end;gap:var(--castle-space-base);max-width:85%;margin:var(--castle-space-small) 0 var(--castle-space-small);flex-wrap:wrap;display:flex}#chat-host .chip{padding:var(--castle-space-base) var(--castle-space-large);border:1px dotted var(--castle-surface-light);border-radius:var(--castle-radius-pill);color:var(--castle-surface-light);font:inherit;font-size:var(--castle-text-size-base);text-align:left;cursor:pointer;background:0 0;line-height:1.3}#chat-host .chips-inert .chip{border-color:var(--castle-text-dim);color:var(--castle-text-muted);cursor:default}#chat-host .chip.is-picked,#chat-host .chips-inert .chip.is-picked{border-style:solid;border-color:var(--castle-surface-light);background:var(--castle-surface-light);color:var(--castle-text-dark)}#chat-host .msg-file{color:inherit;font:inherit;text-underline-offset:2px;text-decoration:underline;-webkit-text-decoration-color:color-mix(in srgb, currentColor 40%, transparent);text-decoration-color:color-mix(in srgb, currentColor 40%, transparent);cursor:pointer;word-break:break-all;background:0 0;border:0;margin:0;padding:0;display:inline}#chat-host .msg-file:hover{text-decoration-color:currentColor}#chat-host .picker-skeleton{pointer-events:none}#chat-host .picker-skeleton-hint{color:var(--castle-text-muted);font-size:var(--castle-text-size-base)}#chat-host .picker-skeleton-line,#chat-host .picker-skeleton-chip{border-radius:var(--castle-radius-small);background:var(--castle-border-1);display:block}#chat-host .picker-skeleton-label{width:60%;height:11px;margin-bottom:var(--castle-space-base)}#chat-host .picker-skeleton-chip{height:24px}.xterm,.xterm-viewport,.xterm-screen,.xterm-helpers{background-color:#0000!important}.xterm{overscroll-behavior:contain}.xterm-viewport{overscroll-behavior:contain;scrollbar-width:none;-ms-overflow-style:none}.xterm-viewport::-webkit-scrollbar{width:0;height:0}.xterm .xterm-scrollable-element>.scrollbar,.xterm .xterm-scrollable-element>.scrollbar.visible,.xterm .xterm-scrollable-element>.visible.scrollbar,.xterm .xterm-scrollable-element>.invisible.scrollbar,.xterm .xterm-scrollable-element>.xterm-scrollbar{opacity:0!important;pointer-events:none!important;width:0!important;min-width:0!important;height:0!important;min-height:0!important;display:none!important}.xterm .xterm-scrollable-element>.scrollbar>.slider,.xterm .xterm-scrollable-element>.scrollbar>.scra,.xterm .xterm-scrollable-element>.xterm-scrollbar>.xterm-slider{width:0!important;height:0!important;display:none!important}.xterm .xterm-scrollable-element>.shadow{display:none!important}.quick-open-backdrop{z-index:2147483100;justify-content:center;align-items:flex-start;padding-top:12vh;display:flex;position:fixed;inset:0}.quick-open{background:#232323;border:1px solid #3a3a3a;border-radius:8px;flex-direction:column;width:min(600px,90vw);max-height:60vh;display:flex;overflow:hidden;box-shadow:0 16px 48px #0009}.quick-open-input{color:#f0f0f0;background:#161616;border:1px solid #4a4a4a;border-radius:5px;outline:none;flex:none;margin:8px;padding:8px 10px;font-size:14px}.quick-open-input:focus{border-color:#5a8bd6}.quick-open-list{flex:auto;padding:4px;overflow-y:auto}.quick-open-item{color:#e6e6e6;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:4px;align-items:baseline;gap:8px;width:100%;padding:5px 8px;font-size:13px;display:flex}.quick-open-item.active{background:#37506f}.quick-open-name{white-space:nowrap;flex:none}.quick-open-dir{text-overflow:ellipsis;white-space:nowrap;color:#8a8a8a;flex:auto;min-width:0;font-size:12px;overflow:hidden}.quick-open-empty{color:#8a8a8a;text-align:center;padding:12px;font-size:13px}.quick-open-keys{color:#b0b0b0;white-space:nowrap;border:1px solid #4a4a4a;border-radius:4px;flex:none;margin-left:8px;padding:1px 6px;font-family:SFMono-Regular,Consolas,monospace;font-size:11px}.mention-picker{z-index:2147483100;background:#232323;border:1px solid #3a3a3a;border-radius:8px;width:min(360px,90vw);max-height:40vh;padding:4px;position:fixed;overflow-y:auto;box-shadow:0 16px 48px #0009}.mention-item{color:#e6e6e6;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:4px;align-items:baseline;gap:8px;width:100%;padding:5px 8px;font-size:13px;display:flex}.mention-item.active{background:#37506f}.mention-name{white-space:nowrap;flex:none}.mention-dir{text-overflow:ellipsis;white-space:nowrap;color:#8a8a8a;flex:auto;min-width:0;font-size:12px;overflow:hidden}.chord-hint{z-index:2147483200;color:#c7c7c7;background:#232323;border:1px solid #3a3a3a;border-radius:8px;align-items:center;gap:8px;padding:6px 12px;font-size:12px;display:flex;position:fixed;bottom:24px;left:50%;transform:translate(-50%);box-shadow:0 8px 24px #0000008c}.chord-hint kbd{color:#f0f0f0;background:#333;border:1px solid #4a4a4a;border-radius:4px;padding:2px 7px;font-family:SFMono-Regular,Consolas,monospace;font-size:12px}@media (pointer:coarse){input,textarea,select,[contenteditable]:not(.cm-content){font-size:16px!important}}.cm-url,.cm-md-link{color:var(--v2-link,#82aaff);text-underline-offset:2px;cursor:pointer;text-decoration:underline;text-decoration-thickness:1px}.cm-url:hover,.cm-md-link:hover{color:var(--v2-white,#fff)}._fieldRow_7dc6k_4{grid-template-columns:minmax(82px,.5fr) minmax(0,1fr);align-items:center;gap:12px;min-height:28px;margin-bottom:0;padding-bottom:12px;display:grid}._fieldRow_7dc6k_4:last-child{margin-bottom:0}._fieldLabel_7dc6k_21{color:var(--castle-inspector-text);overflow-wrap:anywhere;min-width:0;font-size:14px}._fieldLabelOverridden_7dc6k_30{color:var(--castle-override)}._fieldRowOverridden_7dc6k_34{--field-border:var(--castle-override-border)}._fieldOverride_7dc6k_41{padding-bottom:12px}._fieldOverride_7dc6k_41 ._fieldRow_7dc6k_4{padding-bottom:4px}._fieldNote_7dc6k_52{grid-template-columns:minmax(82px,.5fr) minmax(0,1fr);gap:12px;margin-top:-6px;padding-bottom:12px;display:grid}._fieldNoteInner_7dc6k_60{min-width:0;color:var(--castle-inspector-muted);grid-column:2;font-size:12px;line-height:1.35}._fieldDefault_7dc6k_68{grid-template-columns:minmax(82px,.5fr) minmax(0,1fr);gap:12px;display:grid}._fieldDefaultInner_7dc6k_74{min-width:0;color:var(--castle-inspector-muted);grid-column:2;align-items:center;gap:8px;font-size:12px;display:flex}._fieldDefaultInner_7dc6k_74>span{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}._fieldResetBtn_7dc6k_91{color:var(--castle-override);cursor:pointer;background:0 0;border:0;margin-left:auto;padding:0;font-size:12px}._fieldResetBtn_7dc6k_91:hover{color:var(--castle-inspector-text)}._input_7dc6k_34{border:1px solid var(--field-border,var(--castle-inspector-border));border-radius:var(--castle-radius);background:var(--castle-inspector-input-bg);width:100%;color:var(--castle-inspector-text);font:inherit;outline:0;padding:5px 8px}._select_7dc6k_35{appearance:none;text-overflow:ellipsis;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath d='M2.5 4.5L6 8l3.5-3.5' fill='none' stroke='%23888888' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");background-position:right 8px center;background-repeat:no-repeat;padding-right:26px}._numberField_7dc6k_128{width:100%;position:relative}._numberInput_7dc6k_133{appearance:textfield}._numberInput_7dc6k_133::-webkit-inner-spin-button{appearance:none;margin:0}._numberInput_7dc6k_133::-webkit-outer-spin-button{appearance:none;margin:0}._numberScrub_7dc6k_149{cursor:ew-resize;-webkit-user-select:none;user-select:none;align-items:center;gap:6px;padding:5px 8px;display:flex;position:relative;overflow:hidden}._numberSlider_7dc6k_161{cursor:pointer}._numberValue_7dc6k_165{z-index:1;text-align:right;font-variant-numeric:tabular-nums;flex:auto;min-width:0;position:relative}._unitSuffix_7dc6k_174{color:var(--castle-inspector-muted)}._scrubGrip_7dc6k_178{z-index:1;color:var(--castle-inspector-muted);letter-spacing:-2px;opacity:.4;flex:none;font-size:12px;line-height:1;position:relative}._scrubBubble_7dc6k_191{z-index:1001;border:1px solid var(--castle-inspector-border);color:var(--castle-inspector-text);font-variant-numeric:tabular-nums;pointer-events:none;background:#14181ef5;border-radius:8px;padding:3px 10px;font-size:15px;position:fixed;transform:translate(-50%,-100%);box-shadow:0 2px 10px #00000073}._sliderFill_7dc6k_206{pointer-events:none;z-index:0;background:#5a8cd24d;position:absolute;top:0;bottom:0;left:0}._sliderThumb_7dc6k_216{pointer-events:none;z-index:1;background:#96bef0f2;border-radius:2px;width:3px;height:60%;position:absolute;top:50%;transform:translate(-50%,-50%)}._numpadBackdrop_7dc6k_229{z-index:1000;background:#00000059;flex-direction:column;justify-content:flex-end;display:flex;position:fixed;inset:0}._numpadSheet_7dc6k_239{background:var(--castle-inspector-bg,#16181d);border-top:1px solid var(--castle-inspector-border);padding:10px 10px calc(10px + env(safe-area-inset-bottom,0px));border-radius:14px 14px 0 0;box-shadow:0 -8px 24px #0006}._numpadValueRow_7dc6k_247{justify-content:space-between;align-items:baseline;gap:12px;padding:6px 8px 12px;display:flex}._numpadValueLabel_7dc6k_258{color:var(--castle-inspector-text);text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:22px;overflow:hidden}._numpadValueNum_7dc6k_267{color:var(--castle-inspector-text);font-variant-numeric:tabular-nums;flex:none;font-size:22px}._numpadGrid_7dc6k_274{grid-template-columns:repeat(4,1fr);gap:8px;display:grid}._numpadKey_7dc6k_280{border:1px solid var(--castle-inspector-border);background:var(--castle-inspector-input-bg);height:52px;color:var(--castle-inspector-text);cursor:pointer;touch-action:manipulation;border-radius:10px;font-size:20px}._numpadKey_7dc6k_280:active{background:var(--castle-inspector-divider)}._numpadKeyZero_7dc6k_295{grid-column:span 3}._numpadKeyDone_7dc6k_299{color:#fff;background:#5a8cd2e6;border-color:#0000;font-size:16px}._colorInput_7dc6k_306{border:1px solid var(--field-border,var(--castle-inspector-border));border-radius:var(--castle-radius);background:var(--castle-inspector-input-bg);cursor:pointer;outline:0;width:100%;height:28px;padding:2px}._checkbox_7dc6k_317{border:1px solid var(--field-border,var(--castle-inspector-border));border-radius:var(--castle-radius);background:var(--castle-inspector-input-bg);cursor:pointer;width:20px;height:20px;box-shadow:none;color:var(--castle-text);flex:none;justify-content:center;justify-self:end;align-items:center;padding:0;display:flex}._checkboxOn_7dc6k_334{background:var(--castle-black)}._checkboxMark_7dc6k_338{width:12px;height:12px;display:none}._checkboxOn_7dc6k_334 ._checkboxMark_7dc6k_338{display:block}._fileField_7dc6k_350{font:inherit;box-shadow:none;cursor:pointer;align-items:center;display:flex}._fileFieldLabel_7dc6k_358{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}._fileFieldEmpty_7dc6k_365{color:var(--castle-inspector-muted)}._filePicker_7dc6k_369{z-index:200;box-sizing:border-box;border:1px solid var(--castle-inspector-border);border-radius:var(--castle-radius);background:var(--castle-workspace-bg);max-height:min(240px,100vh - 16px);padding:4px;position:fixed;overflow:auto;box-shadow:0 8px 24px #00000047}._filePickerOption_7dc6k_382{text-align:left;width:100%;color:var(--castle-inspector-text);font:inherit;cursor:pointer;background:0 0;border:0;border-radius:3px;padding:6px 8px;font-size:13px;display:block;overflow:hidden}._filePickerPath_7dc6k_397{white-space:nowrap;display:block;overflow:hidden}._filePickerOption_7dc6k_382:hover,._filePickerOptionSelected_7dc6k_404{background:var(--castle-inspector-input-bg)}.castle-file-panel,.castle-code-panel,.castle-params-panel,.castle-params-overlay,.flow-class-files{--castle-font-mono:"SFMono-Regular", Consolas, "Liberation Mono", monospace;--castle-black:var(--v2-ink);--castle-panel-raised:var(--v2-raised);--castle-border:#444;--castle-text:var(--v2-white);--castle-text-dim:var(--v2-muted);--castle-inspector-bg:var(--v2-surface);--castle-inspector-text:var(--v2-fg);--castle-inspector-muted:var(--v2-muted);--castle-inspector-border:var(--v2-border);--castle-inspector-divider:var(--v2-border);--castle-inspector-input-bg:var(--v2-raised);--castle-workspace-bg:var(--v2-surface);--castle-sheet-bg:var(--v2-surface);--castle-radius:4px}.castle-file-panel{background:var(--castle-sheet-bg);flex-direction:column;height:100%;display:flex;overflow:hidden;transform:translateZ(0)}.castle-file-panel>.fileBrowserBare{flex:1 1 0;height:auto;min-height:0}.castle-file-toolbar{border-bottom:1px solid var(--castle-inspector-border);flex-wrap:wrap;flex:none;align-items:center;gap:6px;padding:6px 8px;display:flex}.castle-file-toolbar .button-icon{margin-left:auto}.castle-file-toolbar .button-icon+.button-icon{margin-left:0}.castle-file-toolbar.versions-toolbar{padding-left:var(--castle-space-large);justify-content:space-between}.versions-toolbar-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--castle-text-muted);line-height:1;overflow:hidden}.castle-versions{flex-direction:column;flex:1 1 0;min-height:0;display:flex}.versions-error{align-items:flex-start}.versions-error>span:not(.icon-cell){white-space:pre-line}.versions-save{align-items:center;gap:var(--castle-space-base);flex-wrap:wrap;padding:0;display:flex}.versions-save .text-field{flex:130px;width:auto;min-width:0}.versions-save .button{white-space:nowrap;flex:none}.versions-note{padding:var(--castle-space-large) var(--castle-space-large) 0;color:var(--castle-text-muted);font-size:var(--castle-text-size-base)}.versions-empty{padding:var(--castle-space-large);color:var(--castle-text-muted);font-size:var(--castle-text-size-base)}.castle-versions-list{flex:1 1 0;min-height:0;overflow-y:auto}.version{align-items:start;column-gap:var(--castle-space-base);padding:var(--castle-space-base) var(--castle-space-base) var(--castle-space-large);border-bottom:1px solid var(--castle-border-1);grid-template-columns:minmax(0,1fr) auto;display:grid}.version-toggle{grid-template-columns:var(--castle-button-height) minmax(0, 1fr);align-items:start;column-gap:var(--castle-space-base);min-width:0;color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;grid-area:1/1/auto/-1;margin:0;padding:0;display:grid}.version.is-expanded:not(.version-new) .version-toggle{grid-column:1}.version-toggle:focus-visible{outline:1px solid var(--castle-border-2);outline-offset:2px}.version.later,.version.later .icon-cell,.version.later .version-message,.version.later .version-nomessage,.version.later .version-meta,.version.later .version-summary{color:var(--castle-text-dim)}.version:hover{background:var(--castle-surface-3)}.version-main{gap:var(--castle-space-small);flex-direction:column;min-width:0;display:flex}.version-heading{align-items:center;gap:var(--castle-space-base);min-width:0;min-height:var(--castle-button-height);display:flex}.version-message{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--castle-text-primary);font-size:var(--castle-text-size-base);flex:auto;overflow:hidden}.version-nomessage{color:var(--castle-text-muted);font-style:italic}.version-meta{color:var(--castle-text-muted);font-size:var(--castle-text-size-small);margin:0;display:block}.version-actions{min-height:var(--castle-button-height);flex:none;grid-area:1/2;align-items:center;display:none}.version.is-expanded .version-actions{display:flex}.version-detail{padding-left:calc(var(--castle-button-height) + var(--castle-space-base));grid-column:1/-1;display:none}.version-new{flex:none}.version.is-expanded .version-detail{gap:var(--castle-space-small);flex-direction:column;display:flex}.version-summary{color:var(--castle-text-secondary);font-size:var(--castle-text-size-base);overflow-wrap:anywhere;margin:0}.files-feedback-banner{flex:none}.fileEditInput{border:1px solid var(--castle-border);background:var(--castle-inspector-input-bg);min-width:0;color:var(--castle-inspector-text);font:inherit;border-radius:3px;flex:auto;padding:1px 4px;font-size:13px}.fileEditInput:focus{border-color:#5a8bd6;outline:none}.castle-file-menu{z-index:1000;min-width:168px;position:fixed}.castle-file-menu .menu-keys{font-family:SFMono-Regular,Consolas,monospace}.castle-file-picker{gap:var(--castle-space-small);flex-direction:column;min-width:180px;display:flex}.castle-file-picker .text-field{width:100%}.castle-file-picker-label{color:var(--castle-text-muted);margin:0}.castle-file-picker-list{gap:var(--castle-space-small);flex-direction:column;max-height:min(40vh,180px);display:flex;overflow-y:auto}.castle-file-picker-list[hidden]{display:none}.fileBrowserBare{flex-direction:column;min-width:0;height:100%;display:flex}.fileTree{min-height:0;padding:var(--castle-space-base);flex:1 1 0;overflow-y:auto}.fileBranch{min-width:0}.file-row,.file-row.folder-row{align-items:center;gap:var(--castle-space-base);width:100%;min-width:0;height:var(--castle-button-height);margin:0 0 var(--castle-space-small);padding:0 var(--castle-space-base);padding-left:calc(var(--castle-space-base) + var(--file-depth,0) * (var(--castle-button-icon-size) + var(--castle-space-base)));border-radius:var(--castle-radius-small);color:var(--castle-text-secondary);font-size:var(--castle-text-size-base);text-align:left;cursor:pointer;background:0 0;border:0;line-height:1;display:flex}.file-row.folder-row{color:var(--castle-text-muted)}.file-row>span:not(.icon-slot):not(.icon-inline):not(.icon-cell){text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.file-row:hover{background:var(--castle-surface-3);color:var(--castle-text-primary)}.file-row.imported-row{color:var(--castle-text-muted);font-style:italic}.file-row.forked-row{color:var(--castle-text-secondary);font-style:normal}.file-row.selected-row,.file-row.selected-row:hover{background:var(--castle-surface-4);color:var(--castle-text-primary)}.file-row.hidden-row{color:var(--castle-text-dim)}:is(.file-row:has(.button-icon),.file-row:has(.icon-cell)){padding-right:0}.file-row .button-icon,.file-row .icon-cell{margin-left:auto}.file-row.edit-row{height:auto;min-height:var(--castle-button-height);cursor:default;flex-wrap:wrap}.file-row.edit-row .text-field{flex:auto;width:auto}.file-suffix{color:var(--castle-text-muted);flex:none}.file-row .file-edit-feedback{padding-left:calc(var(--castle-button-icon-size) + var(--castle-space-base));padding-bottom:var(--castle-space-small);font-size:var(--castle-text-size-small);white-space:normal;flex:1 0 100%;line-height:1.45;overflow:visible}.flow-root.is-mobile .castle-file-panel,.flow-mobile-switch{--castle-button-height:var(--castle-button-height-large)}.flow-mobile-switch{--castle-text-size-small:14px;--castle-text-size-base:16px;--castle-text-style-smallcaps-size:var(--castle-text-size-small)}.flow-root.is-mobile .castle-file-panel .button:not(.button-icon){padding-left:var(--castle-space-large);padding-right:var(--castle-space-large)}.flow-root.is-mobile .file-row,.flow-mobile-switch .file-row{margin-bottom:0}.flow-root.is-mobile .file-row>span:not(.icon-slot):not(.icon-inline):not(.icon-cell),.flow-mobile-switch .file-row>span:not(.icon-slot):not(.icon-inline):not(.icon-cell){line-height:var(--castle-button-height)}.flow-root.is-mobile .file-row:hover,.flow-mobile-switch .file-row:hover{color:var(--castle-text-secondary);background:0 0}.flow-root.is-mobile .file-row.folder-row:hover,.flow-root.is-mobile .file-row.imported-row:hover,.flow-mobile-switch .file-row.folder-row:hover,.flow-mobile-switch .file-row.imported-row:hover{color:var(--castle-text-muted)}.flow-root.is-mobile .file-row.hidden-row:hover,.flow-mobile-switch .file-row.hidden-row:hover{color:var(--castle-text-dim)}.flow-root.is-mobile .file-row.selected-row:hover,.flow-mobile-switch .file-row.selected-row:hover{background:var(--castle-surface-4);color:var(--castle-text-primary)}.flow-root.is-mobile .version:hover{background:0 0}.castle-code-panel{flex-direction:column;width:100%;height:100%;display:flex;position:relative}.mainEditor{background:var(--castle-sheet-bg);flex-direction:column;flex:1 1 0;width:100%;min-width:0;height:100%;min-height:0;display:flex}.editorBody{flex:1;min-height:0;display:flex;overflow:hidden;container:editor/inline-size}.codeEditor{background:var(--castle-workspace-bg);flex:1;grid-template-columns:1fr;min-width:0;min-height:0;display:grid}.codeMirrorHost{min-width:0;height:100%;min-height:0}.castle-code-overlay{color:var(--castle-inspector-muted);pointer-events:none;font-size:12px;position:absolute;top:10px;left:12px}.castle-code-overlay.castle-code-error{color:var(--v2-error)}.castle-code-savebar{background:var(--v2-error-bg);color:var(--v2-error);padding:4px 10px;font-size:11px;position:absolute;bottom:0;left:0;right:0}.castle-tab-import{color:var(--v2-muted);font-style:italic}.castle-modal-scrim{z-index:1000;background:#00000080;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.castle-modal{color:#e8e8e8;background:#232323;border:1px solid #3a3a3a;border-radius:6px;min-width:260px;max-width:380px;padding:16px;font-size:13px;box-shadow:0 8px 24px #0000008c}.castle-modal-text{margin-bottom:14px}.castle-modal-actions{justify-content:flex-end;gap:8px;margin-top:16px;display:flex}.castle-modal-actions button,.castle-import-link-row button{color:#e8e8e8;cursor:pointer;background:#2e2e2e;border:1px solid #3a3a3a;border-radius:4px;padding:5px 12px;font-size:12px}.castle-modal-actions button:hover:not(:disabled),.castle-import-link-row button:hover:not(:disabled){background:#383838}.castle-modal-actions button:disabled,.castle-import-link-row button:disabled{opacity:.6;cursor:default}.castle-upload-modal{flex-direction:column;gap:10px;width:min(460px,100vw - 24px);max-width:none;max-height:calc(100vh - 32px);display:flex;overflow-y:auto}.castle-upload-modal>.castle-modal-text{margin-bottom:0}.castle-upload-modal>.castle-file-picker{width:100%;min-width:0}.castle-upload-input{opacity:0;pointer-events:none;width:1px;height:1px;position:absolute}.castle-upload-drop{justify-content:center;align-items:center;gap:var(--castle-space-small);width:100%;padding:calc(var(--castle-space-large) + var(--castle-space-base)) var(--castle-space-large);border:1px dashed var(--castle-border-3);border-radius:var(--castle-radius-small);background:var(--castle-surface-3);color:var(--castle-text-primary);font:inherit;cursor:pointer;flex-direction:column;display:flex}.castle-upload-drop:hover,.castle-upload-drop.over{border-color:var(--castle-border-2);background:var(--castle-surface-5)}.castle-upload-drop svg{font-size:var(--castle-button-icon-size)}.castle-upload-drop-label{font-size:var(--castle-text-size-base)}.castle-upload-drop-hint{color:var(--castle-text-muted);font-size:var(--castle-text-size-small)}.castle-upload-picked{flex-direction:column;max-height:132px;display:flex;overflow-y:auto}.castle-upload-picked-row{align-items:center;gap:var(--castle-space-base);min-height:var(--castle-button-height);padding:var(--castle-space-small) 0;display:flex}.castle-upload-picked-row+.castle-upload-picked-row{border-top:1px solid var(--castle-border-1)}.castle-upload-picked-name{min-width:0;font-size:var(--castle-text-size-base);flex-direction:column;flex:auto;justify-content:center;display:flex}.castle-upload-picked-label{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.castle-upload-picked-name .text-field{width:100%}.castle-upload-picked-warning{color:var(--castle-warn-text);font-size:var(--castle-text-size-small);white-space:normal;margin-top:2px;display:block}.castle-upload-picked-size{color:var(--castle-text-muted);font-size:var(--castle-text-size-small);font-variant-numeric:tabular-nums;flex:none}.castle-upload-status{text-overflow:ellipsis;white-space:nowrap;opacity:.7;text-align:left;flex:auto;min-width:0;font-size:12px;overflow:hidden}@media (width<=520px){.castle-upload-modal{width:calc(100vw - 16px);min-width:0;padding:12px}.castle-upload-drop{padding:var(--castle-space-large) var(--castle-space-base)}.castle-upload-picked{max-height:104px}.castle-file-picker-list{max-height:132px}}.castle-import-modal{flex-direction:column;width:min(520px,100vw - 32px);max-width:none;height:min(560px,100vh - 64px);max-height:none;display:flex}.castle-import-modal>.castle-modal-text,.castle-import-modal>.castle-key-tabs,.castle-import-modal>.castle-import-select-bar,.castle-import-modal>.castle-import-filter,.castle-import-modal>.castle-import-note,.castle-import-modal>.castle-import-error,.castle-import-modal>.castle-modal-actions{flex:none}.castle-import-select-bar{align-items:center;gap:10px;margin-bottom:8px;display:flex}.castle-import-select-all{padding:4px 8px}.castle-import-update-row{align-items:center}.castle-import-tick{color:#1b1b1b;border:1px solid #5a5a5a;border-radius:3px;flex:none;justify-content:center;align-items:center;width:16px;height:16px;font-size:10px;display:flex}.castle-import-tick.checked{background:#8ab4f8;border-color:#8ab4f8}.castle-import-filter{margin-bottom:8px}.castle-import-empty{color:#9a9a9a;text-align:center;flex:auto;justify-content:center;align-items:center;min-height:0;padding:10px;font-size:11px;display:flex}.castle-import-tabs .castle-key-tab{min-height:34px}.castle-import-list{background:#1b1b1b;border:1px solid #3a3a3a;border-radius:4px;flex:auto;min-height:0;overflow-y:auto}.castle-import-row{color:#e8e8e8;width:100%;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-bottom:1px solid #2e2e2e;gap:10px;padding:8px;font-size:12px;display:flex}.castle-import-row:last-child{border-bottom:0}.castle-import-row:hover{background:#262626}.castle-import-row.selected{background:#3a3a3a}.castle-import-row.disabled{opacity:.5}.castle-import-thumb{object-fit:cover;background:#2e2e2e;border-radius:3px;flex:none;width:56px;height:79px}.castle-import-row-text{flex-direction:column;gap:3px;min-width:0;display:flex}.castle-import-row-title{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.castle-import-row-meta{color:#9a9a9a;font-size:11px}.castle-import-link{flex-direction:column;flex:auto;gap:8px;min-height:0;display:flex}.castle-import-link-row{gap:8px;display:flex}.castle-import-link-row button{white-space:nowrap}.castle-import-note{color:#9a9a9a;padding:10px 2px;font-size:11px}.castle-import-error{color:#ff8f8f;margin-top:8px;font-size:11px}.castle-code-params-strip{border:0;border-bottom:1px solid var(--castle-inspector-border);background:var(--castle-inspector-input-bg);width:100%;color:var(--castle-inspector-muted);font:inherit;text-align:left;cursor:pointer;align-items:center;gap:8px;padding:6px 12px;font-size:12px;display:flex}.castle-code-params-strip:hover{color:var(--castle-inspector-text)}.castle-code-params-icon{flex:none;display:inline-flex}.castle-code-params-count{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.castle-code-params-action{color:var(--castle-inspector-text);flex:none;margin-left:auto}.castle-code-selection-bar{z-index:2;position:absolute;bottom:12px;right:12px}.castle-params-panel{background:var(--castle-sheet-bg);height:100%;color:var(--castle-inspector-text);-webkit-overflow-scrolling:touch;font-size:14px;overflow:hidden auto}.paramsFields{padding:10px 16px 24px}.paramsGroup+.paramsGroup{margin-top:6px}.paramsGroupTitle{color:var(--castle-inspector-muted);text-transform:uppercase;letter-spacing:.06em;overflow-wrap:anywhere;margin:0 0 10px;font-size:12px}.paramsGroup+.paramsGroup>.paramsGroupTitle{border-top:1px solid var(--castle-inspector-divider);margin-top:10px;padding-top:10px}.paramsNotice{color:var(--castle-inspector-muted);padding:16px}.paramsSaveError{border-bottom:1px solid var(--castle-inspector-border);color:var(--castle-inspector-text);background:#be464629;padding:8px 16px;font-size:13px}.paramsNoticeRow{align-items:center;gap:10px;display:flex}.paramsNoticeAction{border:1px solid var(--castle-inspector-border);border-radius:var(--castle-radius);background:var(--castle-inspector-input-bg);color:var(--castle-inspector-text);font:inherit;cursor:pointer;flex:none;margin-left:auto;padding:2px 10px}.paramsNoticeAction:hover{border-color:var(--castle-inspector-muted)}.paramsScopeBar{z-index:2;border-bottom:1px solid var(--castle-inspector-border);background:var(--castle-sheet-bg);align-items:center;gap:8px;padding:6px 10px;display:flex;position:sticky;top:0}.paramsScopeButton{border:1px solid var(--castle-inspector-border);border-radius:var(--castle-radius);background:var(--castle-inspector-input-bg);min-width:0;color:var(--castle-inspector-text);font:inherit;cursor:pointer;align-items:center;gap:6px;padding:4px 8px;font-size:13px;display:flex}.paramsScopeIcon,.paramsScopeChevron{flex:none;display:inline-flex}.paramsScopeLabel{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.paramsScopeSummary{color:var(--castle-inspector-muted);font-size:12px}.paramsScopeMenu{max-width:calc(100% - 16px);max-height:60vh;position:absolute;top:100%;left:8px;overflow-y:auto}.paramsScopeMenu .menu-item-label{text-overflow:ellipsis;white-space:nowrap;text-align:left;direction:rtl;overflow:hidden}.paramsScopeDivider{color:var(--castle-inspector-muted);text-transform:uppercase;letter-spacing:.06em;padding:6px 10px 4px;font-size:11px}.paramsScopeCount,.paramsFileCount{color:var(--castle-inspector-muted);font-variant-numeric:tabular-nums;flex:none;margin-left:auto;padding-left:10px;font-size:12px}.paramsFile+.paramsFile{border-top:1px solid var(--castle-inspector-divider)}.paramsFileHead{align-items:center;padding:0 6px 0 0;display:flex}.paramsFileHead~.paramsFields{padding-bottom:6px}.paramsFileToggle{min-width:0;color:var(--castle-inspector-text);font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;flex:1;align-items:center;gap:6px;padding:8px 4px 8px 10px;font-size:12px;display:flex}.paramsFileChevron{color:var(--castle-inspector-muted);flex:none;display:inline-flex}.paramsFilePath{text-overflow:ellipsis;white-space:nowrap;text-align:left;min-width:0;font-family:var(--castle-font-mono);direction:rtl;overflow:hidden}.paramsFileOpen,.paramsHistoryButton{border-radius:var(--castle-radius);color:var(--castle-inspector-muted);cursor:pointer;background:0 0;border:0;flex:none;padding:4px 6px;display:inline-flex}.paramsFileOpen:hover,.paramsHistoryButton:not(:disabled):hover{color:var(--castle-inspector-text)}.paramsHistoryButton:disabled{opacity:.35;cursor:default}.paramsScopeActions{align-items:center;gap:2px;margin-left:auto;display:flex}.paramsEmpty{max-width:46em;padding:20px 16px}.paramsEmptyLead{color:var(--castle-inspector-text);margin:0 0 10px;font-size:15px}.paramsEmptyBody{color:var(--castle-inspector-muted);margin:0 0 12px;line-height:1.5}.paramsEmpty code{font-family:var(--castle-font-mono);color:var(--castle-inspector-text);font-size:13px}.paramsEmptyCode{border:1px solid var(--castle-inspector-border);border-radius:var(--castle-radius);background:var(--castle-inspector-input-bg);color:var(--castle-inspector-text);font-family:var(--castle-font-mono);margin:0 0 14px;padding:10px 12px;font-size:13px;line-height:1.45;overflow-x:auto}.castle-params-panel .paramExpr,.castle-params-panel .paramFoldedSource{text-overflow:ellipsis;white-space:nowrap;border:1px dashed var(--castle-inspector-border);border-radius:var(--castle-radius);min-width:0;color:var(--castle-inspector-muted);font-family:var(--castle-font-mono);cursor:default;padding:5px 8px;font-size:13px;overflow:hidden}.castle-params-panel .paramFoldedSource{max-width:100%;margin-right:6px;padding:1px 5px;font-size:11px;display:inline-block}.castle-params-panel .paramExprLink{width:100%;font:inherit;font-family:var(--castle-font-mono);text-align:left;cursor:pointer;background:0 0;align-items:center;gap:6px;font-size:13px;display:flex}.castle-params-panel .paramExprSource{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.castle-params-panel .paramExprLink:hover{color:var(--castle-inspector-text);border-style:solid}.castle-params-panel [data-field-id].paramFieldRevealed{animation:1.4s ease-out paramFieldReveal}@keyframes paramFieldReveal{0%,60%{background:var(--castle-inspector-input-bg);box-shadow:0 0 0 4px var(--castle-inspector-input-bg)}to{background:0 0;box-shadow:0 0 0 4px #0000}}.xterm{cursor:text;-webkit-user-select:none;user-select:none;position:relative}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{z-index:5;position:absolute;top:0}.xterm .xterm-helper-textarea{opacity:0;z-index:-5;white-space:nowrap;resize:none;border:0;width:0;height:0;margin:0;padding:0;position:absolute;top:0;left:-9999em;overflow:hidden}.xterm .composition-view{color:#fff;white-space:nowrap;z-index:1;background:#000;display:none;position:absolute}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{cursor:default;background-color:#000;position:absolute;inset:0;overflow-y:scroll}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;top:0;left:0}.xterm-char-measure-element{visibility:hidden;line-height:normal;display:inline-block;position:absolute;top:0;left:-9999em}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{z-index:10;color:#0000;pointer-events:none;position:absolute;inset:0}.xterm .xterm-accessibility-tree:not(.debug) ::selection{color:#0000}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre;font-family:monospace}.xterm .xterm-accessibility-tree>div{transform-origin:0;width:fit-content}.xterm .live-region{width:1px;height:1px;position:absolute;left:-9999px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{-webkit-text-decoration:underline double;text-decoration:underline double}.xterm-underline-3{-webkit-text-decoration:underline wavy;text-decoration:underline wavy}.xterm-underline-4{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.xterm-underline-5{-webkit-text-decoration:underline dashed;text-decoration:underline dashed}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:underline overline}.xterm-overline.xterm-underline-2{-webkit-text-decoration:overline double underline;text-decoration:overline double underline}.xterm-overline.xterm-underline-3{-webkit-text-decoration:overline wavy underline;text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{-webkit-text-decoration:overline dotted underline;text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{-webkit-text-decoration:overline dashed underline;text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;pointer-events:none;position:absolute;top:0;right:0}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;z-index:11;background:0 0;transition:opacity .1s linear}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{display:none;position:absolute}.xterm .xterm-scrollable-element>.shadow.top{width:100%;height:3px;box-shadow:var(--vscode-scrollbar-shadow,#000) 0 6px 6px -6px inset;display:block;top:0;left:3px}.xterm .xterm-scrollable-element>.shadow.left{width:3px;height:100%;box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset;display:block;top:3px;left:0}.xterm .xterm-scrollable-element>.shadow.top-left-corner{width:3px;height:3px;display:block;top:0;left:0}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset}@font-face{font-family:Basteleur;src:url(/__castle/ide/assets/Basteleur-Bold-DKFKedNb.woff2)format("woff2"),url(/__castle/ide/assets/Basteleur-Bold-CK8LF7Pt.woff)format("woff");font-weight:700;font-style:normal}.flow-root{--flow-gutter:#000;--flow-surface:#181818;--flow-chip:#282828;--flow-font-display:"Basteleur", Georgia, "Times New Roman", serif;--flow-fg:#e6e6e6;--flow-secondary:#b3b3b3;--flow-muted:#888;--flow-dim:#525252;--flow-border:#2a2a2a;--flow-border-active:#5a5a5a;--flow-gap:12px;--flow-dock-h:36px;--flow-tab-h:var(--castle-panel-header-height);--flow-icon-dock:var(--castle-button-icon-size);--flow-btn-sm:var(--castle-button-height);--flow-host-l:0px;--flow-host-r:0px;--flow-max-chips:6;--flow-chip-size:36px;--flow-chips-w:calc(var(--flow-max-chips) * var(--flow-chip-size));--flow-fade:22px;background:var(--flow-gutter);color:var(--flow-fg);flex-direction:column;font:13px ui-sans-serif,system-ui,-apple-system,sans-serif;display:flex;position:fixed;inset:0;overflow:hidden}.flow-root *{box-sizing:border-box}body.flow-reordering,body.flow-reordering *{touch-action:none;-webkit-user-select:none!important;user-select:none!important;cursor:grabbing!important}.flow-topbar{top:var(--flow-gap);left:var(--flow-gap);right:var(--flow-gap);height:var(--flow-dock-h);align-items:center;gap:var(--castle-space-base);z-index:40;pointer-events:none;padding-left:var(--flow-host-l);padding-right:var(--flow-host-r);grid-template-columns:minmax(0,1fr) minmax(0,auto) minmax(0,1fr);display:grid;position:absolute}.flow-topbar-leading{justify-self:start;align-items:center;gap:var(--castle-space-base);pointer-events:none;min-width:0;display:flex}.flow-topbar-leading>*{pointer-events:auto}.flow-castle-wrap{flex-shrink:0;position:relative}.flow-menu-backdrop{z-index:49;position:fixed;inset:0}.flow-castle-menu{top:calc(var(--flow-dock-h) + var(--castle-space-base));z-index:50;position:absolute;left:0}.flow-menu-narrow{display:none}.flow-deck-identity{max-width:260px}.flow-deck-vis{color:var(--flow-secondary);flex-shrink:0;font-size:14px;display:inline-flex}.flow-deck-vis svg{width:14px;height:14px}.flow-deck-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.flow-deck-caret{color:var(--flow-muted);flex-shrink:0;display:inline-flex}.flow-draft-status{color:var(--flow-muted);font-size:var(--castle-text-size-small);white-space:nowrap;flex-shrink:0}.flow-draft-status.is-error{color:var(--castle-danger-text)}.flow-tabs-wrap{pointer-events:auto;justify-self:center;align-items:center;gap:var(--castle-space-base);min-width:0;max-width:100%;display:flex}.flow-tabs{min-width:0;max-width:var(--flow-chips-w);flex:0 auto;position:relative}.flow-tabs-scroll{scrollbar-width:none;align-items:stretch;gap:0;height:100%;padding:0;display:flex;overflow:auto hidden}.flow-tabs-scroll::-webkit-scrollbar{display:none}.flow-tabs.more-left{-webkit-mask-image:linear-gradient(to right, transparent, #000 var(--flow-fade));-webkit-mask-image:linear-gradient(to right, transparent, #000 var(--flow-fade));mask-image:linear-gradient(to right, transparent, #000 var(--flow-fade));border-top-left-radius:0;border-bottom-left-radius:0}.flow-tabs.more-right{-webkit-mask-image:linear-gradient(to left, transparent, #000 var(--flow-fade));-webkit-mask-image:linear-gradient(to left, transparent, #000 var(--flow-fade));mask-image:linear-gradient(to left, transparent, #000 var(--flow-fade));border-top-right-radius:0;border-bottom-right-radius:0}.flow-tabs.more-left.more-right{-webkit-mask-image:linear-gradient(to right, transparent, #000 var(--flow-fade), #000 calc(100% - var(--flow-fade)), transparent);-webkit-mask-image:linear-gradient(to right, transparent, #000 var(--flow-fade), #000 calc(100% - var(--flow-fade)), transparent);mask-image:linear-gradient(to right, transparent, #000 var(--flow-fade), #000 calc(100% - var(--flow-fade)), transparent)}.button.flow-tabs-add{width:var(--castle-button-height-large);height:var(--castle-button-height-large);border-radius:var(--castle-radius-base);flex-shrink:0}.flow-chip-icon{font-size:var(--flow-icon-dock);display:inline-flex}.flow-chip-icon svg{width:var(--flow-icon-dock);height:var(--flow-icon-dock)}.flow-topbar-trailing{justify-self:end;align-items:center;gap:var(--castle-space-base);pointer-events:none;min-width:0;display:flex}.flow-preview-btn{pointer-events:auto;flex-shrink:0}.flow-preview-btn-failed{color:var(--castle-danger-text);border-color:var(--castle-danger-text)}.flow-preview-label{justify-items:center;display:grid}.flow-preview-label>*{grid-area:1/1}.flow-preview-label-sizer{visibility:hidden;pointer-events:none}.flow-root.is-mobile{--flow-max-chips:4;--flow-gap:var(--castle-space-base);--castle-text-size-small:14px;--castle-text-size-base:16px;--castle-text-style-smallcaps-size:var(--castle-text-size-small);--flow-tab-h:var(--castle-panel-header-height-mobile);--flow-icon-dock:var(--castle-button-icon-size-large);--flow-btn-sm:var(--castle-button-height-large)}.flow-root.is-mobile .flow-deck-identity,.flow-root.is-mobile .flow-topbar-trailing{display:none}.flow-root.is-mobile .flow-topbar{grid-template-columns:auto minmax(0,1fr)}.flow-root.is-mobile .flow-tabs-wrap{justify-self:start}.flow-root.is-mobile .flow-topbar-leading:not(:has(.flow-castle-wrap)):not(:has(.flow-draft-status)){display:none}.flow-root.is-mobile .menu-item.flow-menu-narrow{display:flex}.flow-root.is-mobile .menu-separator.flow-menu-narrow{display:block}.flow-scroller{flex:auto;min-height:0;overflow:auto}.flow-field{width:max-content;min-width:100%;min-height:100%}.flow-row{align-items:flex-start;gap:var(--flow-gap);width:max-content;min-height:100%;padding:calc(var(--flow-dock-h) + var(--flow-gap) * 2) var(--flow-gap) var(--flow-gap);padding-right:calc(var(--flow-gap) + var(--flow-overscroll,0px));display:flex}.flow-group{flex-direction:column;min-width:200px;display:flex;overflow:clip}.flow-root.is-mobile .panel:hover,.flow-root.is-mobile .panel.is-hover,.flow-root.is-maximized .panel:hover,.flow-root.is-maximized .panel.is-hover{border-color:var(--castle-border-1)}.flow-root.is-mobile .panel-header:hover,.flow-root.is-mobile .panel-tabs-header:hover{background:var(--castle-surface-3);cursor:default}.operator-chrome{align-items:stretch;gap:var(--castle-space-base);flex:auto;min-width:0;display:flex}.operator-chrome .panel-type-toggle{flex-shrink:0}.flow-root.is-mobile .operator-chrome{display:contents}.flow-tab-icon{font-size:var(--flow-icon-dock);flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.flow-drop-indicator{background:var(--castle-border-4);z-index:60;pointer-events:none;border-radius:2px;width:3px;position:fixed;transform:translate(-50%)}.flow-group.pinned{left:var(--flow-gap);z-index:5;position:sticky;box-shadow:0 6px 24px #00000073}.flow-panel-body{flex:auto;min-height:0;position:relative;overflow:hidden}.flow-panel-slot{width:100%;height:100%}.flow-resize-e{top:var(--flow-tab-h);cursor:col-resize;touch-action:none;z-index:20;width:16px;position:absolute;bottom:0;right:-8px}.flow-resize-s{cursor:row-resize;touch-action:none;z-index:20;height:16px;position:absolute;bottom:-8px;left:0;right:0}.flow-resize-se{cursor:nwse-resize;touch-action:none;z-index:21;width:22px;height:22px;position:absolute;bottom:-11px;right:-11px}.flow-placeholder{height:100%;color:var(--flow-muted);text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:8px;padding:16px;display:flex}.flow-placeholder-icon :is(svg){width:34px;height:34px}.flow-placeholder-label{color:var(--flow-secondary);font-size:14px}.flow-placeholder-kind{color:var(--flow-muted);font:11px ui-monospace,SFMono-Regular,Menlo,monospace}.flow-placeholder.kind-play{background:repeating-linear-gradient(45deg,#101018,#101018 10px,#0d0d14 10px 20px)}.flow-picker{z-index:50;max-height:min(60vh,420px);position:fixed}.flow-picker-input{margin-bottom:var(--castle-space-base);color:var(--flow-fg);background:var(--flow-surface);border:1px solid var(--flow-border);border-radius:var(--castle-radius-small);outline:none;flex:none;padding:7px 9px;font:13px ui-sans-serif,system-ui,sans-serif}.flow-picker-input:focus{border-color:var(--flow-border-active)}.flow-picker-list{flex:auto;min-height:0;overflow-y:auto}.flow-picker-empty{color:var(--flow-muted);padding:10px 8px;font-size:12px}.flow-operator-host{width:100%;height:100%}.flow-root.is-maximized .flow-scroller{overflow:hidden}.flow-root.is-maximized .flow-field,.flow-root.is-maximized .flow-row{width:100%;height:100%}.flow-root.is-maximized .flow-row{align-items:stretch}.flow-group.maximized{width:100%;height:100%}.flow-group.hidden{display:none}.flow-root.is-mobile .flow-scroller{position:relative;overflow:clip}.flow-root.is-mobile .flow-field{inset:calc(var(--flow-dock-h) + var(--flow-gap) * 2) 0 var(--flow-gap);width:auto;min-width:0;height:auto;min-height:0;position:absolute;overflow:clip}.flow-root.is-mobile .flow-row{width:100%;height:100%;transform:translateX(calc(var(--flow-page,0) * -100% + var(--flow-drag,0px)));will-change:transform;flex-wrap:nowrap;align-items:stretch;gap:0;padding:0;transition:transform .28s cubic-bezier(.22,.61,.36,1);display:flex}.flow-root.is-mobile.flow-dragging .flow-row{transition:none}.flow-root.is-mobile .flow-group{flex:0 0 100%;min-width:0;margin:0}.flow-root.is-mobile .flow-resize-e,.flow-root.is-mobile .flow-resize-s,.flow-root.is-mobile .flow-resize-se{display:none}@media (prefers-reduced-motion:reduce){.flow-root.is-mobile .flow-row{transition:none}}.flow-push-modal-backdrop{z-index:1000;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);pointer-events:auto;background:#0000008c;justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;inset:0}.flow-push-modal{border:1px solid var(--flow-border);text-align:center;background:#141414;border-radius:18px;flex-direction:column;align-items:center;gap:10px;width:min(360px,100%);padding:28px 24px;display:flex;box-shadow:0 20px 60px #0009}.flow-push-spinner{border:3px solid #ffffff26;border-top-color:var(--flow-fg);border-radius:50%;width:34px;height:34px;animation:.8s linear infinite flow-push-spin}@keyframes flow-push-spin{to{transform:rotate(360deg)}}.flow-push-check{color:#fff;background:#2e7d32;border-radius:50%;justify-content:center;align-items:center;width:34px;height:34px;font-size:20px;font-weight:700;display:flex}.flow-push-check-failed{background:var(--castle-danger-surface)}.flow-push-title{color:var(--flow-fg);font-size:16px;font-weight:600}.flow-push-sub{color:var(--flow-secondary);font-size:12px}.flow-push-url{overflow-wrap:anywhere;color:#7aa2ff;max-width:100%;font:13px ui-monospace,SFMono-Regular,Menlo,monospace;text-decoration:none}.flow-push-url:hover{text-decoration:underline}.flow-push-done{background:var(--flow-fg);color:var(--flow-gutter);cursor:pointer;border:none;border-radius:999px;margin-top:8px;padding:9px 24px;font-size:14px;font-weight:600}.flow-tabstrip{height:var(--flow-tab-h);-webkit-user-select:none;user-select:none;touch-action:none;flex-shrink:0}.flow-tabs-row{position:relative;overflow:hidden}.flow-tabs-row .panel-tab{flex:0 auto;min-width:0}.flow-tab-icon svg{width:var(--flow-icon-dock);height:var(--flow-icon-dock)}.flow-tabs-row .panel-tab-insert{z-index:3;height:auto;position:absolute;top:0;bottom:0}.panel-tab-ghost,.dock-segment-ghost{z-index:80;position:fixed}.flow-tabstrip .button{flex-shrink:0;align-self:center}.flow-tab-body{position:absolute;inset:0}.flow-tab-body.inactive{display:none}.flow-class-drawer{background:var(--castle-sheet-bg,var(--v2-surface));border-right:1px solid var(--flow-border);flex-direction:column;flex:none;width:220px;min-height:0;padding:2px 4px 6px;display:flex;overflow:hidden}.flow-class-files{flex:auto;min-height:0;overflow-y:auto}.flow-class-files .fileBrowserBare,.flow-class-files .fileTree{flex:none;height:auto;overflow:visible}.flow-class-recent{border-bottom:1px solid var(--castle-inspector-divider,var(--flow-border));margin-bottom:10px;padding-bottom:10px}.flow-class-section{color:var(--v2-muted,var(--flow-muted));padding:5px 9px;font-size:14px}.flow-class-drawer .flow-view-segments{margin:4px 2px 8px}.flow-class-drawer-empty{color:var(--flow-muted);padding:10px 8px;font-size:12px}.flow-empty-editor{flex:auto;height:100%;min-height:0;display:flex}.flow-empty-editor .flow-class-drawer{flex:0 0 220px}.flow-empty-editor-msg{color:var(--flow-muted);background:var(--castle-sheet-bg,var(--v2-surface));flex:auto;justify-content:center;align-items:center;font-size:13px;display:flex}.flow-tabstrip-mobile{cursor:default;grid-template-columns:1fr auto 1fr;align-items:center;display:grid}.flow-mobile-strip-left,.flow-mobile-strip-right{align-items:center;min-width:0;display:flex}.flow-mobile-strip-left{justify-content:flex-start}.flow-mobile-strip-right{justify-content:flex-end}.flow-tabstrip-mobile .panel-header-actions{margin-left:0}.panel-mobile-current .flow-tab-icon,.panel-mobile-current .flow-tab-icon svg{width:var(--castle-button-icon-size-large);height:var(--castle-button-icon-size-large)}.flow-mobile-chevron{width:var(--castle-button-icon-size-large);height:var(--castle-button-icon-size-large);opacity:.6;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.flow-mobile-chevron svg{width:var(--castle-button-icon-size-large);height:var(--castle-button-icon-size-large);display:block}.flow-mobile-switch-backdrop{z-index:900;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);pointer-events:auto;background:#0000008c;align-items:flex-end;display:flex;position:fixed;inset:0}.flow-mobile-switch{border-top:1px solid var(--flow-border);background:#141414;border-radius:16px 16px 0 0;flex-direction:column;width:100%;max-height:70vh;display:flex;overflow:hidden}.flow-mobile-switch-header{border-bottom:1px solid var(--flow-border);justify-content:space-between;align-items:center;padding:14px 16px;font-weight:600;display:flex}.flow-mobile-switch-close{color:var(--flow-secondary);cursor:pointer;background:0 0;border:none;font-size:22px;line-height:1}.flow-view-segments{background:var(--v2-inset,#0e0e0e);border-radius:8px;flex:none;gap:2px;margin:10px 16px 6px;padding:2px;display:flex}.flow-view-segment{color:var(--flow-secondary);font:inherit;cursor:pointer;background:0 0;border:none;border-radius:6px;flex:1 1 0;padding:7px 10px;font-size:13px;font-weight:600}.flow-view-segment.on{color:var(--flow-text,#eee);background:#282828}.flow-mobile-switch-list{background:var(--v2-surface,#141414);flex-direction:column;flex:auto;min-height:0;display:flex;overflow:hidden}.flow-mobile-switch-list .flow-class-files{padding:4px 6px 10px}
|
|
@@ -446,4 +446,4 @@ Please report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error
|
|
|
446
446
|
|
|
447
447
|
`),chips:n}}function yJ(e,t){let n=[],r=e.map((r,i)=>{if(r.kind!==`md`)return r;let a=vJ(r.text,t&&i===e.length-1);for(let e of a.chips)n.includes(e)||n.push(e);return{kind:`md`,text:a.prose}});return n.length>0&&r.push({kind:`chips`,chips:n}),r}function bJ(e){let t;try{t=JSON.parse(e)}catch{return null}if(!t||!Array.isArray(t.questions))return null;let n=[];return t.questions.forEach((e,t)=>{let r=e;if(!r||typeof r.q!=`string`||!Array.isArray(r.options))return;let i=r.options.filter(e=>typeof e==`string`&&e.trim()!==``);if(i.length===0)return;let a=typeof r.id==`string`&&r.id.trim()?r.id.trim():`q${t}`;n.push({id:a,q:r.q,options:i,multi:r.multi===!0})}),n.length===0?null:{questions:n}}function xJ(e,t=!1){let n=!1;if((e.split("```").length-1)%2==1){let t=e.lastIndexOf("```"),r=e.slice(t+3),i=r.indexOf(`
|
|
448
448
|
`),a=(i===-1?r:r.slice(0,i)).trim();i===-1?a===``?e=e.slice(0,t):`ask`.startsWith(a)&&(e=e.slice(0,t),n=!0):a===`ask`&&(e=e.slice(0,t),n=!0)}let r=[],i=0,a;for(gJ.lastIndex=0;(a=gJ.exec(e))!==null;){let t=bJ(a[1]);t&&(a.index>i&&r.push({kind:`md`,text:e.slice(i,a.index)}),r.push({kind:`ask`,spec:t}),i=a.index+a[0].length)}return i<e.length&&r.push({kind:`md`,text:e.slice(i)}),r.length===0&&!n&&r.push({kind:`md`,text:e}),n&&r.push({kind:`ask-pending`}),yJ(r,t)}function SJ(e){return e.some(e=>e.kind===`ask`||e.kind===`ask-pending`||e.kind===`chips`||e.kind===`md`&&e.text.trim()!==``)}function CJ(e,t){let n=[];for(let r of e.questions){let e=(t[r.id]??[]).filter(e=>r.options.includes(e));e.length!==0&&n.push(`- ${r.q} \u2192 ${e.join(`, `)}`)}return n.length?`Here's what I picked:\n${n.join(`
|
|
449
|
-
`)}`:``}var wJ={thinking:(0,U.jsx)(W,{name:`lightbulb`}),reading:(0,U.jsx)(W,{name:`book`}),building:(0,U.jsx)(W,{name:`hammer`}),painting:(0,U.jsx)(W,{name:`pencil`}),playing:(0,U.jsx)(W,{name:`gamepad`})},TJ={thinking:`Thinking`,reading:`Reading files`,building:`Editing logic`,painting:`Editing art`,playing:`Playtesting`},EJ={thinking:`#FFC826`,reading:`#FFC826`,building:`#FFEB57`,painting:`#FFEB57`,playing:`#D3FC7E`};function DJ(e){if(e.status===`done`)return{icon:(0,U.jsx)(W,{name:`check`}),color:`#5AC54F`};if(e.status===`failed`)return{icon:(0,U.jsx)(W,{name:`times`}),color:`#F5545D`};if(e.status===`interrupted`)return{icon:(0,U.jsx)(W,{name:`stop`}),color:`#B4B4B4`};if(e.status===`blocked`)return{icon:(0,U.jsx)(W,{name:`stop`}),color:`#F5A623`};let t=e.avatar&&wJ[e.avatar]?e.avatar:`thinking`;return{icon:wJ[t],color:EJ[t]}}function OJ(e){let t=Math.max(1,Math.round((e??0)/1e3));if(t<60)return`Thought for ${t}s`;let n=Math.floor(t/60),r=t%60;return r===0?`Thought for ${n}m`:`Thought for ${n}m ${r}s`}var kJ=`plan.md`;function AJ(){let e=Yx();return(0,U.jsxs)(`div`,{className:`operator-line msg-plan`,children:[(0,U.jsx)(W,{name:`file-md`,className:`icon-inline`}),(0,U.jsxs)(`span`,{children:[(0,U.jsx)(`button`,{type:`button`,className:`operator-line-link`,title:`Open ${kJ}`,onClick:()=>e.openFile(kJ),children:kJ}),` `,`updated`]})]})}function jJ(e){let t=Yx();return(0,U.jsx)(`button`,{type:`button`,className:`msg-file`,title:`Open ${gP(e.loc)}`,onClick:()=>kP(t,e.loc),children:e.token})}function MJ(e){let{text:t}=e,n=sC(),r=g.useMemo(()=>OP(t,iC),[t,n]),i=[],a=0;for(let e of r)e.start>a&&i.push(t.slice(a,e.start)),i.push((0,U.jsx)(jJ,{loc:e.loc,token:t.slice(e.start,e.end)},e.start)),a=e.end;return a<t.length&&i.push(t.slice(a)),(0,U.jsx)(`span`,{children:i})}var NJ=(0,U.jsx)(W,{name:`send`}),PJ=(0,U.jsx)(W,{name:`stop`}),FJ=(0,U.jsx)(W,{name:`chevron-down`}),IJ=[{value:`sonnet`,label:`Sonnet`},{value:`opus`,label:`Opus`},{value:`fable`,label:`Fable`}],LJ={sonnet:`Sonnet`,opus:`Opus`,fable:`Fable`};function RJ(e){return e===`router`?{claude:`routerClaudeModel`,slug:`routerOpenrouterModel`}:{claude:`tasksClaudeModel`,slug:`tasksOpenrouterModel`}}function zJ(e){let t=e?.freeModel;return t&&t.trim()?t:null}function BJ(e,t,n){let{claude:r,slug:i}=RJ(e);if(t[r]!==`openrouter`)return`claude`;let a=zJ(n);return a&&(n?.freeRoles?.[e]||t[i]?.trim()===a)?`muse`:`openrouter`}function VJ(e){if(!e||!e.trim())return null;let t=e.trim(),n=t.lastIndexOf(`/`);return n>=0?t.slice(n+1):t}function HJ(e,t,n){let{claude:r,slug:i}=RJ(e),a=t[r];return BJ(e,t,n)===`muse`?`Muse`:a===`openrouter`?VJ(t[i])??`OpenRouter`:LJ[a]??a??`?`}function UJ(e,t){return`${HJ(`router`,e,t)} → ${HJ(`tasks`,e,t)}`}function WJ(e){let{label:t,placeholder:n,value:r,warning:i,discardOnUnmount:a,onCommit:o}=e,[s,c]=g.useState(r);g.useEffect(()=>c(r),[r]);let l=g.useRef(s),u=g.useRef(r),d=g.useRef(o);l.current=s,u.current=r,d.current=o;let f=()=>{let e=l.current.trim();return e&&e!==u.current?(d.current(e),!0):!1},p=()=>{f()||c(u.current)};g.useEffect(()=>{a&&(a.current=!1)},[a]),g.useEffect(()=>()=>{a?.current||f()},[a]);let m=e=>{c(e),o(e)};return(0,U.jsxs)(U.Fragment,{children:[(0,U.jsxs)(`div`,{className:`settings-row-main settings-model-detail`,children:[(0,U.jsx)(`span`,{className:`settings-label`,children:t}),(0,U.jsx)(`input`,{type:`text`,className:`text-field${i?` settings-text-warn`:``}`,value:s,placeholder:n,onChange:e=>c(e.target.value),onBlur:p,onKeyDown:e=>{e.key===`Enter`&&(p(),e.target.blur())}})]}),i?(0,U.jsxs)(`div`,{className:`settings-warning`,children:[`⚠ `,i.message,i.suggestion?(0,U.jsxs)(U.Fragment,{children:[` `,`Did you mean`,` `,(0,U.jsx)(`button`,{type:`button`,className:`settings-warning-suggest`,onMouseDown:e=>{e.preventDefault(),m(i.suggestion)},children:i.suggestion}),`?`]}):null]}):null]})}function GJ(e,t,n){let r=e?.[t];if(!(!r||!n||r.model!==n))return{message:r.message,suggestion:r.suggestion}}function KJ(e){let{claude:t,slug:n}=RJ(e.role),r=e.role===`router`?`Operator model`:`Task model`,i=zJ(e.usage),a=BJ(e.role,e.settings,e.usage),o=e.pendingFamily??a,s=g.useRef(!1),c=IJ.filter(t=>!e.blockedClaudeModels.includes(t.value)),l=e.role===`router`?`opus`:`sonnet`,u=c.some(e=>e.value===l)?l:c[0]?.value,d=r=>{if(r===o)return;if(r===`muse`){if(!i)return;s.current=!0,e.onSetSettings({[t]:`openrouter`,[n]:i}),e.onPendingFamily(null);return}if(r===`claude`){if(!u)return;s.current=!0,e.onSetSetting(t,u),e.onPendingFamily(null);return}e.settings[t]!==`openrouter`&&e.onSetSetting(t,`openrouter`);let c=a===`muse`||e.settings[n]?.trim()===i;e.onPendingFamily(c?`openrouter`:null)},f=e=>e.preventDefault();return(0,U.jsxs)(`div`,{className:`settings-row settings-row-stack`,children:[(0,U.jsxs)(`div`,{className:`settings-row-main`,children:[(0,U.jsx)(`span`,{className:`settings-label`,children:r}),(0,U.jsxs)(`div`,{className:`segmented`,role:`group`,"aria-label":r,children:[i?(0,U.jsxs)(`button`,{type:`button`,tabIndex:-1,className:`button`,"aria-pressed":o===`muse`,onMouseDown:f,onClick:()=>d(`muse`),children:[(0,U.jsx)(`span`,{children:`Muse`}),(0,U.jsx)(`span`,{className:`settings-free-chip`,children:`FREE`})]}):null,[`claude`,`openrouter`].map(e=>(0,U.jsx)(`button`,{type:`button`,tabIndex:-1,className:`button`,"aria-pressed":o===e,onMouseDown:f,onClick:()=>d(e),children:(0,U.jsx)(`span`,{children:e===`claude`?`Claude`:`OpenRouter`})},e))]})]}),e.hasAnthropicAccount&&e.settings[t]===`openrouter`?(0,U.jsx)(`div`,{className:`settings-warning`,children:`⚠ Pick Claude to use your Anthropic credentials`}):null,o===`claude`?(0,U.jsx)(`div`,{className:`settings-row-main settings-model-detail`,children:(0,U.jsx)(`div`,{className:`segmented`,role:`group`,"aria-label":`${e.role===`router`?`Operator`:`Task`} Claude model`,children:c.map(n=>(0,U.jsx)(`button`,{type:`button`,tabIndex:-1,className:`button`,"aria-pressed":e.settings[t]===n.value,onClick:()=>{e.settings[t]!==n.value&&e.onSetSetting(t,n.value)},children:(0,U.jsx)(`span`,{children:n.label})},n.value))})}):null,o===`openrouter`?(0,U.jsx)(WJ,{label:`OpenRouter slug`,placeholder:`openai/gpt-5.6-sol`,value:e.settings[n]??``,discardOnUnmount:s,warning:GJ(e.warnings,n,e.settings[n]),onCommit:t=>e.onSetSetting(n,t)}):null]})}function qJ(e){if(!e||e.limitMicros===null||e.limitMicros<=0)return null;if(e.blocked)return 1;if(e.credits?.plan===`daily`&&e.credits.dailyFreeRemainingCredits!==null){let t=e.credits.dailyFreeRemainingCredits*1e4;return t<=0?1:Math.min(1,Math.max(0,e.usedMicros/(e.usedMicros+t)))}return Math.min(1,e.usedMicros/e.limitMicros)}function JJ(e){let t=e?.autoReload;return!t?.enabled||t.disabledReason||t.thresholdCredits===null||t.amountCredits===null?null:{thresholdCredits:t.thresholdCredits,amountCredits:t.amountCredits}}function YJ(e){if(e?.blocked)return`operator-usage-blocked`;if(e?.credits?.plan===`credits`)return e.credits.lowBalance&&!JJ(e.credits)?`operator-usage-warn`:``;let t=qJ(e);return t===null?``:t>=.8?`operator-usage-warn`:``}var XJ=new Intl.NumberFormat(void 0,{style:`currency`,currency:`USD`});function ZJ(e){return XJ.format(e/100)}function QJ(e){return ZJ(e/1e4)}function $J(e,t){if(!t||t.displayUnit===`usd`||t.usdPerCredit<=0)return QJ(e);let n=Math.round(e/1e6/t.usdPerCredit);return`${n.toLocaleString()} ${n===1?`credit`:`credits`}`}function eY(e){return e.resetAtMs?new Date(e.resetAtMs).toLocaleTimeString([],{hour:`numeric`,minute:`2-digit`}):``}function tY(e){let{usage:t}=e,n=qJ(t);if(n===null)return null;let r=eY(t),i=t.credits?.plan===`daily`?t.credits.purchasedCredits+t.credits.grantedCredits:0,a=i>0?` + ${ZJ(i)} credits`:``,o=(t.blocked?`Limit reached`:`${Math.round(n*100)}%${r?` \u00b7 resets ${r}`:``}`)+a;return(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`div`,{className:`settings-row`,children:(0,U.jsx)(`span`,{className:`settings-label`,children:`Daily Operator usage`})}),(0,U.jsx)(`div`,{className:`settings-usage-bar`,children:(0,U.jsx)(`div`,{className:`settings-usage-fill`+(t.blocked?` blocked`:``),style:{width:`${n*100}%`}})}),(0,U.jsx)(`div`,{className:`settings-usage-subtext`,children:o})]})}function nY(e){let t=e.credits,n=t?.autoReload,r=JJ(t),i=t?.rates,a=`${$J(e.creditsExhausted?0:e.spendableMicros??0,i)} left`,o=t?.nextGrantAt?`Refreshes ${new Date(t.nextGrantAt).toLocaleDateString()}`:null,s=r?`Auto-reload will add ${$J(r.amountCredits*1e4,i)} when you drop below ${$J(r.thresholdCredits*1e4,i)}`:null,c=eY(e),l=e.blocked?`Daily limit reached${c?` · Resets at ${c}`:``}`:null,u=!!n?.disabledReason,d=null;return e.creditsExhausted?d=u?{severity:`danger`,text:`Auto-reload was unsuccessful`,action:`Update your card`}:{severity:`danger`,text:`Out of credits`,action:`Set up auto-reload`}:t?.lowBalance&&!r&&(d=u?{severity:`danger`,text:`Auto-reload was unsuccessful`,action:`Update your card`}:{severity:`warn`,text:`Running low on credits`,action:`Set up auto-reload`}),{amount:a,caption:s,grant:o,dailyBlocked:l,banner:d}}function rY(e){let{usage:t,onRefreshUsage:n}=e;if(t.spendableMicros===null||t.freeTier&&t.creditsExhausted)return null;let r=nY(t);return(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`div`,{className:`settings-row`,children:(0,U.jsx)(`span`,{className:`settings-label`,children:`Operator credits`})}),(0,U.jsxs)(`div`,{className:`settings-split`,children:[(0,U.jsx)(`div`,{className:`settings-credits`,children:r.amount}),(0,U.jsx)(`button`,{type:`button`,className:`button`,onClick:()=>aY(n),children:(0,U.jsx)(`span`,{children:`Get credits`})})]}),r.caption?(0,U.jsx)(`div`,{className:`settings-usage-subtext`,children:r.caption}):null,r.grant?(0,U.jsx)(`div`,{className:`settings-usage-subtext`,children:r.grant}):null,r.dailyBlocked?(0,U.jsx)(`p`,{className:`feedback-note feedback-danger settings-usage-subtext`,children:r.dailyBlocked}):null,r.banner?(0,U.jsxs)(`div`,{className:`feedback-banner feedback-${r.banner.severity} is-inset`,role:`status`,children:[(0,U.jsx)(`span`,{children:r.banner.text}),(0,U.jsx)(`button`,{type:`button`,className:`button`,onClick:()=>aY(n),children:(0,U.jsx)(`span`,{children:r.banner.action})})]}):null]})}function iY(e){return e.usage.credits?.plan===`credits`?(0,U.jsx)(rY,{usage:e.usage,onRefreshUsage:e.onRefreshUsage}):(0,U.jsx)(tY,{usage:e.usage})}function aY(e){if(window.ReactNativeWebView){window.ReactNativeWebView.postMessage(JSON.stringify({type:`castle-open-credits`}));return}if(!window.open(`https://castle.xyz/credits`,`_blank`))return;oY?.();let t=()=>{document.visibilityState===`visible`&&(oY?.(),e())};oY=()=>{document.removeEventListener(`visibilitychange`,t),window.removeEventListener(`focus`,t),oY=null},document.addEventListener(`visibilitychange`,t),window.addEventListener(`focus`,t)}var oY=null;function sY(e){let t=e.providers.filter(e=>e.key?.present||e.login?.loggedIn).map(e=>e.label);return(0,U.jsxs)(`div`,{className:`settings-split`,children:[t.length>0?(0,U.jsxs)(`div`,{className:`settings-split-copy`,children:[(0,U.jsx)(`div`,{className:`settings-credits`,children:`Use your own agent provider`}),(0,U.jsxs)(`div`,{className:`settings-usage-subtext`,children:[`Connected: `,t.join(`, `)]})]}):(0,U.jsx)(`div`,{className:`settings-credits`,children:`Use your own agent provider`}),(0,U.jsx)(`button`,{type:`button`,className:`button`,onClick:e.onOpen,children:(0,U.jsx)(`span`,{children:t.length>0?`Manage providers`:`Add provider`})})]})}function cY(e){let{login:t}=e,[n,r]=g.useState(``),i=()=>{n.trim()&&e.onSubmitCode(n.trim())};return(0,U.jsxs)(U.Fragment,{children:[t.url?(0,U.jsxs)(`div`,{className:`castle-key-login`,children:[(0,U.jsx)(`div`,{className:`castle-key-subtitle`,children:`Open this link to sign in, then come back here.`}),(0,U.jsx)(`a`,{className:`castle-key-url`,href:t.url,target:`_blank`,rel:`noreferrer noopener`,children:t.url})]}):(0,U.jsx)(`div`,{className:`castle-key-subtitle`,children:`Starting sign-in…`}),t.phase===`awaiting-code`?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`div`,{className:`castle-key-subtitle`,children:`Paste the code the browser shows you:`}),(0,U.jsx)(`input`,{className:`castle-key-input`,autoFocus:!0,spellCheck:!1,autoComplete:`off`,value:n,placeholder:`code`,onChange:e=>r(e.target.value),onKeyDown:e=>{e.key===`Enter`&&i()}}),t.message?(0,U.jsx)(`div`,{className:`castle-key-error`,children:t.message}):null]}):null,t.phase===`verifying`?(0,U.jsx)(`div`,{className:`castle-key-stored`,children:`Finishing sign-in…`}):null,t.phase===`error`?(0,U.jsx)(`div`,{className:`castle-key-error`,children:t.message}):null,(0,U.jsxs)(`div`,{className:`castle-modal-actions`,children:[(0,U.jsx)(`button`,{type:`button`,onClick:e.onCancel,children:t.phase===`error`?`Close`:`Cancel`}),t.phase===`awaiting-code`?(0,U.jsx)(`button`,{type:`button`,onClick:i,disabled:!n.trim(),children:`Submit`}):null]})]})}function lY(e){let t=e.accounts.providers,n=e.accounts.login,[r,i]=g.useState(()=>(t.find(e=>e.key?.present||e.login?.loggedIn)??t[0])?.id??``),[a,o]=g.useState(``),[s,c]=g.useState(null),l=(n?t.find(e=>e.login?.provider===n.provider):null)??t.find(e=>e.id===r)??t[0]??null,u=g.useRef(e.onClose);u.current=e.onClose;let d=n!==null;g.useEffect(()=>{let e=e=>{e.key===`Escape`&&!d&&u.current()};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[d]);let f=g.useRef(null);if(g.useEffect(()=>{if(n){f.current=n.provider;return}let e=f.current;e!==null&&(f.current=null,t.find(t=>t.login?.provider===e)?.login?.loggedIn&&u.current())}),!l)return null;let p=!!l.login?.loggedIn,m=!!l.key?.present,h=p||m,_=()=>{let t=a.trim();if(t){if(t.length>500){c(`That key is too long.`);return}if([...t].some(e=>{let t=e.codePointAt(0)??0;return t<32||t===127})){c(`That key contains invalid characters.`);return}e.onSave(l.id,t),e.onClose()}};return(0,My.createPortal)((0,U.jsx)(`div`,{className:`castle-modal-scrim`,onMouseDown:n?void 0:e.onClose,children:(0,U.jsxs)(`div`,{className:`castle-modal`,onMouseDown:e=>e.stopPropagation(),children:[(0,U.jsx)(`div`,{className:`castle-key-heading`,children:n?`Sign in to ${l.label}`:`Your account`}),n?null:(0,U.jsx)(`div`,{className:`castle-key-subtitle`,children:`Run the operator on your own account and bypass Castle's daily limit.`}),t.length>1&&!n?(0,U.jsx)(`div`,{className:`castle-key-tabs`,children:t.map(e=>(0,U.jsx)(`button`,{type:`button`,className:`castle-key-tab`+(e.id===l.id?` active`:``),onClick:()=>{i(e.id),o(``),c(null)},children:e.label},e.id))}):null,n?(0,U.jsx)(cY,{login:n,onSubmitCode:e.onSubmitCode,onCancel:e.onCancelLogin}):(0,U.jsxs)(U.Fragment,{children:[h?(0,U.jsxs)(U.Fragment,{children:[p?(0,U.jsxs)(`div`,{className:`castle-key-row`,children:[(0,U.jsxs)(`span`,{children:[`Signed in with your `,l.label,` account.`]}),(0,U.jsx)(`button`,{type:`button`,onClick:()=>{e.onLogout(l.id),e.onClose()},children:`Sign out`})]}):null,m?(0,U.jsxs)(`div`,{className:`castle-key-row`,children:[(0,U.jsxs)(`span`,{children:[`API key saved (`,l.key?.hint,`).`]}),(0,U.jsx)(`button`,{type:`button`,onClick:()=>{e.onRemove(l.id),e.onClose()},children:`Remove`})]}):null]}):(0,U.jsxs)(U.Fragment,{children:[l.login?(0,U.jsxs)(`button`,{type:`button`,className:`castle-key-signin`,onClick:()=>e.onStartLogin(l.id),children:[`Sign in with your `,l.label,` account`]}):null,l.login&&l.key?(0,U.jsx)(`div`,{className:`castle-key-or`,children:`or`}):null,l.key?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`div`,{className:`castle-key-field-label`,children:`Add API key`}),(0,U.jsx)(`input`,{type:`password`,className:`castle-key-input`,autoFocus:!0,spellCheck:!1,autoComplete:`off`,"data-1p-ignore":!0,"data-lpignore":`true`,value:a,placeholder:l.key.placeholder,onChange:e=>{o(e.target.value),c(null)},onKeyDown:e=>{e.key===`Enter`&&_()}}),s?(0,U.jsx)(`div`,{className:`castle-key-error`,children:s}):null]}):null]}),(0,U.jsxs)(`div`,{className:`castle-modal-actions`,children:[(0,U.jsx)(`button`,{type:`button`,onClick:e.onClose,children:`Cancel`}),!h&&l.key?(0,U.jsx)(`button`,{type:`button`,onClick:_,disabled:!a.trim(),children:`Save`}):null]})]})]})}),document.body)}function uY(e){let{settings:t,onSetSetting:n,onClose:r}=e,[i,a]=g.useState({router:null,tasks:null});g.useEffect(()=>{a(n=>{let r=!1,i={...n};for(let a of[`router`,`tasks`])n[a]===`openrouter`&&BJ(a,t,e.usage)===`openrouter`&&(i[a]=null,r=!0);return r?i:n})},[t,e.usage]);let o=e.usage?.credits?.plan===`credits`?e.usage.spendableMicros!==null:qJ(e.usage)!==null,s=e.accounts.providers.some(e=>e.key?.present||e.login?.loggedIn),c=e.accounts.providers.some(e=>e.id===`anthropic`&&(e.key?.present||e.login?.loggedIn)),l=e.accounts.providers.length>0&&(o||s),u=g.useRef(null),d=e.usage?.blockedClaudeModels??[];return BC(u,r,e.triggerRef),(0,My.createPortal)((0,U.jsxs)(`div`,{className:`popover settings-popover`,ref:u,style:WC(u,e.triggerRef,[t,o,l,e.usage,i,c]),onMouseDown:e=>e.stopPropagation(),children:[o&&e.usage?(0,U.jsx)(`div`,{className:`settings-group`,children:(0,U.jsx)(iY,{usage:e.usage,onRefreshUsage:e.onRefreshUsage})}):null,l?(0,U.jsx)(`div`,{className:`settings-group`,children:(0,U.jsx)(sY,{providers:e.accounts.providers,onOpen:e.onOpenKeys})}):null,[`router`,`tasks`].map(r=>(0,U.jsx)(`div`,{className:`settings-group`,children:(0,U.jsx)(KJ,{role:r,settings:t,warnings:e.warnings,usage:e.usage,blockedClaudeModels:d,hasAnthropicAccount:c,pendingFamily:i[r],onPendingFamily:e=>a(t=>({...t,[r]:e})),onSetSetting:n,onSetSettings:e.onSetSettings})},r))]}),document.body)}function dY(e){let{spec:t,interactive:n,answers:r,onSubmit:i}=e,[a,o]=g.useState({}),s=n?a:r??{},c=(e,t,r)=>{n&&o(n=>{let i=n[e]??[];if(r){let r=i.includes(t)?i.filter(e=>e!==t):[...i,t];return{...n,[e]:r}}return{...n,[e]:i[0]===t?[]:[t]}})};return(0,U.jsxs)(`div`,{className:`picker${n?``:` picker-locked`}`,children:[t.questions.map(e=>(0,U.jsxs)(`fieldset`,{className:`picker-q`,disabled:!n,children:[(0,U.jsx)(`legend`,{className:`picker-q-label`,children:e.q}),(0,U.jsx)(`div`,{className:`picker-options`,children:e.options.map(t=>{let r=(s[e.id]??[]).includes(t);return(0,U.jsxs)(`label`,{className:`picker-option${r?` is-checked`:``}`,children:[(0,U.jsx)(`input`,{type:e.multi?`checkbox`:`radio`,name:e.id,checked:r,disabled:!n,onChange:()=>c(e.id,t,e.multi)}),(0,U.jsx)(`span`,{children:t})]},t)})})]},e.id)),n?(0,U.jsx)(`div`,{className:`picker-actions`,children:(0,U.jsx)(`button`,{className:`button`,type:`button`,onClick:()=>{let e=CJ(t,a);e&&i(a,e)},children:(0,U.jsx)(`span`,{children:`Submit`})})}):null]})}function fY(e){let{chips:t,interactive:n,onPick:r}=e,[i,a]=g.useState(null),o=n&&i===null;return(0,U.jsx)(`div`,{className:`chips`+(o?``:` chips-inert`),children:t.map(e=>(0,U.jsx)(`button`,{type:`button`,className:`chip`+(i===e?` is-picked`:``),disabled:!o,onClick:()=>{a(e),r(e)},children:e},e))})}function pY(){return(0,U.jsxs)(`div`,{className:`picker picker-skeleton`,"aria-hidden":`true`,children:[(0,U.jsx)(`span`,{className:`picker-skeleton-hint`,children:`preparing options…`}),(0,U.jsxs)(`div`,{className:`picker-q`,children:[(0,U.jsx)(`div`,{className:`picker-skeleton-line picker-skeleton-label`}),(0,U.jsxs)(`div`,{className:`picker-options`,children:[(0,U.jsx)(`span`,{className:`picker-skeleton-chip`,style:{width:84}}),(0,U.jsx)(`span`,{className:`picker-skeleton-chip`,style:{width:116}}),(0,U.jsx)(`span`,{className:`picker-skeleton-chip`,style:{width:72}})]})]})]})}function mY(e){let t=/^\[Editing (.+)\]$/,n=/^\[Reading (.+)\]$/,r=new Set;for(let n of e){let e=t.exec(n.trim());if(e)for(let t of e[1].split(`, `))r.add(t)}let i=[];for(let t of e){let e=n.exec(t.trim());if(e){let t=e[1].split(`, `).filter(e=>!r.has(e));if(t.length===0)continue;i.push(`[Reading ${t.join(`, `)}]`);continue}i.push(t)}return i}function hY(e){let t=/^\[([A-Za-z]+)\s+(.+)\]$/,n=[];for(let r of e){let e=t.exec(r.trim());if(e){let r=n.length?t.exec(n[n.length-1].trim()):null;if(r&&r[1]===e[1]){r[2].split(`, `).includes(e[2])||(n[n.length-1]=`[${e[1]} ${r[2]}, ${e[2]}]`);continue}}n.push(r)}return n}function gY(e){return e.detail?(0,U.jsxs)(`details`,{className:`msg-error-detail`,children:[(0,U.jsx)(`summary`,{children:`Details (full text in the browser console)`}),(0,U.jsx)(`pre`,{children:e.detail})]}):null}function _Y(e){let t=Qq(),n=g.useRef(null),r=g.useRef(!0);return g.useLayoutEffect(()=>{let e=n.current;e&&r.current&&(e.scrollTop=e.scrollHeight)},[e.lines]),(0,U.jsx)(`div`,{className:`task-feed`,ref:n,onScroll:()=>{let e=n.current;e&&(r.current=e.scrollHeight-e.scrollTop-e.clientHeight<24)},onClick:e=>e.stopPropagation(),children:hY(mY(e.lines)).map((e,n)=>{let r=/^\[(.+)\]$/.exec(e.trim());return r?(0,U.jsx)(`div`,{className:`task-feed-tool`,children:r[1]},n):(0,U.jsx)(`div`,{className:`task-feed-msg`,onClick:t,dangerouslySetInnerHTML:Xq(e)},n)})})}function vY(e){let t=Math.max(0,Math.round(e/1e3)),n=Math.floor(t/60),r=t%60;return n>0?`${n}m ${r}s`:`${r}s`}function yY(e,t,n){return t?`${e} · ${t}`:n?`${e} · Worked for ${n}`:e}function bY(e){let[t,n]=g.useState(()=>Date.now());g.useEffect(()=>{if(e.status!==`running`)return;let t=setInterval(()=>n(Date.now()),1e3);return()=>clearInterval(t)},[e.status]);let r=e.startedAt?Date.parse(e.startedAt):null,i=e.finishedAt?Date.parse(e.finishedAt):null,a=C.includes(e.status),o=e.status===`done`?100:a?e.progress:Math.min(e.progress,95),s=e.status===`running`?e.phase?.trim()||TJ[e.avatar??``]||`Working`:e.status===`waiting`?`Queued`:e.status===`blocked`?`Blocked`:e.status===`done`?`Done`:e.status===`failed`?`Failed`:e.status===`interrupted`?`Interrupted`:e.status,c=e.status===`running`&&r!==null?vY(t-r):null,l=a&&r!==null&&i!==null?vY(i-r):null;return{pct:o,avatar:DJ(e),stage:s,elapsed:c,workedFor:l,finished:a,display:sJ(e)}}function xY(e){let{task:t,onAck:n}=e,r=e.variant===`archive`,i=Qq(),[a,o]=g.useState(t.status===`failed`);g.useEffect(()=>{t.status===`failed`&&o(!0)},[t.status]);let s=()=>{o(e=>!e)},{pct:c,avatar:l,stage:u,elapsed:d,workedFor:f,finished:p,display:m}=bY(t);return(0,U.jsxs)(`div`,{className:`task${a?` open`:``}`,onClick:s,children:[(0,U.jsxs)(`div`,{className:`task-row`,children:[(0,U.jsx)(`div`,{className:`pie`,style:{"--pct":c},children:(0,U.jsx)(`div`,{className:`avatar`,style:{background:l.color},children:(0,U.jsx)(`span`,{className:`avatar-icon-wrap`,"aria-hidden":`true`,children:l.icon})})}),(0,U.jsxs)(`div`,{className:`task-meta`,children:[(0,U.jsx)(`div`,{className:`task-name`,children:(0,U.jsx)(`span`,{className:`tn`,children:t.title})}),(0,U.jsx)(`div`,{className:`task-sub`,children:yY(u,d,f)})]}),(0,U.jsxs)(`div`,{className:`task-actions`,children:[p&&!r?(0,U.jsx)(`button`,{className:`button button-icon task-action`,type:`button`,title:`Clear`,"aria-label":`Clear ${t.title}`,onClick:e=>{e.stopPropagation(),n(t.id,!1)},children:(0,U.jsx)(W,{name:`archive`})}):null,e.onOpen?(0,U.jsx)(`button`,{className:`button button-icon task-action`,type:`button`,title:`Open`,"aria-label":`Open ${t.title}`,onClick:n=>{n.stopPropagation(),e.onOpen?.(t)},children:(0,U.jsx)(W,{name:`chevron-right`})}):null]})]}),(0,U.jsxs)(`div`,{className:`task-body`,children:[a&&t.status===`running`&&e.feed&&e.feed.length>0?(0,U.jsx)(_Y,{lines:e.feed}):null,a&&t.status!==`running`&&m.error?(0,U.jsx)(`p`,{className:`feedback-note feedback-danger`,children:m.error}):null,a&&t.status!==`running`&&m.notes?(0,U.jsx)(`div`,{className:`task-notes`,onClick:i,dangerouslySetInnerHTML:Xq(m.notes)}):null,a&&t.status===`failed`?(0,U.jsx)(gY,{detail:t.errorDetail}):null,a?(0,U.jsx)(SY,{frames:t.playtestFrames}):null]})]})}function SY(e){let t=e.frames??[];return t.length===0?null:(0,U.jsxs)(`div`,{className:`task-playtest-frames`,children:[(0,U.jsxs)(`div`,{className:`task-playtest-frames-label`,children:[`Playtest frames (`,t.length,`)`]}),(0,U.jsx)(`div`,{className:`task-playtest-frames-row`,children:t.map(e=>(0,U.jsx)(`a`,{href:e,target:`_blank`,rel:`noreferrer`,onClick:e=>e.stopPropagation(),children:(0,U.jsx)(`img`,{className:`task-playtest-frame`,src:e,alt:`playtest frame`})},e))})]})}function CY(e){return e.filter(e=>!(e.acknowledged&&C.includes(e.status)))}function wY(e){let t=g.useRef(null),n=g.useRef(!0),r=g.useRef(0),[i,a]=g.useState(!1),o=CY(e.tasks),s=fJ(e.tasks);g.useLayoutEffect(()=>{let e=t.current;e&&n.current&&(e.scrollTop=e.scrollHeight)},[e.tasks]),g.useEffect(()=>()=>window.clearTimeout(r.current),[]);let c=()=>{let e=t.current;e&&(n.current=e.scrollHeight-e.scrollTop-e.clientHeight<24,a(!0),window.clearTimeout(r.current),r.current=window.setTimeout(()=>a(!1),900))};if(o.length===0&&s.length===0)return null;let l=o.filter(e=>C.includes(e.status));return(0,U.jsxs)(`div`,{id:`task-board`,className:`task-stack${i?` scrolling`:``}`,ref:t,onScroll:c,children:[(0,U.jsxs)(`div`,{className:`task-board-header`,children:[(0,U.jsxs)(`button`,{type:`button`,className:`button`,onClick:e.onOpenTasks,children:[(0,U.jsx)(`span`,{children:`Tasks`}),(0,U.jsx)(W,{name:`chevron-right`})]}),l.length>0?(0,U.jsxs)(`button`,{type:`button`,className:`button`,onClick:()=>{for(let t of l)e.onAck(t.id,!1)},children:[(0,U.jsx)(W,{name:`archive`}),(0,U.jsx)(`span`,{children:`Clear completed`}),(0,U.jsx)(`span`,{className:`button-badge`,children:l.length})]}):null]}),o.map(t=>(0,U.jsx)(xY,{task:t,feed:e.feeds[t.id],onAck:e.onAck,onOpen:e.onOpenTask},t.id))]})}function TY(e){let{task:t}=e,{pct:n,avatar:r,stage:i,elapsed:a,workedFor:o}=bY(t);return(0,U.jsx)(`header`,{className:`task-page-header`,children:(0,U.jsxs)(`div`,{className:`task-row`,children:[(0,U.jsx)(`div`,{className:`pie`,style:{"--pct":n},children:(0,U.jsx)(`div`,{className:`avatar`,style:{background:r.color},children:(0,U.jsx)(`span`,{className:`avatar-icon-wrap`,"aria-hidden":`true`,children:r.icon})})}),(0,U.jsxs)(`div`,{className:`task-meta`,children:[(0,U.jsx)(`div`,{className:`task-name`,children:(0,U.jsx)(`span`,{className:`tn`,children:t.title})}),(0,U.jsx)(`div`,{className:`task-sub`,children:yY(i,a,o)})]})]})})}function EY(e){let{task:t}=e,n=Qq(),r=g.useRef(null),i=g.useRef(!0),a=e.feed??[],o=sJ(t),s=t.status===`running`,c=a.length>0,l=!s&&(!!o.error||!!o.notes);return g.useLayoutEffect(()=>{i.current=!0},[t.id]),g.useLayoutEffect(()=>{let e=r.current;e&&i.current&&(e.scrollTop=e.scrollHeight)},[t.id,e.feed,o.notes,o.error,t.status,t.playtestFrames]),(0,U.jsxs)(`div`,{className:`task-page`,children:[(0,U.jsx)(TY,{task:t}),(0,U.jsxs)(`div`,{className:`task-page-body`,ref:r,onScroll:()=>{let e=r.current;e&&(i.current=e.scrollHeight-e.scrollTop-e.clientHeight<24)},children:[c?(0,U.jsx)(_Y,{lines:a}):null,l&&o.error?(0,U.jsx)(`p`,{className:`feedback-note feedback-danger`,children:o.error}):null,l&&o.notes?(0,U.jsxs)(`div`,{className:`task-notes`,onClick:n,children:[(0,U.jsx)(`p`,{className:`task-report-label`,children:`Report`}),(0,U.jsx)(`div`,{dangerouslySetInnerHTML:Xq(o.notes)})]}):null,t.status===`failed`?(0,U.jsx)(gY,{detail:t.errorDetail}):null,(0,U.jsx)(SY,{frames:t.playtestFrames}),!c&&!l&&!(t.playtestFrames&&t.playtestFrames.length>0)?(0,U.jsx)(`p`,{className:`task-page-empty`,children:`No activity yet.`}):null]})]})}function DY(e){let t=CY(e.tasks),n=fJ(e.tasks);return(0,U.jsxs)(`div`,{className:`task-page-body task-board-page`,children:[t.length>0?(0,U.jsx)(`div`,{className:`task-stack`,children:t.map(t=>(0,U.jsx)(xY,{task:t,feed:e.feeds[t.id],onAck:e.onAck,onOpen:e.onOpenTask},t.id))}):null,n.length>0?(0,U.jsxs)(`div`,{className:`task-archive task-stack`,children:[(0,U.jsx)(`div`,{className:`task-archive-heading text-style-smallcaps`,children:`Cleared`}),n.map(t=>(0,U.jsx)(xY,{task:t,feed:e.feeds[t.id],onAck:e.onAck,onOpen:e.onOpenTask,variant:`archive`},t.id))]}):null,t.length===0&&n.length===0?(0,U.jsx)(`p`,{className:`task-page-empty`,children:`No tasks yet.`}):null]})}function OY(e){let{msg:t,onPickerSubmit:n,onChip:r,chipsLive:i=!1,interactive:a=!1}=e,o=Qq();if(t.role===`log`)return(0,U.jsx)(`div`,{className:`msg toolline`,children:t.text});if(t.role===`user`)return(0,U.jsxs)(`div`,{className:`msg user`,children:[(t.attachments??[]).map(e=>(0,U.jsx)(`img`,{className:`msg-image`,src:e,alt:``},e)),t.text?(0,U.jsx)(MJ,{text:t.text}):null]});let s=t.status===`streaming`,c=xJ(t.text,s),l=SJ(c)||t.planUpdated===!0;if(!s&&!l)return null;let u=!s&&!t.pickerAnswers&&a,d=-1;c.forEach((e,t)=>{e.kind===`md`&&e.text.trim()!==``&&(d=t)});let f=c.some(e=>e.kind===`ask`||e.kind===`ask-pending`),p=s&&d===-1&&!f||!!(s&&t.activity),m=t.activity??`Thinking`;return(0,U.jsxs)(`div`,{className:`assistant-turn`,onClick:o,children:[t.thinking&&t.thinking.trim()?(0,U.jsxs)(`details`,{className:`msg-thinking`+(p?` is-active`:``),children:[(0,U.jsxs)(`summary`,{className:`operator-line`,children:[(0,U.jsx)(W,{name:`lightbulb`,className:`icon-inline`}),(0,U.jsx)(`span`,{className:`thinking-label`,children:p?m:OJ(t.thinkingMs)}),(0,U.jsx)(W,{name:`chevron-right`,className:`icon-inline thinking-caret`})]}),(0,U.jsx)(`div`,{className:`msg-thinking-body`,dangerouslySetInnerHTML:Xq(t.thinking??``)})]}):p?(0,U.jsxs)(`div`,{className:`operator-line msg-thinking is-active`,children:[(0,U.jsx)(W,{name:`lightbulb`,className:`icon-inline`}),(0,U.jsx)(`span`,{className:`thinking-label`,children:m})]}):null,c.map((e,a)=>{if(e.kind===`ask-pending`)return(0,U.jsx)(pY,{},a);if(e.kind===`chips`)return(0,U.jsx)(fY,{chips:e.chips,interactive:!s&&i,onPick:r},a);if(e.kind===`ask`)return(0,U.jsx)(dY,{spec:e.spec,interactive:u,answers:t.pickerAnswers,onSubmit:(e,r)=>n(t,e,r)},a);if(!e.text.trim())return null;let o=[`msg`,`assistant`,`md`];return s&&a===d&&o.push(`streaming`),t.status===`error`&&o.push(`errbubble`),(0,U.jsx)(`div`,{className:o.join(` `),dangerouslySetInnerHTML:Xq(e.text)},a)}),s?null:(0,U.jsx)(gY,{detail:t.errorDetail}),t.planUpdated?(0,U.jsx)(AJ,{}):null,t.interrupted?(0,U.jsxs)(`div`,{className:`operator-line`,children:[(0,U.jsx)(W,{name:`square`,className:`icon-inline`}),(0,U.jsx)(`span`,{children:`Interrupted by your next message`})]}):null]})}function kY(e){let t=g.useRef(null),n=g.useRef(null),r=g.useRef(0),i=g.useRef(!0),a=g.useRef(0),o=g.useRef(0),[s,c]=g.useState(!1),l=g.useRef(!1),u=g.useCallback(()=>{l.current=!0,c(!0)},[]),d=g.useCallback(()=>{let e=t.current;if(!e)return;let n=Math.max(0,e.scrollHeight-e.clientHeight),r=Math.abs(e.scrollTop-n)>1;e.scrollTop=n,r&&(a.current=typeof performance<`u`?performance.now():Date.now())},[]);e.pinThreadRef.current=()=>{i.current&&d()};let f=g.useCallback(()=>{d();let e=t.current;e&&e.clientHeight>0&&u()},[d,u]);g.useLayoutEffect(()=>{if(!i.current)return;f();let e=requestAnimationFrame(f),t=window.setTimeout(f,250),n=window.setTimeout(u,500);return()=>{cancelAnimationFrame(e),clearTimeout(t),clearTimeout(n)}},[e.messages,f,u]),g.useEffect(()=>{let e=t.current;if(!e)return;o.current=e.clientHeight;let a=new ResizeObserver(()=>{o.current=e.clientHeight,i.current?f():e.scrollTop=e.scrollHeight-e.clientHeight-r.current});return a.observe(e),n.current&&a.observe(n.current),()=>a.disconnect()},[f]);let p=()=>{let e=t.current;if(!e||!l.current||(typeof performance<`u`?performance.now():Date.now())-a.current<200)return;let n=e.clientHeight,s=n!==o.current;o.current=n,!s&&(r.current=e.scrollHeight-e.scrollTop-e.clientHeight,i.current=r.current<48)},m=jY(e.messages),h=MY(e.messages);return(0,U.jsx)(`div`,{id:`chat-messages`,className:`chat-scroll`,"data-castle-allow-select":``,ref:t,onScroll:p,children:(0,U.jsxs)(`div`,{className:`chat-thread`+(s?` ready`:``),ref:n,children:[e.messages.length===0?(0,U.jsx)(`div`,{id:`chat-empty`,children:`Tell the agent what you want to make.`}):null,e.messages.map(t=>(0,U.jsx)(OY,{msg:t,interactive:t.id===m,chipsLive:t.id===h,onPickerSubmit:e.onPickerSubmit,onChip:e.onChip},t.id))]})})}function AY(e){return e.role!==`assistant`||e.pickerAnswers?!1:xJ(e.text).some(e=>e.kind===`ask`)}function jY(e){for(let t=e.length-1;t>=0;t--)if(AY(e[t]))return e[t].id;return null}function MY(e){for(let t=e.length-1;t>=0;t--){let n=e[t];if(n.role===`user`)return null;if(n.role===`assistant`){if(n.status===`streaming`)return null;if(xJ(n.text).some(e=>e.kind===`chips`))return n.id}}return null}function NY(e,t){for(let n of Array.from(e)){if(!n.type.startsWith(`image/`))continue;let e=new FileReader;e.onload=()=>{typeof e.result==`string`&&t({name:n.name,dataUrl:e.result})},e.readAsDataURL(n)}}function PY(e){return e.pending.length===0?null:(0,U.jsx)(`div`,{id:`chat-pending`,children:e.pending.map((t,n)=>(0,U.jsx)(`img`,{className:`operator-thumb`,src:t.dataUrl,alt:t.name,title:`remove`,onClick:()=>e.onRemove(n)},`${t.name}-${n}`))})}function FY(e){return e.queued.length===0?null:(0,U.jsx)(`div`,{className:`chat-queue`,onMouseDown:e=>e.preventDefault(),children:e.queued.map((t,n)=>(0,U.jsxs)(`div`,{className:`queue-row`,children:[(0,U.jsx)(`span`,{className:`queue-snippet`,children:t.length>60?`${t.slice(0,60)}\u2026`:t}),(0,U.jsx)(`button`,{className:`button`,type:`button`,tabIndex:-1,title:`Send now — interrupts the turn`,onClick:e.onInterrupt,children:(0,U.jsx)(`span`,{children:`Send now`})}),(0,U.jsx)(`button`,{className:`button button-icon button-quiet`,type:`button`,tabIndex:-1,title:`Remove from queue`,"aria-label":`Remove`,onClick:()=>e.onCancelQueued(n),children:(0,U.jsx)(W,{name:`times`})})]},n))})}function IY(e,t){if(!e)return;e.style.height=`auto`;let n=Number.parseFloat(window.getComputedStyle(e).lineHeight),r=Number.isFinite(n)?Math.ceil(n):21,i=t.length===0?r:Math.min(e.scrollHeight,120);e.style.height=i>0?`${i}px`:``}function LY(e){let{running:t,queued:n}=e,[r,i]=g.useState(``),[a,o]=g.useState(!1),[s,c]=g.useState(!1),l=g.useRef(null),[u,d]=g.useState([]),[f,p]=g.useState(!1);g.useEffect(()=>{t||p(!1)},[t]);let m=g.useRef(null),h=g.useRef(null),_=aJ({inputRef:m,anchorRef:h,setValue:i});g.useLayoutEffect(()=>{IY(m.current,r),e.pinThreadRef.current()},[r,u.length,n.length,e.pinThreadRef]);let v=e=>{d(t=>t.length>=6?t:[...t,e])},y=()=>{let t=r.trim();!t&&u.length===0||(e.onSend(t,u,_.attachedIn(t)),i(``),d([]),_.clear())},b=r.trim().length>0||u.length>0,x=e=>{let t=e.target;h.current?.contains(t)&&(t instanceof Element&&t.closest(`.composer-settings .button, #chat-send`)||m.current?.focus())},S=t&&!b;return(0,U.jsxs)(`div`,{className:`operator-composer`,children:[(0,U.jsx)(PY,{pending:u,onRemove:e=>d(t=>t.filter((t,n)=>n!==e))}),_.overlay,(0,U.jsxs)(`div`,{className:`chat-input`,ref:h,children:[(0,U.jsx)(FY,{queued:n,onInterrupt:e.onInterrupt,onCancelQueued:e.onCancelQueued}),(0,U.jsxs)(`div`,{className:`ta`,onClick:x,children:[(0,U.jsx)(`textarea`,{id:`chat-input`,className:`ta-text`,ref:m,rows:1,placeholder:t?`Queue a message…`:`Message the operator`,value:r,onChange:e=>{i(e.target.value),_.sync()},onSelect:_.sync,onPaste:e=>{let t=e.clipboardData?.files;t&&t.length>0&&(e.preventDefault(),NY(t,v))},onKeyDown:e=>{_.handleKeyDown(e)||e.key===`Enter`&&!e.shiftKey&&!e.metaKey&&!e.altKey&&(e.preventDefault(),y())}}),(0,U.jsxs)(`div`,{className:`ta-bottom`,onMouseDown:e=>e.preventDefault(),children:[(0,U.jsxs)(`div`,{className:`composer-settings`,children:[(0,U.jsxs)(`button`,{ref:l,className:[`button`,`button-quiet`,YJ(e.usage)].filter(Boolean).join(` `),type:`button`,tabIndex:-1,title:`Agent & model settings`,"aria-label":`Agent & model settings`,"aria-pressed":a,onMouseDown:e=>{e.preventDefault(),e.stopPropagation()},onClick:()=>{a||e.onRefreshUsage(),o(e=>!e)},children:[(0,U.jsx)(`span`,{children:UJ(e.settings,e.usage)}),FJ]}),a?(0,U.jsx)(uY,{settings:e.settings,warnings:e.settingsWarnings,usage:e.usage,accounts:e.accounts,triggerRef:l,onSetSetting:e.onSetSetting,onSetSettings:e.onSetSettings,onOpenKeys:()=>c(!0),onRefreshUsage:e.onRefreshUsage,onClose:()=>o(!1)}):null,s?(0,U.jsx)(lY,{accounts:e.accounts,onSave:e.onSetCredential,onRemove:e.onClearCredential,onStartLogin:e.onStartLogin,onSubmitCode:e.onSubmitLoginCode,onCancelLogin:e.onCancelLogin,onLogout:e.onLogout,onClose:()=>c(!1)}):null]}),(0,U.jsx)(`button`,{id:`chat-send`,className:`button button-icon composer-action`,type:`button`,tabIndex:-1,title:S?f?`Stopping…`:`Stop`:`Send`,"aria-label":S?f?`Stopping`:`Stop`:`Send`,disabled:!S&&!b||S&&f,onClick:()=>{S?(p(!0),e.onInterrupt()):y()},children:S?PJ:NJ})]})]})]})]})}function RY(e){let{agent:t,mobile:n,active:r}=e,{messages:i,tasks:a,feeds:o,settings:s,running:c,queued:l}=t,u=uJ(n),[d,f]=g.useState(null),p=g.useRef(()=>{}),m=dJ(d),h=e=>{u.openView(e.id)};nb(()=>!r||u.view===`home`?!1:(u.goHome(),!0));let _=(e,n,r)=>{t.submitPicker(e.id,n,r)},v=e=>{t.sendUserMessage(e,[],[])},y=u.view!==`home`&&u.view!==`tasks`?a.find(e=>e.id===u.view):void 0;return(0,U.jsxs)(`div`,{id:`chat-host`,ref:f,children:[m?(0,U.jsx)(pJ,{view:u.view,openIds:u.openIds,tasks:a,mobile:n,onHome:u.goHome,onSelect:u.openView,onClose:u.closeView,onReorder:u.reorderOpenIds,slot:m}):null,(0,U.jsx)(`div`,{className:`operator-inset`,children:u.view===`home`?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(wY,{tasks:a,feeds:o,onAck:t.ackTask,onOpenTask:h,onOpenTasks:()=>u.openView(lJ)}),CY(a).length>0||fJ(a).length>0?(0,U.jsx)(`div`,{className:`chat-divider`,"aria-hidden":`true`}):null,(0,U.jsx)(kY,{messages:i,onPickerSubmit:_,onChip:v,pinThreadRef:p})]}):u.view===`tasks`?(0,U.jsx)(DY,{tasks:a,feeds:o,onAck:t.ackTask,onOpenTask:h}):y?(0,U.jsx)(EY,{task:y,feed:o[y.id]}):(0,U.jsx)(`p`,{className:`task-page-empty`,children:`This task is gone.`})}),(0,U.jsx)(LY,{pinThreadRef:p,running:c,queued:l,onSend:t.sendUserMessage,onInterrupt:t.interrupt,onCancelQueued:t.cancelQueued,settings:s,settingsWarnings:t.settingsWarnings,usage:t.usage,accounts:t.accounts,onSetSetting:t.setSetting,onSetSettings:t.setSettings,onRefreshUsage:t.refreshUsage,onSetCredential:t.setCredential,onClearCredential:t.clearCredential,onStartLogin:t.startLogin,onSubmitLoginCode:t.submitLoginCode,onCancelLogin:t.cancelLogin,onLogout:t.logout})]})}function zY(e,t){if(e===t)return!0;if(!e||!t||e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}function BY(e,t){return e.messageId===t.messageId&&zY(e.taskIds,t.taskIds)}function VY(e,t,n,r,i){if(!t)return i;let a=n[n.length-1]??``;return e||i.messageId===void 0?{messageId:a,taskIds:r}:i.messageId!==``&&n.length>0&&!n.includes(i.messageId)?{messageId:a,taskIds:i.taskIds}:i.taskIds===void 0?{messageId:i.messageId,taskIds:r}:i}function HY(e,t){if(t===void 0)return 0;if(t===``)return e.length;let n=e.indexOf(t);return n<0?0:e.length-n-1}function UY(e,t){if(t===void 0)return 0;let n=new Set(t),r=0;for(let t of e)n.has(t)||(r+=1);return r}function WY(e,t,n){return HY(e,n.messageId)+UY(t,n.taskIds)}var GY=`castle-operator-seen-v1`,KY=`castle-operator-seen-v2`;function qY(){try{let e=localStorage.getItem(KY);if(e!==null){let t=JSON.parse(e);if(t&&typeof t==`object`){let e=t,n=e.taskIds;return{messageId:typeof e.messageId==`string`?e.messageId:void 0,taskIds:Array.isArray(n)&&n.every(e=>typeof e==`string`)?n:void 0}}}let t=localStorage.getItem(GY);if(t!==null)return{messageId:t,taskIds:void 0}}catch{}return{messageId:void 0,taskIds:void 0}}function JY(e,t){try{localStorage.setItem(KY,JSON.stringify({messageId:e,taskIds:t}))}catch{}}function YY(e){let t=[];for(let n of e)n.role===`assistant`&&n.status!==`streaming`&&t.push(n.id);return t}function XY(e){let t=[];for(let n of e)C.includes(n.status)&&!n.acknowledged&&t.push(n.id);return t}function ZY(){let[e,t]=g.useState(()=>document.visibilityState===`visible`);return g.useEffect(()=>{let e=()=>t(document.visibilityState===`visible`);return document.addEventListener(`visibilitychange`,e),()=>document.removeEventListener(`visibilitychange`,e)},[]),e}function QY(e){let t=e.boundingClientRect;if(t.width<=0||t.height<=0)return!1;let n=e.intersectionRect;return n.width>=t.width-1&&n.height>=t.height-1}var $Y=Array.from({length:21},(e,t)=>t/20);function eX(e){let[t,n]=g.useState(!1);return g.useEffect(()=>{if(!e){n(!1);return}let t=new IntersectionObserver(([e])=>n(e?QY(e):!1),{threshold:$Y});return t.observe(e),()=>t.disconnect()},[e]),t}function tX(e,t,n){let r=ZY(),i=eX(n),a=r&&(t||i),[o,s]=g.useState(qY),c=YY(e.messages),l=XY(e.tasks),u=VY(a,e.messages.length>0,c,l,o);return g.useEffect(()=>{BY(u,o)||(u.messageId!==void 0&&u.taskIds!==void 0&&JY(u.messageId,u.taskIds),s(u))},[a,e.messages,e.tasks,o]),WY(c,l,u)}var nX=`castle-flow-layout:`,rX=1;function iX(e,t){if(e)try{let n={version:rX,state:t};localStorage.setItem(nX+e,JSON.stringify(n))}catch{}}function aX(e,t,n){if(!e)return null;try{let r=localStorage.getItem(nX+e);if(!r)return null;let i=JSON.parse(r);if(i.version!==rX||!i.state||!Array.isArray(i.state.groups))return null;let a=Yt(fX(pX(i.state,t)),n);return a.groups.length===0?null:mt(a)}catch{return null}}var oX=new Set([`operator`,`files`,`params`]);function sX(e){let t=e.codeView;if(t===void 0)return e;let n={...e};return delete n.codeView,t&&(n.view=pe),n}function cX(e,t){let n=t.some(t=>t.id===e.activeTabId)?e.activeTabId:t[0].id;return{...e,tabs:t,activeTabId:n}}var lX=`params`;function uX(e){return e.kind===`editor`&&e.view===lX}function dX(e,t){if(e.kind!==`params`||e.path===void 0||t.has(e.path))return e;let n={...e};return delete n.path,n}function fX(e){if(!e.groups.some(e=>e.tabs.some(uX)))return e;let t,n=!1,r=0,i=[];for(let a of e.groups){let e=[];for(let o of a.tabs){if(!uX(o)){e.push(o);continue}let a={...o};if(delete a.view,n){e.push(a);continue}n=!0,t=o.path,r=i.length+1}if(e.length===0){r=Math.min(r,i.length);continue}i.push(cX(a,e))}let a=dt(`params`,t);return i.splice(Math.min(r,i.length),0,pt([a],at(a))),{...e,groups:i}}function pX(e,t){let n=new Set,r=[];for(let i of e.groups){let e=i.tabs.filter(e=>!(e.kind===`editor`&&e.path!==void 0&&!t.has(e.path))).map(sX).map(e=>dX(e,t));if(e.length===0)continue;let a=e.find(e=>e.kind!==`editor`);if(a&&oX.has(a.kind)){if(n.has(a.kind))continue;n.add(a.kind)}r.push(cX(i,e))}return{groups:r,activeGroupId:r.some(t=>t.id===e.activeGroupId)?e.activeGroupId:r[0]?.id??null,pinnedGroupId:r.some(t=>t.id===e.pinnedGroupId)?e.pinnedGroupId:null,maximizedGroupId:null}}var mX=g.createContext(null),hX={groups:[],activeGroupId:null,pinnedGroupId:null,maximizedGroupId:null};function gX(e,t){let n=[];if(e.forEach((e,r)=>{let i=t.get(r);if(!i)return;let a=i.getBoundingClientRect(),o=e.left-a.left,s=e.top-a.top;Math.abs(o)<1&&Math.abs(s)<1||(i.style.transition=`none`,i.style.transform=`translate(${o}px, ${s}px)`,n.push(i))}),n.length!==0){n[0].getBoundingClientRect();for(let e of n){e.style.transition=`transform 180ms ease`,e.style.transform=`translate(0px, 0px)`;let t=()=>{e.style.transition=``,e.style.transform=``,e.removeEventListener(`transitionend`,t)};e.addEventListener(`transitionend`,t)}}}function _X(e){return Array.isArray(e.column)}function vX(e){return Array.isArray(e.tabs)}function yX(e){let t=[],n=e=>{vX(e)?t.push(...e.tabs??[]):t.push(e)};for(let t of e)_X(t)?(t.column??[]).forEach(n):n(t);return t}function bX(e){return e===`files`?`files`:e===`playtest`?`play`:e===`terminal`?`terminal`:e===`editor`?`editor`:e===`params`?`params`:null}var xX=[{type:`files`},{type:`playtest`},{type:`editor`,file:`scenes/main.scene`}];function SX(e,t){let n=e&&e.length>0?yX(e):xX,r=v?null:dt(`operator`),i=r?[pt([r],at(r))]:[],a=new Map,o=null;for(let e of n){let n=bX(e.type);if(!n||n===`editor`&&!e.file)continue;if(n===`editor`&&e.file){let n=t(e.file),r=a.get(n);if(r){r.tabs.push(dt(`editor`,e.file));continue}let s=dt(`editor`,e.file),c=pt([s],at(s));a.set(n,c),i.push(c),o||=c.id;continue}let r=dt(n,e.file);i.push(pt([r],at(r)))}return{groups:i,activeGroupId:o??i[0]?.id??null,pinnedGroupId:null,maximizedGroupId:null}}function CX(){let e=jw(),[t,n]=g.useState(()=>Pw());return g.useEffect(()=>{if(e)return;let t=window.matchMedia(`(max-width: 768px)`),r=()=>n(t.matches);return t.addEventListener(`change`,r),()=>t.removeEventListener(`change`,r)},[e]),t}function wX(e){let t=e.target;if(!(t instanceof HTMLIFrameElement)||!t.classList.contains(`deck-frame`))return t;try{let n=t.contentDocument;if(!n)return t;let r=t.getBoundingClientRect();return n.elementFromPoint(e.clientX-r.left,e.clientY-r.top)??t}catch{return t}}function TX(e,t){let n=e,r=!!(n?.ownerDocument&&n.ownerDocument!==t.ownerDocument),i=r?null:t.parentElement;for(;n&&n!==i;){if(n.nodeType===1){let e=getComputedStyle(n).overflowY;if((e===`auto`||e===`scroll`)&&n.scrollHeight>n.clientHeight+1)return!0}if(!r&&n===t)break;n=n.parentElement}return!1}function EX(e,t,n){let r=e,i=t.parentElement;for(;r&&r!==i;){if(r.nodeType===1){let e=getComputedStyle(r),t=e.touchAction;if(t.includes(`pan-y`)&&!t.includes(`pan-x`))return!0;let i=e.overflowX;if(i===`auto`||i===`scroll`){let e=r.scrollWidth-r.clientWidth;if(e>1&&(n>0?r.scrollLeft>1:r.scrollLeft<e-1))return!0}}if(r===t)break;r=r.parentElement}return!1}function DX(e){g.useEffect(()=>{let t=e.current;if(!t)return;let n=e=>{e.deltaY!==0&&(t.scrollWidth<=t.clientWidth||!e.shiftKey&&TX(wX(e),t)||(t.scrollLeft+=e.deltaX-e.deltaY,e.preventDefault()))};return t.addEventListener(`wheel`,n,{passive:!1}),()=>t.removeEventListener(`wheel`,n)},[e])}function OX(e,t,n){g.useLayoutEffect(()=>{let n=e.current,r=n?.querySelector(`.flow-row`);if(!n||!r)return;let i=()=>{let e=r.lastElementChild,i=e?e.offsetLeft+e.offsetWidth:0,a=t&&i>n.clientWidth?n.clientWidth/2:0;r.style.setProperty(`--flow-overscroll`,`${Math.round(a)}px`)};i();let a=new ResizeObserver(i);return a.observe(n),()=>a.disconnect()},[e,t,n])}function kX(e,t){let n=e.getBoundingClientRect(),r=t.getBoundingClientRect();if(r.left>=n.left-1&&r.right<=n.right+1)return;let i=window.matchMedia(`(prefers-reduced-motion: reduce)`).matches;e.scrollTo({left:e.scrollLeft+(r.left+r.width/2-(n.left+n.width/2)),behavior:i?`auto`:`smooth`})}function AX(e,t){let n=g.useRef(new Map),r=g.useCallback(e=>{let t=n.current.get(e);if(t)return t.obj;let r={visible:!1,active:!1,activeCbs:new Set,visibleCbs:new Set,obj:{id:e,isVisible:()=>r.visible,isActive:()=>r.active,onDidActiveChange:e=>(r.activeCbs.add(e),()=>r.activeCbs.delete(e)),onDidVisibilityChange:e=>(r.visibleCbs.add(e),()=>r.visibleCbs.delete(e))}};return n.current.set(e,r),r.obj},[]);return g.useEffect(()=>{let r=new Set;for(let i of e.groups){let a=t?i.id===e.activeGroupId:!0;for(let t of i.tabs){r.add(t.id);let o=n.current.get(t.id);if(!o)continue;let s=i.activeTabId===t.id,c=a&&s,l=i.id===e.activeGroupId&&s;c!==o.visible&&(o.visible=c,o.visibleCbs.forEach(e=>e(c))),l!==o.active&&(o.active=l,o.activeCbs.forEach(e=>e(l)))}}for(let e of n.current.keys())r.has(e)||n.current.delete(e)}),r}function jX({agent:e}){let[t,n]=g.useState(hX),[r,i]=g.useState(null),[a,o]=g.useState(null),s=g.useRef(null),c=g.useRef(!1),l=CX(),u=g.useRef(l);u.current=l;let d=g.useRef(hX),f=g.useRef(null),[p,m]=g.useState(null);d.current=t;let h=g.useRef(new Map),_=t.groups.find(e=>e.tabs.some(e=>e.kind===`operator`))?.id??null,y=g.useRef(_);y.current=_;let[b,x]=g.useState(null),S=g.useRef(null),C=g.useRef(null),w=g.useRef(null),T=g.useRef({page:0,count:0,ids:[]});DX(C),OX(C,!l&&!t.maximizedGroupId,t.groups);let ee=AX(t,l);g.useEffect(()=>{let e=!0;Promise.all([xe(),Ae().catch(()=>[])]).then(([t,r])=>{e&&(s.current=t.deckId,ue(t),i(t.kitEditorExtensions),o(r),n(aX(t.deckId,new Set(r),he)??SX(t.initialPanels,he)),c.current=!0)},()=>{e&&(i([]),o([]),n(SX(null,he)),c.current=!0)});let t=cx(t=>{t.changes.some(e=>e.event!==`change`)&&Ae().then(t=>{e&&o(t)}).catch(()=>{}),t.changes.some(e=>e.path===`castle.json`||e.path.startsWith(`imports/`))&&xe().then(t=>{e&&(ue(t),i(t.kitEditorExtensions))},()=>{})});return()=>{e=!1,t()}},[]),g.useEffect(()=>{if(!c.current)return;let e=window.setTimeout(()=>iX(s.current,t),400);return()=>window.clearTimeout(e)},[t]);let E=g.useMemo(()=>{let e=t.groups.find(e=>e.id===t.activeGroupId),n=e?.tabs.find(t=>t.id===e.activeTabId)??e?.tabs[0];return n&&n.kind===`editor`?n.path??null:null},[t.groups,t.activeGroupId]),te=g.useRef(null),D=g.useCallback(e=>{if(u.current||d.current.maximizedGroupId)return;let t=C.current,n=h.current.get(e);t&&n&&kX(t,n)},[]),ne=g.useCallback((e,t)=>{e&&(te.current=e,t||requestAnimationFrame(()=>{te.current===e&&(te.current=null,D(e))}))},[D]);g.useLayoutEffect(()=>{let e=te.current;e&&(te.current=null,D(e))},[t.groups,t.activeGroupId,t.maximizedGroupId,D]);let re=g.useCallback(e=>{let t=d.current,r=e(t);r!==t&&n(()=>r),ne(r.activeGroupId,r!==t)},[ne]),O=g.useCallback((e,t,r,i)=>{let a=d.current,o=i?.line===void 0&&i?.field===void 0;i&&!(o&&_t(a,e))&&tS(e,i);let c=u.current?1:1/0,l=t?Bt(a,t,e,he,c,r):zt(a,e,he,c,r);if(l===a)return;let f=rt(l);for(let e of rt(a))f.has(e)||oy(e);fb(s.current,e),n(()=>l),ne(l.activeGroupId,!0)},[ne]),k=g.useMemo(()=>({openFile:(e,t,n)=>O(e,void 0,t,n),openPlaytest:()=>re(e=>Ut(e,`play`)),openParams:(e,t)=>{e&&t?.field&&tS(e,{field:t.field}),re(t=>qt(t,e))},setParamsScope:e=>n(t=>Kt(t,e)),mentionInChat:e=>{v||(lK(e),re(e=>Ut(e,`operator`)))},closeEditor:e=>n(t=>{let n=_t(t,e);return n?Pt(t,n.group.id,n.tab.id):t}),activeEditorPath:E,kitEditorExts:r,terminalTheme:`dark`}),[r,E,O,re]);Xx(k);let ie=g.useCallback((e,t)=>{let r=d.current,i=r.maximizedGroupId?$t({...r,maximizedGroupId:null},e):At(r,e);i!==r&&n(()=>i),t?.reveal&&ne(e,i!==r)},[ne]),ae=g.useCallback(e=>{let t=gt(d.current,e);if(t)for(let e of t.tabs)e.kind===`editor`&&e.path&&oy(e.path);n(t=>Jt(t,e))},[]),oe=g.useCallback((e,t)=>{let r=gt(d.current,e)?.tabs.find(e=>e.id===t);r?.kind===`editor`&&r.path&&oy(r.path),n(n=>Pt(n,e,t))},[]),se=g.useCallback((e,t)=>n(n=>jt(n,e,t)),[]),ce=g.useCallback((e,t,r)=>{n(n=>Zt(n,e,t,r))},[]),[A,le]=g.useState(null),de=g.useCallback(e=>le(e),[]),fe=g.useCallback(()=>le(null),[]),pe=g.useCallback((e,t)=>O(t,e),[O]),me=g.useCallback((e,t,r)=>{n(n=>Lt(n,e,t,r))},[]),ge=g.useCallback(e=>n(t=>Qt(t,e)),[]),_e=g.useCallback(e=>{let t=d.current.maximizedGroupId===e;n(t=>$t(t,e)),t&&ne(e,!0)},[ne]),ve=g.useCallback((e,t,r)=>{n(n=>tn(en(n,e,t),e,r))},[]);g.useEffect(()=>{if(!l)return;let e=C.current,t=w.current;if(!e||!t)return;let r=0,i=0,a=0,o=1,s=!1,c=!1,u=null,d=e=>t.style.setProperty(`--flow-drag`,`${e}px`),f=t=>{t.touches.length===1&&(r=t.touches[0].clientX,i=t.touches[0].clientY,a=t.timeStamp,u=t.target,o=e.clientWidth||1,s=!1,c=!1)},p=n=>{if(n.touches.length!==1)return;let a=n.touches[0].clientX-r,o=n.touches[0].clientY-i;if(!s){if(Math.abs(a)<8&&Math.abs(o)<8)return;s=!0,c=Math.abs(a)>Math.abs(o)&&!EX(u,e,a),c&&t.classList.add(`flow-dragging`)}if(!c)return;n.preventDefault();let{page:l,count:f}=T.current;d(l===0&&a>0||l===f-1&&a<0?a*.3:a)},m=e=>{if(!c){t.classList.remove(`flow-dragging`);return}c=!1,t.classList.remove(`flow-dragging`);let i=e.changedTouches[0],s=i?i.clientX-r:0,l=e.timeStamp-a,{page:u,count:f,ids:p}=T.current,m=Math.abs(s)>50&&l<250,h=Math.abs(s)>o*.25,g=u;s<0&&(m||h)?g=Math.min(f-1,u+1):s>0&&(m||h)&&(g=Math.max(0,u-1));let _=p[g];g!==u&&_?n(e=>At(e,_)):d(0)};return e.addEventListener(`touchstart`,f,{passive:!0}),e.addEventListener(`touchmove`,p,{passive:!1}),e.addEventListener(`touchend`,m,{passive:!0}),e.addEventListener(`touchcancel`,m,{passive:!0}),()=>{e.removeEventListener(`touchstart`,f),e.removeEventListener(`touchmove`,p),e.removeEventListener(`touchend`,m),e.removeEventListener(`touchcancel`,m)}},[l]);let ye=g.useCallback((e,t)=>{t?h.current.set(e,t):h.current.delete(e),e===y.current&&x(t)},[]);g.useLayoutEffect(()=>{x(_?h.current.get(_)??null:null)},[_]);let be=tX(e,(()=>{let e=t.groups.find(e=>e.id===t.activeGroupId);return(e?.tabs.find(t=>t.id===e.activeTabId)??e?.tabs[0])?.kind===`operator`})(),b),[Se,Ce]=g.useState(null),we=g.useRef(null),Te=g.useRef(!1);g.useLayoutEffect(()=>{let e=we.current;e&&(we.current=null,gX(e,h.current))});let Ee=g.useCallback((e,t)=>{let r=d.current;if(u.current){let n=Xt(r,e,t),i=r.groups.findIndex(e=>e.id===r.activeGroupId);n.groups.findIndex(e=>e.id===n.activeGroupId)!==i&&(Te.current=!0)}else{let e=new Map;for(let t of r.groups){let n=h.current.get(t.id)?.getBoundingClientRect();n&&e.set(t.id,n)}we.current=e}n(n=>Xt(n,e,t))},[]);g.useEffect(()=>()=>{S.current?.()},[]);let De=g.useCallback((e,r)=>{if(l||e.button!==0||e.target.closest(`.panel-tab, button`)||!h.current.get(r))return;let i=e.currentTarget,a=e.pointerId;try{i.setPointerCapture(a)}catch{}let o=e.clientX,s=t.groups.findIndex(e=>e.id===r),c=e=>{let n=t.groups.filter(e=>e.id!==r).map(e=>{let t=h.current.get(e.id)?.getBoundingClientRect();return{left:t?.left??1/0,right:t?.right??1/0,center:t?t.left+t.width/2:1/0}}),i=0;for(;i<n.length&&n[i].center<e;)i+=1;if(i===s)return{target:i,x:null};let a=i<n.length?n[i].left-6:n.length?n[n.length-1].right+6:e;return{target:i,x:a}},u=!1,d=e.clientX,f=0,p=()=>{let e=C.current;if(e&&e.scrollWidth>e.clientWidth+1){let t=e.getBoundingClientRect(),n=0;d<t.left+64?n=-(1-Math.max(0,d-t.left)/64):d>t.right-64&&(n=1-Math.max(0,t.right-d)/64),n!==0&&(e.scrollLeft+=n*24,Ce({id:r,x:c(d).x}))}f=requestAnimationFrame(p)},m=e=>{!u&&Math.abs(e.clientX-o)<5||(u||(document.body.classList.add(`flow-reordering`),u=!0,f=requestAnimationFrame(p)),d=e.clientX,Ce({id:r,x:c(e.clientX).x}))},g=!1,_=()=>{if(!g){g=!0,i.removeEventListener(`pointermove`,m),i.removeEventListener(`pointerup`,v),i.removeEventListener(`pointercancel`,y),i.removeEventListener(`lostpointercapture`,y);try{i.hasPointerCapture(a)&&i.releasePointerCapture(a)}catch{}f&&cancelAnimationFrame(f),document.body.classList.remove(`flow-reordering`),S.current=null}},v=e=>{let i=u;if(_(),i){let{target:i}=c(e.clientX);if(i!==s){let e=new Map;for(let n of t.groups){let t=h.current.get(n.id)?.getBoundingClientRect();t&&e.set(n.id,t)}we.current=e,n(e=>Xt(e,r,i))}}Ce(null)},y=()=>{_(),Ce(null)};S.current=y,i.addEventListener(`pointermove`,m),i.addEventListener(`pointerup`,v),i.addEventListener(`pointercancel`,y),i.addEventListener(`lostpointercapture`,y)},[l,t.groups]),[Oe,ke]=g.useState(null),je=g.useCallback(e=>ke(t=>t?null:{anchor:e}),[]),Me=g.useCallback(()=>{let e=w.current?.querySelector(`.flow-tabs-add`);ke({anchor:e?.getBoundingClientRect()??new DOMRect(window.innerWidth/2,48)})},[]);g.useEffect(()=>{let e=(e,t)=>(t&&t!==window?[...document.querySelectorAll(`iframe.deck-frame`)].find(e=>e.contentWindow===t):e)?.closest?.(`.flow-group`)?.getAttribute(`data-group-id`)??null;return Dy(`pointermove`,t=>{let n=e(t.target,t.view);f.current=n,!u.current&&m(e=>e===n?e:n)},{passive:!0})},[]);let Ne=g.useMemo(()=>hy({getState:()=>d.current,setState:n,spawn:re,focusGroup:e=>ie(e,{reveal:!0}),closeGroup:ae,closeTab:oe,openPath:e=>O(e),openNewGroupPicker:Me,getHoveredGroupId:()=>f.current,toggleMaximize:_e}),[re,ie,ae,oe,O,Me,_e]),Pe=Ay(Ne),Fe=t.groups.some(e=>e.id===t.activeGroupId)?t.activeGroupId:t.groups[0]?.id??null,Ie=l?null:t.maximizedGroupId,Le=Math.max(0,t.groups.findIndex(e=>e.id===Fe));T.current={page:Le,count:t.groups.length,ids:t.groups.map(e=>e.id)},g.useLayoutEffect(()=>{let e=w.current;if(!e)return;let t=Te.current;t&&e.classList.add(`flow-dragging`),e.style.setProperty(`--flow-page`,String(Le)),e.style.setProperty(`--flow-drag`,`0px`),t&&(Te.current=!1,e.offsetHeight,requestAnimationFrame(()=>e.classList.remove(`flow-dragging`)))},[Le,l]),Qy(w),nb(()=>A?(le(null),!0):Oe?(ke(null),!0):!1,1);let Re=A?gt(t,A):null,ze=Re?.tabs.find(e=>e.id===Re.activeTabId)??Re?.tabs[0],Be=ze&&ze.kind===`editor`?ze.path??``:``;return(0,U.jsx)(Jx,{value:k,children:(0,U.jsx)(mX.Provider,{value:e,children:(0,U.jsxs)(`div`,{ref:w,className:`flow-root${l?` is-mobile`:``}${Ie?` is-maximized`:``}`,children:[(0,U.jsx)(MX,{state:t,activeId:Fe,operatorBadge:be,onFocusGroup:ie,onReorderGroup:Ee,onNewGroup:je}),(0,U.jsx)(`div`,{className:`flow-scroller`,ref:C,children:(0,U.jsx)(`div`,{className:`flow-field`,children:(0,U.jsx)(`div`,{className:`flow-row`,children:t.groups.map(e=>(0,U.jsx)(PX,{group:e,active:e.id===Fe,mobile:l,pinned:e.id===t.pinnedGroupId&&!Ie,maximized:e.id===Ie,hidden:Ie!==null&&e.id!==Ie,dragging:Se?.id===e.id,hovered:e.id===p,getLifecycle:ee,registerEl:ye,onFocusGroup:ie,onClose:ae,onActivateTab:se,onCloseTab:oe,onReorderTab:ce,onOpenMobileSwitch:de,onOpenInGroup:pe,onSetTabView:me,onTogglePin:ge,onToggleMaximize:_e,onStartDrag:De,onResize:ve},e.id))})})}),Se&&Se.x!==null&&(()=>{let e=C.current?.getBoundingClientRect(),t=h.current.get(Se.id)?.getBoundingClientRect();if(!e||!t)return null;let n=Math.max(t.top,e.top+12+36),r=Math.min(t.bottom,e.bottom)-n;return r<=0?null:(0,U.jsx)(`div`,{className:`flow-drop-indicator`,style:{left:Se.x,top:n,height:r}})})(),Oe&&(0,U.jsx)(WX,{anchor:Oe.anchor,files:a??[],onOpenFile:e=>O(e),onSpawnPanel:e=>re(t=>Ut(t,e)),onSpawnClass:e=>re(t=>Vt(t,e,he)),onClose:()=>ke(null)}),A&&(0,U.jsx)(Dw,{groupId:A,groupClass:nt(Re,he),currentFile:Be,files:a,recent:mb(s.current),view:ze?.view,onSetView:e=>{A&&ze&&me(A,ze.id,e)},onOpen:(e,t)=>O(e,t),onClose:fe}),(0,U.jsx)(sb,{openFile:e=>O(e),openPanel:e=>re(t=>Ut(t,e===`playtest`?`play`:e)),panels:HX,getCommands:Ne}),Pe?(0,U.jsxs)(`div`,{className:`chord-hint`,role:`status`,children:[(0,U.jsx)(`kbd`,{children:Pe}),(0,U.jsx)(`span`,{children:`waiting for the next key…`})]}):null]})})})}function MX(e){let{state:t,activeId:n,operatorBadge:r,onFocusGroup:i,onReorderGroup:a,onNewGroup:o}=e,s=ib(),[c,l]=g.useState(!1),u=s?.title?.trim()||`Untitled deck`;Yy(u,r),Xy(r);let d=s?.visibility===`public`?kb:s?.visibility===`unlisted`?Db:Ob,f=s?.saving??`idle`,p=s?.saveError??null,m=s?.draftAutosaveState??null,h=m===`starting`||m===`saving`?`Saving draft…`:m===`dirty`?`Unsaved changes`:m===`error`?`Draft save failed`:m===`saved`?`Draft saved`:null,[_,v]=g.useState(null),y=g.useRef(!1);g.useEffect(()=>{_!==null&&(f===`working`&&(y.current=!0),f===`done`&&y.current&&v(`done`),p&&y.current&&v(`failed`))},[f,p,_]);let b=g.useCallback(()=>{y.current=!1,v(`pushing`),qy(`push`)},[]);return(0,U.jsxs)(U.Fragment,{children:[(0,U.jsxs)(`div`,{className:`flow-topbar`,children:[(0,U.jsxs)(`div`,{className:`flow-topbar-leading`,children:[jw()?null:(0,U.jsxs)(`div`,{className:`flow-castle-wrap`,children:[(0,U.jsx)(`button`,{type:`button`,className:`dock-control dock-control-icon dock-control-mark`,title:`Menu`,"aria-haspopup":`menu`,"aria-expanded":c,onClick:()=>l(e=>!e),children:Fb}),c&&(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`div`,{className:`flow-menu-backdrop`,onClick:()=>l(!1)}),(0,U.jsxs)(`div`,{className:`menu flow-castle-menu`,role:`menu`,children:[(0,U.jsxs)(`button`,{type:`button`,role:`menuitem`,className:`menu-item`,onClick:()=>{l(!1),qy(`back-to-decks`)},children:[(0,U.jsx)(`span`,{className:`menu-icon`,children:jb}),(0,U.jsx)(`span`,{className:`menu-item-label`,children:`Back to decks`})]}),(0,U.jsxs)(`button`,{type:`button`,role:`menuitem`,className:`menu-item`,onClick:()=>{l(!1),qy(`new-deck`)},children:[(0,U.jsx)(`span`,{className:`menu-icon`,children:Cb}),(0,U.jsx)(`span`,{className:`menu-item-label`,children:`New deck`})]}),(0,U.jsx)(`div`,{className:`menu-separator flow-menu-narrow`}),(0,U.jsx)(`button`,{type:`button`,role:`menuitem`,className:`menu-item flow-menu-narrow`,onClick:()=>{l(!1),qy(`open-settings`)},children:(0,U.jsx)(`span`,{className:`menu-item-label`,children:`Deck settings`})}),(0,U.jsx)(`button`,{type:`button`,role:`menuitem`,className:`menu-item flow-menu-narrow`,disabled:f===`working`,onClick:()=>{l(!1),b()},children:(0,U.jsx)(`span`,{className:`menu-item-label`,children:f===`working`?`Pushing…`:p?`Push failed — retry`:f===`done`?`Pushed ✓`:`Push to Castle`})})]})]})]}),(0,U.jsxs)(`button`,{type:`button`,className:`dock-control dock-control-quiet flow-deck-identity`,title:`Deck settings`,onClick:()=>qy(`open-settings`),children:[(0,U.jsx)(`span`,{className:`flow-deck-vis`,children:d}),(0,U.jsx)(`span`,{className:`flow-deck-name`,children:u}),(0,U.jsx)(`span`,{className:`flow-deck-caret`,children:Mb})]}),h?(0,U.jsx)(`span`,{className:`flow-draft-status${m===`error`?` is-error`:``}`,role:`status`,children:h}):null]}),(0,U.jsxs)(`div`,{className:`flow-tabs-wrap`,children:[(0,U.jsx)(rw,{groups:t.groups,activeId:n,operatorBadge:r,onFocusGroup:i,onReorderGroup:a}),(0,U.jsx)(`button`,{type:`button`,className:`button button-icon button-quiet flow-tabs-add flow-picker-trigger`,title:`New group`,"aria-label":`New group`,onClick:e=>o(e.currentTarget.getBoundingClientRect()),children:Cb})]}),(0,U.jsx)(`div`,{className:`flow-topbar-trailing`,children:(0,U.jsxs)(`button`,{type:`button`,className:`dock-control flow-preview-btn${p?` flow-preview-btn-failed`:``}`,title:p??`Publish this deck to your Castle account (sandbox edits stay local until pushed)`,disabled:f===`working`,onClick:()=>qy(`push`),children:[Ab,(0,U.jsxs)(`span`,{className:`flow-preview-label`,children:[(0,U.jsx)(`span`,{className:`flow-preview-label-sizer`,"aria-hidden":`true`,children:`Push to Castle`}),(0,U.jsx)(`span`,{children:f===`working`?`Pushing…`:p?`Push failed`:f===`done`?`Pushed ✓`:`Push to Castle`})]})]})})]}),_!==null&&(0,U.jsx)(`div`,{className:`flow-push-modal-backdrop`,children:(0,U.jsx)(`div`,{className:`flow-push-modal`,role:`dialog`,"aria-modal":`true`,children:_===`failed`?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`div`,{className:`flow-push-check flow-push-check-failed`,children:`!`}),(0,U.jsx)(`div`,{className:`flow-push-title`,children:`Push failed`}),(0,U.jsx)(`div`,{className:`flow-push-sub`,children:p}),(0,U.jsx)(`button`,{type:`button`,className:`flow-push-done`,onClick:()=>v(null),children:`Dismiss`})]}):_===`done`?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`div`,{className:`flow-push-check`,children:`✓`}),(0,U.jsx)(`div`,{className:`flow-push-title`,children:`Pushed to Castle`}),s?.shareUrl?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`div`,{className:`flow-push-sub`,children:`Your deck is live at`}),(0,U.jsx)(`a`,{className:`flow-push-url`,href:s.shareUrl,target:`_blank`,rel:`noreferrer`,children:s.shareUrl.replace(/^https?:\/\//,``)})]}):(0,U.jsx)(`div`,{className:`flow-push-sub`,children:`Saved to your Castle account.`}),(0,U.jsx)(`button`,{type:`button`,className:`flow-push-done`,onClick:()=>v(null),children:`Done`})]}):(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`div`,{className:`flow-push-spinner`}),(0,U.jsx)(`div`,{className:`flow-push-title`,children:`Pushing to Castle…`}),(0,U.jsx)(`div`,{className:`flow-push-sub`,children:`Publishing your latest changes.`})]})})})]})}function NX(e,t){e.currentTarget.blur(),t()}var PX=g.memo(function(e){let{group:t,active:n,mobile:r,pinned:i,maximized:a,hidden:o,dragging:s,hovered:c,getLifecycle:l,registerEl:u}=e,{onFocusGroup:d,onClose:f}=e,p=tt(t),m=GX(t,e.onResize),[h,_]=g.useState(()=>p&&t.tabs.every(et)),v=g.useCallback(()=>_(e=>!e),[]),y=r?void 0:a?{flex:`1 1 auto`}:{flex:`0 0 auto`,width:t.w,height:t.h},b=p?null:t.tabs[0],x=(0,U.jsx)(`button`,{type:`button`,className:r?`button button-icon button-icon-large button-quiet`:`button button-icon button-quiet`,title:`Close`,"aria-label":`Close`,onClick:e=>NX(e,()=>f(t.id)),children:wb}),S=n=>{n.target.closest(`button, .panel-tab`)||a||e.onStartDrag(n,t.id)},C=n&&!r&&!a,w=b?.kind===`operator`;return(0,U.jsxs)(`div`,{ref:e=>u(t.id,e),"data-group-id":t.id,className:`panel flow-group${C?` is-active`:``}${i?` pinned`:``}${a?` maximized`:``}${o?` hidden`:``}${s?` is-dragging`:``}${c?` is-hover`:``}${p?` is-editor`:``}`,style:y,onMouseDown:()=>d(t.id),children:[p?(0,U.jsx)(QC,{group:t,mobile:r,pinned:i,maximized:a,onStartDrag:e.onStartDrag,onActivateTab:e.onActivateTab,onCloseTab:e.onCloseTab,onCloseGroup:f,onReorderTab:e.onReorderTab,onTogglePin:e.onTogglePin,onToggleMaximize:e.onToggleMaximize,onOpenMobileSwitch:e.onOpenMobileSwitch,onSetTabView:e.onSetTabView,drawerOpen:h,onToggleDrawer:v}):(0,U.jsxs)(`div`,{className:`${w?`panel-tabs-header`:`panel-header`} flow-tabstrip${r?` flow-tabstrip-mobile`:``}`,onPointerDown:S,children:[w?(0,U.jsx)(`div`,{className:`operator-chrome`,"data-operator-chrome":!0}):r?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`div`,{className:`flow-mobile-strip-left`}),(0,U.jsxs)(`div`,{className:`panel-mobile-current`,children:[(0,U.jsx)(`span`,{className:`flow-tab-icon`,children:b&&Sb(b.kind,b.path)}),(0,U.jsx)(`span`,{className:`panel-mobile-current-label`,children:b?.label})]})]}):(0,U.jsxs)(`div`,{className:`panel-title`,children:[(0,U.jsx)(`span`,{className:`flow-tab-icon`,children:b&&Sb(b.kind,b.path)}),(0,U.jsx)(`span`,{children:b?.label})]}),(0,U.jsxs)(`div`,{className:`panel-header-actions${r?` flow-mobile-strip-right`:``}`,children:[!r&&!a&&(0,U.jsx)(`button`,{type:`button`,className:`button button-icon button-quiet`,title:i?`Unpin`:`Pin to left`,"aria-label":i?`Unpin`:`Pin to left`,"aria-pressed":i,onClick:n=>NX(n,()=>e.onTogglePin(t.id)),children:Eb}),!r&&(0,U.jsx)(`button`,{type:`button`,className:`button button-icon button-quiet`,title:a?`Restore`:`Maximize`,"aria-label":a?`Restore`:`Maximize`,"aria-pressed":a,onClick:n=>NX(n,()=>e.onToggleMaximize(t.id)),children:a?Pb:Nb}),x]})]}),(0,U.jsx)(`div`,{className:`flow-panel-body`,children:t.tabs.map(i=>(0,U.jsx)(`div`,{className:`flow-tab-body${i.id===t.activeTabId?``:` inactive`}`,children:(0,U.jsx)(FX,{tab:i,groupId:t.id,lifecycle:l(i.id),onOpenInGroup:e.onOpenInGroup,onSetTabView:e.onSetTabView,drawerOpen:h&&!r,mobile:r,active:n})},i.id))}),!r&&!a&&(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`div`,{className:`flow-resize-e`,onPointerDown:m(`x`),title:`Drag to resize width`}),(0,U.jsx)(`div`,{className:`flow-resize-s`,onPointerDown:m(`y`),title:`Drag to resize height`}),(0,U.jsx)(`div`,{className:`flow-resize-se`,onPointerDown:m(`xy`),title:`Drag to resize`})]})]})}),FX=g.memo(function(e){let{tab:t,groupId:n,lifecycle:r,onOpenInGroup:i,onSetTabView:a,drawerOpen:o,mobile:s,active:c}=e;if(t.kind===`editor`&&et(t))return(0,U.jsxs)(`div`,{className:`flow-empty-editor`,children:[o?(0,U.jsx)(QW,{currentFile:``,filterClass:t.classHint,onOpen:e=>i(n,e)}):null,(0,U.jsx)(`div`,{className:`flow-empty-editor-msg`,children:`Open a file`})]});switch(t.kind){case`editor`:return(0,U.jsx)(HW,{file:t.path,editorClass:t.view,lifecycle:r,hideContextBar:!0,drawerOpen:o,drawer:(0,U.jsx)(QW,{currentFile:t.path??``,filterClass:t.path?he(t.path):void 0,onOpen:e=>i(n,e),view:t.view,onSetView:e=>a(n,t.id,e)})});case`play`:return(0,U.jsx)(XW,{lifecycle:r});case`terminal`:return(0,U.jsx)(ZW,{lifecycle:r});case`files`:return(0,U.jsx)(eK,{lifecycle:r});case`params`:return(0,U.jsx)(zC,{scope:t.path,lifecycle:r});case`operator`:return(0,U.jsx)(IX,{mobile:s,active:c});default:return(0,U.jsx)(LX,{tab:t})}});function IX(e){let t=g.useContext(mX);return t?(0,U.jsx)(`div`,{className:`shell-root docked flow-operator-host`,style:{"--operator-col":`100%`},children:(0,U.jsx)(RY,{agent:t,mobile:e.mobile,active:e.active})}):(0,U.jsx)(`div`,{className:`flow-placeholder`,children:`operator unavailable`})}function LX(e){let{tab:t}=e;return(0,U.jsxs)(`div`,{className:`flow-placeholder kind-${t.kind}`,children:[(0,U.jsx)(`div`,{className:`flow-placeholder-icon`,children:Sb(t.kind,t.path)}),(0,U.jsx)(`div`,{className:`flow-placeholder-label`,children:t.label}),(0,U.jsx)(`div`,{className:`flow-placeholder-kind`,children:t.path??t.kind})]})}function RX(e,t){g.useEffect(()=>{let n=n=>{n.target.closest(e)||t()},r=window.setTimeout(()=>document.addEventListener(`mousedown`,n),0);return()=>{window.clearTimeout(r),document.removeEventListener(`mousedown`,n)}},[e,t])}function zX(e,t){return Math.max(8,Math.min(e,window.innerWidth-t-8))}var BX=300,VX=[...v?[]:[{kind:`operator`,label:`Operator`}],{kind:`play`,label:`Play`},...v?[]:[{kind:`terminal`,label:`Terminal`}],{kind:`files`,label:`Files`},{kind:`params`,label:`Parameters`}],HX=VX.map(({kind:e,label:t})=>({kind:e===`play`?`playtest`:e,label:t}));function UX(e,t){let n=t.trim().toLowerCase(),r=VX.filter(e=>e.label.toLowerCase().includes(n)).map(e=>({kind:`panel`,panel:e.kind,label:e.label})),i=new Set;for(let t of e)i.add(he(t));let a=[...i].map(e=>{let t=ge(e);return{kind:`class`,classId:e,label:t.label,icon:t.icon}}).filter(e=>e.label.toLowerCase().includes(n)).sort((e,t)=>e.label.localeCompare(t.label)),o=e.filter(e=>e.toLowerCase().includes(n)).slice(0,40).map(e=>({kind:`file`,path:e}));return[...r,...a,...o]}function WX(e){let{anchor:t,files:n,onOpenFile:r,onSpawnPanel:i,onSpawnClass:a,onClose:o}=e,[s,c]=g.useState(``),[l,u]=g.useState(0);RX(`.flow-picker, .flow-picker-trigger`,o);let d=UX(n,s),f=Math.min(l,Math.max(0,d.length-1)),p=e=>{e.kind===`panel`?i(e.panel):e.kind===`class`?a(e.classId):r(e.path),o()};return(0,My.createPortal)((0,U.jsxs)(`div`,{className:`menu flow-picker`,style:{top:t.bottom+4,left:zX(t.left,BX),width:BX},onMouseDown:e=>e.stopPropagation(),children:[(0,U.jsx)(`input`,{className:`flow-picker-input`,autoFocus:!0,placeholder:`Open a file or panel…`,value:s,onChange:e=>{c(e.target.value),u(0)},onKeyDown:e=>{e.key===`Escape`?o():e.key===`ArrowDown`?(e.preventDefault(),u(e=>Math.min(e+1,d.length-1))):e.key===`ArrowUp`?(e.preventDefault(),u(e=>Math.max(e-1,0))):e.key===`Enter`&&d[f]&&p(d[f])}}),(0,U.jsxs)(`div`,{className:`flow-picker-list`,children:[d.length===0&&(0,U.jsx)(`div`,{className:`flow-picker-empty`,children:`No matches`}),d.map((e,t)=>(0,U.jsxs)(`button`,{type:`button`,className:`menu-item${t===f?` is-hover`:``}`,onMouseEnter:()=>u(t),onClick:()=>p(e),children:[(0,U.jsx)(`span`,{className:`menu-icon`,children:e.kind===`panel`?Sb(e.panel):e.kind===`class`?yb(e.icon):Sb(`editor`,e.path)}),(0,U.jsx)(`span`,{className:`menu-item-label`,children:e.kind===`panel`||e.kind===`class`?e.label:e.path})]},e.kind===`panel`?`p:${e.panel}`:e.kind===`class`?`c:${e.classId}`:`f:${e.path}`))]})]}),document.body)}function GX(e,t){return g.useCallback(n=>r=>{r.preventDefault(),r.stopPropagation();let i=r.clientX,a=r.clientY,o=e.w,s=e.h,c=r.currentTarget;c.setPointerCapture(r.pointerId);let l=!1,u=r=>{let c=r.clientX-i,u=r.clientY-a;if(!l&&Math.abs(c)<5&&Math.abs(u)<5)return;l=!0;let d=n===`y`?o:Math.max(200,o+c),f=n===`x`?s:Math.max(160,s+u);t(e.id,d,f)},d=()=>{c.removeEventListener(`pointermove`,u),c.removeEventListener(`pointerup`,d)};c.addEventListener(`pointermove`,u),c.addEventListener(`pointerup`,d)},[e.id,e.w,e.h,t])}function KX(){let e=se(),t=g.useRef(0);return rb(()=>{let n=Date.now();n-t.current<1e3||(t.current=n,e.refreshUsage())}),(0,U.jsx)(jX,{agent:e})}var qX=document.getElementById(`root`);if(!qX)throw Error(`Missing #root`);lG(),YP(),Bx(),(0,_.createRoot)(qX).render((0,U.jsx)(KX,{}));
|
|
449
|
+
`)}`:``}var wJ={thinking:(0,U.jsx)(W,{name:`lightbulb`}),reading:(0,U.jsx)(W,{name:`book`}),building:(0,U.jsx)(W,{name:`hammer`}),painting:(0,U.jsx)(W,{name:`pencil`}),playing:(0,U.jsx)(W,{name:`gamepad`})},TJ={thinking:`Thinking`,reading:`Reading files`,building:`Editing logic`,painting:`Editing art`,playing:`Playtesting`},EJ={thinking:`#FFC826`,reading:`#FFC826`,building:`#FFEB57`,painting:`#FFEB57`,playing:`#D3FC7E`};function DJ(e){if(e.status===`done`)return{icon:(0,U.jsx)(W,{name:`check`}),color:`#5AC54F`};if(e.status===`failed`)return{icon:(0,U.jsx)(W,{name:`times`}),color:`#F5545D`};if(e.status===`interrupted`)return{icon:(0,U.jsx)(W,{name:`stop`}),color:`#B4B4B4`};if(e.status===`blocked`)return{icon:(0,U.jsx)(W,{name:`stop`}),color:`#F5A623`};let t=e.avatar&&wJ[e.avatar]?e.avatar:`thinking`;return{icon:wJ[t],color:EJ[t]}}function OJ(e){let t=Math.max(1,Math.round((e??0)/1e3));if(t<60)return`Thought for ${t}s`;let n=Math.floor(t/60),r=t%60;return r===0?`Thought for ${n}m`:`Thought for ${n}m ${r}s`}var kJ=`plan.md`;function AJ(){let e=Yx();return(0,U.jsxs)(`div`,{className:`operator-line msg-plan`,children:[(0,U.jsx)(W,{name:`file-md`,className:`icon-inline`}),(0,U.jsxs)(`span`,{children:[(0,U.jsx)(`button`,{type:`button`,className:`operator-line-link`,title:`Open ${kJ}`,onClick:()=>e.openFile(kJ),children:kJ}),` `,`updated`]})]})}function jJ(e){let t=Yx();return(0,U.jsx)(`button`,{type:`button`,className:`msg-file`,title:`Open ${gP(e.loc)}`,onClick:()=>kP(t,e.loc),children:e.token})}function MJ(e){let{text:t}=e,n=sC(),r=g.useMemo(()=>OP(t,iC),[t,n]),i=[],a=0;for(let e of r)e.start>a&&i.push(t.slice(a,e.start)),i.push((0,U.jsx)(jJ,{loc:e.loc,token:t.slice(e.start,e.end)},e.start)),a=e.end;return a<t.length&&i.push(t.slice(a)),(0,U.jsx)(`span`,{children:i})}var NJ=(0,U.jsx)(W,{name:`send`}),PJ=(0,U.jsx)(W,{name:`stop`}),FJ=(0,U.jsx)(W,{name:`chevron-down`}),IJ=`openai/gpt-5.6-terra`,LJ=[{value:`sonnet`,label:`Sonnet`},{value:`opus`,label:`Opus`},{value:`fable`,label:`Fable`}],RJ={sonnet:`Sonnet`,opus:`Opus`,fable:`Fable`};function zJ(e){return e===`router`?{claude:`routerClaudeModel`,slug:`routerOpenrouterModel`}:{claude:`tasksClaudeModel`,slug:`tasksOpenrouterModel`}}function BJ(e){let t=e?.freeModel;return t&&t.trim()?t:null}function VJ(e,t,n){let{claude:r,slug:i}=zJ(e);if(t[r]!==`openrouter`)return`claude`;let a=BJ(n);return a&&(n?.freeRoles?.[e]||t[i]?.trim()===a)?`muse`:`openrouter`}function HJ(e){if(!e||!e.trim())return null;let t=e.trim(),n=t.lastIndexOf(`/`);return n>=0?t.slice(n+1):t}function UJ(e,t,n){let{claude:r,slug:i}=zJ(e),a=t[r];return VJ(e,t,n)===`muse`?`Muse`:a===`openrouter`?HJ(t[i])??`OpenRouter`:RJ[a]??a??`?`}function WJ(e,t){return`${UJ(`router`,e,t)} → ${UJ(`tasks`,e,t)}`}function GJ(e){let{label:t,placeholder:n,value:r,warning:i,discardOnUnmount:a,onCommit:o}=e,[s,c]=g.useState(r);g.useEffect(()=>c(r),[r]);let l=g.useRef(s),u=g.useRef(r),d=g.useRef(o);l.current=s,u.current=r,d.current=o;let f=()=>{let e=l.current.trim();return e&&e!==u.current?(d.current(e),!0):!1},p=()=>{f()||c(u.current)};g.useEffect(()=>{a&&(a.current=!1)},[a]),g.useEffect(()=>()=>{a?.current||f()},[a]);let m=e=>{c(e),o(e)};return(0,U.jsxs)(U.Fragment,{children:[(0,U.jsxs)(`div`,{className:`settings-row-main settings-model-detail`,children:[(0,U.jsx)(`span`,{className:`settings-label`,children:t}),(0,U.jsx)(`input`,{type:`text`,size:1,className:`text-field${i?` settings-text-warn`:``}`,value:s,placeholder:n,onChange:e=>c(e.target.value),onBlur:p,onKeyDown:e=>{e.key===`Enter`&&(p(),e.target.blur())}})]}),i?(0,U.jsxs)(`div`,{className:`settings-warning`,children:[`⚠ `,i.message,i.suggestion?(0,U.jsxs)(U.Fragment,{children:[` `,`Did you mean`,` `,(0,U.jsx)(`button`,{type:`button`,className:`settings-warning-suggest`,onMouseDown:e=>{e.preventDefault(),m(i.suggestion)},children:i.suggestion}),`?`]}):null]}):null]})}function KJ(e,t,n){let r=e?.[t];if(!(!r||!n||r.model!==n))return{message:r.message,suggestion:r.suggestion}}function qJ(e){let{claude:t,slug:n}=zJ(e.role),r=e.role===`router`?`Operator model`:`Task model`,i=BJ(e.usage),a=VJ(e.role,e.settings,e.usage),o=g.useRef(!1),s=LJ.filter(t=>!e.blockedClaudeModels.includes(t.value)),c=e.role===`router`?`opus`:`sonnet`,l=s.some(e=>e.value===c)?c:s[0]?.value,u=r=>{if(r===a)return;if(r===`muse`){if(!i)return;o.current=!0,e.onSetSettings({[t]:`openrouter`,[n]:i});return}if(r===`claude`){if(!l)return;o.current=!0,e.onSetSetting(t,l);return}let s=e.settings[n]?.trim()??``;if(!s||s===i){e.onSetSettings({[t]:`openrouter`,[n]:IJ});return}e.settings[t]!==`openrouter`&&e.onSetSetting(t,`openrouter`)},d=e=>e.preventDefault();return(0,U.jsxs)(`div`,{className:`settings-row settings-row-stack settings-model-picker`,children:[(0,U.jsxs)(`div`,{className:`settings-row-main`,children:[(0,U.jsx)(`span`,{className:`settings-label`,children:r}),(0,U.jsxs)(`div`,{className:`segmented settings-model-family`,role:`group`,"aria-label":r,children:[i?(0,U.jsxs)(`button`,{type:`button`,tabIndex:-1,className:`button`,"aria-pressed":a===`muse`,onMouseDown:d,onClick:()=>u(`muse`),children:[(0,U.jsx)(`span`,{children:`Muse`}),(0,U.jsx)(`span`,{className:`settings-free-chip`,children:`FREE`})]}):null,[`claude`,`openrouter`].map(e=>(0,U.jsx)(`button`,{type:`button`,tabIndex:-1,className:`button`,"aria-pressed":a===e,onMouseDown:d,onClick:()=>u(e),children:(0,U.jsx)(`span`,{children:e===`claude`?`Claude`:`OpenRouter`})},e))]})]}),e.hasAnthropicAccount&&e.settings[t]===`openrouter`?(0,U.jsx)(`div`,{className:`settings-warning`,children:`⚠ Pick Claude to use your Anthropic credentials`}):null,a===`claude`?(0,U.jsx)(`div`,{className:`settings-row-main settings-model-detail`,children:(0,U.jsx)(`div`,{className:`segmented`,role:`group`,"aria-label":`${e.role===`router`?`Operator`:`Task`} Claude model`,children:s.map(n=>(0,U.jsx)(`button`,{type:`button`,tabIndex:-1,className:`button`,"aria-pressed":e.settings[t]===n.value,onClick:()=>{e.settings[t]!==n.value&&e.onSetSetting(t,n.value)},children:(0,U.jsx)(`span`,{children:n.label})},n.value))})}):null,a===`openrouter`?(0,U.jsx)(GJ,{label:`OpenRouter slug`,placeholder:IJ,value:e.settings[n]??``,discardOnUnmount:o,warning:KJ(e.warnings,n,e.settings[n]),onCommit:t=>e.onSetSetting(n,t)}):null]})}function JJ(e){if(!e||e.limitMicros===null||e.limitMicros<=0)return null;if(e.blocked)return 1;if(e.credits?.plan===`daily`&&e.credits.dailyFreeRemainingCredits!==null){let t=e.credits.dailyFreeRemainingCredits*1e4;return t<=0?1:Math.min(1,Math.max(0,e.usedMicros/(e.usedMicros+t)))}return Math.min(1,e.usedMicros/e.limitMicros)}function YJ(e){let t=e?.autoReload;return!t?.enabled||t.disabledReason||t.thresholdCredits===null||t.amountCredits===null?null:{thresholdCredits:t.thresholdCredits,amountCredits:t.amountCredits}}function XJ(e){if(e?.blocked)return`operator-usage-blocked`;if(e?.credits?.plan===`credits`)return e.credits.lowBalance&&!YJ(e.credits)?`operator-usage-warn`:``;let t=JJ(e);return t===null?``:t>=.8?`operator-usage-warn`:``}var ZJ=new Intl.NumberFormat(void 0,{style:`currency`,currency:`USD`});function QJ(e){return ZJ.format(e/100)}function $J(e){return QJ(e/1e4)}function eY(e,t){if(!t||t.displayUnit===`usd`||t.usdPerCredit<=0)return $J(e);let n=Math.round(e/1e6/t.usdPerCredit);return`${n.toLocaleString()} ${n===1?`credit`:`credits`}`}function tY(e){return e.resetAtMs?new Date(e.resetAtMs).toLocaleTimeString([],{hour:`numeric`,minute:`2-digit`}):``}function nY(e){let{usage:t}=e,n=JJ(t);if(n===null)return null;let r=tY(t),i=t.credits?.plan===`daily`?t.credits.purchasedCredits+t.credits.grantedCredits:0,a=i>0?` + ${QJ(i)} credits`:``,o=(t.blocked?`Limit reached`:`${Math.round(n*100)}%${r?` \u00b7 resets ${r}`:``}`)+a;return(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`div`,{className:`settings-row`,children:(0,U.jsx)(`span`,{className:`settings-label`,children:`Daily Operator usage`})}),(0,U.jsx)(`div`,{className:`settings-usage-bar`,children:(0,U.jsx)(`div`,{className:`settings-usage-fill`+(t.blocked?` blocked`:``),style:{width:`${n*100}%`}})}),(0,U.jsx)(`div`,{className:`settings-usage-subtext`,children:o})]})}function rY(e){let t=e.credits,n=t?.autoReload,r=YJ(t),i=t?.rates,a=`${eY(e.creditsExhausted?0:e.spendableMicros??0,i)} left`,o=t?.nextGrantAt?`Refreshes ${new Date(t.nextGrantAt).toLocaleDateString()}`:null,s=r?`Auto-reload will add ${eY(r.amountCredits*1e4,i)} when you drop below ${eY(r.thresholdCredits*1e4,i)}`:null,c=tY(e),l=e.blocked?`Daily limit reached${c?` · Resets at ${c}`:``}`:null,u=!!n?.disabledReason,d=null;return e.creditsExhausted?d=u?{severity:`danger`,text:`Auto-reload was unsuccessful`,action:`Update your card`}:{severity:`danger`,text:`Out of credits`,action:`Set up auto-reload`}:t?.lowBalance&&!r&&(d=u?{severity:`danger`,text:`Auto-reload was unsuccessful`,action:`Update your card`}:{severity:`warn`,text:`Running low on credits`,action:`Set up auto-reload`}),{amount:a,caption:s,grant:o,dailyBlocked:l,banner:d}}function iY(e){let{usage:t,onRefreshUsage:n}=e;if(t.spendableMicros===null||t.freeTier&&t.creditsExhausted)return null;let r=rY(t);return(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`div`,{className:`settings-row`,children:(0,U.jsx)(`span`,{className:`settings-label`,children:`Operator credits`})}),(0,U.jsxs)(`div`,{className:`settings-split`,children:[(0,U.jsx)(`div`,{className:`settings-credits`,children:r.amount}),(0,U.jsx)(`button`,{type:`button`,className:`button`,onClick:()=>oY(n),children:(0,U.jsx)(`span`,{children:`Get credits`})})]}),r.caption?(0,U.jsx)(`div`,{className:`settings-usage-subtext`,children:r.caption}):null,r.grant?(0,U.jsx)(`div`,{className:`settings-usage-subtext`,children:r.grant}):null,r.dailyBlocked?(0,U.jsx)(`p`,{className:`feedback-note feedback-danger settings-usage-subtext`,children:r.dailyBlocked}):null,r.banner?(0,U.jsxs)(`div`,{className:`feedback-banner feedback-${r.banner.severity} is-inset`,role:`status`,children:[(0,U.jsx)(`span`,{children:r.banner.text}),(0,U.jsx)(`button`,{type:`button`,className:`button`,onClick:()=>oY(n),children:(0,U.jsx)(`span`,{children:r.banner.action})})]}):null]})}function aY(e){return e.usage.credits?.plan===`credits`?(0,U.jsx)(iY,{usage:e.usage,onRefreshUsage:e.onRefreshUsage}):(0,U.jsx)(nY,{usage:e.usage})}function oY(e){if(window.ReactNativeWebView){window.ReactNativeWebView.postMessage(JSON.stringify({type:`castle-open-credits`}));return}if(!window.open(`https://castle.xyz/credits`,`_blank`))return;sY?.();let t=()=>{document.visibilityState===`visible`&&(sY?.(),e())};sY=()=>{document.removeEventListener(`visibilitychange`,t),window.removeEventListener(`focus`,t),sY=null},document.addEventListener(`visibilitychange`,t),window.addEventListener(`focus`,t)}var sY=null;function cY(e){let t=e.providers.filter(e=>e.key?.present||e.login?.loggedIn).map(e=>e.label);return(0,U.jsxs)(`div`,{className:`settings-split`,children:[t.length>0?(0,U.jsxs)(`div`,{className:`settings-split-copy`,children:[(0,U.jsx)(`div`,{className:`settings-credits`,children:`Use your own agent provider`}),(0,U.jsxs)(`div`,{className:`settings-usage-subtext`,children:[`Connected: `,t.join(`, `)]})]}):(0,U.jsx)(`div`,{className:`settings-credits`,children:`Use your own agent provider`}),(0,U.jsx)(`button`,{type:`button`,className:`button`,onClick:e.onOpen,children:(0,U.jsx)(`span`,{children:t.length>0?`Manage providers`:`Add provider`})})]})}function lY(e){let{login:t}=e,[n,r]=g.useState(``),i=()=>{n.trim()&&e.onSubmitCode(n.trim())};return(0,U.jsxs)(U.Fragment,{children:[t.url?(0,U.jsxs)(`div`,{className:`castle-key-login`,children:[(0,U.jsx)(`div`,{className:`castle-key-subtitle`,children:`Open this link to sign in, then come back here.`}),(0,U.jsx)(`a`,{className:`castle-key-url`,href:t.url,target:`_blank`,rel:`noreferrer noopener`,children:t.url})]}):(0,U.jsx)(`div`,{className:`castle-key-subtitle`,children:`Starting sign-in…`}),t.phase===`awaiting-code`?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`div`,{className:`castle-key-subtitle`,children:`Paste the code the browser shows you:`}),(0,U.jsx)(`input`,{className:`castle-key-input`,autoFocus:!0,spellCheck:!1,autoComplete:`off`,value:n,placeholder:`code`,onChange:e=>r(e.target.value),onKeyDown:e=>{e.key===`Enter`&&i()}}),t.message?(0,U.jsx)(`div`,{className:`castle-key-error`,children:t.message}):null]}):null,t.phase===`verifying`?(0,U.jsx)(`div`,{className:`castle-key-stored`,children:`Finishing sign-in…`}):null,t.phase===`error`?(0,U.jsx)(`div`,{className:`castle-key-error`,children:t.message}):null,(0,U.jsxs)(`div`,{className:`castle-modal-actions`,children:[(0,U.jsx)(`button`,{type:`button`,onClick:e.onCancel,children:t.phase===`error`?`Close`:`Cancel`}),t.phase===`awaiting-code`?(0,U.jsx)(`button`,{type:`button`,onClick:i,disabled:!n.trim(),children:`Submit`}):null]})]})}function uY(e){let t=e.accounts.providers,n=e.accounts.login,[r,i]=g.useState(()=>(t.find(e=>e.key?.present||e.login?.loggedIn)??t[0])?.id??``),[a,o]=g.useState(``),[s,c]=g.useState(null),l=(n?t.find(e=>e.login?.provider===n.provider):null)??t.find(e=>e.id===r)??t[0]??null,u=g.useRef(e.onClose);u.current=e.onClose;let d=n!==null;g.useEffect(()=>{let e=e=>{e.key===`Escape`&&!d&&u.current()};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[d]);let f=g.useRef(null);if(g.useEffect(()=>{if(n){f.current=n.provider;return}let e=f.current;e!==null&&(f.current=null,t.find(t=>t.login?.provider===e)?.login?.loggedIn&&u.current())}),!l)return null;let p=!!l.login?.loggedIn,m=!!l.key?.present,h=p||m,_=()=>{let t=a.trim();if(t){if(t.length>500){c(`That key is too long.`);return}if([...t].some(e=>{let t=e.codePointAt(0)??0;return t<32||t===127})){c(`That key contains invalid characters.`);return}e.onSave(l.id,t),e.onClose()}};return(0,My.createPortal)((0,U.jsx)(`div`,{className:`castle-modal-scrim`,onMouseDown:n?void 0:e.onClose,children:(0,U.jsxs)(`div`,{className:`castle-modal`,onMouseDown:e=>e.stopPropagation(),children:[(0,U.jsx)(`div`,{className:`castle-key-heading`,children:n?`Sign in to ${l.label}`:`Your account`}),n?null:(0,U.jsx)(`div`,{className:`castle-key-subtitle`,children:`Run the operator on your own account and bypass Castle's daily limit.`}),t.length>1&&!n?(0,U.jsx)(`div`,{className:`castle-key-tabs`,children:t.map(e=>(0,U.jsx)(`button`,{type:`button`,className:`castle-key-tab`+(e.id===l.id?` active`:``),onClick:()=>{i(e.id),o(``),c(null)},children:e.label},e.id))}):null,n?(0,U.jsx)(lY,{login:n,onSubmitCode:e.onSubmitCode,onCancel:e.onCancelLogin}):(0,U.jsxs)(U.Fragment,{children:[h?(0,U.jsxs)(U.Fragment,{children:[p?(0,U.jsxs)(`div`,{className:`castle-key-row`,children:[(0,U.jsxs)(`span`,{children:[`Signed in with your `,l.label,` account.`]}),(0,U.jsx)(`button`,{type:`button`,onClick:()=>{e.onLogout(l.id),e.onClose()},children:`Sign out`})]}):null,m?(0,U.jsxs)(`div`,{className:`castle-key-row`,children:[(0,U.jsxs)(`span`,{children:[`API key saved (`,l.key?.hint,`).`]}),(0,U.jsx)(`button`,{type:`button`,onClick:()=>{e.onRemove(l.id),e.onClose()},children:`Remove`})]}):null]}):(0,U.jsxs)(U.Fragment,{children:[l.login?(0,U.jsxs)(`button`,{type:`button`,className:`castle-key-signin`,onClick:()=>e.onStartLogin(l.id),children:[`Sign in with your `,l.label,` account`]}):null,l.login&&l.key?(0,U.jsx)(`div`,{className:`castle-key-or`,children:`or`}):null,l.key?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`div`,{className:`castle-key-field-label`,children:`Add API key`}),(0,U.jsx)(`input`,{type:`password`,className:`castle-key-input`,autoFocus:!0,spellCheck:!1,autoComplete:`off`,"data-1p-ignore":!0,"data-lpignore":`true`,value:a,placeholder:l.key.placeholder,onChange:e=>{o(e.target.value),c(null)},onKeyDown:e=>{e.key===`Enter`&&_()}}),s?(0,U.jsx)(`div`,{className:`castle-key-error`,children:s}):null]}):null]}),(0,U.jsxs)(`div`,{className:`castle-modal-actions`,children:[(0,U.jsx)(`button`,{type:`button`,onClick:e.onClose,children:`Cancel`}),!h&&l.key?(0,U.jsx)(`button`,{type:`button`,onClick:_,disabled:!a.trim(),children:`Save`}):null]})]})]})}),document.body)}function dY(e){let{settings:t,onSetSetting:n,onClose:r}=e,i=e.usage?.credits?.plan===`credits`?e.usage.spendableMicros!==null:JJ(e.usage)!==null,a=e.accounts.providers.some(e=>e.key?.present||e.login?.loggedIn),o=e.accounts.providers.some(e=>e.id===`anthropic`&&(e.key?.present||e.login?.loggedIn)),s=e.accounts.providers.length>0&&(i||a),c=g.useRef(null),l=e.usage?.blockedClaudeModels??[];return BC(c,r,e.triggerRef),(0,My.createPortal)((0,U.jsxs)(`div`,{className:`popover settings-popover`,ref:c,style:WC(c,e.triggerRef,[t,i,s,e.usage,o]),onMouseDown:e=>e.stopPropagation(),children:[i&&e.usage?(0,U.jsx)(`div`,{className:`settings-group`,children:(0,U.jsx)(aY,{usage:e.usage,onRefreshUsage:e.onRefreshUsage})}):null,s?(0,U.jsx)(`div`,{className:`settings-group`,children:(0,U.jsx)(cY,{providers:e.accounts.providers,onOpen:e.onOpenKeys})}):null,[`router`,`tasks`].map(r=>(0,U.jsx)(`div`,{className:`settings-group`,children:(0,U.jsx)(qJ,{role:r,settings:t,warnings:e.warnings,usage:e.usage,blockedClaudeModels:l,hasAnthropicAccount:o,onSetSetting:n,onSetSettings:e.onSetSettings})},r))]}),document.body)}function fY(e){let{spec:t,interactive:n,answers:r,onSubmit:i}=e,[a,o]=g.useState({}),s=n?a:r??{},c=(e,t,r)=>{n&&o(n=>{let i=n[e]??[];if(r){let r=i.includes(t)?i.filter(e=>e!==t):[...i,t];return{...n,[e]:r}}return{...n,[e]:i[0]===t?[]:[t]}})};return(0,U.jsxs)(`div`,{className:`picker${n?``:` picker-locked`}`,children:[t.questions.map(e=>(0,U.jsxs)(`fieldset`,{className:`picker-q`,disabled:!n,children:[(0,U.jsx)(`legend`,{className:`picker-q-label`,children:e.q}),(0,U.jsx)(`div`,{className:`picker-options`,children:e.options.map(t=>{let r=(s[e.id]??[]).includes(t);return(0,U.jsxs)(`label`,{className:`picker-option${r?` is-checked`:``}`,children:[(0,U.jsx)(`input`,{type:e.multi?`checkbox`:`radio`,name:e.id,checked:r,disabled:!n,onChange:()=>c(e.id,t,e.multi)}),(0,U.jsx)(`span`,{children:t})]},t)})})]},e.id)),n?(0,U.jsx)(`div`,{className:`picker-actions`,children:(0,U.jsx)(`button`,{className:`button`,type:`button`,onClick:()=>{let e=CJ(t,a);e&&i(a,e)},children:(0,U.jsx)(`span`,{children:`Submit`})})}):null]})}function pY(e){let{chips:t,interactive:n,onPick:r}=e,[i,a]=g.useState(null),o=n&&i===null;return(0,U.jsx)(`div`,{className:`chips`+(o?``:` chips-inert`),children:t.map(e=>(0,U.jsx)(`button`,{type:`button`,className:`chip`+(i===e?` is-picked`:``),disabled:!o,onClick:()=>{a(e),r(e)},children:e},e))})}function mY(){return(0,U.jsxs)(`div`,{className:`picker picker-skeleton`,"aria-hidden":`true`,children:[(0,U.jsx)(`span`,{className:`picker-skeleton-hint`,children:`preparing options…`}),(0,U.jsxs)(`div`,{className:`picker-q`,children:[(0,U.jsx)(`div`,{className:`picker-skeleton-line picker-skeleton-label`}),(0,U.jsxs)(`div`,{className:`picker-options`,children:[(0,U.jsx)(`span`,{className:`picker-skeleton-chip`,style:{width:84}}),(0,U.jsx)(`span`,{className:`picker-skeleton-chip`,style:{width:116}}),(0,U.jsx)(`span`,{className:`picker-skeleton-chip`,style:{width:72}})]})]})]})}function hY(e){let t=/^\[Editing (.+)\]$/,n=/^\[Reading (.+)\]$/,r=new Set;for(let n of e){let e=t.exec(n.trim());if(e)for(let t of e[1].split(`, `))r.add(t)}let i=[];for(let t of e){let e=n.exec(t.trim());if(e){let t=e[1].split(`, `).filter(e=>!r.has(e));if(t.length===0)continue;i.push(`[Reading ${t.join(`, `)}]`);continue}i.push(t)}return i}function gY(e){let t=/^\[([A-Za-z]+)\s+(.+)\]$/,n=[];for(let r of e){let e=t.exec(r.trim());if(e){let r=n.length?t.exec(n[n.length-1].trim()):null;if(r&&r[1]===e[1]){r[2].split(`, `).includes(e[2])||(n[n.length-1]=`[${e[1]} ${r[2]}, ${e[2]}]`);continue}}n.push(r)}return n}function _Y(e){return e.detail?(0,U.jsxs)(`details`,{className:`msg-error-detail`,children:[(0,U.jsx)(`summary`,{children:`Details (full text in the browser console)`}),(0,U.jsx)(`pre`,{children:e.detail})]}):null}function vY(e){let t=Qq(),n=g.useRef(null),r=g.useRef(!0);return g.useLayoutEffect(()=>{let e=n.current;e&&r.current&&(e.scrollTop=e.scrollHeight)},[e.lines]),(0,U.jsx)(`div`,{className:`task-feed`,ref:n,onScroll:()=>{let e=n.current;e&&(r.current=e.scrollHeight-e.scrollTop-e.clientHeight<24)},onClick:e=>e.stopPropagation(),children:gY(hY(e.lines)).map((e,n)=>{let r=/^\[(.+)\]$/.exec(e.trim());return r?(0,U.jsx)(`div`,{className:`task-feed-tool`,children:r[1]},n):(0,U.jsx)(`div`,{className:`task-feed-msg`,onClick:t,dangerouslySetInnerHTML:Xq(e)},n)})})}function yY(e){let t=Math.max(0,Math.round(e/1e3)),n=Math.floor(t/60),r=t%60;return n>0?`${n}m ${r}s`:`${r}s`}function bY(e,t,n){return t?`${e} · ${t}`:n?`${e} · Worked for ${n}`:e}function xY(e){let[t,n]=g.useState(()=>Date.now());g.useEffect(()=>{if(e.status!==`running`)return;let t=setInterval(()=>n(Date.now()),1e3);return()=>clearInterval(t)},[e.status]);let r=e.startedAt?Date.parse(e.startedAt):null,i=e.finishedAt?Date.parse(e.finishedAt):null,a=C.includes(e.status),o=e.status===`done`?100:a?e.progress:Math.min(e.progress,95),s=e.status===`running`?e.phase?.trim()||TJ[e.avatar??``]||`Working`:e.status===`waiting`?`Queued`:e.status===`blocked`?`Blocked`:e.status===`done`?`Done`:e.status===`failed`?`Failed`:e.status===`interrupted`?`Interrupted`:e.status,c=e.status===`running`&&r!==null?yY(t-r):null,l=a&&r!==null&&i!==null?yY(i-r):null;return{pct:o,avatar:DJ(e),stage:s,elapsed:c,workedFor:l,finished:a,display:sJ(e)}}function SY(e){let{task:t,onAck:n}=e,r=e.variant===`archive`,i=Qq(),[a,o]=g.useState(t.status===`failed`);g.useEffect(()=>{t.status===`failed`&&o(!0)},[t.status]);let s=()=>{o(e=>!e)},{pct:c,avatar:l,stage:u,elapsed:d,workedFor:f,finished:p,display:m}=xY(t);return(0,U.jsxs)(`div`,{className:`task${a?` open`:``}`,onClick:s,children:[(0,U.jsxs)(`div`,{className:`task-row`,children:[(0,U.jsx)(`div`,{className:`pie`,style:{"--pct":c},children:(0,U.jsx)(`div`,{className:`avatar`,style:{background:l.color},children:(0,U.jsx)(`span`,{className:`avatar-icon-wrap`,"aria-hidden":`true`,children:l.icon})})}),(0,U.jsxs)(`div`,{className:`task-meta`,children:[(0,U.jsx)(`div`,{className:`task-name`,children:(0,U.jsx)(`span`,{className:`tn`,children:t.title})}),(0,U.jsx)(`div`,{className:`task-sub`,children:bY(u,d,f)})]}),(0,U.jsxs)(`div`,{className:`task-actions`,children:[p&&!r?(0,U.jsx)(`button`,{className:`button button-icon task-action`,type:`button`,title:`Clear`,"aria-label":`Clear ${t.title}`,onClick:e=>{e.stopPropagation(),n(t.id,!1)},children:(0,U.jsx)(W,{name:`archive`})}):null,e.onOpen?(0,U.jsx)(`button`,{className:`button button-icon task-action`,type:`button`,title:`Open`,"aria-label":`Open ${t.title}`,onClick:n=>{n.stopPropagation(),e.onOpen?.(t)},children:(0,U.jsx)(W,{name:`chevron-right`})}):null]})]}),(0,U.jsxs)(`div`,{className:`task-body`,children:[a&&t.status===`running`&&e.feed&&e.feed.length>0?(0,U.jsx)(vY,{lines:e.feed}):null,a&&t.status!==`running`&&m.error?(0,U.jsx)(`p`,{className:`feedback-note feedback-danger`,children:m.error}):null,a&&t.status!==`running`&&m.notes?(0,U.jsx)(`div`,{className:`task-notes`,onClick:i,dangerouslySetInnerHTML:Xq(m.notes)}):null,a&&t.status===`failed`?(0,U.jsx)(_Y,{detail:t.errorDetail}):null,a?(0,U.jsx)(CY,{frames:t.playtestFrames}):null]})]})}function CY(e){let t=e.frames??[];return t.length===0?null:(0,U.jsxs)(`div`,{className:`task-playtest-frames`,children:[(0,U.jsxs)(`div`,{className:`task-playtest-frames-label`,children:[`Playtest frames (`,t.length,`)`]}),(0,U.jsx)(`div`,{className:`task-playtest-frames-row`,children:t.map(e=>(0,U.jsx)(`a`,{href:e,target:`_blank`,rel:`noreferrer`,onClick:e=>e.stopPropagation(),children:(0,U.jsx)(`img`,{className:`task-playtest-frame`,src:e,alt:`playtest frame`})},e))})]})}function wY(e){return e.filter(e=>!(e.acknowledged&&C.includes(e.status)))}function TY(e){let t=g.useRef(null),n=g.useRef(!0),r=g.useRef(0),[i,a]=g.useState(!1),o=wY(e.tasks),s=fJ(e.tasks);g.useLayoutEffect(()=>{let e=t.current;e&&n.current&&(e.scrollTop=e.scrollHeight)},[e.tasks]),g.useEffect(()=>()=>window.clearTimeout(r.current),[]);let c=()=>{let e=t.current;e&&(n.current=e.scrollHeight-e.scrollTop-e.clientHeight<24,a(!0),window.clearTimeout(r.current),r.current=window.setTimeout(()=>a(!1),900))};if(o.length===0&&s.length===0)return null;let l=o.filter(e=>C.includes(e.status));return(0,U.jsxs)(`div`,{id:`task-board`,className:`task-stack${i?` scrolling`:``}`,ref:t,onScroll:c,children:[(0,U.jsxs)(`div`,{className:`task-board-header`,children:[(0,U.jsxs)(`button`,{type:`button`,className:`button`,onClick:e.onOpenTasks,children:[(0,U.jsx)(`span`,{children:`Tasks`}),(0,U.jsx)(W,{name:`chevron-right`})]}),l.length>0?(0,U.jsxs)(`button`,{type:`button`,className:`button`,onClick:()=>{for(let t of l)e.onAck(t.id,!1)},children:[(0,U.jsx)(W,{name:`archive`}),(0,U.jsx)(`span`,{children:`Clear completed`}),(0,U.jsx)(`span`,{className:`button-badge`,children:l.length})]}):null]}),o.map(t=>(0,U.jsx)(SY,{task:t,feed:e.feeds[t.id],onAck:e.onAck,onOpen:e.onOpenTask},t.id))]})}function EY(e){let{task:t}=e,{pct:n,avatar:r,stage:i,elapsed:a,workedFor:o}=xY(t);return(0,U.jsx)(`header`,{className:`task-page-header`,children:(0,U.jsxs)(`div`,{className:`task-row`,children:[(0,U.jsx)(`div`,{className:`pie`,style:{"--pct":n},children:(0,U.jsx)(`div`,{className:`avatar`,style:{background:r.color},children:(0,U.jsx)(`span`,{className:`avatar-icon-wrap`,"aria-hidden":`true`,children:r.icon})})}),(0,U.jsxs)(`div`,{className:`task-meta`,children:[(0,U.jsx)(`div`,{className:`task-name`,children:(0,U.jsx)(`span`,{className:`tn`,children:t.title})}),(0,U.jsx)(`div`,{className:`task-sub`,children:bY(i,a,o)})]})]})})}function DY(e){let{task:t}=e,n=Qq(),r=g.useRef(null),i=g.useRef(!0),a=e.feed??[],o=sJ(t),s=t.status===`running`,c=a.length>0,l=!s&&(!!o.error||!!o.notes);return g.useLayoutEffect(()=>{i.current=!0},[t.id]),g.useLayoutEffect(()=>{let e=r.current;e&&i.current&&(e.scrollTop=e.scrollHeight)},[t.id,e.feed,o.notes,o.error,t.status,t.playtestFrames]),(0,U.jsxs)(`div`,{className:`task-page`,children:[(0,U.jsx)(EY,{task:t}),(0,U.jsxs)(`div`,{className:`task-page-body`,ref:r,onScroll:()=>{let e=r.current;e&&(i.current=e.scrollHeight-e.scrollTop-e.clientHeight<24)},children:[c?(0,U.jsx)(vY,{lines:a}):null,l&&o.error?(0,U.jsx)(`p`,{className:`feedback-note feedback-danger`,children:o.error}):null,l&&o.notes?(0,U.jsxs)(`div`,{className:`task-notes`,onClick:n,children:[(0,U.jsx)(`p`,{className:`task-report-label`,children:`Report`}),(0,U.jsx)(`div`,{dangerouslySetInnerHTML:Xq(o.notes)})]}):null,t.status===`failed`?(0,U.jsx)(_Y,{detail:t.errorDetail}):null,(0,U.jsx)(CY,{frames:t.playtestFrames}),!c&&!l&&!(t.playtestFrames&&t.playtestFrames.length>0)?(0,U.jsx)(`p`,{className:`task-page-empty`,children:`No activity yet.`}):null]})]})}function OY(e){let t=wY(e.tasks),n=fJ(e.tasks);return(0,U.jsxs)(`div`,{className:`task-page-body task-board-page`,children:[t.length>0?(0,U.jsx)(`div`,{className:`task-stack`,children:t.map(t=>(0,U.jsx)(SY,{task:t,feed:e.feeds[t.id],onAck:e.onAck,onOpen:e.onOpenTask},t.id))}):null,n.length>0?(0,U.jsxs)(`div`,{className:`task-archive task-stack`,children:[(0,U.jsx)(`div`,{className:`task-archive-heading text-style-smallcaps`,children:`Cleared`}),n.map(t=>(0,U.jsx)(SY,{task:t,feed:e.feeds[t.id],onAck:e.onAck,onOpen:e.onOpenTask,variant:`archive`},t.id))]}):null,t.length===0&&n.length===0?(0,U.jsx)(`p`,{className:`task-page-empty`,children:`No tasks yet.`}):null]})}function kY(e){let{msg:t,onPickerSubmit:n,onChip:r,chipsLive:i=!1,interactive:a=!1}=e,o=Qq();if(t.role===`log`)return(0,U.jsx)(`div`,{className:`msg toolline`,children:t.text});if(t.role===`user`)return(0,U.jsxs)(`div`,{className:`msg user`,children:[(t.attachments??[]).map(e=>(0,U.jsx)(`img`,{className:`msg-image`,src:e,alt:``},e)),t.text?(0,U.jsx)(MJ,{text:t.text}):null]});let s=t.status===`streaming`,c=xJ(t.text,s),l=SJ(c)||t.planUpdated===!0;if(!s&&!l)return null;let u=!s&&!t.pickerAnswers&&a,d=-1;c.forEach((e,t)=>{e.kind===`md`&&e.text.trim()!==``&&(d=t)});let f=c.some(e=>e.kind===`ask`||e.kind===`ask-pending`),p=s&&d===-1&&!f||!!(s&&t.activity),m=t.activity??`Thinking`;return(0,U.jsxs)(`div`,{className:`assistant-turn`,onClick:o,children:[t.thinking&&t.thinking.trim()?(0,U.jsxs)(`details`,{className:`msg-thinking`+(p?` is-active`:``),children:[(0,U.jsxs)(`summary`,{className:`operator-line`,children:[(0,U.jsx)(W,{name:`lightbulb`,className:`icon-inline`}),(0,U.jsx)(`span`,{className:`thinking-label`,children:p?m:OJ(t.thinkingMs)}),(0,U.jsx)(W,{name:`chevron-right`,className:`icon-inline thinking-caret`})]}),(0,U.jsx)(`div`,{className:`msg-thinking-body`,dangerouslySetInnerHTML:Xq(t.thinking??``)})]}):p?(0,U.jsxs)(`div`,{className:`operator-line msg-thinking is-active`,children:[(0,U.jsx)(W,{name:`lightbulb`,className:`icon-inline`}),(0,U.jsx)(`span`,{className:`thinking-label`,children:m})]}):null,c.map((e,a)=>{if(e.kind===`ask-pending`)return(0,U.jsx)(mY,{},a);if(e.kind===`chips`)return(0,U.jsx)(pY,{chips:e.chips,interactive:!s&&i,onPick:r},a);if(e.kind===`ask`)return(0,U.jsx)(fY,{spec:e.spec,interactive:u,answers:t.pickerAnswers,onSubmit:(e,r)=>n(t,e,r)},a);if(!e.text.trim())return null;let o=[`msg`,`assistant`,`md`];return s&&a===d&&o.push(`streaming`),t.status===`error`&&o.push(`errbubble`),(0,U.jsx)(`div`,{className:o.join(` `),dangerouslySetInnerHTML:Xq(e.text)},a)}),s?null:(0,U.jsx)(_Y,{detail:t.errorDetail}),t.planUpdated?(0,U.jsx)(AJ,{}):null,t.interrupted?(0,U.jsxs)(`div`,{className:`operator-line`,children:[(0,U.jsx)(W,{name:`square`,className:`icon-inline`}),(0,U.jsx)(`span`,{children:`Interrupted by your next message`})]}):null]})}function AY(e){let t=g.useRef(null),n=g.useRef(null),r=g.useRef(0),i=g.useRef(!0),a=g.useRef(0),o=g.useRef(0),[s,c]=g.useState(!1),l=g.useRef(!1),u=g.useCallback(()=>{l.current=!0,c(!0)},[]),d=g.useCallback(()=>{let e=t.current;if(!e)return;let n=Math.max(0,e.scrollHeight-e.clientHeight),r=Math.abs(e.scrollTop-n)>1;e.scrollTop=n,r&&(a.current=typeof performance<`u`?performance.now():Date.now())},[]);e.pinThreadRef.current=()=>{i.current&&d()};let f=g.useCallback(()=>{d();let e=t.current;e&&e.clientHeight>0&&u()},[d,u]);g.useLayoutEffect(()=>{if(!i.current)return;f();let e=requestAnimationFrame(f),t=window.setTimeout(f,250),n=window.setTimeout(u,500);return()=>{cancelAnimationFrame(e),clearTimeout(t),clearTimeout(n)}},[e.messages,f,u]),g.useEffect(()=>{let e=t.current;if(!e)return;o.current=e.clientHeight;let a=new ResizeObserver(()=>{o.current=e.clientHeight,i.current?f():e.scrollTop=e.scrollHeight-e.clientHeight-r.current});return a.observe(e),n.current&&a.observe(n.current),()=>a.disconnect()},[f]);let p=()=>{let e=t.current;if(!e||!l.current||(typeof performance<`u`?performance.now():Date.now())-a.current<200)return;let n=e.clientHeight,s=n!==o.current;o.current=n,!s&&(r.current=e.scrollHeight-e.scrollTop-e.clientHeight,i.current=r.current<48)},m=MY(e.messages),h=NY(e.messages);return(0,U.jsx)(`div`,{id:`chat-messages`,className:`chat-scroll`,"data-castle-allow-select":``,ref:t,onScroll:p,children:(0,U.jsxs)(`div`,{className:`chat-thread`+(s?` ready`:``),ref:n,children:[e.messages.length===0?(0,U.jsx)(`div`,{id:`chat-empty`,children:`Tell the agent what you want to make.`}):null,e.messages.map(t=>(0,U.jsx)(kY,{msg:t,interactive:t.id===m,chipsLive:t.id===h,onPickerSubmit:e.onPickerSubmit,onChip:e.onChip},t.id))]})})}function jY(e){return e.role!==`assistant`||e.pickerAnswers?!1:xJ(e.text).some(e=>e.kind===`ask`)}function MY(e){for(let t=e.length-1;t>=0;t--)if(jY(e[t]))return e[t].id;return null}function NY(e){for(let t=e.length-1;t>=0;t--){let n=e[t];if(n.role===`user`)return null;if(n.role===`assistant`){if(n.status===`streaming`)return null;if(xJ(n.text).some(e=>e.kind===`chips`))return n.id}}return null}function PY(e,t){for(let n of Array.from(e)){if(!n.type.startsWith(`image/`))continue;let e=new FileReader;e.onload=()=>{typeof e.result==`string`&&t({name:n.name,dataUrl:e.result})},e.readAsDataURL(n)}}function FY(e){return e.pending.length===0?null:(0,U.jsx)(`div`,{id:`chat-pending`,children:e.pending.map((t,n)=>(0,U.jsx)(`img`,{className:`operator-thumb`,src:t.dataUrl,alt:t.name,title:`remove`,onClick:()=>e.onRemove(n)},`${t.name}-${n}`))})}function IY(e){return e.queued.length===0?null:(0,U.jsx)(`div`,{className:`chat-queue`,onMouseDown:e=>e.preventDefault(),children:e.queued.map((t,n)=>(0,U.jsxs)(`div`,{className:`queue-row`,children:[(0,U.jsx)(`span`,{className:`queue-snippet`,children:t.length>60?`${t.slice(0,60)}\u2026`:t}),(0,U.jsx)(`button`,{className:`button`,type:`button`,tabIndex:-1,title:`Send now — interrupts the turn`,onClick:e.onInterrupt,children:(0,U.jsx)(`span`,{children:`Send now`})}),(0,U.jsx)(`button`,{className:`button button-icon button-quiet`,type:`button`,tabIndex:-1,title:`Remove from queue`,"aria-label":`Remove`,onClick:()=>e.onCancelQueued(n),children:(0,U.jsx)(W,{name:`times`})})]},n))})}function LY(e,t){if(!e)return;e.style.height=`auto`;let n=Number.parseFloat(window.getComputedStyle(e).lineHeight),r=Number.isFinite(n)?Math.ceil(n):21,i=t.length===0?r:Math.min(e.scrollHeight,120);e.style.height=i>0?`${i}px`:``}function RY(e){let{running:t,queued:n}=e,[r,i]=g.useState(``),[a,o]=g.useState(!1),[s,c]=g.useState(!1),l=g.useRef(null),[u,d]=g.useState([]),[f,p]=g.useState(!1);g.useEffect(()=>{t||p(!1)},[t]);let m=g.useRef(null),h=g.useRef(null),_=aJ({inputRef:m,anchorRef:h,setValue:i});g.useLayoutEffect(()=>{LY(m.current,r),e.pinThreadRef.current()},[r,u.length,n.length,e.pinThreadRef]);let v=e=>{d(t=>t.length>=6?t:[...t,e])},y=()=>{let t=r.trim();!t&&u.length===0||(e.onSend(t,u,_.attachedIn(t)),i(``),d([]),_.clear())},b=r.trim().length>0||u.length>0,x=e=>{let t=e.target;h.current?.contains(t)&&(t instanceof Element&&t.closest(`.composer-settings .button, #chat-send`)||m.current?.focus())},S=t&&!b;return(0,U.jsxs)(`div`,{className:`operator-composer`,children:[(0,U.jsx)(FY,{pending:u,onRemove:e=>d(t=>t.filter((t,n)=>n!==e))}),_.overlay,(0,U.jsxs)(`div`,{className:`chat-input`,ref:h,children:[(0,U.jsx)(IY,{queued:n,onInterrupt:e.onInterrupt,onCancelQueued:e.onCancelQueued}),(0,U.jsxs)(`div`,{className:`ta`,onClick:x,children:[(0,U.jsx)(`textarea`,{id:`chat-input`,className:`ta-text`,ref:m,rows:1,placeholder:t?`Queue a message…`:`Message the operator`,value:r,onChange:e=>{i(e.target.value),_.sync()},onSelect:_.sync,onPaste:e=>{let t=e.clipboardData?.files;t&&t.length>0&&(e.preventDefault(),PY(t,v))},onKeyDown:e=>{_.handleKeyDown(e)||e.key===`Enter`&&!e.shiftKey&&!e.metaKey&&!e.altKey&&(e.preventDefault(),y())}}),(0,U.jsxs)(`div`,{className:`ta-bottom`,onMouseDown:e=>e.preventDefault(),children:[(0,U.jsxs)(`div`,{className:`composer-settings`,children:[(0,U.jsxs)(`button`,{ref:l,className:[`button`,`button-quiet`,XJ(e.usage)].filter(Boolean).join(` `),type:`button`,tabIndex:-1,title:`Agent & model settings`,"aria-label":`Agent & model settings`,"aria-pressed":a,onMouseDown:e=>{e.preventDefault(),e.stopPropagation()},onClick:()=>{a||e.onRefreshUsage(),o(e=>!e)},children:[(0,U.jsx)(`span`,{children:WJ(e.settings,e.usage)}),FJ]}),a?(0,U.jsx)(dY,{settings:e.settings,warnings:e.settingsWarnings,usage:e.usage,accounts:e.accounts,triggerRef:l,onSetSetting:e.onSetSetting,onSetSettings:e.onSetSettings,onOpenKeys:()=>c(!0),onRefreshUsage:e.onRefreshUsage,onClose:()=>o(!1)}):null,s?(0,U.jsx)(uY,{accounts:e.accounts,onSave:e.onSetCredential,onRemove:e.onClearCredential,onStartLogin:e.onStartLogin,onSubmitCode:e.onSubmitLoginCode,onCancelLogin:e.onCancelLogin,onLogout:e.onLogout,onClose:()=>c(!1)}):null]}),(0,U.jsx)(`button`,{id:`chat-send`,className:`button button-icon composer-action`,type:`button`,tabIndex:-1,title:S?f?`Stopping…`:`Stop`:`Send`,"aria-label":S?f?`Stopping`:`Stop`:`Send`,disabled:!S&&!b||S&&f,onClick:()=>{S?(p(!0),e.onInterrupt()):y()},children:S?PJ:NJ})]})]})]})]})}function zY(e){let{agent:t,mobile:n,active:r}=e,{messages:i,tasks:a,feeds:o,settings:s,running:c,queued:l}=t,u=uJ(n),[d,f]=g.useState(null),p=g.useRef(()=>{}),m=dJ(d),h=e=>{u.openView(e.id)};nb(()=>!r||u.view===`home`?!1:(u.goHome(),!0));let _=(e,n,r)=>{t.submitPicker(e.id,n,r)},v=e=>{t.sendUserMessage(e,[],[])},y=u.view!==`home`&&u.view!==`tasks`?a.find(e=>e.id===u.view):void 0;return(0,U.jsxs)(`div`,{id:`chat-host`,ref:f,children:[m?(0,U.jsx)(pJ,{view:u.view,openIds:u.openIds,tasks:a,mobile:n,onHome:u.goHome,onSelect:u.openView,onClose:u.closeView,onReorder:u.reorderOpenIds,slot:m}):null,(0,U.jsx)(`div`,{className:`operator-inset`,children:u.view===`home`?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(TY,{tasks:a,feeds:o,onAck:t.ackTask,onOpenTask:h,onOpenTasks:()=>u.openView(lJ)}),wY(a).length>0||fJ(a).length>0?(0,U.jsx)(`div`,{className:`chat-divider`,"aria-hidden":`true`}):null,(0,U.jsx)(AY,{messages:i,onPickerSubmit:_,onChip:v,pinThreadRef:p})]}):u.view===`tasks`?(0,U.jsx)(OY,{tasks:a,feeds:o,onAck:t.ackTask,onOpenTask:h}):y?(0,U.jsx)(DY,{task:y,feed:o[y.id]}):(0,U.jsx)(`p`,{className:`task-page-empty`,children:`This task is gone.`})}),(0,U.jsx)(RY,{pinThreadRef:p,running:c,queued:l,onSend:t.sendUserMessage,onInterrupt:t.interrupt,onCancelQueued:t.cancelQueued,settings:s,settingsWarnings:t.settingsWarnings,usage:t.usage,accounts:t.accounts,onSetSetting:t.setSetting,onSetSettings:t.setSettings,onRefreshUsage:t.refreshUsage,onSetCredential:t.setCredential,onClearCredential:t.clearCredential,onStartLogin:t.startLogin,onSubmitLoginCode:t.submitLoginCode,onCancelLogin:t.cancelLogin,onLogout:t.logout})]})}function BY(e,t){if(e===t)return!0;if(!e||!t||e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}function VY(e,t){return e.messageId===t.messageId&&BY(e.taskIds,t.taskIds)}function HY(e,t,n,r,i){if(!t)return i;let a=n[n.length-1]??``;return e||i.messageId===void 0?{messageId:a,taskIds:r}:i.messageId!==``&&n.length>0&&!n.includes(i.messageId)?{messageId:a,taskIds:i.taskIds}:i.taskIds===void 0?{messageId:i.messageId,taskIds:r}:i}function UY(e,t){if(t===void 0)return 0;if(t===``)return e.length;let n=e.indexOf(t);return n<0?0:e.length-n-1}function WY(e,t){if(t===void 0)return 0;let n=new Set(t),r=0;for(let t of e)n.has(t)||(r+=1);return r}function GY(e,t,n){return UY(e,n.messageId)+WY(t,n.taskIds)}var KY=`castle-operator-seen-v1`,qY=`castle-operator-seen-v2`;function JY(){try{let e=localStorage.getItem(qY);if(e!==null){let t=JSON.parse(e);if(t&&typeof t==`object`){let e=t,n=e.taskIds;return{messageId:typeof e.messageId==`string`?e.messageId:void 0,taskIds:Array.isArray(n)&&n.every(e=>typeof e==`string`)?n:void 0}}}let t=localStorage.getItem(KY);if(t!==null)return{messageId:t,taskIds:void 0}}catch{}return{messageId:void 0,taskIds:void 0}}function YY(e,t){try{localStorage.setItem(qY,JSON.stringify({messageId:e,taskIds:t}))}catch{}}function XY(e){let t=[];for(let n of e)n.role===`assistant`&&n.status!==`streaming`&&t.push(n.id);return t}function ZY(e){let t=[];for(let n of e)C.includes(n.status)&&!n.acknowledged&&t.push(n.id);return t}function QY(){let[e,t]=g.useState(()=>document.visibilityState===`visible`);return g.useEffect(()=>{let e=()=>t(document.visibilityState===`visible`);return document.addEventListener(`visibilitychange`,e),()=>document.removeEventListener(`visibilitychange`,e)},[]),e}function $Y(e){let t=e.boundingClientRect;if(t.width<=0||t.height<=0)return!1;let n=e.intersectionRect;return n.width>=t.width-1&&n.height>=t.height-1}var eX=Array.from({length:21},(e,t)=>t/20);function tX(e){let[t,n]=g.useState(!1);return g.useEffect(()=>{if(!e){n(!1);return}let t=new IntersectionObserver(([e])=>n(e?$Y(e):!1),{threshold:eX});return t.observe(e),()=>t.disconnect()},[e]),t}function nX(e,t,n){let r=QY(),i=tX(n),a=r&&(t||i),[o,s]=g.useState(JY),c=XY(e.messages),l=ZY(e.tasks),u=HY(a,e.messages.length>0,c,l,o);return g.useEffect(()=>{VY(u,o)||(u.messageId!==void 0&&u.taskIds!==void 0&&YY(u.messageId,u.taskIds),s(u))},[a,e.messages,e.tasks,o]),GY(c,l,u)}var rX=`castle-flow-layout:`,iX=1;function aX(e,t){if(e)try{let n={version:iX,state:t};localStorage.setItem(rX+e,JSON.stringify(n))}catch{}}function oX(e,t,n){if(!e)return null;try{let r=localStorage.getItem(rX+e);if(!r)return null;let i=JSON.parse(r);if(i.version!==iX||!i.state||!Array.isArray(i.state.groups))return null;let a=Yt(pX(mX(i.state,t)),n);return a.groups.length===0?null:mt(a)}catch{return null}}var sX=new Set([`operator`,`files`,`params`]);function cX(e){let t=e.codeView;if(t===void 0)return e;let n={...e};return delete n.codeView,t&&(n.view=pe),n}function lX(e,t){let n=t.some(t=>t.id===e.activeTabId)?e.activeTabId:t[0].id;return{...e,tabs:t,activeTabId:n}}var uX=`params`;function dX(e){return e.kind===`editor`&&e.view===uX}function fX(e,t){if(e.kind!==`params`||e.path===void 0||t.has(e.path))return e;let n={...e};return delete n.path,n}function pX(e){if(!e.groups.some(e=>e.tabs.some(dX)))return e;let t,n=!1,r=0,i=[];for(let a of e.groups){let e=[];for(let o of a.tabs){if(!dX(o)){e.push(o);continue}let a={...o};if(delete a.view,n){e.push(a);continue}n=!0,t=o.path,r=i.length+1}if(e.length===0){r=Math.min(r,i.length);continue}i.push(lX(a,e))}let a=dt(`params`,t);return i.splice(Math.min(r,i.length),0,pt([a],at(a))),{...e,groups:i}}function mX(e,t){let n=new Set,r=[];for(let i of e.groups){let e=i.tabs.filter(e=>!(e.kind===`editor`&&e.path!==void 0&&!t.has(e.path))).map(cX).map(e=>fX(e,t));if(e.length===0)continue;let a=e.find(e=>e.kind!==`editor`);if(a&&sX.has(a.kind)){if(n.has(a.kind))continue;n.add(a.kind)}r.push(lX(i,e))}return{groups:r,activeGroupId:r.some(t=>t.id===e.activeGroupId)?e.activeGroupId:r[0]?.id??null,pinnedGroupId:r.some(t=>t.id===e.pinnedGroupId)?e.pinnedGroupId:null,maximizedGroupId:null}}var hX=g.createContext(null),gX={groups:[],activeGroupId:null,pinnedGroupId:null,maximizedGroupId:null};function _X(e,t){let n=[];if(e.forEach((e,r)=>{let i=t.get(r);if(!i)return;let a=i.getBoundingClientRect(),o=e.left-a.left,s=e.top-a.top;Math.abs(o)<1&&Math.abs(s)<1||(i.style.transition=`none`,i.style.transform=`translate(${o}px, ${s}px)`,n.push(i))}),n.length!==0){n[0].getBoundingClientRect();for(let e of n){e.style.transition=`transform 180ms ease`,e.style.transform=`translate(0px, 0px)`;let t=()=>{e.style.transition=``,e.style.transform=``,e.removeEventListener(`transitionend`,t)};e.addEventListener(`transitionend`,t)}}}function vX(e){return Array.isArray(e.column)}function yX(e){return Array.isArray(e.tabs)}function bX(e){let t=[],n=e=>{yX(e)?t.push(...e.tabs??[]):t.push(e)};for(let t of e)vX(t)?(t.column??[]).forEach(n):n(t);return t}function xX(e){return e===`files`?`files`:e===`playtest`?`play`:e===`terminal`?`terminal`:e===`editor`?`editor`:e===`params`?`params`:null}var SX=[{type:`files`},{type:`playtest`},{type:`editor`,file:`scenes/main.scene`}];function CX(e,t){let n=e&&e.length>0?bX(e):SX,r=v?null:dt(`operator`),i=r?[pt([r],at(r))]:[],a=new Map,o=null;for(let e of n){let n=xX(e.type);if(!n||n===`editor`&&!e.file)continue;if(n===`editor`&&e.file){let n=t(e.file),r=a.get(n);if(r){r.tabs.push(dt(`editor`,e.file));continue}let s=dt(`editor`,e.file),c=pt([s],at(s));a.set(n,c),i.push(c),o||=c.id;continue}let r=dt(n,e.file);i.push(pt([r],at(r)))}return{groups:i,activeGroupId:o??i[0]?.id??null,pinnedGroupId:null,maximizedGroupId:null}}function wX(){let e=jw(),[t,n]=g.useState(()=>Pw());return g.useEffect(()=>{if(e)return;let t=window.matchMedia(`(max-width: 768px)`),r=()=>n(t.matches);return t.addEventListener(`change`,r),()=>t.removeEventListener(`change`,r)},[e]),t}function TX(e){let t=e.target;if(!(t instanceof HTMLIFrameElement)||!t.classList.contains(`deck-frame`))return t;try{let n=t.contentDocument;if(!n)return t;let r=t.getBoundingClientRect();return n.elementFromPoint(e.clientX-r.left,e.clientY-r.top)??t}catch{return t}}function EX(e,t){let n=e,r=!!(n?.ownerDocument&&n.ownerDocument!==t.ownerDocument),i=r?null:t.parentElement;for(;n&&n!==i;){if(n.nodeType===1){let e=getComputedStyle(n).overflowY;if((e===`auto`||e===`scroll`)&&n.scrollHeight>n.clientHeight+1)return!0}if(!r&&n===t)break;n=n.parentElement}return!1}function DX(e,t,n){let r=e,i=t.parentElement;for(;r&&r!==i;){if(r.nodeType===1){let e=getComputedStyle(r),t=e.touchAction;if(t.includes(`pan-y`)&&!t.includes(`pan-x`))return!0;let i=e.overflowX;if(i===`auto`||i===`scroll`){let e=r.scrollWidth-r.clientWidth;if(e>1&&(n>0?r.scrollLeft>1:r.scrollLeft<e-1))return!0}}if(r===t)break;r=r.parentElement}return!1}function OX(e){g.useEffect(()=>{let t=e.current;if(!t)return;let n=e=>{e.deltaY!==0&&(t.scrollWidth<=t.clientWidth||!e.shiftKey&&EX(TX(e),t)||(t.scrollLeft+=e.deltaX-e.deltaY,e.preventDefault()))};return t.addEventListener(`wheel`,n,{passive:!1}),()=>t.removeEventListener(`wheel`,n)},[e])}function kX(e,t,n){g.useLayoutEffect(()=>{let n=e.current,r=n?.querySelector(`.flow-row`);if(!n||!r)return;let i=()=>{let e=r.lastElementChild,i=e?e.offsetLeft+e.offsetWidth:0,a=t&&i>n.clientWidth?n.clientWidth/2:0;r.style.setProperty(`--flow-overscroll`,`${Math.round(a)}px`)};i();let a=new ResizeObserver(i);return a.observe(n),()=>a.disconnect()},[e,t,n])}function AX(e,t){let n=e.getBoundingClientRect(),r=t.getBoundingClientRect();if(r.left>=n.left-1&&r.right<=n.right+1)return;let i=window.matchMedia(`(prefers-reduced-motion: reduce)`).matches;e.scrollTo({left:e.scrollLeft+(r.left+r.width/2-(n.left+n.width/2)),behavior:i?`auto`:`smooth`})}function jX(e,t){let n=g.useRef(new Map),r=g.useCallback(e=>{let t=n.current.get(e);if(t)return t.obj;let r={visible:!1,active:!1,activeCbs:new Set,visibleCbs:new Set,obj:{id:e,isVisible:()=>r.visible,isActive:()=>r.active,onDidActiveChange:e=>(r.activeCbs.add(e),()=>r.activeCbs.delete(e)),onDidVisibilityChange:e=>(r.visibleCbs.add(e),()=>r.visibleCbs.delete(e))}};return n.current.set(e,r),r.obj},[]);return g.useEffect(()=>{let r=new Set;for(let i of e.groups){let a=t?i.id===e.activeGroupId:!0;for(let t of i.tabs){r.add(t.id);let o=n.current.get(t.id);if(!o)continue;let s=i.activeTabId===t.id,c=a&&s,l=i.id===e.activeGroupId&&s;c!==o.visible&&(o.visible=c,o.visibleCbs.forEach(e=>e(c))),l!==o.active&&(o.active=l,o.activeCbs.forEach(e=>e(l)))}}for(let e of n.current.keys())r.has(e)||n.current.delete(e)}),r}function MX({agent:e}){let[t,n]=g.useState(gX),[r,i]=g.useState(null),[a,o]=g.useState(null),s=g.useRef(null),c=g.useRef(!1),l=wX(),u=g.useRef(l);u.current=l;let d=g.useRef(gX),f=g.useRef(null),[p,m]=g.useState(null);d.current=t;let h=g.useRef(new Map),_=t.groups.find(e=>e.tabs.some(e=>e.kind===`operator`))?.id??null,y=g.useRef(_);y.current=_;let[b,x]=g.useState(null),S=g.useRef(null),C=g.useRef(null),w=g.useRef(null),T=g.useRef({page:0,count:0,ids:[]});OX(C),kX(C,!l&&!t.maximizedGroupId,t.groups);let ee=jX(t,l);g.useEffect(()=>{let e=!0;Promise.all([xe(),Ae().catch(()=>[])]).then(([t,r])=>{e&&(s.current=t.deckId,ue(t),i(t.kitEditorExtensions),o(r),n(oX(t.deckId,new Set(r),he)??CX(t.initialPanels,he)),c.current=!0)},()=>{e&&(i([]),o([]),n(CX(null,he)),c.current=!0)});let t=cx(t=>{t.changes.some(e=>e.event!==`change`)&&Ae().then(t=>{e&&o(t)}).catch(()=>{}),t.changes.some(e=>e.path===`castle.json`||e.path.startsWith(`imports/`))&&xe().then(t=>{e&&(ue(t),i(t.kitEditorExtensions))},()=>{})});return()=>{e=!1,t()}},[]),g.useEffect(()=>{if(!c.current)return;let e=window.setTimeout(()=>aX(s.current,t),400);return()=>window.clearTimeout(e)},[t]);let E=g.useMemo(()=>{let e=t.groups.find(e=>e.id===t.activeGroupId),n=e?.tabs.find(t=>t.id===e.activeTabId)??e?.tabs[0];return n&&n.kind===`editor`?n.path??null:null},[t.groups,t.activeGroupId]),te=g.useRef(null),D=g.useCallback(e=>{if(u.current||d.current.maximizedGroupId)return;let t=C.current,n=h.current.get(e);t&&n&&AX(t,n)},[]),ne=g.useCallback((e,t)=>{e&&(te.current=e,t||requestAnimationFrame(()=>{te.current===e&&(te.current=null,D(e))}))},[D]);g.useLayoutEffect(()=>{let e=te.current;e&&(te.current=null,D(e))},[t.groups,t.activeGroupId,t.maximizedGroupId,D]);let re=g.useCallback(e=>{let t=d.current,r=e(t);r!==t&&n(()=>r),ne(r.activeGroupId,r!==t)},[ne]),O=g.useCallback((e,t,r,i)=>{let a=d.current,o=i?.line===void 0&&i?.field===void 0;i&&!(o&&_t(a,e))&&tS(e,i);let c=u.current?1:1/0,l=t?Bt(a,t,e,he,c,r):zt(a,e,he,c,r);if(l===a)return;let f=rt(l);for(let e of rt(a))f.has(e)||oy(e);fb(s.current,e),n(()=>l),ne(l.activeGroupId,!0)},[ne]),k=g.useMemo(()=>({openFile:(e,t,n)=>O(e,void 0,t,n),openPlaytest:()=>re(e=>Ut(e,`play`)),openParams:(e,t)=>{e&&t?.field&&tS(e,{field:t.field}),re(t=>qt(t,e))},setParamsScope:e=>n(t=>Kt(t,e)),mentionInChat:e=>{v||(lK(e),re(e=>Ut(e,`operator`)))},closeEditor:e=>n(t=>{let n=_t(t,e);return n?Pt(t,n.group.id,n.tab.id):t}),activeEditorPath:E,kitEditorExts:r,terminalTheme:`dark`}),[r,E,O,re]);Xx(k);let ie=g.useCallback((e,t)=>{let r=d.current,i=r.maximizedGroupId?$t({...r,maximizedGroupId:null},e):At(r,e);i!==r&&n(()=>i),t?.reveal&&ne(e,i!==r)},[ne]),ae=g.useCallback(e=>{let t=gt(d.current,e);if(t)for(let e of t.tabs)e.kind===`editor`&&e.path&&oy(e.path);n(t=>Jt(t,e))},[]),oe=g.useCallback((e,t)=>{let r=gt(d.current,e)?.tabs.find(e=>e.id===t);r?.kind===`editor`&&r.path&&oy(r.path),n(n=>Pt(n,e,t))},[]),se=g.useCallback((e,t)=>n(n=>jt(n,e,t)),[]),ce=g.useCallback((e,t,r)=>{n(n=>Zt(n,e,t,r))},[]),[A,le]=g.useState(null),de=g.useCallback(e=>le(e),[]),fe=g.useCallback(()=>le(null),[]),pe=g.useCallback((e,t)=>O(t,e),[O]),me=g.useCallback((e,t,r)=>{n(n=>Lt(n,e,t,r))},[]),ge=g.useCallback(e=>n(t=>Qt(t,e)),[]),_e=g.useCallback(e=>{let t=d.current.maximizedGroupId===e;n(t=>$t(t,e)),t&&ne(e,!0)},[ne]),ve=g.useCallback((e,t,r)=>{n(n=>tn(en(n,e,t),e,r))},[]);g.useEffect(()=>{if(!l)return;let e=C.current,t=w.current;if(!e||!t)return;let r=0,i=0,a=0,o=1,s=!1,c=!1,u=null,d=e=>t.style.setProperty(`--flow-drag`,`${e}px`),f=t=>{t.touches.length===1&&(r=t.touches[0].clientX,i=t.touches[0].clientY,a=t.timeStamp,u=t.target,o=e.clientWidth||1,s=!1,c=!1)},p=n=>{if(n.touches.length!==1)return;let a=n.touches[0].clientX-r,o=n.touches[0].clientY-i;if(!s){if(Math.abs(a)<8&&Math.abs(o)<8)return;s=!0,c=Math.abs(a)>Math.abs(o)&&!DX(u,e,a),c&&t.classList.add(`flow-dragging`)}if(!c)return;n.preventDefault();let{page:l,count:f}=T.current;d(l===0&&a>0||l===f-1&&a<0?a*.3:a)},m=e=>{if(!c){t.classList.remove(`flow-dragging`);return}c=!1,t.classList.remove(`flow-dragging`);let i=e.changedTouches[0],s=i?i.clientX-r:0,l=e.timeStamp-a,{page:u,count:f,ids:p}=T.current,m=Math.abs(s)>50&&l<250,h=Math.abs(s)>o*.25,g=u;s<0&&(m||h)?g=Math.min(f-1,u+1):s>0&&(m||h)&&(g=Math.max(0,u-1));let _=p[g];g!==u&&_?n(e=>At(e,_)):d(0)};return e.addEventListener(`touchstart`,f,{passive:!0}),e.addEventListener(`touchmove`,p,{passive:!1}),e.addEventListener(`touchend`,m,{passive:!0}),e.addEventListener(`touchcancel`,m,{passive:!0}),()=>{e.removeEventListener(`touchstart`,f),e.removeEventListener(`touchmove`,p),e.removeEventListener(`touchend`,m),e.removeEventListener(`touchcancel`,m)}},[l]);let ye=g.useCallback((e,t)=>{t?h.current.set(e,t):h.current.delete(e),e===y.current&&x(t)},[]);g.useLayoutEffect(()=>{x(_?h.current.get(_)??null:null)},[_]);let be=nX(e,(()=>{let e=t.groups.find(e=>e.id===t.activeGroupId);return(e?.tabs.find(t=>t.id===e.activeTabId)??e?.tabs[0])?.kind===`operator`})(),b),[Se,Ce]=g.useState(null),we=g.useRef(null),Te=g.useRef(!1);g.useLayoutEffect(()=>{let e=we.current;e&&(we.current=null,_X(e,h.current))});let Ee=g.useCallback((e,t)=>{let r=d.current;if(u.current){let n=Xt(r,e,t),i=r.groups.findIndex(e=>e.id===r.activeGroupId);n.groups.findIndex(e=>e.id===n.activeGroupId)!==i&&(Te.current=!0)}else{let e=new Map;for(let t of r.groups){let n=h.current.get(t.id)?.getBoundingClientRect();n&&e.set(t.id,n)}we.current=e}n(n=>Xt(n,e,t))},[]);g.useEffect(()=>()=>{S.current?.()},[]);let De=g.useCallback((e,r)=>{if(l||e.button!==0||e.target.closest(`.panel-tab, button`)||!h.current.get(r))return;let i=e.currentTarget,a=e.pointerId;try{i.setPointerCapture(a)}catch{}let o=e.clientX,s=t.groups.findIndex(e=>e.id===r),c=e=>{let n=t.groups.filter(e=>e.id!==r).map(e=>{let t=h.current.get(e.id)?.getBoundingClientRect();return{left:t?.left??1/0,right:t?.right??1/0,center:t?t.left+t.width/2:1/0}}),i=0;for(;i<n.length&&n[i].center<e;)i+=1;if(i===s)return{target:i,x:null};let a=i<n.length?n[i].left-6:n.length?n[n.length-1].right+6:e;return{target:i,x:a}},u=!1,d=e.clientX,f=0,p=()=>{let e=C.current;if(e&&e.scrollWidth>e.clientWidth+1){let t=e.getBoundingClientRect(),n=0;d<t.left+64?n=-(1-Math.max(0,d-t.left)/64):d>t.right-64&&(n=1-Math.max(0,t.right-d)/64),n!==0&&(e.scrollLeft+=n*24,Ce({id:r,x:c(d).x}))}f=requestAnimationFrame(p)},m=e=>{!u&&Math.abs(e.clientX-o)<5||(u||(document.body.classList.add(`flow-reordering`),u=!0,f=requestAnimationFrame(p)),d=e.clientX,Ce({id:r,x:c(e.clientX).x}))},g=!1,_=()=>{if(!g){g=!0,i.removeEventListener(`pointermove`,m),i.removeEventListener(`pointerup`,v),i.removeEventListener(`pointercancel`,y),i.removeEventListener(`lostpointercapture`,y);try{i.hasPointerCapture(a)&&i.releasePointerCapture(a)}catch{}f&&cancelAnimationFrame(f),document.body.classList.remove(`flow-reordering`),S.current=null}},v=e=>{let i=u;if(_(),i){let{target:i}=c(e.clientX);if(i!==s){let e=new Map;for(let n of t.groups){let t=h.current.get(n.id)?.getBoundingClientRect();t&&e.set(n.id,t)}we.current=e,n(e=>Xt(e,r,i))}}Ce(null)},y=()=>{_(),Ce(null)};S.current=y,i.addEventListener(`pointermove`,m),i.addEventListener(`pointerup`,v),i.addEventListener(`pointercancel`,y),i.addEventListener(`lostpointercapture`,y)},[l,t.groups]),[Oe,ke]=g.useState(null),je=g.useCallback(e=>ke(t=>t?null:{anchor:e}),[]),Me=g.useCallback(()=>{let e=w.current?.querySelector(`.flow-tabs-add`);ke({anchor:e?.getBoundingClientRect()??new DOMRect(window.innerWidth/2,48)})},[]);g.useEffect(()=>{let e=(e,t)=>(t&&t!==window?[...document.querySelectorAll(`iframe.deck-frame`)].find(e=>e.contentWindow===t):e)?.closest?.(`.flow-group`)?.getAttribute(`data-group-id`)??null;return Dy(`pointermove`,t=>{let n=e(t.target,t.view);f.current=n,!u.current&&m(e=>e===n?e:n)},{passive:!0})},[]);let Ne=g.useMemo(()=>hy({getState:()=>d.current,setState:n,spawn:re,focusGroup:e=>ie(e,{reveal:!0}),closeGroup:ae,closeTab:oe,openPath:e=>O(e),openNewGroupPicker:Me,getHoveredGroupId:()=>f.current,toggleMaximize:_e}),[re,ie,ae,oe,O,Me,_e]),Pe=Ay(Ne),Fe=t.groups.some(e=>e.id===t.activeGroupId)?t.activeGroupId:t.groups[0]?.id??null,Ie=l?null:t.maximizedGroupId,Le=Math.max(0,t.groups.findIndex(e=>e.id===Fe));T.current={page:Le,count:t.groups.length,ids:t.groups.map(e=>e.id)},g.useLayoutEffect(()=>{let e=w.current;if(!e)return;let t=Te.current;t&&e.classList.add(`flow-dragging`),e.style.setProperty(`--flow-page`,String(Le)),e.style.setProperty(`--flow-drag`,`0px`),t&&(Te.current=!1,e.offsetHeight,requestAnimationFrame(()=>e.classList.remove(`flow-dragging`)))},[Le,l]),Qy(w),nb(()=>A?(le(null),!0):Oe?(ke(null),!0):!1,1);let Re=A?gt(t,A):null,ze=Re?.tabs.find(e=>e.id===Re.activeTabId)??Re?.tabs[0],Be=ze&&ze.kind===`editor`?ze.path??``:``;return(0,U.jsx)(Jx,{value:k,children:(0,U.jsx)(hX.Provider,{value:e,children:(0,U.jsxs)(`div`,{ref:w,className:`flow-root${l?` is-mobile`:``}${Ie?` is-maximized`:``}`,children:[(0,U.jsx)(NX,{state:t,activeId:Fe,operatorBadge:be,onFocusGroup:ie,onReorderGroup:Ee,onNewGroup:je}),(0,U.jsx)(`div`,{className:`flow-scroller`,ref:C,children:(0,U.jsx)(`div`,{className:`flow-field`,children:(0,U.jsx)(`div`,{className:`flow-row`,children:t.groups.map(e=>(0,U.jsx)(FX,{group:e,active:e.id===Fe,mobile:l,pinned:e.id===t.pinnedGroupId&&!Ie,maximized:e.id===Ie,hidden:Ie!==null&&e.id!==Ie,dragging:Se?.id===e.id,hovered:e.id===p,getLifecycle:ee,registerEl:ye,onFocusGroup:ie,onClose:ae,onActivateTab:se,onCloseTab:oe,onReorderTab:ce,onOpenMobileSwitch:de,onOpenInGroup:pe,onSetTabView:me,onTogglePin:ge,onToggleMaximize:_e,onStartDrag:De,onResize:ve},e.id))})})}),Se&&Se.x!==null&&(()=>{let e=C.current?.getBoundingClientRect(),t=h.current.get(Se.id)?.getBoundingClientRect();if(!e||!t)return null;let n=Math.max(t.top,e.top+12+36),r=Math.min(t.bottom,e.bottom)-n;return r<=0?null:(0,U.jsx)(`div`,{className:`flow-drop-indicator`,style:{left:Se.x,top:n,height:r}})})(),Oe&&(0,U.jsx)(GX,{anchor:Oe.anchor,files:a??[],onOpenFile:e=>O(e),onSpawnPanel:e=>re(t=>Ut(t,e)),onSpawnClass:e=>re(t=>Vt(t,e,he)),onClose:()=>ke(null)}),A&&(0,U.jsx)(Dw,{groupId:A,groupClass:nt(Re,he),currentFile:Be,files:a,recent:mb(s.current),view:ze?.view,onSetView:e=>{A&&ze&&me(A,ze.id,e)},onOpen:(e,t)=>O(e,t),onClose:fe}),(0,U.jsx)(sb,{openFile:e=>O(e),openPanel:e=>re(t=>Ut(t,e===`playtest`?`play`:e)),panels:UX,getCommands:Ne}),Pe?(0,U.jsxs)(`div`,{className:`chord-hint`,role:`status`,children:[(0,U.jsx)(`kbd`,{children:Pe}),(0,U.jsx)(`span`,{children:`waiting for the next key…`})]}):null]})})})}function NX(e){let{state:t,activeId:n,operatorBadge:r,onFocusGroup:i,onReorderGroup:a,onNewGroup:o}=e,s=ib(),[c,l]=g.useState(!1),u=s?.title?.trim()||`Untitled deck`;Yy(u,r),Xy(r);let d=s?.visibility===`public`?kb:s?.visibility===`unlisted`?Db:Ob,f=s?.saving??`idle`,p=s?.saveError??null,m=s?.draftAutosaveState??null,h=m===`starting`||m===`saving`?`Saving draft…`:m===`dirty`?`Unsaved changes`:m===`error`?`Draft save failed`:m===`saved`?`Draft saved`:null,[_,v]=g.useState(null),y=g.useRef(!1);g.useEffect(()=>{_!==null&&(f===`working`&&(y.current=!0),f===`done`&&y.current&&v(`done`),p&&y.current&&v(`failed`))},[f,p,_]);let b=g.useCallback(()=>{y.current=!1,v(`pushing`),qy(`push`)},[]);return(0,U.jsxs)(U.Fragment,{children:[(0,U.jsxs)(`div`,{className:`flow-topbar`,children:[(0,U.jsxs)(`div`,{className:`flow-topbar-leading`,children:[jw()?null:(0,U.jsxs)(`div`,{className:`flow-castle-wrap`,children:[(0,U.jsx)(`button`,{type:`button`,className:`dock-control dock-control-icon dock-control-mark`,title:`Menu`,"aria-haspopup":`menu`,"aria-expanded":c,onClick:()=>l(e=>!e),children:Fb}),c&&(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`div`,{className:`flow-menu-backdrop`,onClick:()=>l(!1)}),(0,U.jsxs)(`div`,{className:`menu flow-castle-menu`,role:`menu`,children:[(0,U.jsxs)(`button`,{type:`button`,role:`menuitem`,className:`menu-item`,onClick:()=>{l(!1),qy(`back-to-decks`)},children:[(0,U.jsx)(`span`,{className:`menu-icon`,children:jb}),(0,U.jsx)(`span`,{className:`menu-item-label`,children:`Back to decks`})]}),(0,U.jsxs)(`button`,{type:`button`,role:`menuitem`,className:`menu-item`,onClick:()=>{l(!1),qy(`new-deck`)},children:[(0,U.jsx)(`span`,{className:`menu-icon`,children:Cb}),(0,U.jsx)(`span`,{className:`menu-item-label`,children:`New deck`})]}),(0,U.jsx)(`div`,{className:`menu-separator flow-menu-narrow`}),(0,U.jsx)(`button`,{type:`button`,role:`menuitem`,className:`menu-item flow-menu-narrow`,onClick:()=>{l(!1),qy(`open-settings`)},children:(0,U.jsx)(`span`,{className:`menu-item-label`,children:`Deck settings`})}),(0,U.jsx)(`button`,{type:`button`,role:`menuitem`,className:`menu-item flow-menu-narrow`,disabled:f===`working`,onClick:()=>{l(!1),b()},children:(0,U.jsx)(`span`,{className:`menu-item-label`,children:f===`working`?`Pushing…`:p?`Push failed — retry`:f===`done`?`Pushed ✓`:`Push to Castle`})})]})]})]}),(0,U.jsxs)(`button`,{type:`button`,className:`dock-control dock-control-quiet flow-deck-identity`,title:`Deck settings`,onClick:()=>qy(`open-settings`),children:[(0,U.jsx)(`span`,{className:`flow-deck-vis`,children:d}),(0,U.jsx)(`span`,{className:`flow-deck-name`,children:u}),(0,U.jsx)(`span`,{className:`flow-deck-caret`,children:Mb})]}),h?(0,U.jsx)(`span`,{className:`flow-draft-status${m===`error`?` is-error`:``}`,role:`status`,children:h}):null]}),(0,U.jsxs)(`div`,{className:`flow-tabs-wrap`,children:[(0,U.jsx)(rw,{groups:t.groups,activeId:n,operatorBadge:r,onFocusGroup:i,onReorderGroup:a}),(0,U.jsx)(`button`,{type:`button`,className:`button button-icon button-quiet flow-tabs-add flow-picker-trigger`,title:`New group`,"aria-label":`New group`,onClick:e=>o(e.currentTarget.getBoundingClientRect()),children:Cb})]}),(0,U.jsx)(`div`,{className:`flow-topbar-trailing`,children:(0,U.jsxs)(`button`,{type:`button`,className:`dock-control flow-preview-btn${p?` flow-preview-btn-failed`:``}`,title:p??`Publish this deck to your Castle account (sandbox edits stay local until pushed)`,disabled:f===`working`,onClick:()=>qy(`push`),children:[Ab,(0,U.jsxs)(`span`,{className:`flow-preview-label`,children:[(0,U.jsx)(`span`,{className:`flow-preview-label-sizer`,"aria-hidden":`true`,children:`Push to Castle`}),(0,U.jsx)(`span`,{children:f===`working`?`Pushing…`:p?`Push failed`:f===`done`?`Pushed ✓`:`Push to Castle`})]})]})})]}),_!==null&&(0,U.jsx)(`div`,{className:`flow-push-modal-backdrop`,children:(0,U.jsx)(`div`,{className:`flow-push-modal`,role:`dialog`,"aria-modal":`true`,children:_===`failed`?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`div`,{className:`flow-push-check flow-push-check-failed`,children:`!`}),(0,U.jsx)(`div`,{className:`flow-push-title`,children:`Push failed`}),(0,U.jsx)(`div`,{className:`flow-push-sub`,children:p}),(0,U.jsx)(`button`,{type:`button`,className:`flow-push-done`,onClick:()=>v(null),children:`Dismiss`})]}):_===`done`?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`div`,{className:`flow-push-check`,children:`✓`}),(0,U.jsx)(`div`,{className:`flow-push-title`,children:`Pushed to Castle`}),s?.shareUrl?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`div`,{className:`flow-push-sub`,children:`Your deck is live at`}),(0,U.jsx)(`a`,{className:`flow-push-url`,href:s.shareUrl,target:`_blank`,rel:`noreferrer`,children:s.shareUrl.replace(/^https?:\/\//,``)})]}):(0,U.jsx)(`div`,{className:`flow-push-sub`,children:`Saved to your Castle account.`}),(0,U.jsx)(`button`,{type:`button`,className:`flow-push-done`,onClick:()=>v(null),children:`Done`})]}):(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`div`,{className:`flow-push-spinner`}),(0,U.jsx)(`div`,{className:`flow-push-title`,children:`Pushing to Castle…`}),(0,U.jsx)(`div`,{className:`flow-push-sub`,children:`Publishing your latest changes.`})]})})})]})}function PX(e,t){e.currentTarget.blur(),t()}var FX=g.memo(function(e){let{group:t,active:n,mobile:r,pinned:i,maximized:a,hidden:o,dragging:s,hovered:c,getLifecycle:l,registerEl:u}=e,{onFocusGroup:d,onClose:f}=e,p=tt(t),m=KX(t,e.onResize),[h,_]=g.useState(()=>p&&t.tabs.every(et)),v=g.useCallback(()=>_(e=>!e),[]),y=r?void 0:a?{flex:`1 1 auto`}:{flex:`0 0 auto`,width:t.w,height:t.h},b=p?null:t.tabs[0],x=(0,U.jsx)(`button`,{type:`button`,className:r?`button button-icon button-icon-large button-quiet`:`button button-icon button-quiet`,title:`Close`,"aria-label":`Close`,onClick:e=>PX(e,()=>f(t.id)),children:wb}),S=n=>{n.target.closest(`button, .panel-tab`)||a||e.onStartDrag(n,t.id)},C=n&&!r&&!a,w=b?.kind===`operator`;return(0,U.jsxs)(`div`,{ref:e=>u(t.id,e),"data-group-id":t.id,className:`panel flow-group${C?` is-active`:``}${i?` pinned`:``}${a?` maximized`:``}${o?` hidden`:``}${s?` is-dragging`:``}${c?` is-hover`:``}${p?` is-editor`:``}`,style:y,onMouseDown:()=>d(t.id),children:[p?(0,U.jsx)(QC,{group:t,mobile:r,pinned:i,maximized:a,onStartDrag:e.onStartDrag,onActivateTab:e.onActivateTab,onCloseTab:e.onCloseTab,onCloseGroup:f,onReorderTab:e.onReorderTab,onTogglePin:e.onTogglePin,onToggleMaximize:e.onToggleMaximize,onOpenMobileSwitch:e.onOpenMobileSwitch,onSetTabView:e.onSetTabView,drawerOpen:h,onToggleDrawer:v}):(0,U.jsxs)(`div`,{className:`${w?`panel-tabs-header`:`panel-header`} flow-tabstrip${r?` flow-tabstrip-mobile`:``}`,onPointerDown:S,children:[w?(0,U.jsx)(`div`,{className:`operator-chrome`,"data-operator-chrome":!0}):r?(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`div`,{className:`flow-mobile-strip-left`}),(0,U.jsxs)(`div`,{className:`panel-mobile-current`,children:[(0,U.jsx)(`span`,{className:`flow-tab-icon`,children:b&&Sb(b.kind,b.path)}),(0,U.jsx)(`span`,{className:`panel-mobile-current-label`,children:b?.label})]})]}):(0,U.jsxs)(`div`,{className:`panel-title`,children:[(0,U.jsx)(`span`,{className:`flow-tab-icon`,children:b&&Sb(b.kind,b.path)}),(0,U.jsx)(`span`,{children:b?.label})]}),(0,U.jsxs)(`div`,{className:`panel-header-actions${r?` flow-mobile-strip-right`:``}`,children:[!r&&!a&&(0,U.jsx)(`button`,{type:`button`,className:`button button-icon button-quiet`,title:i?`Unpin`:`Pin to left`,"aria-label":i?`Unpin`:`Pin to left`,"aria-pressed":i,onClick:n=>PX(n,()=>e.onTogglePin(t.id)),children:Eb}),!r&&(0,U.jsx)(`button`,{type:`button`,className:`button button-icon button-quiet`,title:a?`Restore`:`Maximize`,"aria-label":a?`Restore`:`Maximize`,"aria-pressed":a,onClick:n=>PX(n,()=>e.onToggleMaximize(t.id)),children:a?Pb:Nb}),x]})]}),(0,U.jsx)(`div`,{className:`flow-panel-body`,children:t.tabs.map(i=>(0,U.jsx)(`div`,{className:`flow-tab-body${i.id===t.activeTabId?``:` inactive`}`,children:(0,U.jsx)(IX,{tab:i,groupId:t.id,lifecycle:l(i.id),onOpenInGroup:e.onOpenInGroup,onSetTabView:e.onSetTabView,drawerOpen:h&&!r,mobile:r,active:n})},i.id))}),!r&&!a&&(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`div`,{className:`flow-resize-e`,onPointerDown:m(`x`),title:`Drag to resize width`}),(0,U.jsx)(`div`,{className:`flow-resize-s`,onPointerDown:m(`y`),title:`Drag to resize height`}),(0,U.jsx)(`div`,{className:`flow-resize-se`,onPointerDown:m(`xy`),title:`Drag to resize`})]})]})}),IX=g.memo(function(e){let{tab:t,groupId:n,lifecycle:r,onOpenInGroup:i,onSetTabView:a,drawerOpen:o,mobile:s,active:c}=e;if(t.kind===`editor`&&et(t))return(0,U.jsxs)(`div`,{className:`flow-empty-editor`,children:[o?(0,U.jsx)(QW,{currentFile:``,filterClass:t.classHint,onOpen:e=>i(n,e)}):null,(0,U.jsx)(`div`,{className:`flow-empty-editor-msg`,children:`Open a file`})]});switch(t.kind){case`editor`:return(0,U.jsx)(HW,{file:t.path,editorClass:t.view,lifecycle:r,hideContextBar:!0,drawerOpen:o,drawer:(0,U.jsx)(QW,{currentFile:t.path??``,filterClass:t.path?he(t.path):void 0,onOpen:e=>i(n,e),view:t.view,onSetView:e=>a(n,t.id,e)})});case`play`:return(0,U.jsx)(XW,{lifecycle:r});case`terminal`:return(0,U.jsx)(ZW,{lifecycle:r});case`files`:return(0,U.jsx)(eK,{lifecycle:r});case`params`:return(0,U.jsx)(zC,{scope:t.path,lifecycle:r});case`operator`:return(0,U.jsx)(LX,{mobile:s,active:c});default:return(0,U.jsx)(RX,{tab:t})}});function LX(e){let t=g.useContext(hX);return t?(0,U.jsx)(`div`,{className:`shell-root docked flow-operator-host`,style:{"--operator-col":`100%`},children:(0,U.jsx)(zY,{agent:t,mobile:e.mobile,active:e.active})}):(0,U.jsx)(`div`,{className:`flow-placeholder`,children:`operator unavailable`})}function RX(e){let{tab:t}=e;return(0,U.jsxs)(`div`,{className:`flow-placeholder kind-${t.kind}`,children:[(0,U.jsx)(`div`,{className:`flow-placeholder-icon`,children:Sb(t.kind,t.path)}),(0,U.jsx)(`div`,{className:`flow-placeholder-label`,children:t.label}),(0,U.jsx)(`div`,{className:`flow-placeholder-kind`,children:t.path??t.kind})]})}function zX(e,t){g.useEffect(()=>{let n=n=>{n.target.closest(e)||t()},r=window.setTimeout(()=>document.addEventListener(`mousedown`,n),0);return()=>{window.clearTimeout(r),document.removeEventListener(`mousedown`,n)}},[e,t])}function BX(e,t){return Math.max(8,Math.min(e,window.innerWidth-t-8))}var VX=300,HX=[...v?[]:[{kind:`operator`,label:`Operator`}],{kind:`play`,label:`Play`},...v?[]:[{kind:`terminal`,label:`Terminal`}],{kind:`files`,label:`Files`},{kind:`params`,label:`Parameters`}],UX=HX.map(({kind:e,label:t})=>({kind:e===`play`?`playtest`:e,label:t}));function WX(e,t){let n=t.trim().toLowerCase(),r=HX.filter(e=>e.label.toLowerCase().includes(n)).map(e=>({kind:`panel`,panel:e.kind,label:e.label})),i=new Set;for(let t of e)i.add(he(t));let a=[...i].map(e=>{let t=ge(e);return{kind:`class`,classId:e,label:t.label,icon:t.icon}}).filter(e=>e.label.toLowerCase().includes(n)).sort((e,t)=>e.label.localeCompare(t.label)),o=e.filter(e=>e.toLowerCase().includes(n)).slice(0,40).map(e=>({kind:`file`,path:e}));return[...r,...a,...o]}function GX(e){let{anchor:t,files:n,onOpenFile:r,onSpawnPanel:i,onSpawnClass:a,onClose:o}=e,[s,c]=g.useState(``),[l,u]=g.useState(0);zX(`.flow-picker, .flow-picker-trigger`,o);let d=WX(n,s),f=Math.min(l,Math.max(0,d.length-1)),p=e=>{e.kind===`panel`?i(e.panel):e.kind===`class`?a(e.classId):r(e.path),o()};return(0,My.createPortal)((0,U.jsxs)(`div`,{className:`menu flow-picker`,style:{top:t.bottom+4,left:BX(t.left,VX),width:VX},onMouseDown:e=>e.stopPropagation(),children:[(0,U.jsx)(`input`,{className:`flow-picker-input`,autoFocus:!0,placeholder:`Open a file or panel…`,value:s,onChange:e=>{c(e.target.value),u(0)},onKeyDown:e=>{e.key===`Escape`?o():e.key===`ArrowDown`?(e.preventDefault(),u(e=>Math.min(e+1,d.length-1))):e.key===`ArrowUp`?(e.preventDefault(),u(e=>Math.max(e-1,0))):e.key===`Enter`&&d[f]&&p(d[f])}}),(0,U.jsxs)(`div`,{className:`flow-picker-list`,children:[d.length===0&&(0,U.jsx)(`div`,{className:`flow-picker-empty`,children:`No matches`}),d.map((e,t)=>(0,U.jsxs)(`button`,{type:`button`,className:`menu-item${t===f?` is-hover`:``}`,onMouseEnter:()=>u(t),onClick:()=>p(e),children:[(0,U.jsx)(`span`,{className:`menu-icon`,children:e.kind===`panel`?Sb(e.panel):e.kind===`class`?yb(e.icon):Sb(`editor`,e.path)}),(0,U.jsx)(`span`,{className:`menu-item-label`,children:e.kind===`panel`||e.kind===`class`?e.label:e.path})]},e.kind===`panel`?`p:${e.panel}`:e.kind===`class`?`c:${e.classId}`:`f:${e.path}`))]})]}),document.body)}function KX(e,t){return g.useCallback(n=>r=>{r.preventDefault(),r.stopPropagation();let i=r.clientX,a=r.clientY,o=e.w,s=e.h,c=r.currentTarget;c.setPointerCapture(r.pointerId);let l=!1,u=r=>{let c=r.clientX-i,u=r.clientY-a;if(!l&&Math.abs(c)<5&&Math.abs(u)<5)return;l=!0;let d=n===`y`?o:Math.max(200,o+c),f=n===`x`?s:Math.max(160,s+u);t(e.id,d,f)},d=()=>{c.removeEventListener(`pointermove`,u),c.removeEventListener(`pointerup`,d)};c.addEventListener(`pointermove`,u),c.addEventListener(`pointerup`,d)},[e.id,e.w,e.h,t])}function qX(){let e=se(),t=g.useRef(0);return rb(()=>{let n=Date.now();n-t.current<1e3||(t.current=n,e.refreshUsage())}),(0,U.jsx)(MX,{agent:e})}var JX=document.getElementById(`root`);if(!JX)throw Error(`Missing #root`);lG(),YP(),Bx(),(0,_.createRoot)(JX).render((0,U.jsx)(qX,{}));
|
package/dist/shell/index.html
CHANGED
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
<link rel="icon" type="image/png" sizes="32x32" href="/__castle/ide/favicon-32x32.png" />
|
|
11
11
|
<link rel="icon" type="image/png" sizes="16x16" href="/__castle/ide/favicon-16x16.png" />
|
|
12
12
|
<link rel="icon" href="/__castle/ide/favicon.ico" sizes="any" />
|
|
13
|
-
<script type="module" crossorigin src="/__castle/ide/assets/index-
|
|
14
|
-
<link rel="stylesheet" crossorigin href="/__castle/ide/assets/index-
|
|
13
|
+
<script type="module" crossorigin src="/__castle/ide/assets/index-DS9bSm5p.js"></script>
|
|
14
|
+
<link rel="stylesheet" crossorigin href="/__castle/ide/assets/index-CMoHf5L9.css">
|
|
15
15
|
</head>
|
|
16
16
|
<body>
|
|
17
17
|
<div id="root"></div>
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
:root{--castle-font-body:baltomobile, Balto, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;--castle-font-display:Basteleur, Georgia, "Times New Roman", serif;--castle-font-mono:ui-monospace, SFMono-Regular, Menlo, monospace;--castle-text-size-small:11px;--castle-text-size-base:13px;--castle-text-size-large:15px;--castle-text-style-smallcaps-size:var(--castle-text-size-small);--castle-text-style-smallcaps-letter-spacing:.05em;--castle-text-style-smallcaps-transform:uppercase;--castle-text-primary:#e6e6e6;--castle-text-secondary:#b3b3b3;--castle-text-muted:#888;--castle-text-dim:#525252;--castle-text-dark:#111;--castle-surface-1:#000;--castle-surface-2:#0c0c0c;--castle-surface-3:#181818;--castle-surface-4:#242424;--castle-surface-5:#303030;--castle-surface-6:#3c3c3c;--castle-surface-light:#e6e6e6;--castle-border-1:#2a2a2a;--castle-border-2:#6a6a6a;--castle-border-3:#3a3a3a;--castle-border-4:#e6e6e6;--castle-accent:#793a80;--castle-danger-text:#e86a73;--castle-danger-surface:#73172d;--castle-danger-surface-hover:#b4202a;--castle-warn-text:#e8b25a;--castle-warn-surface:#5a3d0a;--castle-space-small:3px;--castle-space-base:6px;--castle-space-large:12px;--castle-radius-small:4px;--castle-radius-base:8px;--castle-radius-large:16px;--castle-radius-pill:999px;--castle-button-height:24px;--castle-button-icon-size:16px;--castle-button-height-large:36px;--castle-button-icon-size-large:24px;--castle-icon-size-inline:12px;--castle-panel-header-height:36px;--castle-panel-header-height-mobile:48px}.text-style-smallcaps{font-size:var(--castle-text-style-smallcaps-size);letter-spacing:var(--castle-text-style-smallcaps-letter-spacing);text-transform:var(--castle-text-style-smallcaps-transform)}.icon-inline{flex:0 0 var(--castle-icon-size-inline);width:var(--castle-icon-size-inline);height:var(--castle-icon-size-inline);font-size:var(--castle-icon-size-inline)}.icon-slot{flex:0 0 var(--castle-button-icon-size);width:var(--castle-button-icon-size);height:var(--castle-button-icon-size);justify-content:center;align-items:center;display:flex}.icon-cell{flex:0 0 var(--castle-button-height);width:var(--castle-button-height);height:var(--castle-button-height);color:var(--castle-text-dim);pointer-events:none;justify-content:center;align-items:center;display:inline-flex}.icon-slot svg,.icon-slot iconify-icon,.icon-cell svg,.icon-cell iconify-icon{flex:0 0 var(--castle-button-icon-size);width:var(--castle-button-icon-size);height:var(--castle-button-icon-size);font-size:var(--castle-button-icon-size)}.button{justify-content:center;align-items:center;gap:var(--castle-space-base);max-width:100%;height:var(--castle-button-height);padding:0 var(--castle-space-base);border-radius:var(--castle-radius-small);background:var(--castle-surface-4);color:var(--castle-text-primary);font-family:var(--castle-font-body);font-size:var(--castle-text-size-base);white-space:nowrap;cursor:pointer;border:0;line-height:1.3;display:inline-flex}.button:not(.button-icon){min-width:0}.button>span{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.button:hover,.button.is-hover{background:var(--castle-surface-5)}.button:active,.button.is-pressed{background:var(--castle-surface-3)}.button:focus-visible,.button.is-focus{outline:1px solid var(--castle-border-2);outline-offset:2px}.button[aria-pressed=true],.button[aria-pressed=true]:hover,.button[aria-pressed=true]:active{background:var(--castle-surface-light);color:var(--castle-text-dark)}.button:disabled{opacity:.4;cursor:default}.button-icon{width:var(--castle-button-height);padding:0}.button-icon-large{width:var(--castle-button-height-large);height:var(--castle-button-height-large)}.button-danger{background:var(--castle-danger-surface);color:var(--castle-text-primary)}.button-danger:hover,.button-danger.is-hover{background:var(--castle-danger-surface-hover)}.button-danger:active,.button-danger.is-pressed{background:var(--castle-danger-surface)}.button-quiet{color:var(--castle-text-dim);background:0 0}.button-quiet:hover,.button-quiet.is-hover{background:var(--castle-surface-5);color:var(--castle-text-primary)}.button-quiet:active,.button-quiet.is-pressed{background:var(--castle-surface-3)}.button-quiet[aria-pressed=true],.button-quiet[aria-pressed=true]:hover,.button-quiet[aria-pressed=true]:active{background:var(--castle-surface-5);color:var(--castle-text-primary)}.composer-action{border-radius:var(--castle-radius-pill);color:var(--castle-text-muted);box-shadow:inset 0 0 0 1px var(--castle-border-2);background:0 0}.composer-action:disabled{opacity:1;color:var(--castle-text-muted);box-shadow:inset 0 0 0 1px var(--castle-border-1);background:0 0}.composer-action:not(:disabled),.composer-action:not(:disabled):hover,.composer-action:not(:disabled):active,.composer-action:not(:disabled).is-hover,.composer-action:not(:disabled).is-pressed{background:var(--castle-surface-light);color:var(--castle-text-dark);box-shadow:none}.button svg,.button iconify-icon{width:var(--castle-button-icon-size);height:var(--castle-button-icon-size);font-size:var(--castle-button-icon-size)}.button-icon-large svg,.button-icon-large iconify-icon{width:var(--castle-button-icon-size-large);height:var(--castle-button-icon-size-large);font-size:var(--castle-button-icon-size-large)}.button-badge{min-width:16px;height:16px;padding:0 var(--castle-space-small);border-radius:var(--castle-radius-pill);background:var(--castle-surface-5);color:var(--castle-text-secondary);font-size:var(--castle-text-size-small);font-variant-numeric:tabular-nums;text-align:center;text-overflow:clip;flex:none;line-height:16px;overflow:hidden}.button>.button-badge{text-overflow:clip;min-width:16px;overflow:hidden}.text-field{min-width:0;height:var(--castle-button-height);padding:0 var(--castle-space-base);border:1px solid var(--castle-border-3);border-radius:var(--castle-radius-small);background:var(--castle-surface-3);color:var(--castle-text-primary);font-family:var(--castle-font-body);font-size:var(--castle-text-size-base);cursor:text;outline:0}.text-field::placeholder{color:var(--castle-text-muted)}.text-field:hover,.text-field.is-hover{background:var(--castle-surface-4)}.text-field:focus,.text-field:focus-visible,.text-field.is-focus{outline:1px solid var(--castle-border-2);outline-offset:2px}.text-field:disabled{opacity:.4;cursor:default}.select{min-width:0;height:var(--castle-button-height);padding:0 var(--castle-space-base);border:1px solid var(--castle-border-3);border-radius:var(--castle-radius-small);background:var(--castle-surface-3);color:var(--castle-text-primary);font-family:var(--castle-font-body);font-size:var(--castle-text-size-base);cursor:pointer;outline:0}.select:hover,.select.is-hover{background:var(--castle-surface-4)}.select:focus,.select:focus-visible,.select.is-focus{outline:1px solid var(--castle-border-2);outline-offset:2px}.select:disabled{opacity:.4;cursor:default}.dock-control{justify-content:center;align-items:center;gap:var(--castle-space-base);max-width:100%;height:var(--castle-panel-header-height);padding:0 var(--castle-space-large);border:1px solid var(--castle-border-1);border-radius:var(--castle-radius-base);background:var(--castle-surface-3);color:var(--castle-text-primary);font-family:var(--castle-font-body);font-size:var(--castle-text-size-base);white-space:nowrap;cursor:pointer;font-weight:600;line-height:1;display:inline-flex}.dock-control:not(.dock-control-icon){min-width:0}.dock-control>span{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.dock-control-icon{width:var(--castle-panel-header-height);padding:0}.dock-control-quiet{background:0 0;border-color:#0000;justify-content:flex-start;min-width:0}.dock-control-mark{background:var(--castle-surface-1)}.dock-control-group{cursor:default;box-shadow:inset 0 0 0 1px var(--castle-border-1);border:none;justify-content:flex-start;align-items:stretch;gap:0;padding:0;overflow:hidden}button.dock-control:hover,button.dock-control.is-hover{background:var(--castle-surface-4);border-color:var(--castle-border-3)}button.dock-control:active,button.dock-control.is-pressed{background:var(--castle-surface-2)}button.dock-control-quiet:active,button.dock-control-quiet.is-pressed{background:var(--castle-surface-3)}button.dock-control:focus-visible,button.dock-control.is-focus{outline:1px solid var(--castle-border-2);outline-offset:2px}.dock-control:disabled{opacity:.4;cursor:default}button.dock-control:disabled:hover,button.dock-control:disabled.is-hover{background:var(--castle-surface-3);border-color:var(--castle-border-1)}button.dock-control-quiet:disabled:hover,button.dock-control-quiet:disabled.is-hover{background:0 0;border-color:#0000}button.dock-control-mark:disabled:hover,button.dock-control-mark:disabled.is-hover{background:var(--castle-surface-1)}.dock-control svg,.dock-control iconify-icon{width:var(--castle-button-icon-size);height:var(--castle-button-icon-size);font-size:var(--castle-button-icon-size);flex-shrink:0}.dock-control-mark svg,.dock-control-mark img{width:20px;height:20px}.dock-control-mark img{object-fit:contain;display:block}.dock-segment{flex:0 0 var(--castle-panel-header-height);width:var(--castle-panel-header-height);height:var(--castle-panel-header-height);color:var(--castle-text-muted);cursor:pointer;background:0 0;border:none;border-radius:0;justify-content:center;align-items:center;padding:0;display:inline-flex}.dock-segment iconify-icon,.dock-segment svg{width:var(--castle-button-icon-size);height:var(--castle-button-icon-size);font-size:var(--castle-button-icon-size)}@media (hover:hover){.dock-segment:hover:not(.is-active){color:var(--castle-text-primary);background:var(--castle-surface-5)}}.dock-segment.is-hover:not(.is-active){color:var(--castle-text-primary);background:var(--castle-surface-5)}.dock-segment.is-active{color:var(--castle-text-dark);background:var(--castle-surface-light)}.dock-segment.is-drag-origin{opacity:0;pointer-events:none;flex:0 0 0;width:0;min-width:0;max-width:0;padding:0;overflow:hidden}.dock-segment-slot{flex:0 0 var(--castle-panel-header-height);width:var(--castle-panel-header-height);height:var(--castle-panel-header-height);color:var(--castle-text-primary);background:var(--castle-surface-6);pointer-events:none;justify-content:center;align-items:center;display:inline-flex}.dock-segment-slot iconify-icon,.dock-segment-slot svg{width:var(--castle-button-icon-size);height:var(--castle-button-icon-size);font-size:var(--castle-button-icon-size)}.dock-segment-ghost{border-radius:var(--castle-radius-small);pointer-events:none;box-shadow:0 8px 24px #00000073}.dock-segment:has(.dock-badge){position:relative}.dock-segment .dock-badge{top:var(--castle-space-small);right:var(--castle-space-small);z-index:1;background:var(--castle-surface-light);color:var(--castle-text-dark);pointer-events:none;transform-origin:50%;position:absolute}.dock-segment .dock-badge:not(.is-appearing){visibility:hidden;opacity:0;transform:scale(.45)}.dock-segment .dock-badge.is-appearing{visibility:visible;animation:.28s cubic-bezier(.2,.8,.2,1) both dock-badge-appear}@keyframes dock-badge-appear{0%{opacity:0;transform:scale(.45)}70%{opacity:1;transform:scale(1.08)}to{opacity:1;transform:scale(1)}}@media (prefers-reduced-motion:reduce){.dock-segment .dock-badge.is-appearing{animation:none}}.menu{gap:var(--castle-space-small);width:max-content;min-width:144px;padding:var(--castle-space-small);border:1px solid var(--castle-border-3);border-radius:var(--castle-radius-base);background:var(--castle-surface-5);flex-direction:column;display:flex;box-shadow:0 8px 24px #0000008c}.menu-item{align-items:center;gap:var(--castle-space-base);width:100%;height:26px;padding:0 var(--castle-space-base);border-radius:var(--castle-radius-small);color:var(--castle-text-primary);font-family:var(--castle-font-body);font-size:var(--castle-text-size-base);cursor:pointer;background:0 0;border:0;display:flex}.menu-icon{flex:0 0 16px;width:16px;height:16px;font-size:16px}svg.menu-icon,iconify-icon.menu-icon{fill:none;stroke:currentColor;stroke-linecap:round;stroke-linejoin:round;stroke-width:1.5px}.menu-icon svg,.menu-icon iconify-icon{width:16px;height:16px;font-size:16px}.menu-item:hover:not(:disabled),.menu-item.is-hover:not(:disabled){background:var(--castle-surface-6)}.menu-item:disabled{opacity:.4;cursor:default}.menu-item-label{text-overflow:ellipsis;white-space:nowrap;text-align:left;flex:auto;min-width:0;overflow:hidden}.menu-check{color:var(--castle-text-primary);flex:none}.menu-keys{margin-left:var(--castle-space-large);color:var(--castle-text-muted);font-size:var(--castle-text-size-small);white-space:nowrap;flex:none}.menu-item:disabled .menu-keys{color:inherit}.menu-item-danger{color:var(--castle-danger-text)}.menu-separator{height:1px;margin:var(--castle-space-small) 0;background:var(--castle-border-3)}.menu-header{padding:var(--castle-space-small) var(--castle-space-base);color:var(--castle-text-muted);font-size:var(--castle-text-size-small);letter-spacing:.04em;text-transform:uppercase}.menu-confirm{gap:var(--castle-space-base);min-width:180px;padding:var(--castle-space-small) var(--castle-space-base);flex-direction:column;display:flex}.menu-confirm-text{color:var(--castle-text-primary);font-size:var(--castle-text-size-base);margin:0}.menu-confirm-actions{justify-content:flex-end;gap:var(--castle-space-base);display:flex}.menu-error{padding:var(--castle-space-small) var(--castle-space-base);color:var(--castle-danger-text);font-size:var(--castle-text-size-small);margin:0}.feedback-quiet{--castle-feedback-text:var(--castle-text-muted);--castle-feedback-surface:var(--castle-surface-3);--castle-feedback-border:var(--castle-border-3)}.feedback-warn{--castle-feedback-text:var(--castle-warn-text);--castle-feedback-surface:var(--castle-warn-surface);--castle-feedback-surface-hover:color-mix(in srgb, var(--castle-warn-text) 35%, var(--castle-warn-surface));--castle-feedback-border:color-mix(in srgb, var(--castle-warn-text), var(--castle-warn-surface))}.feedback-danger{--castle-feedback-text:var(--castle-danger-text);--castle-feedback-surface:var(--castle-danger-surface);--castle-feedback-surface-hover:var(--castle-danger-surface-hover);--castle-feedback-border:color-mix(in srgb, var(--castle-danger-text), var(--castle-danger-surface))}.feedback-note{color:var(--castle-feedback-text);margin:0}.feedback-banner{align-items:center;gap:var(--castle-space-base);min-height:var(--castle-panel-header-height);padding:var(--castle-space-base);border-bottom:1px solid var(--castle-feedback-border);background:var(--castle-feedback-surface);color:var(--castle-feedback-text);font-size:var(--castle-text-size-base);display:flex}.feedback-banner>span:not(.icon-cell){flex:auto;min-width:0}.feedback-banner .icon-cell{color:inherit}.feedback-warn .button,.feedback-danger .button{border:1px solid var(--castle-feedback-border);background:var(--castle-feedback-surface);color:var(--castle-text-primary)}.feedback-warn .button:hover,.feedback-warn .button.is-hover,.feedback-danger .button:hover,.feedback-danger .button.is-hover{background:var(--castle-feedback-surface-hover)}.feedback-warn .button:active,.feedback-warn .button.is-pressed,.feedback-danger .button:active,.feedback-danger .button.is-pressed{background:var(--castle-feedback-surface)}.feedback-takeover{padding:calc(var(--castle-space-large) * 2);border:1px solid var(--castle-feedback-border);border-radius:var(--castle-radius-base);background:var(--castle-feedback-surface);color:var(--castle-feedback-text);font-size:var(--castle-text-size-base);text-align:center;justify-content:center;align-items:center;display:flex}.panel{border:1px solid var(--castle-border-1);border-radius:var(--castle-radius-base);background:var(--castle-surface-2);color:var(--castle-text-primary);font-family:var(--castle-font-body);transition:border-color .12s;position:relative;overflow:hidden}@media (hover:hover){.panel:hover{border-color:var(--castle-border-3)}}.panel.is-hover{border-color:var(--castle-border-3)}.panel.is-active,.panel.is-active:hover,.panel.is-active.is-hover{border-color:var(--castle-border-2)}.panel.is-dragging,.panel.is-dragging:hover,.panel.is-dragging.is-hover,.panel.is-dragging.is-active{border-color:var(--castle-border-4)}.panel-header,.panel-tabs-header{height:var(--castle-panel-header-height);padding:0 var(--castle-space-base);border-bottom:1px solid var(--castle-border-1);background:var(--castle-surface-3);align-items:center;display:flex}@media (hover:hover){.panel-header:hover,.panel-tabs-header:hover{background:var(--castle-surface-4);cursor:grab}}.panel-header.is-hover,.panel-tabs-header.is-hover{background:var(--castle-surface-4);cursor:grab}.panel-header:active,.panel-header.is-pressed,.panel-tabs-header:active,.panel-tabs-header.is-pressed{cursor:grabbing}.panel-tabs-header{align-items:stretch;gap:var(--castle-space-base)}.panel-title{align-items:center;gap:var(--castle-space-base);min-width:0;padding:0 var(--castle-space-base);color:var(--castle-text-primary);font-family:var(--castle-font-display);font-size:var(--castle-text-size-base);margin:0 auto 0 0;font-weight:700;line-height:1.5;display:inline-flex}.panel-title svg,.panel-title iconify-icon{width:var(--castle-button-icon-size);height:var(--castle-button-icon-size);font-size:var(--castle-button-icon-size);flex-shrink:0}.panel-header-actions{align-items:center;gap:var(--castle-space-small);margin-left:auto;display:flex}.panel-type-toggle{align-items:center;gap:var(--castle-space-base);min-width:0;max-width:100%;height:var(--castle-button-height);padding:0 var(--castle-space-base);border-radius:var(--castle-radius-small);color:var(--castle-text-primary);font-family:var(--castle-font-display);font-size:var(--castle-text-size-base);white-space:nowrap;cursor:pointer;background:0 0;border:0;align-self:center;font-weight:700;display:inline-flex}.panel-type-toggle:hover,.panel-type-toggle.is-hover,.panel-type-toggle[aria-pressed=true]{background:var(--castle-surface-5)}.panel-type-toggle svg,.panel-type-toggle iconify-icon{width:var(--castle-button-icon-size);height:var(--castle-button-icon-size);font-size:var(--castle-button-icon-size);flex-shrink:0}.panel-tabs{align-items:center;gap:var(--castle-space-base);flex:auto;min-width:0;display:flex}.panel-tab{max-width:160px;height:var(--castle-button-height);padding:var(--castle-space-small) var(--castle-space-base);border-radius:var(--castle-radius-small);color:var(--castle-text-dim);font-family:var(--castle-font-body);font-size:var(--castle-text-size-base);white-space:nowrap;cursor:pointer;background:0 0;border:0;align-items:center;line-height:18px;display:flex;position:relative;overflow:hidden}.panel-tab>span{text-overflow:ellipsis;min-width:0;overflow:hidden}.panel-tab:hover,.panel-tab.is-hover{background:var(--castle-surface-5);color:var(--castle-text-secondary)}.panel-tab.is-active{background:var(--castle-surface-5);color:var(--castle-text-primary)}.panel-tab:hover>span,.panel-tab.is-hover>span{-webkit-mask-image:linear-gradient(to right, #000 calc(100% - (var(--castle-button-icon-size) + var(--castle-space-large))), transparent 100%);mask-image:linear-gradient(to right, #000 calc(100% - (var(--castle-button-icon-size) + var(--castle-space-large))), transparent 100%)}.panel-tab.is-narrow:not(.is-active):hover>span,.panel-tab.is-narrow:not(.is-active).is-hover>span{-webkit-mask-image:none;mask-image:none}.panel-tab-close{z-index:1;top:var(--castle-space-small);right:var(--castle-space-small);width:calc(var(--castle-button-icon-size) + var(--castle-space-large));height:var(--castle-button-icon-size);border-radius:var(--castle-radius-small);background:linear-gradient(to right, transparent, var(--castle-surface-3) 45%);color:currentColor;cursor:pointer;opacity:0;pointer-events:none;border:0;justify-content:flex-end;align-items:center;padding:0;display:inline-flex;position:absolute}.panel-tab-close svg,.panel-tab-close iconify-icon{width:var(--castle-button-icon-size);height:var(--castle-button-icon-size);font-size:var(--castle-button-icon-size)}.panel-tab:hover .panel-tab-close,.panel-tab.is-hover .panel-tab-close,.panel-tab:focus-within .panel-tab-close{opacity:1;pointer-events:auto;background:linear-gradient(to right, transparent, var(--castle-surface-5) 45%)}.panel-tab.is-active .panel-tab-close{background:linear-gradient(to right, transparent, var(--castle-surface-5) 45%)}.panel-tab-close:hover,.panel-tab-close.is-hover{background:linear-gradient(to right, transparent, var(--castle-surface-5) 45%);color:var(--castle-text-primary)}.panel-tab.is-narrow:not(.is-active):hover .panel-tab-close,.panel-tab.is-narrow:not(.is-active).is-hover .panel-tab-close{opacity:0;pointer-events:none}.panel-tab.is-drag-origin{opacity:0;pointer-events:none;border:0;width:0;min-width:0;max-width:0;padding:0}.panel-tab-insert{width:2px;height:var(--castle-button-height);border-radius:var(--castle-radius-pill);background:var(--castle-border-4);pointer-events:none;flex:0 0 2px}.panel-tab-ghost{padding:var(--castle-space-base) var(--castle-space-large);border:1px solid var(--castle-border-1);border-radius:var(--castle-radius-small);background:var(--castle-surface-3);color:var(--castle-text-primary);font-size:var(--castle-text-size-base);pointer-events:none;box-shadow:0 8px 24px #00000073}.panel-mobile-current{justify-content:center;align-self:center;align-items:center;gap:var(--castle-space-base);min-width:0;max-width:100%;height:var(--castle-button-height-large);padding:0 var(--castle-space-base);border-radius:var(--castle-radius-small);color:var(--castle-text-primary);font-family:var(--castle-font-body);font-size:var(--castle-text-size-base);cursor:pointer;background:0 0;border:0;display:inline-flex}.panel-mobile-current:hover,.panel-mobile-current.is-hover{background:var(--castle-surface-5)}.panel-mobile-current-text{align-items:baseline;gap:var(--castle-space-small);min-width:0;display:flex}.panel-mobile-current-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.panel-mobile-current strong,.panel-mobile-current-type{font-family:var(--castle-font-display);flex-shrink:0;font-weight:700}.panel-mobile-current svg,.panel-mobile-current iconify-icon{width:var(--castle-button-icon-size-large);height:var(--castle-button-icon-size-large);font-size:var(--castle-button-icon-size-large);flex:none}.segmented{border-radius:var(--castle-radius-small);flex-wrap:wrap;align-items:stretch;display:flex;overflow:hidden}.segmented>.button{border-radius:0}.feedback-banner.is-inset{border-radius:var(--castle-radius-small);border-bottom:none}.feedback-banner.is-inset .button{flex:none;width:auto}.popover{width:max-content;max-width:calc(100vw - 24px);max-height:calc(100vh - 16px);padding:var(--castle-space-large);border:1px solid var(--castle-border-3);border-radius:var(--castle-radius-base);background:var(--castle-surface-4);color:var(--castle-text-primary);font-family:var(--castle-font-body);font-size:var(--castle-text-size-base);flex-direction:column;display:flex;overflow:auto;box-shadow:0 8px 24px #0000008c}.popover .button:not(.button-quiet){background:var(--castle-surface-5)}.popover .button:not(.button-quiet):hover,.popover .button:not(.button-quiet).is-hover{background:var(--castle-surface-6)}.popover .button:not(.button-quiet):active,.popover .button:not(.button-quiet).is-pressed{background:var(--castle-surface-4)}.popover .button[aria-pressed=true],.popover .button[aria-pressed=true]:hover,.popover .button[aria-pressed=true]:active{background:var(--castle-surface-light);color:var(--castle-text-dark)}.popover .feedback-warn .button:not(.button-quiet),.popover .feedback-danger .button:not(.button-quiet){border:1px solid var(--castle-feedback-border);background:var(--castle-feedback-surface);color:var(--castle-text-primary)}.popover .feedback-warn .button:not(.button-quiet):hover,.popover .feedback-warn .button:not(.button-quiet).is-hover,.popover .feedback-danger .button:not(.button-quiet):hover,.popover .feedback-danger .button:not(.button-quiet).is-hover{background:var(--castle-feedback-surface-hover)}.popover .feedback-warn .button:not(.button-quiet):active,.popover .feedback-warn .button:not(.button-quiet).is-pressed,.popover .feedback-danger .button:not(.button-quiet):active,.popover .feedback-danger .button:not(.button-quiet).is-pressed{background:var(--castle-feedback-surface)}:root{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--v2-gutter:#000;--v2-surface:#0d0d0d;--v2-raised:#161616;--v2-hover:#1d1d1d;--v2-fg:#e6e6e6;--v2-head:#e8e8e8;--v2-secondary:#b3b3b3;--v2-muted:#888;--v2-dim:#525252;--v2-placeholder:#666;--v2-ink:#111;--v2-white:#fff;--v2-border:#2a2a2a;--v2-accent:var(--castle-accent);--v2-accent-hover:color-mix(in srgb, var(--castle-accent) 84%, #fff);--v2-error-bg:#5a2b2b;--v2-warn:#e2c08d;--v2-error:#e08c8c;--v2-overlay-scrim:#00000059;--v2-overlay-code:#00000038;--v2-overlay-code-block:#00000047;--v2-overlay-task:#141414eb;--v2-overlay-feed-code:#7878784d;--v2-overlay-white-subtle:#ffffff0f;--v2-overlay-white-hover:#ffffff14;--v2-overlay-white-border:#ffffff24;--v2-overlay-white-quote:#fff6;--v2-overlay-white-dim:#ffffffd9;--v2-shadow-pop:0 10px 24px -10px #000000e6;--v2-selection:#e6e6e62e;--v2-mono:ui-monospace, SFMono-Regular, Menlo, monospace;--panel-gutter:10px;--panel-chrome-radius:8px}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{color:var(--v2-fg);background:var(--v2-surface);font-family:baltomobile,Balto,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;overflow:hidden}.panel-error{height:100%;color:var(--v2-muted);flex-direction:column;align-items:flex-start;gap:8px;padding:14px 16px;font-size:13px;display:flex;overflow:auto}.panel-error-title{color:var(--v2-fg)}.panel-error-msg{white-space:pre-wrap;word-break:break-word;max-width:100%;color:var(--v2-muted);margin:0;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}.panel-error-retry{font:inherit;border:1px solid var(--v2-border);background:var(--v2-raised);color:var(--v2-fg);cursor:pointer;border-radius:4px;padding:3px 10px;font-size:12px}.panel-error-retry:hover{background:var(--v2-hover)}.editor-panel-root{flex-direction:column;width:100%;height:100%;min-height:0;display:flex}.editor-shell{flex:auto;min-height:0;display:flex}.editor-panel-body{flex-direction:column;flex:auto;min-width:0;min-height:0;display:flex}.editor-panel-view{flex:auto;min-width:0;min-height:0;position:relative}.editor-import-banner{background:var(--flow-surface,#181818);border-bottom:1px solid var(--v2-border,#2a2a2a);color:var(--v2-muted,#888);flex:none;align-items:center;gap:8px;padding:8px;font:12px ui-sans-serif,system-ui,sans-serif;display:flex}.editor-import-chip{border:1px solid var(--v2-border,#2a2a2a);background:var(--v2-raised,#161616);color:var(--v2-muted,#888);letter-spacing:.02em;border-radius:999px;flex:none;align-items:center;padding:2px 8px;font-size:12px;line-height:1.4;display:inline-flex}.editor-import-banner-text{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.editor-import-banner-action{border:1px solid var(--v2-border,#2a2a2a);background:var(--v2-raised,#161616);color:var(--v2-text,#ddd);font:inherit;cursor:pointer;border-radius:4px;flex:none;margin-left:auto;padding:2px 10px}.editor-import-banner-action:hover{border-color:var(--v2-muted,#888)}.editor-import-chip.editor-fork-chip{color:var(--v2-text,#ddd)}.editor-fork-modal-scrim{z-index:40;background:#00000080;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.editor-fork-modal{border:1px solid var(--v2-border,#2a2a2a);background:var(--flow-surface,#181818);max-width:420px;color:var(--v2-text,#ddd);border-radius:6px;padding:16px;font:13px ui-sans-serif,system-ui,sans-serif}.editor-fork-modal-title{margin-bottom:8px;font-weight:600}.editor-fork-modal-body{color:var(--v2-muted,#888);line-height:1.5}.editor-fork-modal-actions{justify-content:flex-end;gap:8px;margin-top:16px;display:flex}.editor-fork-modal-actions button{border:1px solid var(--v2-border,#2a2a2a);background:var(--v2-raised,#161616);color:var(--v2-text,#ddd);font:inherit;cursor:pointer;border-radius:4px;padding:4px 12px}.editor-fork-modal-actions button:hover{border-color:var(--v2-muted,#888)}.editor-contextbar{background:var(--v2-gutter,#0d0d0d);border-bottom:1px solid var(--v2-border,#2a2a2a);flex:none;align-items:center;gap:8px;padding:5px 8px;display:flex}.editor-drawer-toggle{width:26px;height:24px;color:var(--v2-muted,#888);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:6px;flex:none;justify-content:center;align-items:center;display:inline-flex}.editor-drawer-toggle:hover{color:var(--v2-fg,#e7e7ef);background:var(--v2-surface,#1b1b2b)}.editor-drawer-toggle.on{color:var(--v2-fg,#e7e7ef);background:var(--v2-surface,#1b1b2b);border-color:var(--v2-border,#3a3a52)}.editor-drawer{background:var(--v2-gutter,#0d0d0d);border-right:1px solid var(--v2-border,#2a2a2a);flex:none;width:190px;padding:6px 4px;overflow-y:auto}.editor-drawer-folder{letter-spacing:.03em;text-transform:uppercase;color:var(--v2-muted,#888);padding:6px 8px 2px;font:10px ui-sans-serif,system-ui,sans-serif}.editor-drawer-item{width:100%;color:var(--v2-secondary,#b3b3b3);cursor:pointer;text-align:left;text-overflow:ellipsis;white-space:nowrap;background:0 0;border:none;border-radius:6px;padding:5px 8px;font:12px ui-sans-serif,system-ui,sans-serif;display:block;overflow:hidden}.editor-drawer-item:hover{background:var(--v2-surface,#1b1b2b);color:var(--v2-fg,#e7e7ef)}.editor-drawer-item.current{color:var(--v2-fg,#e7e7ef);background:#ffffff1a}.editor-drawer-empty{color:var(--v2-muted,#888);padding:10px 8px;font-size:12px}.editor-view-picker{background:var(--v2-surface,#1b1b2b);color:var(--v2-fg,#e7e7ef);border:1px solid var(--v2-border,#3a3a52);cursor:pointer;border-radius:6px;flex:none;padding:3px 6px;font:12px system-ui,sans-serif}.editor-contextbar-path{text-overflow:ellipsis;white-space:nowrap;color:var(--v2-muted,#888);flex:auto;font:11px ui-monospace,SFMono-Regular,Menlo,monospace;overflow:hidden}.editor-contextbar-reload{width:22px;height:22px;color:var(--v2-muted,#888);cursor:pointer;background:0 0;border:none;border-radius:5px;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.editor-contextbar-reload:hover{color:var(--v2-white,#fff);background:var(--v2-overlay-white-hover,#ffffff14)}.editor-contextbar-reload svg{width:13px;height:13px}.deck-panel{background:var(--v2-surface);width:100%;height:100%}.deck-frame{border:0;width:100%;height:100%;display:block}.play-panel{background:var(--castle-surface-2);flex-direction:column;width:100%;height:100%;display:flex}.play-scene-picker{padding:0 var(--castle-space-large) var(--castle-space-large);flex:none;justify-content:center;align-items:center;display:flex}.play-stage{min-height:0;padding:var(--castle-space-large);flex:auto;justify-content:center;align-items:center;display:flex;container-type:size}.play-stage:has(+.play-scene-picker){padding-bottom:var(--castle-space-base)}.play-frame-shell{aspect-ratio:5/7;border-radius:4%/2.85714%;width:min(100cqw,71.4286cqh);height:min(100cqh,140cqw);position:relative;overflow:hidden}.play-frame-shell .deck-frame{width:100%;height:100%}.play-logs{border-top:1px solid var(--castle-border-1);background:var(--castle-surface-2);color:var(--castle-text-secondary);flex:none;position:relative}.play-logs.is-open{--play-logs-height:160px;flex:0 0 var(--play-logs-height);height:var(--play-logs-height);flex-direction:column;min-height:0;display:flex;overflow:hidden}.play-logs-resize{z-index:2;cursor:row-resize;touch-action:none;height:12px;display:none;position:absolute;top:-6px;left:0;right:0}.play-logs.is-open>.play-logs-resize{display:block}body.play-logs-resizing,body.play-logs-resizing *{cursor:row-resize!important;-webkit-user-select:none!important;user-select:none!important}.play-logs-header{min-height:calc(var(--castle-button-height) + 2 * var(--castle-space-base));padding:var(--castle-space-base);align-items:center;column-gap:var(--castle-space-base);cursor:pointer;flex:none;grid-template-columns:minmax(0,1fr) minmax(0,max-content) max-content;display:grid;position:relative}.play-logs-header:hover{background:var(--castle-surface-3)}.play-logs-expand{z-index:0;cursor:pointer;background:0 0;border:0;padding:0;position:absolute;inset:0}.play-logs-expand:focus{outline:none}.play-logs-expand:focus-visible{outline:2px solid var(--castle-border-2);outline-offset:-2px}.play-logs-label{align-items:center;gap:var(--castle-space-base);min-width:0;color:var(--castle-text-dim);pointer-events:none;justify-self:start;display:inline-flex}.play-logs-header:hover .play-logs-label{color:var(--castle-text-primary)}.play-logs-label svg{flex:0 0 var(--castle-button-icon-size);width:var(--castle-button-icon-size);height:var(--castle-button-icon-size);font-size:var(--castle-button-icon-size)}.play-logs-pending{min-width:0;color:var(--castle-text-muted);font-size:var(--castle-text-size-small);text-overflow:ellipsis;white-space:nowrap;pointer-events:none;grid-column:2;margin:0;line-height:1.4;overflow:hidden}.play-logs-restart{z-index:1;grid-column:3;justify-self:end;min-width:max-content;position:relative}.play-logs-restart.is-pending,.play-logs-restart.is-pending:hover,.play-logs-restart.is-pending:active{color:var(--castle-warn-text)}.play-logs-restart-icon{line-height:1;display:inline-flex}.play-logs-restart-icon.is-spinning{animation:.6s linear infinite play-logs-spin}@keyframes play-logs-spin{to{transform:rotate(360deg)}}.play-logs-toolbar{align-items:center;gap:var(--castle-space-base);padding:var(--castle-space-base);border-top:1px solid var(--castle-border-1);flex-wrap:wrap;flex:none;display:flex}.play-logs-body{min-height:0;padding:var(--castle-space-base) var(--castle-space-large);border-top:1px solid var(--castle-border-1);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:var(--castle-text-size-small);flex:auto;line-height:1.5;overflow-y:auto}.play-logs-line{white-space:pre-wrap;word-break:break-word}.play-logs-warn{color:var(--castle-warn-text)}.play-logs-error{color:var(--castle-danger-text)}.play-logs-empty{color:var(--castle-text-dim)}.flow-root.is-mobile .play-panel{--castle-text-size-small:14px;--castle-text-size-base:16px;--castle-text-style-smallcaps-size:var(--castle-text-size-small);--castle-button-height:var(--castle-button-height-large)}.flow-root.is-mobile .play-panel .button:not(.button-icon){padding-left:var(--castle-space-large);padding-right:var(--castle-space-large)}.flow-root.is-mobile .play-logs.is-open{--play-logs-height:200px}.flow-root.is-mobile .play-logs-header:hover{background:0 0}.flow-root.is-mobile .play-logs-header:hover .play-logs-label{color:var(--castle-text-dim)}.flow-root.is-mobile .play-stage{padding:var(--castle-space-small)}.term-panel{width:100%;height:100%;position:relative}.term-host{overscroll-behavior:contain;padding:6px;position:absolute;inset:0}.shell-root{--operator-pad:var(--castle-space-large);--operator-col-fit:min(var(--operator-col,400px), 100%);background:var(--v2-gutter);height:100%;position:relative}#chat-host{width:var(--operator-col-fit);background:var(--v2-gutter);color:var(--v2-fg);z-index:10;flex-direction:column;font-family:Balto,system-ui,-apple-system,sans-serif;display:flex;position:absolute;top:0;bottom:0;left:0;overflow:hidden}.settings-popover{z-index:2147483000;width:390px;position:fixed}.settings-popover .settings-row{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:6px 10px;display:flex}.settings-popover .settings-row+.settings-row{margin-top:8px}.settings-popover .settings-label{white-space:nowrap}.settings-popover .settings-row-stack{flex-direction:column;align-items:stretch;gap:4px;display:flex}.settings-popover .settings-row-main{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:6px 10px;display:flex}.settings-popover .settings-free-chip{border-radius:var(--castle-radius-small);background:var(--castle-surface-1);height:14px;color:var(--castle-text-primary);letter-spacing:.06em;text-transform:uppercase;flex:none;padding:0 4px;font-size:9px;font-weight:500;line-height:14px;overflow:visible}.settings-popover .settings-model-detail .segmented{width:100%}.settings-popover .settings-model-detail .segmented>.button{flex:1 1 0}.settings-popover .settings-model-detail .text-field{min-width:0;max-width:none}.settings-popover .settings-text-warn{border-color:var(--v2-warn)}.settings-popover .settings-warning{color:var(--v2-warn);text-align:right;font-size:11px;line-height:1.35}.settings-popover .settings-warning-suggest{appearance:none;font:inherit;color:var(--v2-warn);cursor:pointer;background:0 0;border:none;margin:0;padding:0;text-decoration:underline}.settings-popover .settings-warning-suggest:hover{color:var(--castle-text-primary)}.settings-popover .settings-group+.settings-group{border-top:1px solid var(--castle-border-1);margin-top:12px;padding-top:12px}.settings-popover .settings-credits{margin-top:var(--castle-space-base);color:var(--castle-text-secondary);font-size:var(--castle-text-size-base)}.settings-popover .settings-usage-subtext{margin-top:var(--castle-space-small);color:var(--castle-text-muted);font-size:var(--castle-text-size-small)}.settings-popover .settings-usage-subtext.feedback-note{color:var(--castle-feedback-text)}.settings-popover .settings-split{justify-content:space-between;align-items:center;gap:var(--castle-space-large);margin-top:var(--castle-space-base);display:flex}.settings-popover .settings-group>.settings-split:first-child{margin-top:0}.settings-popover .settings-split-copy,.settings-popover .settings-split>.settings-credits{flex:auto;min-width:0}.settings-popover .settings-split .settings-credits{margin-top:0}.settings-popover .settings-split .button{flex:none;width:auto;margin-left:auto}.settings-popover .settings-group>.feedback-banner.is-inset{margin-top:var(--castle-space-base)}.settings-popover .text-field{flex:auto}.settings-popover .settings-usage-bar{height:4px;margin-top:var(--castle-space-base);background:var(--castle-surface-5);border-radius:2px;overflow:hidden}.settings-popover .settings-usage-fill{background:var(--castle-accent);height:100%}.settings-popover .settings-usage-fill.blocked{background:var(--castle-danger-text)}.castle-key-heading{margin-bottom:4px;font-weight:600}.castle-key-subtitle{color:#9a9a9a;margin-bottom:14px;font-size:12px;line-height:1.5}.castle-key-tabs{border:1px solid #3a3a3a;border-radius:4px;margin-bottom:12px;display:flex;overflow:hidden}.castle-key-tab{color:#9a9a9a;font:inherit;cursor:pointer;background:#2e2e2e;border:0;flex:1;padding:6px 10px;font-size:12px}.castle-key-tab+.castle-key-tab{border-left:1px solid #3a3a3a}.castle-key-tab:hover{color:#e8e8e8}.castle-key-tab.active{color:#e8e8e8;background:#3a3a3a}.castle-key-input{box-sizing:border-box;color:#e8e8e8;width:100%;font:inherit;background:#1b1b1b;border:1px solid #3a3a3a;border-radius:4px;outline:none;padding:7px 9px;font-size:12px;display:block}.castle-key-input:focus{border-color:#4a4a4a}.castle-key-input::placeholder{color:#6a6a6a}.castle-key-stored{color:#8a8a8a;margin-top:8px;font-size:11px}.castle-key-error{color:#e8705a;margin-top:8px;font-size:11px;line-height:1.4}.castle-key-row{color:#c8c8c8;justify-content:space-between;align-items:center;gap:10px;margin-bottom:12px;display:flex}.castle-key-row button{color:#e8e8e8;font:inherit;cursor:pointer;background:#2e2e2e;border:1px solid #3a3a3a;border-radius:4px;padding:5px 12px;font-size:12px}.castle-key-row button:hover{background:#383838}.castle-key-login{margin-bottom:12px}.castle-key-signin{color:#e8e8e8;width:100%;font:inherit;cursor:pointer;background:#2e2e2e;border:1px solid #3a3a3a;border-radius:4px;padding:9px 12px;font-size:13px;display:block}.castle-key-signin:hover{background:#383838}.castle-key-or{color:#7a7a7a;letter-spacing:.08em;text-transform:uppercase;align-items:center;gap:10px;margin:14px 0;font-size:11px;display:flex}.castle-key-or:before,.castle-key-or:after{content:"";background:#3a3a3a;flex:1;height:1px}.castle-key-field-label{color:#c8c8c8;margin-bottom:6px;font-size:12px}.castle-key-url{color:#7aa2f7;word-break:break-all;-webkit-user-select:all;user-select:all;background:#1b1b1b;border:1px solid #3a3a3a;border-radius:4px;padding:8px 9px;font-size:11px;line-height:1.4;display:block}#chat-messages{overflow-anchor:none;min-height:0;font-size:var(--castle-text-size-base);scrollbar-width:none;-ms-overflow-style:none;flex-direction:column;flex:1 1 0;padding:0;line-height:1.5;display:flex;overflow-y:auto}#chat-messages .chat-thread{gap:var(--castle-space-large);padding-bottom:var(--castle-space-large);opacity:0;flex-direction:column;transition:opacity .12s;display:flex}#chat-messages .chat-thread.ready{opacity:1}.shell-root.docked #chat-messages{padding:0}.shell-root.docked #chat-messages>:first-child{margin-top:auto}#chat-messages::-webkit-scrollbar{width:0;height:0}#chat-empty{color:var(--castle-text-muted)}#chat-host .msg{margin:0}#chat-host .msg.user{text-align:right}#chat-host .msg.user span:not(.msg-image){background:var(--castle-surface-light);color:var(--castle-text-dark);padding:var(--castle-space-base) var(--castle-space-large);border-radius:var(--castle-radius-large);text-align:left;white-space:pre-wrap;word-break:break-word;max-width:85%;display:inline-block}#chat-host .msg-image{border:1px solid var(--castle-border-1);border-radius:var(--castle-radius-base);max-width:220px;max-height:150px;margin:0 0 var(--castle-space-base) auto;display:block}#chat-host .assistant-turn{align-items:flex-start;gap:var(--castle-space-base);flex-direction:column;margin:0;display:flex}#chat-host .assistant-turn .feedback-note{max-width:85%}#chat-host .msg.assistant{background:var(--castle-accent);width:fit-content;color:var(--castle-surface-light);padding:var(--castle-space-base) var(--castle-space-large);border-radius:var(--castle-radius-large);word-break:break-word;max-width:85%;margin:0}#chat-host .msg.assistant.errbubble{background:var(--castle-danger-surface);color:var(--castle-danger-text)}#chat-host .msg.assistant.streaming:after{content:"▌";opacity:.6;animation:1s step-end infinite chat-blink}@keyframes chat-blink{50%{opacity:0}}#chat-host .msg.toolline{color:var(--castle-text-muted);font-size:var(--castle-text-size-base);font-family:var(--castle-font-mono);word-break:break-word}#chat-host .msg-error-detail{font-size:var(--castle-text-size-base);color:var(--castle-text-muted)}#chat-host .msg-error-detail summary{cursor:pointer;-webkit-user-select:none;user-select:none}#chat-host .msg-error-detail pre{margin:var(--castle-space-small) 0 0;padding:var(--castle-space-base);background:var(--castle-surface-1);border-radius:var(--castle-radius-small);font-size:var(--castle-text-size-small);white-space:pre-wrap;word-break:break-word;max-height:160px;overflow-y:auto}#chat-host .operator-line,#chat-host .msg-thinking{color:var(--castle-text-muted);font-size:var(--castle-text-size-base)}#chat-host .operator-line{align-items:center;gap:var(--castle-space-base);display:flex}#chat-host .operator-line .icon-inline{flex:0 0 var(--castle-icon-size-inline)}#chat-host .operator-line .icon-inline:not(:first-child){color:var(--castle-text-dim)}#chat-host .operator-line-link{color:inherit;font:inherit;text-underline-offset:2px;cursor:pointer;background:0 0;border:0;padding:0;text-decoration:underline}#chat-host .operator-line-link:hover{color:var(--castle-text-primary)}#chat-host .msg-thinking summary{cursor:pointer;-webkit-user-select:none;user-select:none;list-style:none}#chat-host .msg-thinking summary::-webkit-details-marker{display:none}#chat-host .msg-thinking .thinking-caret{transform-origin:50%;transition:transform .12s}#chat-host .msg-thinking[open] .thinking-caret{transform:rotate(90deg)}#chat-host .msg-thinking.is-active .thinking-label{background-image:linear-gradient(90deg, var(--castle-text-muted) 20%, var(--castle-text-primary) 50%, var(--castle-text-muted) 80%);color:#0000;-webkit-text-fill-color:transparent;background-size:200% 100%;-webkit-background-clip:text;background-clip:text;animation:1.6s linear infinite thinking-shimmer;display:inline-block}@keyframes thinking-shimmer{0%{background-position:100% 0}to{background-position:-100% 0}}@media (prefers-reduced-motion:reduce){#chat-host .msg-thinking.is-active .thinking-label{color:var(--castle-text-muted);-webkit-text-fill-color:currentColor;background:0 0;animation:none}}#chat-host .msg-thinking-body{max-height:160px;padding:0 var(--castle-space-large) 0 calc(var(--castle-icon-size-inline) + var(--castle-space-base));border-radius:var(--castle-radius-small);background:var(--castle-surface-1);color:var(--castle-text-muted);font-size:var(--castle-text-size-base);overflow-y:auto}#chat-host .msg.md>:first-child,#chat-host .task-notes>:first-child{margin-top:0}#chat-host .msg.md>:last-child,#chat-host .task-notes>:last-child{margin-bottom:0}#chat-host .msg.md p:empty{display:none}#chat-host .msg.md p,#chat-host .task-notes p{margin:.4em 0}#chat-host .msg.md ul,#chat-host .msg.md ol,#chat-host .task-notes ul,#chat-host .task-notes ol{margin:.4em 0;padding-left:1.3em}#chat-host .task-notes li,#chat-host .msg.md li{margin:.1em 0}#chat-host .msg.md h1,#chat-host .msg.md h2,#chat-host .msg.md h3{margin:.5em 0 .3em;font-weight:700;line-height:1.25}#chat-host .msg.md h1{font-size:1.2em}#chat-host .msg.md h2{font-size:1.12em}#chat-host .msg.md h3{font-size:1.05em}#chat-host .msg.md a:not(.msg-link),#chat-host .msg-thinking-body a:not(.msg-link),#chat-host .task-notes a:not(.msg-link),#chat-host .task-feed-msg a:not(.msg-link){color:var(--castle-surface-light);text-underline-offset:2px;text-decoration:underline}#chat-host .msg-link{border-radius:var(--castle-radius-small);color:inherit;font-family:var(--castle-font-mono);-webkit-text-decoration-color:color-mix(in srgb, currentColor 40%, transparent);text-decoration-color:color-mix(in srgb, currentColor 40%, transparent);text-underline-offset:2px;margin:0 -.35em;padding:.1em .35em}#chat-host .msg-link:hover{background:var(--castle-surface-4);color:var(--castle-text-primary);text-decoration-color:currentColor}#chat-host .msg.assistant .msg-link:hover{background:color-mix(in srgb, var(--castle-accent) 84%, #fff)}#chat-host .msg.md code{font-family:var(--castle-font-mono);font-size:var(--castle-text-size-small);background:color-mix(in srgb, var(--castle-accent) 78%, #000);border-radius:var(--castle-radius-small);padding:.1em .35em}#chat-host .msg.md pre{margin:var(--castle-space-base) 0;padding:var(--castle-space-base) var(--castle-space-large);background:color-mix(in srgb, var(--castle-accent) 72%, #000);border-radius:var(--castle-radius-small);white-space:pre-wrap;word-break:break-word;font-family:var(--castle-font-mono);font-size:var(--castle-text-size-small);line-height:1.4;overflow-x:auto}#chat-host .msg.md pre code{background:0 0;border-radius:0;padding:0}#chat-host .msg.md blockquote{margin:var(--castle-space-base) 0;padding-left:var(--castle-space-large);border-left:3px solid color-mix(in srgb, var(--castle-accent) 60%, #fff)}.shell-root.docked #chat-host .operator-inset{min-height:0;padding:0 var(--operator-pad);flex-direction:column;flex:1 1 0;display:flex;overflow:hidden}.shell-root.docked #chat-host .chat-divider{margin:0 calc(-1 * var(--operator-pad));background:var(--castle-border-1);flex:0 0 1px}.task-stack{gap:var(--castle-space-small);flex-direction:column;display:flex}#task-board{min-height:0;margin-inline:calc(-1 * var(--castle-space-base));padding-inline:var(--castle-space-base);padding-top:0;padding-bottom:var(--castle-space-base);scrollbar-width:thin;scrollbar-color:transparent transparent;flex-direction:column;flex:0 auto;max-height:40vh;display:flex;overflow:hidden auto}#task-board.scrolling{scrollbar-color:var(--castle-text-dim) transparent}#task-board::-webkit-scrollbar{width:6px}#task-board::-webkit-scrollbar-track{background:0 0}#task-board::-webkit-scrollbar-thumb{background:0 0;border-radius:3px;transition:background .25s}#task-board.scrolling::-webkit-scrollbar-thumb{background:var(--castle-text-dim)}#chat-host .task{margin:0 calc(-1 * var(--castle-space-base));border-radius:var(--castle-radius-small);cursor:pointer;transition:background .12s,box-shadow .12s}#chat-host .task.open{background:var(--castle-surface-2);box-shadow:inset 0 0 0 1px var(--castle-border-1)}#chat-host .task:hover{background:var(--castle-surface-3)}#chat-host .task-row{align-items:center;gap:var(--castle-space-large);padding:var(--castle-space-small) var(--castle-space-base);display:flex;position:relative}#chat-host .pie{background:conic-gradient(var(--castle-surface-light) calc(var(--pct,0) * 3.6deg), var(--castle-surface-5) 0deg);border-radius:50%;flex:0 0 32px;width:32px;height:32px;padding:2px;display:flex;position:relative}#chat-host .pie .avatar{background:var(--castle-surface-3);width:100%;height:100%;color:var(--castle-text-dark);border-radius:50%;justify-content:center;align-items:center;display:flex;overflow:hidden}#chat-host .pie .avatar .avatar-icon-wrap{justify-content:center;align-items:center;width:16px;height:16px;font-size:16px;display:flex}#chat-host .pie .avatar .avatar-icon-wrap svg{width:16px;height:16px;display:block}#chat-host .task-meta{flex:1;min-width:0}#chat-host .task-name{color:var(--castle-text-muted);font-size:var(--castle-text-size-base);text-overflow:ellipsis;white-space:nowrap;overflow:hidden}#chat-host .task-name .tn{color:var(--castle-text-primary);font-weight:600}#chat-host .task-sub{color:var(--castle-text-muted);font-size:var(--castle-text-size-small);text-overflow:ellipsis;white-space:nowrap;font-variant-numeric:tabular-nums;overflow:hidden}#chat-host .task-actions{align-items:center;gap:var(--castle-space-small);visibility:hidden;flex:none;margin-left:auto;display:flex}#chat-host .task:hover .task-actions,#chat-host .task.open .task-actions{visibility:visible}#chat-host .task-board-header{z-index:1;justify-content:space-between;align-items:center;gap:var(--castle-space-base);margin-inline:calc(-1 * var(--castle-space-base));padding:var(--castle-space-large) var(--castle-space-base) var(--castle-space-base);background:var(--castle-surface-1);display:flex;position:sticky;top:0}#chat-host .task-body{padding:0 var(--castle-space-base) var(--castle-space-base) calc(var(--castle-space-base) + 32px + var(--castle-space-large));font-size:var(--castle-text-size-base);color:var(--castle-text-secondary);display:none}#chat-host .task.open .task-body{display:block}#chat-host .task-notes{margin-top:var(--castle-space-small);font-size:var(--castle-text-size-base);color:var(--castle-text-secondary);word-break:break-word}#chat-host .task-body>.feedback-note{margin-top:var(--castle-space-small)}#chat-host .task-notes code{border-radius:var(--castle-radius-small);font-family:var(--castle-font-mono);padding:1px 4px;font-size:12px}#chat-host .task-playtest-frames{margin-top:var(--castle-space-base)}#chat-host .task-playtest-frames-label{font-size:var(--castle-text-size-small);color:var(--castle-text-muted);margin-bottom:var(--castle-space-small)}#chat-host .task-playtest-frames-row{gap:var(--castle-space-base);flex-wrap:wrap;display:flex}#chat-host .task-playtest-frame{object-fit:cover;border:1px solid var(--castle-border-1);background:var(--castle-text-dark);border-radius:4px;width:64px;height:90px;display:block}#chat-host .task-feed{margin-top:var(--castle-space-base);scrollbar-width:none;-ms-overflow-style:none;max-height:96px;font-size:var(--castle-text-size-base);color:var(--castle-text-secondary);cursor:default;word-break:break-word;line-height:1.5;overflow:hidden auto;-webkit-mask-image:linear-gradient(#0000,#000 8px 100%);mask-image:linear-gradient(#0000,#000 8px 100%)}#chat-host .task-feed::-webkit-scrollbar{width:0;height:0}#chat-host .task-feed-tool{padding-left:var(--castle-space-large);color:var(--castle-text-muted);font-family:var(--castle-font-mono);white-space:pre-wrap;font-size:12px}#chat-host .task-feed-msg{margin:0}#chat-host .task-feed-msg>:first-child{margin-top:0}#chat-host .task-feed-msg>:last-child{margin-bottom:0}#chat-host .task-feed-msg p{margin:0}#chat-host .task-feed-msg code{font-family:var(--castle-font-mono);font-size:var(--castle-text-size-base)}#chat-host .task-page{min-height:0;margin-inline:calc(-1 * var(--operator-pad));flex-direction:column;flex:1 1 0;display:flex}#chat-host .task-page-header{padding:var(--castle-space-large) var(--operator-pad);border-bottom:1px solid var(--castle-border-1);flex:none}#chat-host .task-page-header .task-row{padding:0}#chat-host .task-page-header .tn{color:var(--castle-text-primary)}#chat-host .task-page-body{min-height:0;padding:var(--castle-space-large) var(--operator-pad);flex:1 1 0;overflow:auto}#chat-host .task-page-body .task-feed{max-height:none;margin-top:0;overflow:visible;-webkit-mask-image:none;mask-image:none}#chat-host .task-page-body:not(.task-board-page) .task-notes{margin-top:var(--castle-space-large);padding-top:var(--castle-space-large);border-top:1px solid var(--castle-border-1)}#chat-host .task-page-body:not(.task-board-page) .task-notes:first-child{border-top:0;margin-top:0;padding-top:0}#chat-host .task-report-label{margin:0 0 var(--castle-space-small);color:var(--castle-text-primary);font-weight:700}#chat-host .task-page-empty{color:var(--castle-text-muted);margin:0}#chat-host .task-board-page{min-height:0;margin-inline:calc(-1 * var(--operator-pad));padding:var(--castle-space-large) var(--operator-pad);flex-direction:column;flex:1 1 0;display:flex;overflow:auto}#chat-host .task-archive{margin-top:var(--castle-space-base);padding-top:var(--castle-space-large);border-top:1px solid var(--castle-border-1)}#chat-host .task-archive:first-child{border-top:0;margin-top:0;padding-top:0}#chat-host .task-archive-heading{margin:0 0 var(--castle-space-large);color:var(--castle-text-muted)}#chat-host .operator-composer{flex-direction:column;flex:0 auto;min-height:0;max-height:50%;display:flex;overflow:auto}.chat-input{padding:0 var(--operator-pad) var(--operator-pad);flex:none;position:relative}#chat-host .chat-input .ta{width:100%;min-height:60px;padding:var(--castle-space-base) var(--castle-space-small);border:1px solid var(--castle-border-1);border-radius:var(--castle-radius-base);background:var(--castle-surface-2);cursor:text;flex-direction:column;display:flex;overflow:hidden}#chat-input{width:100%;min-height:21px;max-height:120px;padding:0 var(--castle-space-base);color:var(--castle-text-primary);font:inherit;font-size:var(--castle-text-size-base);resize:none;scrollbar-width:none;-ms-overflow-style:none;background:0 0;border:none;outline:none;line-height:1.5;display:block;overflow-y:auto}#chat-input::-webkit-scrollbar{width:0;height:0}#chat-input::placeholder{color:var(--castle-text-muted)}#chat-host .chat-input .ta-bottom{justify-content:space-between;align-items:center;gap:var(--castle-space-base);min-width:0;display:flex}#chat-host .composer-settings{flex:auto;min-width:0}#chat-host .composer-settings .button{min-width:0;max-width:100%;font-size:var(--castle-text-size-small);justify-content:flex-start}#chat-host .composer-settings .operator-usage-warn,#chat-host .composer-settings .operator-usage-warn:hover,#chat-host .composer-settings .operator-usage-warn[aria-pressed=true]{color:var(--castle-warn-text)}#chat-host .composer-settings .operator-usage-blocked,#chat-host .composer-settings .operator-usage-blocked:hover,#chat-host .composer-settings .operator-usage-blocked[aria-pressed=true]{color:var(--castle-danger-text)}#chat-host .queue-row .button,#chat-host .ta-bottom .button-icon{flex-shrink:0}#chat-host .composer-action{margin-right:var(--castle-space-small)}#chat-pending{gap:var(--castle-space-base);padding:0 var(--operator-pad) var(--castle-space-base);flex:none;display:flex}#chat-pending .operator-thumb{object-fit:cover;border:1px solid var(--castle-border-1);border-radius:var(--castle-radius-small);cursor:pointer;width:64px;height:44px;margin:0;display:block}#chat-host .chat-input .chat-queue{gap:var(--castle-space-small);margin-bottom:var(--castle-space-base);flex-direction:column;display:flex}#chat-host .chat-input .queue-row{align-items:center;gap:var(--castle-space-base);padding:var(--castle-space-base) var(--castle-space-base) var(--castle-space-base) var(--castle-space-large);border:1px dashed var(--castle-border-1);border-radius:var(--castle-radius-base);background:var(--castle-surface-1);color:var(--castle-text-muted);font-size:var(--castle-text-size-base);display:flex}#chat-host .chat-input .queue-snippet{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}#chat-host .picker{gap:var(--castle-space-large);width:100%;padding:var(--castle-space-large);border:1px solid var(--castle-border-1);border-radius:var(--castle-radius-base);background:var(--castle-surface-3);flex-direction:column;align-self:stretch;margin:0;display:flex}#chat-host .picker-q{border:none;min-width:0;margin:0;padding:0}#chat-host .picker-q-label{margin:0 0 var(--castle-space-base);color:var(--castle-text-primary);font-size:var(--castle-text-size-base);font-weight:inherit;padding:0}#chat-host .picker-options{gap:var(--castle-space-small);flex-direction:column;display:flex}#chat-host .picker-option{align-items:center;gap:var(--castle-space-base);padding:var(--castle-space-small) var(--castle-space-base);border-radius:var(--castle-radius-small);color:var(--castle-text-secondary);cursor:pointer;display:flex}#chat-host .picker-option input{appearance:none;border:1px solid var(--castle-border-2);border-radius:var(--castle-radius-small);background:var(--castle-surface-3);width:12px;height:12px;cursor:inherit;flex:none;place-content:center;margin:0;display:grid}#chat-host .picker-option input[type=radio]{border-radius:var(--castle-radius-pill)}#chat-host .picker-option input:checked{border-color:var(--castle-surface-light);background:var(--castle-surface-light)}#chat-host .picker-option input:before{content:"";display:block}#chat-host .picker-option input[type=radio]:checked:before{border-radius:var(--castle-radius-pill);background:var(--castle-text-dark);width:4px;height:4px}#chat-host .picker-option input[type=checkbox]:checked:before{border-left:1.5px solid var(--castle-text-dark);border-bottom:1.5px solid var(--castle-text-dark);width:6px;height:3px;margin-top:-2px;transform:rotate(-45deg)}#chat-host .picker:not(.picker-locked) .picker-option:hover,#chat-host .picker-option.is-checked{background:var(--castle-surface-5);color:var(--castle-text-primary)}#chat-host .picker-option:has(input:checked){background:var(--castle-surface-5);color:var(--castle-text-primary)}#chat-host .picker-locked{opacity:.72}#chat-host .picker-locked .picker-option{cursor:default}#chat-host .picker-actions{justify-content:flex-end;display:flex}#chat-host .chips{justify-content:flex-end;align-self:flex-end;gap:var(--castle-space-base);max-width:85%;margin:var(--castle-space-small) 0 var(--castle-space-small);flex-wrap:wrap;display:flex}#chat-host .chip{padding:var(--castle-space-base) var(--castle-space-large);border:1px dotted var(--castle-surface-light);border-radius:var(--castle-radius-pill);color:var(--castle-surface-light);font:inherit;font-size:var(--castle-text-size-base);text-align:left;cursor:pointer;background:0 0;line-height:1.3}#chat-host .chips-inert .chip{border-color:var(--castle-text-dim);color:var(--castle-text-muted);cursor:default}#chat-host .chip.is-picked,#chat-host .chips-inert .chip.is-picked{border-style:solid;border-color:var(--castle-surface-light);background:var(--castle-surface-light);color:var(--castle-text-dark)}#chat-host .msg-file{color:inherit;font:inherit;text-underline-offset:2px;text-decoration:underline;-webkit-text-decoration-color:color-mix(in srgb, currentColor 40%, transparent);text-decoration-color:color-mix(in srgb, currentColor 40%, transparent);cursor:pointer;word-break:break-all;background:0 0;border:0;margin:0;padding:0;display:inline}#chat-host .msg-file:hover{text-decoration-color:currentColor}#chat-host .picker-skeleton{pointer-events:none}#chat-host .picker-skeleton-hint{color:var(--castle-text-muted);font-size:var(--castle-text-size-base)}#chat-host .picker-skeleton-line,#chat-host .picker-skeleton-chip{border-radius:var(--castle-radius-small);background:var(--castle-border-1);display:block}#chat-host .picker-skeleton-label{width:60%;height:11px;margin-bottom:var(--castle-space-base)}#chat-host .picker-skeleton-chip{height:24px}.xterm,.xterm-viewport,.xterm-screen,.xterm-helpers{background-color:#0000!important}.xterm{overscroll-behavior:contain}.xterm-viewport{overscroll-behavior:contain;scrollbar-width:none;-ms-overflow-style:none}.xterm-viewport::-webkit-scrollbar{width:0;height:0}.xterm .xterm-scrollable-element>.scrollbar,.xterm .xterm-scrollable-element>.scrollbar.visible,.xterm .xterm-scrollable-element>.visible.scrollbar,.xterm .xterm-scrollable-element>.invisible.scrollbar,.xterm .xterm-scrollable-element>.xterm-scrollbar{opacity:0!important;pointer-events:none!important;width:0!important;min-width:0!important;height:0!important;min-height:0!important;display:none!important}.xterm .xterm-scrollable-element>.scrollbar>.slider,.xterm .xterm-scrollable-element>.scrollbar>.scra,.xterm .xterm-scrollable-element>.xterm-scrollbar>.xterm-slider{width:0!important;height:0!important;display:none!important}.xterm .xterm-scrollable-element>.shadow{display:none!important}.quick-open-backdrop{z-index:2147483100;justify-content:center;align-items:flex-start;padding-top:12vh;display:flex;position:fixed;inset:0}.quick-open{background:#232323;border:1px solid #3a3a3a;border-radius:8px;flex-direction:column;width:min(600px,90vw);max-height:60vh;display:flex;overflow:hidden;box-shadow:0 16px 48px #0009}.quick-open-input{color:#f0f0f0;background:#161616;border:1px solid #4a4a4a;border-radius:5px;outline:none;flex:none;margin:8px;padding:8px 10px;font-size:14px}.quick-open-input:focus{border-color:#5a8bd6}.quick-open-list{flex:auto;padding:4px;overflow-y:auto}.quick-open-item{color:#e6e6e6;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:4px;align-items:baseline;gap:8px;width:100%;padding:5px 8px;font-size:13px;display:flex}.quick-open-item.active{background:#37506f}.quick-open-name{white-space:nowrap;flex:none}.quick-open-dir{text-overflow:ellipsis;white-space:nowrap;color:#8a8a8a;flex:auto;min-width:0;font-size:12px;overflow:hidden}.quick-open-empty{color:#8a8a8a;text-align:center;padding:12px;font-size:13px}.quick-open-keys{color:#b0b0b0;white-space:nowrap;border:1px solid #4a4a4a;border-radius:4px;flex:none;margin-left:8px;padding:1px 6px;font-family:SFMono-Regular,Consolas,monospace;font-size:11px}.mention-picker{z-index:2147483100;background:#232323;border:1px solid #3a3a3a;border-radius:8px;width:min(360px,90vw);max-height:40vh;padding:4px;position:fixed;overflow-y:auto;box-shadow:0 16px 48px #0009}.mention-item{color:#e6e6e6;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:4px;align-items:baseline;gap:8px;width:100%;padding:5px 8px;font-size:13px;display:flex}.mention-item.active{background:#37506f}.mention-name{white-space:nowrap;flex:none}.mention-dir{text-overflow:ellipsis;white-space:nowrap;color:#8a8a8a;flex:auto;min-width:0;font-size:12px;overflow:hidden}.chord-hint{z-index:2147483200;color:#c7c7c7;background:#232323;border:1px solid #3a3a3a;border-radius:8px;align-items:center;gap:8px;padding:6px 12px;font-size:12px;display:flex;position:fixed;bottom:24px;left:50%;transform:translate(-50%);box-shadow:0 8px 24px #0000008c}.chord-hint kbd{color:#f0f0f0;background:#333;border:1px solid #4a4a4a;border-radius:4px;padding:2px 7px;font-family:SFMono-Regular,Consolas,monospace;font-size:12px}@media (pointer:coarse){input,textarea,select,[contenteditable]:not(.cm-content){font-size:16px!important}}.cm-url,.cm-md-link{color:var(--v2-link,#82aaff);text-underline-offset:2px;cursor:pointer;text-decoration:underline;text-decoration-thickness:1px}.cm-url:hover,.cm-md-link:hover{color:var(--v2-white,#fff)}._fieldRow_7dc6k_4{grid-template-columns:minmax(82px,.5fr) minmax(0,1fr);align-items:center;gap:12px;min-height:28px;margin-bottom:0;padding-bottom:12px;display:grid}._fieldRow_7dc6k_4:last-child{margin-bottom:0}._fieldLabel_7dc6k_21{color:var(--castle-inspector-text);overflow-wrap:anywhere;min-width:0;font-size:14px}._fieldLabelOverridden_7dc6k_30{color:var(--castle-override)}._fieldRowOverridden_7dc6k_34{--field-border:var(--castle-override-border)}._fieldOverride_7dc6k_41{padding-bottom:12px}._fieldOverride_7dc6k_41 ._fieldRow_7dc6k_4{padding-bottom:4px}._fieldNote_7dc6k_52{grid-template-columns:minmax(82px,.5fr) minmax(0,1fr);gap:12px;margin-top:-6px;padding-bottom:12px;display:grid}._fieldNoteInner_7dc6k_60{min-width:0;color:var(--castle-inspector-muted);grid-column:2;font-size:12px;line-height:1.35}._fieldDefault_7dc6k_68{grid-template-columns:minmax(82px,.5fr) minmax(0,1fr);gap:12px;display:grid}._fieldDefaultInner_7dc6k_74{min-width:0;color:var(--castle-inspector-muted);grid-column:2;align-items:center;gap:8px;font-size:12px;display:flex}._fieldDefaultInner_7dc6k_74>span{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}._fieldResetBtn_7dc6k_91{color:var(--castle-override);cursor:pointer;background:0 0;border:0;margin-left:auto;padding:0;font-size:12px}._fieldResetBtn_7dc6k_91:hover{color:var(--castle-inspector-text)}._input_7dc6k_34{border:1px solid var(--field-border,var(--castle-inspector-border));border-radius:var(--castle-radius);background:var(--castle-inspector-input-bg);width:100%;color:var(--castle-inspector-text);font:inherit;outline:0;padding:5px 8px}._select_7dc6k_35{appearance:none;text-overflow:ellipsis;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath d='M2.5 4.5L6 8l3.5-3.5' fill='none' stroke='%23888888' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");background-position:right 8px center;background-repeat:no-repeat;padding-right:26px}._numberField_7dc6k_128{width:100%;position:relative}._numberInput_7dc6k_133{appearance:textfield}._numberInput_7dc6k_133::-webkit-inner-spin-button{appearance:none;margin:0}._numberInput_7dc6k_133::-webkit-outer-spin-button{appearance:none;margin:0}._numberScrub_7dc6k_149{cursor:ew-resize;-webkit-user-select:none;user-select:none;align-items:center;gap:6px;padding:5px 8px;display:flex;position:relative;overflow:hidden}._numberSlider_7dc6k_161{cursor:pointer}._numberValue_7dc6k_165{z-index:1;text-align:right;font-variant-numeric:tabular-nums;flex:auto;min-width:0;position:relative}._unitSuffix_7dc6k_174{color:var(--castle-inspector-muted)}._scrubGrip_7dc6k_178{z-index:1;color:var(--castle-inspector-muted);letter-spacing:-2px;opacity:.4;flex:none;font-size:12px;line-height:1;position:relative}._scrubBubble_7dc6k_191{z-index:1001;border:1px solid var(--castle-inspector-border);color:var(--castle-inspector-text);font-variant-numeric:tabular-nums;pointer-events:none;background:#14181ef5;border-radius:8px;padding:3px 10px;font-size:15px;position:fixed;transform:translate(-50%,-100%);box-shadow:0 2px 10px #00000073}._sliderFill_7dc6k_206{pointer-events:none;z-index:0;background:#5a8cd24d;position:absolute;top:0;bottom:0;left:0}._sliderThumb_7dc6k_216{pointer-events:none;z-index:1;background:#96bef0f2;border-radius:2px;width:3px;height:60%;position:absolute;top:50%;transform:translate(-50%,-50%)}._numpadBackdrop_7dc6k_229{z-index:1000;background:#00000059;flex-direction:column;justify-content:flex-end;display:flex;position:fixed;inset:0}._numpadSheet_7dc6k_239{background:var(--castle-inspector-bg,#16181d);border-top:1px solid var(--castle-inspector-border);padding:10px 10px calc(10px + env(safe-area-inset-bottom,0px));border-radius:14px 14px 0 0;box-shadow:0 -8px 24px #0006}._numpadValueRow_7dc6k_247{justify-content:space-between;align-items:baseline;gap:12px;padding:6px 8px 12px;display:flex}._numpadValueLabel_7dc6k_258{color:var(--castle-inspector-text);text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:22px;overflow:hidden}._numpadValueNum_7dc6k_267{color:var(--castle-inspector-text);font-variant-numeric:tabular-nums;flex:none;font-size:22px}._numpadGrid_7dc6k_274{grid-template-columns:repeat(4,1fr);gap:8px;display:grid}._numpadKey_7dc6k_280{border:1px solid var(--castle-inspector-border);background:var(--castle-inspector-input-bg);height:52px;color:var(--castle-inspector-text);cursor:pointer;touch-action:manipulation;border-radius:10px;font-size:20px}._numpadKey_7dc6k_280:active{background:var(--castle-inspector-divider)}._numpadKeyZero_7dc6k_295{grid-column:span 3}._numpadKeyDone_7dc6k_299{color:#fff;background:#5a8cd2e6;border-color:#0000;font-size:16px}._colorInput_7dc6k_306{border:1px solid var(--field-border,var(--castle-inspector-border));border-radius:var(--castle-radius);background:var(--castle-inspector-input-bg);cursor:pointer;outline:0;width:100%;height:28px;padding:2px}._checkbox_7dc6k_317{border:1px solid var(--field-border,var(--castle-inspector-border));border-radius:var(--castle-radius);background:var(--castle-inspector-input-bg);cursor:pointer;width:20px;height:20px;box-shadow:none;color:var(--castle-text);flex:none;justify-content:center;justify-self:end;align-items:center;padding:0;display:flex}._checkboxOn_7dc6k_334{background:var(--castle-black)}._checkboxMark_7dc6k_338{width:12px;height:12px;display:none}._checkboxOn_7dc6k_334 ._checkboxMark_7dc6k_338{display:block}._fileField_7dc6k_350{font:inherit;box-shadow:none;cursor:pointer;align-items:center;display:flex}._fileFieldLabel_7dc6k_358{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}._fileFieldEmpty_7dc6k_365{color:var(--castle-inspector-muted)}._filePicker_7dc6k_369{z-index:200;box-sizing:border-box;border:1px solid var(--castle-inspector-border);border-radius:var(--castle-radius);background:var(--castle-workspace-bg);max-height:min(240px,100vh - 16px);padding:4px;position:fixed;overflow:auto;box-shadow:0 8px 24px #00000047}._filePickerOption_7dc6k_382{text-align:left;width:100%;color:var(--castle-inspector-text);font:inherit;cursor:pointer;background:0 0;border:0;border-radius:3px;padding:6px 8px;font-size:13px;display:block;overflow:hidden}._filePickerPath_7dc6k_397{white-space:nowrap;display:block;overflow:hidden}._filePickerOption_7dc6k_382:hover,._filePickerOptionSelected_7dc6k_404{background:var(--castle-inspector-input-bg)}.castle-file-panel,.castle-code-panel,.castle-params-panel,.castle-params-overlay,.flow-class-files{--castle-font-mono:"SFMono-Regular", Consolas, "Liberation Mono", monospace;--castle-black:var(--v2-ink);--castle-panel-raised:var(--v2-raised);--castle-border:#444;--castle-text:var(--v2-white);--castle-text-dim:var(--v2-muted);--castle-inspector-bg:var(--v2-surface);--castle-inspector-text:var(--v2-fg);--castle-inspector-muted:var(--v2-muted);--castle-inspector-border:var(--v2-border);--castle-inspector-divider:var(--v2-border);--castle-inspector-input-bg:var(--v2-raised);--castle-workspace-bg:var(--v2-surface);--castle-sheet-bg:var(--v2-surface);--castle-radius:4px}.castle-file-panel{background:var(--castle-sheet-bg);flex-direction:column;height:100%;display:flex;overflow:hidden;transform:translateZ(0)}.castle-file-panel>.fileBrowserBare{flex:1 1 0;height:auto;min-height:0}.castle-file-toolbar{border-bottom:1px solid var(--castle-inspector-border);flex-wrap:wrap;flex:none;align-items:center;gap:6px;padding:6px 8px;display:flex}.castle-file-toolbar .button-icon{margin-left:auto}.castle-file-toolbar .button-icon+.button-icon{margin-left:0}.castle-file-toolbar.versions-toolbar{padding-left:var(--castle-space-large);justify-content:space-between}.versions-toolbar-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--castle-text-muted);line-height:1;overflow:hidden}.castle-versions{flex-direction:column;flex:1 1 0;min-height:0;display:flex}.versions-error{align-items:flex-start}.versions-error>span:not(.icon-cell){white-space:pre-line}.versions-save{align-items:center;gap:var(--castle-space-base);flex-wrap:wrap;padding:0;display:flex}.versions-save .text-field{flex:130px;width:auto;min-width:0}.versions-save .button{white-space:nowrap;flex:none}.versions-note{padding:var(--castle-space-large) var(--castle-space-large) 0;color:var(--castle-text-muted);font-size:var(--castle-text-size-base)}.versions-empty{padding:var(--castle-space-large);color:var(--castle-text-muted);font-size:var(--castle-text-size-base)}.castle-versions-list{flex:1 1 0;min-height:0;overflow-y:auto}.version{align-items:start;column-gap:var(--castle-space-base);padding:var(--castle-space-base) var(--castle-space-base) var(--castle-space-large);border-bottom:1px solid var(--castle-border-1);grid-template-columns:minmax(0,1fr) auto;display:grid}.version-toggle{grid-template-columns:var(--castle-button-height) minmax(0, 1fr);align-items:start;column-gap:var(--castle-space-base);min-width:0;color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;grid-area:1/1/auto/-1;margin:0;padding:0;display:grid}.version.is-expanded:not(.version-new) .version-toggle{grid-column:1}.version-toggle:focus-visible{outline:1px solid var(--castle-border-2);outline-offset:2px}.version.later,.version.later .icon-cell,.version.later .version-message,.version.later .version-nomessage,.version.later .version-meta,.version.later .version-summary{color:var(--castle-text-dim)}.version:hover{background:var(--castle-surface-3)}.version-main{gap:var(--castle-space-small);flex-direction:column;min-width:0;display:flex}.version-heading{align-items:center;gap:var(--castle-space-base);min-width:0;min-height:var(--castle-button-height);display:flex}.version-message{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--castle-text-primary);font-size:var(--castle-text-size-base);flex:auto;overflow:hidden}.version-nomessage{color:var(--castle-text-muted);font-style:italic}.version-meta{color:var(--castle-text-muted);font-size:var(--castle-text-size-small);margin:0;display:block}.version-actions{min-height:var(--castle-button-height);flex:none;grid-area:1/2;align-items:center;display:none}.version.is-expanded .version-actions{display:flex}.version-detail{padding-left:calc(var(--castle-button-height) + var(--castle-space-base));grid-column:1/-1;display:none}.version-new{flex:none}.version.is-expanded .version-detail{gap:var(--castle-space-small);flex-direction:column;display:flex}.version-summary{color:var(--castle-text-secondary);font-size:var(--castle-text-size-base);overflow-wrap:anywhere;margin:0}.files-feedback-banner{flex:none}.fileEditInput{border:1px solid var(--castle-border);background:var(--castle-inspector-input-bg);min-width:0;color:var(--castle-inspector-text);font:inherit;border-radius:3px;flex:auto;padding:1px 4px;font-size:13px}.fileEditInput:focus{border-color:#5a8bd6;outline:none}.castle-file-menu{z-index:1000;min-width:168px;position:fixed}.castle-file-menu .menu-keys{font-family:SFMono-Regular,Consolas,monospace}.castle-file-picker{gap:var(--castle-space-small);flex-direction:column;min-width:180px;display:flex}.castle-file-picker .text-field{width:100%}.castle-file-picker-label{color:var(--castle-text-muted);margin:0}.castle-file-picker-list{gap:var(--castle-space-small);flex-direction:column;max-height:min(40vh,180px);display:flex;overflow-y:auto}.castle-file-picker-list[hidden]{display:none}.fileBrowserBare{flex-direction:column;min-width:0;height:100%;display:flex}.fileTree{min-height:0;padding:var(--castle-space-base);flex:1 1 0;overflow-y:auto}.fileBranch{min-width:0}.file-row,.file-row.folder-row{align-items:center;gap:var(--castle-space-base);width:100%;min-width:0;height:var(--castle-button-height);margin:0 0 var(--castle-space-small);padding:0 var(--castle-space-base);padding-left:calc(var(--castle-space-base) + var(--file-depth,0) * (var(--castle-button-icon-size) + var(--castle-space-base)));border-radius:var(--castle-radius-small);color:var(--castle-text-secondary);font-size:var(--castle-text-size-base);text-align:left;cursor:pointer;background:0 0;border:0;line-height:1;display:flex}.file-row.folder-row{color:var(--castle-text-muted)}.file-row>span:not(.icon-slot):not(.icon-inline):not(.icon-cell){text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.file-row:hover{background:var(--castle-surface-3);color:var(--castle-text-primary)}.file-row.imported-row{color:var(--castle-text-muted);font-style:italic}.file-row.forked-row{color:var(--castle-text-secondary);font-style:normal}.file-row.selected-row,.file-row.selected-row:hover{background:var(--castle-surface-4);color:var(--castle-text-primary)}.file-row.hidden-row{color:var(--castle-text-dim)}:is(.file-row:has(.button-icon),.file-row:has(.icon-cell)){padding-right:0}.file-row .button-icon,.file-row .icon-cell{margin-left:auto}.file-row.edit-row{height:auto;min-height:var(--castle-button-height);cursor:default;flex-wrap:wrap}.file-row.edit-row .text-field{flex:auto;width:auto}.file-suffix{color:var(--castle-text-muted);flex:none}.file-row .file-edit-feedback{padding-left:calc(var(--castle-button-icon-size) + var(--castle-space-base));padding-bottom:var(--castle-space-small);font-size:var(--castle-text-size-small);white-space:normal;flex:1 0 100%;line-height:1.45;overflow:visible}.flow-root.is-mobile .castle-file-panel,.flow-mobile-switch{--castle-button-height:var(--castle-button-height-large)}.flow-mobile-switch{--castle-text-size-small:14px;--castle-text-size-base:16px;--castle-text-style-smallcaps-size:var(--castle-text-size-small)}.flow-root.is-mobile .castle-file-panel .button:not(.button-icon){padding-left:var(--castle-space-large);padding-right:var(--castle-space-large)}.flow-root.is-mobile .file-row,.flow-mobile-switch .file-row{margin-bottom:0}.flow-root.is-mobile .file-row>span:not(.icon-slot):not(.icon-inline):not(.icon-cell),.flow-mobile-switch .file-row>span:not(.icon-slot):not(.icon-inline):not(.icon-cell){line-height:var(--castle-button-height)}.flow-root.is-mobile .file-row:hover,.flow-mobile-switch .file-row:hover{color:var(--castle-text-secondary);background:0 0}.flow-root.is-mobile .file-row.folder-row:hover,.flow-root.is-mobile .file-row.imported-row:hover,.flow-mobile-switch .file-row.folder-row:hover,.flow-mobile-switch .file-row.imported-row:hover{color:var(--castle-text-muted)}.flow-root.is-mobile .file-row.hidden-row:hover,.flow-mobile-switch .file-row.hidden-row:hover{color:var(--castle-text-dim)}.flow-root.is-mobile .file-row.selected-row:hover,.flow-mobile-switch .file-row.selected-row:hover{background:var(--castle-surface-4);color:var(--castle-text-primary)}.flow-root.is-mobile .version:hover{background:0 0}.castle-code-panel{flex-direction:column;width:100%;height:100%;display:flex;position:relative}.mainEditor{background:var(--castle-sheet-bg);flex-direction:column;flex:1 1 0;width:100%;min-width:0;height:100%;min-height:0;display:flex}.editorBody{flex:1;min-height:0;display:flex;overflow:hidden;container:editor/inline-size}.codeEditor{background:var(--castle-workspace-bg);flex:1;grid-template-columns:1fr;min-width:0;min-height:0;display:grid}.codeMirrorHost{min-width:0;height:100%;min-height:0}.castle-code-overlay{color:var(--castle-inspector-muted);pointer-events:none;font-size:12px;position:absolute;top:10px;left:12px}.castle-code-overlay.castle-code-error{color:var(--v2-error)}.castle-code-savebar{background:var(--v2-error-bg);color:var(--v2-error);padding:4px 10px;font-size:11px;position:absolute;bottom:0;left:0;right:0}.castle-tab-import{color:var(--v2-muted);font-style:italic}.castle-modal-scrim{z-index:1000;background:#00000080;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.castle-modal{color:#e8e8e8;background:#232323;border:1px solid #3a3a3a;border-radius:6px;min-width:260px;max-width:380px;padding:16px;font-size:13px;box-shadow:0 8px 24px #0000008c}.castle-modal-text{margin-bottom:14px}.castle-modal-actions{justify-content:flex-end;gap:8px;margin-top:16px;display:flex}.castle-modal-actions button,.castle-import-link-row button{color:#e8e8e8;cursor:pointer;background:#2e2e2e;border:1px solid #3a3a3a;border-radius:4px;padding:5px 12px;font-size:12px}.castle-modal-actions button:hover:not(:disabled),.castle-import-link-row button:hover:not(:disabled){background:#383838}.castle-modal-actions button:disabled,.castle-import-link-row button:disabled{opacity:.6;cursor:default}.castle-upload-modal{flex-direction:column;gap:10px;width:min(460px,100vw - 24px);max-width:none;max-height:calc(100vh - 32px);display:flex;overflow-y:auto}.castle-upload-modal>.castle-modal-text{margin-bottom:0}.castle-upload-modal>.castle-file-picker{width:100%;min-width:0}.castle-upload-input{opacity:0;pointer-events:none;width:1px;height:1px;position:absolute}.castle-upload-drop{justify-content:center;align-items:center;gap:var(--castle-space-small);width:100%;padding:calc(var(--castle-space-large) + var(--castle-space-base)) var(--castle-space-large);border:1px dashed var(--castle-border-3);border-radius:var(--castle-radius-small);background:var(--castle-surface-3);color:var(--castle-text-primary);font:inherit;cursor:pointer;flex-direction:column;display:flex}.castle-upload-drop:hover,.castle-upload-drop.over{border-color:var(--castle-border-2);background:var(--castle-surface-5)}.castle-upload-drop svg{font-size:var(--castle-button-icon-size)}.castle-upload-drop-label{font-size:var(--castle-text-size-base)}.castle-upload-drop-hint{color:var(--castle-text-muted);font-size:var(--castle-text-size-small)}.castle-upload-picked{flex-direction:column;max-height:132px;display:flex;overflow-y:auto}.castle-upload-picked-row{align-items:center;gap:var(--castle-space-base);min-height:var(--castle-button-height);padding:var(--castle-space-small) 0;display:flex}.castle-upload-picked-row+.castle-upload-picked-row{border-top:1px solid var(--castle-border-1)}.castle-upload-picked-name{min-width:0;font-size:var(--castle-text-size-base);flex-direction:column;flex:auto;justify-content:center;display:flex}.castle-upload-picked-label{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.castle-upload-picked-name .text-field{width:100%}.castle-upload-picked-warning{color:var(--castle-warn-text);font-size:var(--castle-text-size-small);white-space:normal;margin-top:2px;display:block}.castle-upload-picked-size{color:var(--castle-text-muted);font-size:var(--castle-text-size-small);font-variant-numeric:tabular-nums;flex:none}.castle-upload-status{text-overflow:ellipsis;white-space:nowrap;opacity:.7;text-align:left;flex:auto;min-width:0;font-size:12px;overflow:hidden}@media (width<=520px){.castle-upload-modal{width:calc(100vw - 16px);min-width:0;padding:12px}.castle-upload-drop{padding:var(--castle-space-large) var(--castle-space-base)}.castle-upload-picked{max-height:104px}.castle-file-picker-list{max-height:132px}}.castle-import-modal{flex-direction:column;width:min(520px,100vw - 32px);max-width:none;height:min(560px,100vh - 64px);max-height:none;display:flex}.castle-import-modal>.castle-modal-text,.castle-import-modal>.castle-key-tabs,.castle-import-modal>.castle-import-select-bar,.castle-import-modal>.castle-import-filter,.castle-import-modal>.castle-import-note,.castle-import-modal>.castle-import-error,.castle-import-modal>.castle-modal-actions{flex:none}.castle-import-select-bar{align-items:center;gap:10px;margin-bottom:8px;display:flex}.castle-import-select-all{padding:4px 8px}.castle-import-update-row{align-items:center}.castle-import-tick{color:#1b1b1b;border:1px solid #5a5a5a;border-radius:3px;flex:none;justify-content:center;align-items:center;width:16px;height:16px;font-size:10px;display:flex}.castle-import-tick.checked{background:#8ab4f8;border-color:#8ab4f8}.castle-import-filter{margin-bottom:8px}.castle-import-empty{color:#9a9a9a;text-align:center;flex:auto;justify-content:center;align-items:center;min-height:0;padding:10px;font-size:11px;display:flex}.castle-import-tabs .castle-key-tab{min-height:34px}.castle-import-list{background:#1b1b1b;border:1px solid #3a3a3a;border-radius:4px;flex:auto;min-height:0;overflow-y:auto}.castle-import-row{color:#e8e8e8;width:100%;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-bottom:1px solid #2e2e2e;gap:10px;padding:8px;font-size:12px;display:flex}.castle-import-row:last-child{border-bottom:0}.castle-import-row:hover{background:#262626}.castle-import-row.selected{background:#3a3a3a}.castle-import-row.disabled{opacity:.5}.castle-import-thumb{object-fit:cover;background:#2e2e2e;border-radius:3px;flex:none;width:56px;height:79px}.castle-import-row-text{flex-direction:column;gap:3px;min-width:0;display:flex}.castle-import-row-title{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.castle-import-row-meta{color:#9a9a9a;font-size:11px}.castle-import-link{flex-direction:column;flex:auto;gap:8px;min-height:0;display:flex}.castle-import-link-row{gap:8px;display:flex}.castle-import-link-row button{white-space:nowrap}.castle-import-note{color:#9a9a9a;padding:10px 2px;font-size:11px}.castle-import-error{color:#ff8f8f;margin-top:8px;font-size:11px}.castle-code-params-strip{border:0;border-bottom:1px solid var(--castle-inspector-border);background:var(--castle-inspector-input-bg);width:100%;color:var(--castle-inspector-muted);font:inherit;text-align:left;cursor:pointer;align-items:center;gap:8px;padding:6px 12px;font-size:12px;display:flex}.castle-code-params-strip:hover{color:var(--castle-inspector-text)}.castle-code-params-icon{flex:none;display:inline-flex}.castle-code-params-count{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.castle-code-params-action{color:var(--castle-inspector-text);flex:none;margin-left:auto}.castle-code-selection-bar{z-index:2;position:absolute;bottom:12px;right:12px}.castle-params-panel{background:var(--castle-sheet-bg);height:100%;color:var(--castle-inspector-text);-webkit-overflow-scrolling:touch;font-size:14px;overflow:hidden auto}.paramsFields{padding:10px 16px 24px}.paramsGroup+.paramsGroup{margin-top:6px}.paramsGroupTitle{color:var(--castle-inspector-muted);text-transform:uppercase;letter-spacing:.06em;overflow-wrap:anywhere;margin:0 0 10px;font-size:12px}.paramsGroup+.paramsGroup>.paramsGroupTitle{border-top:1px solid var(--castle-inspector-divider);margin-top:10px;padding-top:10px}.paramsNotice{color:var(--castle-inspector-muted);padding:16px}.paramsSaveError{border-bottom:1px solid var(--castle-inspector-border);color:var(--castle-inspector-text);background:#be464629;padding:8px 16px;font-size:13px}.paramsNoticeRow{align-items:center;gap:10px;display:flex}.paramsNoticeAction{border:1px solid var(--castle-inspector-border);border-radius:var(--castle-radius);background:var(--castle-inspector-input-bg);color:var(--castle-inspector-text);font:inherit;cursor:pointer;flex:none;margin-left:auto;padding:2px 10px}.paramsNoticeAction:hover{border-color:var(--castle-inspector-muted)}.paramsScopeBar{z-index:2;border-bottom:1px solid var(--castle-inspector-border);background:var(--castle-sheet-bg);align-items:center;gap:8px;padding:6px 10px;display:flex;position:sticky;top:0}.paramsScopeButton{border:1px solid var(--castle-inspector-border);border-radius:var(--castle-radius);background:var(--castle-inspector-input-bg);min-width:0;color:var(--castle-inspector-text);font:inherit;cursor:pointer;align-items:center;gap:6px;padding:4px 8px;font-size:13px;display:flex}.paramsScopeIcon,.paramsScopeChevron{flex:none;display:inline-flex}.paramsScopeLabel{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.paramsScopeSummary{color:var(--castle-inspector-muted);font-size:12px}.paramsScopeMenu{max-width:calc(100% - 16px);max-height:60vh;position:absolute;top:100%;left:8px;overflow-y:auto}.paramsScopeMenu .menu-item-label{text-overflow:ellipsis;white-space:nowrap;text-align:left;direction:rtl;overflow:hidden}.paramsScopeDivider{color:var(--castle-inspector-muted);text-transform:uppercase;letter-spacing:.06em;padding:6px 10px 4px;font-size:11px}.paramsScopeCount,.paramsFileCount{color:var(--castle-inspector-muted);font-variant-numeric:tabular-nums;flex:none;margin-left:auto;padding-left:10px;font-size:12px}.paramsFile+.paramsFile{border-top:1px solid var(--castle-inspector-divider)}.paramsFileHead{align-items:center;padding:0 6px 0 0;display:flex}.paramsFileHead~.paramsFields{padding-bottom:6px}.paramsFileToggle{min-width:0;color:var(--castle-inspector-text);font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;flex:1;align-items:center;gap:6px;padding:8px 4px 8px 10px;font-size:12px;display:flex}.paramsFileChevron{color:var(--castle-inspector-muted);flex:none;display:inline-flex}.paramsFilePath{text-overflow:ellipsis;white-space:nowrap;text-align:left;min-width:0;font-family:var(--castle-font-mono);direction:rtl;overflow:hidden}.paramsFileOpen,.paramsHistoryButton{border-radius:var(--castle-radius);color:var(--castle-inspector-muted);cursor:pointer;background:0 0;border:0;flex:none;padding:4px 6px;display:inline-flex}.paramsFileOpen:hover,.paramsHistoryButton:not(:disabled):hover{color:var(--castle-inspector-text)}.paramsHistoryButton:disabled{opacity:.35;cursor:default}.paramsScopeActions{align-items:center;gap:2px;margin-left:auto;display:flex}.paramsEmpty{max-width:46em;padding:20px 16px}.paramsEmptyLead{color:var(--castle-inspector-text);margin:0 0 10px;font-size:15px}.paramsEmptyBody{color:var(--castle-inspector-muted);margin:0 0 12px;line-height:1.5}.paramsEmpty code{font-family:var(--castle-font-mono);color:var(--castle-inspector-text);font-size:13px}.paramsEmptyCode{border:1px solid var(--castle-inspector-border);border-radius:var(--castle-radius);background:var(--castle-inspector-input-bg);color:var(--castle-inspector-text);font-family:var(--castle-font-mono);margin:0 0 14px;padding:10px 12px;font-size:13px;line-height:1.45;overflow-x:auto}.castle-params-panel .paramExpr,.castle-params-panel .paramFoldedSource{text-overflow:ellipsis;white-space:nowrap;border:1px dashed var(--castle-inspector-border);border-radius:var(--castle-radius);min-width:0;color:var(--castle-inspector-muted);font-family:var(--castle-font-mono);cursor:default;padding:5px 8px;font-size:13px;overflow:hidden}.castle-params-panel .paramFoldedSource{max-width:100%;margin-right:6px;padding:1px 5px;font-size:11px;display:inline-block}.castle-params-panel .paramExprLink{width:100%;font:inherit;font-family:var(--castle-font-mono);text-align:left;cursor:pointer;background:0 0;align-items:center;gap:6px;font-size:13px;display:flex}.castle-params-panel .paramExprSource{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.castle-params-panel .paramExprLink:hover{color:var(--castle-inspector-text);border-style:solid}.castle-params-panel [data-field-id].paramFieldRevealed{animation:1.4s ease-out paramFieldReveal}@keyframes paramFieldReveal{0%,60%{background:var(--castle-inspector-input-bg);box-shadow:0 0 0 4px var(--castle-inspector-input-bg)}to{background:0 0;box-shadow:0 0 0 4px #0000}}.xterm{cursor:text;-webkit-user-select:none;user-select:none;position:relative}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{z-index:5;position:absolute;top:0}.xterm .xterm-helper-textarea{opacity:0;z-index:-5;white-space:nowrap;resize:none;border:0;width:0;height:0;margin:0;padding:0;position:absolute;top:0;left:-9999em;overflow:hidden}.xterm .composition-view{color:#fff;white-space:nowrap;z-index:1;background:#000;display:none;position:absolute}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{cursor:default;background-color:#000;position:absolute;inset:0;overflow-y:scroll}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;top:0;left:0}.xterm-char-measure-element{visibility:hidden;line-height:normal;display:inline-block;position:absolute;top:0;left:-9999em}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{z-index:10;color:#0000;pointer-events:none;position:absolute;inset:0}.xterm .xterm-accessibility-tree:not(.debug) ::selection{color:#0000}.xterm .xterm-accessibility-tree{-webkit-user-select:text;user-select:text;white-space:pre;font-family:monospace}.xterm .xterm-accessibility-tree>div{transform-origin:0;width:fit-content}.xterm .live-region{width:1px;height:1px;position:absolute;left:-9999px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{-webkit-text-decoration:underline double;text-decoration:underline double}.xterm-underline-3{-webkit-text-decoration:underline wavy;text-decoration:underline wavy}.xterm-underline-4{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.xterm-underline-5{-webkit-text-decoration:underline dashed;text-decoration:underline dashed}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:underline overline}.xterm-overline.xterm-underline-2{-webkit-text-decoration:overline double underline;text-decoration:overline double underline}.xterm-overline.xterm-underline-3{-webkit-text-decoration:overline wavy underline;text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{-webkit-text-decoration:overline dotted underline;text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{-webkit-text-decoration:overline dashed underline;text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;pointer-events:none;position:absolute;top:0;right:0}.xterm-decoration-top{z-index:2;position:relative}.xterm .xterm-scrollable-element>.scrollbar{cursor:default}.xterm .xterm-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.xterm .xterm-scrollable-element>.visible{opacity:1;z-index:11;background:0 0;transition:opacity .1s linear}.xterm .xterm-scrollable-element>.invisible{opacity:0;pointer-events:none}.xterm .xterm-scrollable-element>.invisible.fade{transition:opacity .8s linear}.xterm .xterm-scrollable-element>.shadow{display:none;position:absolute}.xterm .xterm-scrollable-element>.shadow.top{width:100%;height:3px;box-shadow:var(--vscode-scrollbar-shadow,#000) 0 6px 6px -6px inset;display:block;top:0;left:3px}.xterm .xterm-scrollable-element>.shadow.left{width:3px;height:100%;box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset;display:block;top:3px;left:0}.xterm .xterm-scrollable-element>.shadow.top-left-corner{width:3px;height:3px;display:block;top:0;left:0}.xterm .xterm-scrollable-element>.shadow.top.left{box-shadow:var(--vscode-scrollbar-shadow,#000) 6px 0 6px -6px inset}@font-face{font-family:Basteleur;src:url(/__castle/ide/assets/Basteleur-Bold-DKFKedNb.woff2)format("woff2"),url(/__castle/ide/assets/Basteleur-Bold-CK8LF7Pt.woff)format("woff");font-weight:700;font-style:normal}.flow-root{--flow-gutter:#000;--flow-surface:#181818;--flow-chip:#282828;--flow-font-display:"Basteleur", Georgia, "Times New Roman", serif;--flow-fg:#e6e6e6;--flow-secondary:#b3b3b3;--flow-muted:#888;--flow-dim:#525252;--flow-border:#2a2a2a;--flow-border-active:#5a5a5a;--flow-gap:12px;--flow-dock-h:36px;--flow-tab-h:var(--castle-panel-header-height);--flow-icon-dock:var(--castle-button-icon-size);--flow-btn-sm:var(--castle-button-height);--flow-host-l:0px;--flow-host-r:0px;--flow-max-chips:6;--flow-chip-size:36px;--flow-chips-w:calc(var(--flow-max-chips) * var(--flow-chip-size));--flow-fade:22px;background:var(--flow-gutter);color:var(--flow-fg);flex-direction:column;font:13px ui-sans-serif,system-ui,-apple-system,sans-serif;display:flex;position:fixed;inset:0;overflow:hidden}.flow-root *{box-sizing:border-box}body.flow-reordering,body.flow-reordering *{touch-action:none;-webkit-user-select:none!important;user-select:none!important;cursor:grabbing!important}.flow-topbar{top:var(--flow-gap);left:var(--flow-gap);right:var(--flow-gap);height:var(--flow-dock-h);align-items:center;gap:var(--castle-space-base);z-index:40;pointer-events:none;padding-left:var(--flow-host-l);padding-right:var(--flow-host-r);grid-template-columns:minmax(0,1fr) minmax(0,auto) minmax(0,1fr);display:grid;position:absolute}.flow-topbar-leading{justify-self:start;align-items:center;gap:var(--castle-space-base);pointer-events:none;min-width:0;display:flex}.flow-topbar-leading>*{pointer-events:auto}.flow-castle-wrap{flex-shrink:0;position:relative}.flow-menu-backdrop{z-index:49;position:fixed;inset:0}.flow-castle-menu{top:calc(var(--flow-dock-h) + var(--castle-space-base));z-index:50;position:absolute;left:0}.flow-menu-narrow{display:none}.flow-deck-identity{max-width:260px}.flow-deck-vis{color:var(--flow-secondary);flex-shrink:0;font-size:14px;display:inline-flex}.flow-deck-vis svg{width:14px;height:14px}.flow-deck-name{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.flow-deck-caret{color:var(--flow-muted);flex-shrink:0;display:inline-flex}.flow-draft-status{color:var(--flow-muted);font-size:var(--castle-text-size-small);white-space:nowrap;flex-shrink:0}.flow-draft-status.is-error{color:var(--castle-danger-text)}.flow-tabs-wrap{pointer-events:auto;justify-self:center;align-items:center;gap:var(--castle-space-base);min-width:0;max-width:100%;display:flex}.flow-tabs{min-width:0;max-width:var(--flow-chips-w);flex:0 auto;position:relative}.flow-tabs-scroll{scrollbar-width:none;align-items:stretch;gap:0;height:100%;padding:0;display:flex;overflow:auto hidden}.flow-tabs-scroll::-webkit-scrollbar{display:none}.flow-tabs.more-left{-webkit-mask-image:linear-gradient(to right, transparent, #000 var(--flow-fade));-webkit-mask-image:linear-gradient(to right, transparent, #000 var(--flow-fade));mask-image:linear-gradient(to right, transparent, #000 var(--flow-fade));border-top-left-radius:0;border-bottom-left-radius:0}.flow-tabs.more-right{-webkit-mask-image:linear-gradient(to left, transparent, #000 var(--flow-fade));-webkit-mask-image:linear-gradient(to left, transparent, #000 var(--flow-fade));mask-image:linear-gradient(to left, transparent, #000 var(--flow-fade));border-top-right-radius:0;border-bottom-right-radius:0}.flow-tabs.more-left.more-right{-webkit-mask-image:linear-gradient(to right, transparent, #000 var(--flow-fade), #000 calc(100% - var(--flow-fade)), transparent);-webkit-mask-image:linear-gradient(to right, transparent, #000 var(--flow-fade), #000 calc(100% - var(--flow-fade)), transparent);mask-image:linear-gradient(to right, transparent, #000 var(--flow-fade), #000 calc(100% - var(--flow-fade)), transparent)}.button.flow-tabs-add{width:var(--castle-button-height-large);height:var(--castle-button-height-large);border-radius:var(--castle-radius-base);flex-shrink:0}.flow-chip-icon{font-size:var(--flow-icon-dock);display:inline-flex}.flow-chip-icon svg{width:var(--flow-icon-dock);height:var(--flow-icon-dock)}.flow-topbar-trailing{justify-self:end;align-items:center;gap:var(--castle-space-base);pointer-events:none;min-width:0;display:flex}.flow-preview-btn{pointer-events:auto;flex-shrink:0}.flow-preview-btn-failed{color:var(--castle-danger-text);border-color:var(--castle-danger-text)}.flow-preview-label{justify-items:center;display:grid}.flow-preview-label>*{grid-area:1/1}.flow-preview-label-sizer{visibility:hidden;pointer-events:none}.flow-root.is-mobile{--flow-max-chips:4;--flow-gap:var(--castle-space-base);--castle-text-size-small:14px;--castle-text-size-base:16px;--castle-text-style-smallcaps-size:var(--castle-text-size-small);--flow-tab-h:var(--castle-panel-header-height-mobile);--flow-icon-dock:var(--castle-button-icon-size-large);--flow-btn-sm:var(--castle-button-height-large)}.flow-root.is-mobile .flow-deck-identity,.flow-root.is-mobile .flow-topbar-trailing{display:none}.flow-root.is-mobile .flow-topbar{grid-template-columns:auto minmax(0,1fr)}.flow-root.is-mobile .flow-tabs-wrap{justify-self:start}.flow-root.is-mobile .flow-topbar-leading:not(:has(.flow-castle-wrap)):not(:has(.flow-draft-status)){display:none}.flow-root.is-mobile .menu-item.flow-menu-narrow{display:flex}.flow-root.is-mobile .menu-separator.flow-menu-narrow{display:block}.flow-scroller{flex:auto;min-height:0;overflow:auto}.flow-field{width:max-content;min-width:100%;min-height:100%}.flow-row{align-items:flex-start;gap:var(--flow-gap);width:max-content;min-height:100%;padding:calc(var(--flow-dock-h) + var(--flow-gap) * 2) var(--flow-gap) var(--flow-gap);padding-right:calc(var(--flow-gap) + var(--flow-overscroll,0px));display:flex}.flow-group{flex-direction:column;min-width:200px;display:flex;overflow:clip}.flow-root.is-mobile .panel:hover,.flow-root.is-mobile .panel.is-hover,.flow-root.is-maximized .panel:hover,.flow-root.is-maximized .panel.is-hover{border-color:var(--castle-border-1)}.flow-root.is-mobile .panel-header:hover,.flow-root.is-mobile .panel-tabs-header:hover{background:var(--castle-surface-3);cursor:default}.operator-chrome{align-items:stretch;gap:var(--castle-space-base);flex:auto;min-width:0;display:flex}.operator-chrome .panel-type-toggle{flex-shrink:0}.flow-root.is-mobile .operator-chrome{display:contents}.flow-tab-icon{font-size:var(--flow-icon-dock);flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.flow-drop-indicator{background:var(--castle-border-4);z-index:60;pointer-events:none;border-radius:2px;width:3px;position:fixed;transform:translate(-50%)}.flow-group.pinned{left:var(--flow-gap);z-index:5;position:sticky;box-shadow:0 6px 24px #00000073}.flow-panel-body{flex:auto;min-height:0;position:relative;overflow:hidden}.flow-panel-slot{width:100%;height:100%}.flow-resize-e{top:var(--flow-tab-h);cursor:col-resize;touch-action:none;z-index:20;width:16px;position:absolute;bottom:0;right:-8px}.flow-resize-s{cursor:row-resize;touch-action:none;z-index:20;height:16px;position:absolute;bottom:-8px;left:0;right:0}.flow-resize-se{cursor:nwse-resize;touch-action:none;z-index:21;width:22px;height:22px;position:absolute;bottom:-11px;right:-11px}.flow-placeholder{height:100%;color:var(--flow-muted);text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:8px;padding:16px;display:flex}.flow-placeholder-icon :is(svg){width:34px;height:34px}.flow-placeholder-label{color:var(--flow-secondary);font-size:14px}.flow-placeholder-kind{color:var(--flow-muted);font:11px ui-monospace,SFMono-Regular,Menlo,monospace}.flow-placeholder.kind-play{background:repeating-linear-gradient(45deg,#101018,#101018 10px,#0d0d14 10px 20px)}.flow-picker{z-index:50;max-height:min(60vh,420px);position:fixed}.flow-picker-input{margin-bottom:var(--castle-space-base);color:var(--flow-fg);background:var(--flow-surface);border:1px solid var(--flow-border);border-radius:var(--castle-radius-small);outline:none;flex:none;padding:7px 9px;font:13px ui-sans-serif,system-ui,sans-serif}.flow-picker-input:focus{border-color:var(--flow-border-active)}.flow-picker-list{flex:auto;min-height:0;overflow-y:auto}.flow-picker-empty{color:var(--flow-muted);padding:10px 8px;font-size:12px}.flow-operator-host{width:100%;height:100%}.flow-root.is-maximized .flow-scroller{overflow:hidden}.flow-root.is-maximized .flow-field,.flow-root.is-maximized .flow-row{width:100%;height:100%}.flow-root.is-maximized .flow-row{align-items:stretch}.flow-group.maximized{width:100%;height:100%}.flow-group.hidden{display:none}.flow-root.is-mobile .flow-scroller{position:relative;overflow:clip}.flow-root.is-mobile .flow-field{inset:calc(var(--flow-dock-h) + var(--flow-gap) * 2) 0 var(--flow-gap);width:auto;min-width:0;height:auto;min-height:0;position:absolute;overflow:clip}.flow-root.is-mobile .flow-row{width:100%;height:100%;transform:translateX(calc(var(--flow-page,0) * -100% + var(--flow-drag,0px)));will-change:transform;flex-wrap:nowrap;align-items:stretch;gap:0;padding:0;transition:transform .28s cubic-bezier(.22,.61,.36,1);display:flex}.flow-root.is-mobile.flow-dragging .flow-row{transition:none}.flow-root.is-mobile .flow-group{flex:0 0 100%;min-width:0;margin:0}.flow-root.is-mobile .flow-resize-e,.flow-root.is-mobile .flow-resize-s,.flow-root.is-mobile .flow-resize-se{display:none}@media (prefers-reduced-motion:reduce){.flow-root.is-mobile .flow-row{transition:none}}.flow-push-modal-backdrop{z-index:1000;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);pointer-events:auto;background:#0000008c;justify-content:center;align-items:center;padding:24px;display:flex;position:fixed;inset:0}.flow-push-modal{border:1px solid var(--flow-border);text-align:center;background:#141414;border-radius:18px;flex-direction:column;align-items:center;gap:10px;width:min(360px,100%);padding:28px 24px;display:flex;box-shadow:0 20px 60px #0009}.flow-push-spinner{border:3px solid #ffffff26;border-top-color:var(--flow-fg);border-radius:50%;width:34px;height:34px;animation:.8s linear infinite flow-push-spin}@keyframes flow-push-spin{to{transform:rotate(360deg)}}.flow-push-check{color:#fff;background:#2e7d32;border-radius:50%;justify-content:center;align-items:center;width:34px;height:34px;font-size:20px;font-weight:700;display:flex}.flow-push-check-failed{background:var(--castle-danger-surface)}.flow-push-title{color:var(--flow-fg);font-size:16px;font-weight:600}.flow-push-sub{color:var(--flow-secondary);font-size:12px}.flow-push-url{overflow-wrap:anywhere;color:#7aa2ff;max-width:100%;font:13px ui-monospace,SFMono-Regular,Menlo,monospace;text-decoration:none}.flow-push-url:hover{text-decoration:underline}.flow-push-done{background:var(--flow-fg);color:var(--flow-gutter);cursor:pointer;border:none;border-radius:999px;margin-top:8px;padding:9px 24px;font-size:14px;font-weight:600}.flow-tabstrip{height:var(--flow-tab-h);-webkit-user-select:none;user-select:none;touch-action:none;flex-shrink:0}.flow-tabs-row{position:relative;overflow:hidden}.flow-tabs-row .panel-tab{flex:0 auto;min-width:0}.flow-tab-icon svg{width:var(--flow-icon-dock);height:var(--flow-icon-dock)}.flow-tabs-row .panel-tab-insert{z-index:3;height:auto;position:absolute;top:0;bottom:0}.panel-tab-ghost,.dock-segment-ghost{z-index:80;position:fixed}.flow-tabstrip .button{flex-shrink:0;align-self:center}.flow-tab-body{position:absolute;inset:0}.flow-tab-body.inactive{display:none}.flow-class-drawer{background:var(--castle-sheet-bg,var(--v2-surface));border-right:1px solid var(--flow-border);flex-direction:column;flex:none;width:220px;min-height:0;padding:2px 4px 6px;display:flex;overflow:hidden}.flow-class-files{flex:auto;min-height:0;overflow-y:auto}.flow-class-files .fileBrowserBare,.flow-class-files .fileTree{flex:none;height:auto;overflow:visible}.flow-class-recent{border-bottom:1px solid var(--castle-inspector-divider,var(--flow-border));margin-bottom:10px;padding-bottom:10px}.flow-class-section{color:var(--v2-muted,var(--flow-muted));padding:5px 9px;font-size:14px}.flow-class-drawer .flow-view-segments{margin:4px 2px 8px}.flow-class-drawer-empty{color:var(--flow-muted);padding:10px 8px;font-size:12px}.flow-empty-editor{flex:auto;height:100%;min-height:0;display:flex}.flow-empty-editor .flow-class-drawer{flex:0 0 220px}.flow-empty-editor-msg{color:var(--flow-muted);background:var(--castle-sheet-bg,var(--v2-surface));flex:auto;justify-content:center;align-items:center;font-size:13px;display:flex}.flow-tabstrip-mobile{cursor:default;grid-template-columns:1fr auto 1fr;align-items:center;display:grid}.flow-mobile-strip-left,.flow-mobile-strip-right{align-items:center;min-width:0;display:flex}.flow-mobile-strip-left{justify-content:flex-start}.flow-mobile-strip-right{justify-content:flex-end}.flow-tabstrip-mobile .panel-header-actions{margin-left:0}.panel-mobile-current .flow-tab-icon,.panel-mobile-current .flow-tab-icon svg{width:var(--castle-button-icon-size-large);height:var(--castle-button-icon-size-large)}.flow-mobile-chevron{width:var(--castle-button-icon-size-large);height:var(--castle-button-icon-size-large);opacity:.6;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.flow-mobile-chevron svg{width:var(--castle-button-icon-size-large);height:var(--castle-button-icon-size-large);display:block}.flow-mobile-switch-backdrop{z-index:900;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);pointer-events:auto;background:#0000008c;align-items:flex-end;display:flex;position:fixed;inset:0}.flow-mobile-switch{border-top:1px solid var(--flow-border);background:#141414;border-radius:16px 16px 0 0;flex-direction:column;width:100%;max-height:70vh;display:flex;overflow:hidden}.flow-mobile-switch-header{border-bottom:1px solid var(--flow-border);justify-content:space-between;align-items:center;padding:14px 16px;font-weight:600;display:flex}.flow-mobile-switch-close{color:var(--flow-secondary);cursor:pointer;background:0 0;border:none;font-size:22px;line-height:1}.flow-view-segments{background:var(--v2-inset,#0e0e0e);border-radius:8px;flex:none;gap:2px;margin:10px 16px 6px;padding:2px;display:flex}.flow-view-segment{color:var(--flow-secondary);font:inherit;cursor:pointer;background:0 0;border:none;border-radius:6px;flex:1 1 0;padding:7px 10px;font-size:13px;font-weight:600}.flow-view-segment.on{color:var(--flow-text,#eee);background:#282828}.flow-mobile-switch-list{background:var(--v2-surface,#141414);flex-direction:column;flex:auto;min-height:0;display:flex;overflow:hidden}.flow-mobile-switch-list .flow-class-files{padding:4px 6px 10px}
|