@sigrun/sigrun 0.7.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/CHANGELOG.md +78 -59
  2. package/README.md +32 -0
  3. package/dist/config.js +47 -0
  4. package/dist/curation/host.js +125 -21
  5. package/dist/curation/runs.js +15 -4
  6. package/dist/extension.d.ts +331 -4
  7. package/dist/harness/boot.js +114 -3
  8. package/dist/harness/complete.js +127 -0
  9. package/dist/harness/decision-tool.js +93 -0
  10. package/dist/harness/decisions.js +477 -0
  11. package/dist/harness/event-bus.js +12 -0
  12. package/dist/harness/interactions.js +81 -0
  13. package/dist/harness/interactive-tools.js +97 -0
  14. package/dist/harness/loader.js +285 -1
  15. package/dist/harness/packages.js +7 -0
  16. package/dist/harness/published-hooks.js +208 -0
  17. package/dist/harness/seam-host.js +149 -1
  18. package/dist/harness/settings.js +41 -0
  19. package/dist/history/git.js +6 -2
  20. package/dist/jobs/fire.js +10 -0
  21. package/dist/jobs/observe.js +27 -2
  22. package/dist/notices/events.js +8 -0
  23. package/dist/notices/service.js +297 -0
  24. package/dist/notices/store.js +331 -0
  25. package/dist/notices/validate.js +311 -0
  26. package/dist/server/conversation-ops.js +50 -0
  27. package/dist/server/core-views/skills-tree.js +3 -12
  28. package/dist/server/core-views/skills.js +11 -23
  29. package/dist/server/host-bridge.js +62 -1
  30. package/dist/server/index.js +26 -0
  31. package/dist/server/routes/events.js +20 -0
  32. package/dist/server/routes/extensions.js +5 -0
  33. package/dist/server/routes/interactions.js +48 -1
  34. package/dist/server/routes/meta.js +17 -0
  35. package/dist/server/routes/notices.js +94 -0
  36. package/dist/server/routes/providers.js +65 -8
  37. package/dist/server/routes/submissions.js +3 -0
  38. package/dist/server/routes/users.js +4 -0
  39. package/dist/server/surfaces/dedup.js +6 -0
  40. package/dist/server/visibility.js +30 -0
  41. package/dist/settings/registry.js +18 -0
  42. package/node_modules/@sigrun/shared/CHANGELOG.md +12 -0
  43. package/node_modules/@sigrun/shared/dist/decisions.d.ts +95 -0
  44. package/node_modules/@sigrun/shared/dist/decisions.js +16 -0
  45. package/node_modules/@sigrun/shared/dist/interactions.d.ts +14 -0
  46. package/node_modules/@sigrun/shared/dist/notices.d.ts +112 -0
  47. package/node_modules/@sigrun/shared/dist/notices.js +49 -0
  48. package/node_modules/@sigrun/shared/dist/settings.d.ts +32 -0
  49. package/node_modules/@sigrun/shared/dist/views.d.ts +63 -0
  50. package/node_modules/@sigrun/shared/package.json +9 -1
  51. package/package.json +7 -7
  52. package/webui/dist/assets/index-D5KowS7k.css +1 -0
  53. package/webui/dist/assets/index-DGIrLC6F.js +55 -0
  54. package/webui/dist/index.html +2 -2
  55. package/webui/dist/assets/index-BI5k-Oci.js +0 -55
  56. package/webui/dist/assets/index-EGluyRXk.css +0 -1
@@ -0,0 +1,112 @@
1
+ /**
2
+ * The per-user notice wire types (notices spec §1/§3) — THE notices
3
+ * channel contract.
4
+ *
5
+ * Part of the shared leaf package (`@sigrun/shared`): the server owns the
6
+ * runtime half (`src/notices/*` — validation, store, service) and both
7
+ * clients (webui, tui) import these types directly. Like every wire
8
+ * module, imports are TYPE-ONLY from sibling shared modules (the
9
+ * views-purity guard enforces this); the two `RegExp` constants and the
10
+ * limits table are local pure values.
11
+ *
12
+ * A notice is a short message aimed at ONE directory user: a title, an
13
+ * optional line of body text, and up to three buttons. It is deliberately
14
+ * not a block tree (every client renders it the same way) and it is never
15
+ * conversation state — that is what ambient records are for. The `User*`
16
+ * prefix keeps these shapes apart from `host.notify`'s
17
+ * `ExtensionNoticeInput`, which delivers to external channels instead.
18
+ */
19
+ import type { CoreTarget, IconName, Tone } from "./blocks/index.js";
20
+ import type { JsonObject } from "./json.js";
21
+ /**
22
+ * The notice bounds (spec §1 fields, §3 caps): the input limits the
23
+ * validator enforces, and the per-user store caps that bound the pile.
24
+ */
25
+ export declare const NOTICE_LIMITS: {
26
+ /** Max title characters (one line). */
27
+ readonly title: 200;
28
+ /** Max body characters (plain text, shown under the title). */
29
+ readonly body: 1000;
30
+ /** Max actions per notice. */
31
+ readonly actions: 3;
32
+ /** Max action label characters. */
33
+ readonly label: 40;
34
+ /** Max extension-action payload, as canonical JSON bytes. */
35
+ readonly payloadBytes: 4096;
36
+ /** Max extension-action confirm characters. */
37
+ readonly confirm: 200;
38
+ /** Max `open` URL characters (https only). */
39
+ readonly url: 2048;
40
+ /** Max notices one extension may hold per user. */
41
+ readonly perExtension: 10;
42
+ /** Max notices a user may hold in total. */
43
+ readonly perUser: 50;
44
+ };
45
+ /**
46
+ * The extension-scoped replace key grammar (spec §1): posting an existing
47
+ * (extension, user, key) replaces that notice.
48
+ */
49
+ export declare const NOTICE_KEY_RE: RegExp;
50
+ /** The per-notice action id grammar (spec §1); ids are unique per notice. */
51
+ export declare const NOTICE_ACTION_ID_RE: RegExp;
52
+ /**
53
+ * One notice button. `navigate` moves the client to a core target, `open`
54
+ * opens an https link (and then dismisses), and `extension` runs a
55
+ * handler the posting extension declared (and clears the notice unless
56
+ * the handler asks to keep it).
57
+ */
58
+ export type UserNoticeAction = {
59
+ readonly id: string;
60
+ readonly label: string;
61
+ readonly icon?: IconName;
62
+ } & ({
63
+ readonly kind: "navigate";
64
+ readonly target: CoreTarget;
65
+ } | {
66
+ readonly kind: "open";
67
+ readonly url: string;
68
+ } | {
69
+ readonly kind: "extension";
70
+ readonly name: string;
71
+ /** Extension-owned payload, read by the handler; visible to the client, so never a secret. */
72
+ readonly payload?: JsonObject;
73
+ /** Confirmation the client shows before running the handler. */
74
+ readonly confirm?: string;
75
+ });
76
+ /** What an extension posts: one recipient, the content, at most three actions. */
77
+ export interface UserNoticeInput {
78
+ /** The one recipient (a directory user). */
79
+ readonly user: string;
80
+ /** Present → a conversation notice; absent → an app-wide notice. */
81
+ readonly conversationId?: number;
82
+ /** Extension-scoped replace key; posting the same key replaces the notice. */
83
+ readonly key?: string;
84
+ readonly title: string;
85
+ readonly body?: string;
86
+ readonly tone?: Tone;
87
+ readonly actions?: readonly UserNoticeAction[];
88
+ }
89
+ /** A stored notice as the wire carries it (core assigns the three extras). */
90
+ export interface UserNotice extends UserNoticeInput {
91
+ /** Core-assigned random UUID; a keyed replace mints a new one. */
92
+ readonly id: string;
93
+ /** The posting extension slug. */
94
+ readonly owner: string;
95
+ /** ISO timestamp, set on post. */
96
+ readonly at: string;
97
+ }
98
+ /** The `GET /v1/notices` payload: the caller's notices, newest first. */
99
+ export interface NoticesResponse {
100
+ readonly notices: readonly UserNotice[];
101
+ }
102
+ /** The `POST /v1/notices/{id}/actions/{actionId}` answer (spec §4). */
103
+ export type NoticeActionResponse = {
104
+ readonly ok: true;
105
+ readonly message?: string;
106
+ readonly navigate?: CoreTarget;
107
+ } | {
108
+ readonly ok: false;
109
+ readonly error: {
110
+ readonly message: string;
111
+ };
112
+ };
@@ -0,0 +1,49 @@
1
+ /**
2
+ * The per-user notice wire types (notices spec §1/§3) — THE notices
3
+ * channel contract.
4
+ *
5
+ * Part of the shared leaf package (`@sigrun/shared`): the server owns the
6
+ * runtime half (`src/notices/*` — validation, store, service) and both
7
+ * clients (webui, tui) import these types directly. Like every wire
8
+ * module, imports are TYPE-ONLY from sibling shared modules (the
9
+ * views-purity guard enforces this); the two `RegExp` constants and the
10
+ * limits table are local pure values.
11
+ *
12
+ * A notice is a short message aimed at ONE directory user: a title, an
13
+ * optional line of body text, and up to three buttons. It is deliberately
14
+ * not a block tree (every client renders it the same way) and it is never
15
+ * conversation state — that is what ambient records are for. The `User*`
16
+ * prefix keeps these shapes apart from `host.notify`'s
17
+ * `ExtensionNoticeInput`, which delivers to external channels instead.
18
+ */
19
+ /**
20
+ * The notice bounds (spec §1 fields, §3 caps): the input limits the
21
+ * validator enforces, and the per-user store caps that bound the pile.
22
+ */
23
+ export const NOTICE_LIMITS = {
24
+ /** Max title characters (one line). */
25
+ title: 200,
26
+ /** Max body characters (plain text, shown under the title). */
27
+ body: 1000,
28
+ /** Max actions per notice. */
29
+ actions: 3,
30
+ /** Max action label characters. */
31
+ label: 40,
32
+ /** Max extension-action payload, as canonical JSON bytes. */
33
+ payloadBytes: 4096,
34
+ /** Max extension-action confirm characters. */
35
+ confirm: 200,
36
+ /** Max `open` URL characters (https only). */
37
+ url: 2048,
38
+ /** Max notices one extension may hold per user. */
39
+ perExtension: 10,
40
+ /** Max notices a user may hold in total. */
41
+ perUser: 50,
42
+ };
43
+ /**
44
+ * The extension-scoped replace key grammar (spec §1): posting an existing
45
+ * (extension, user, key) replaces that notice.
46
+ */
47
+ export const NOTICE_KEY_RE = /^[a-z0-9._:-]{1,128}$/;
48
+ /** The per-notice action id grammar (spec §1); ids are unique per notice. */
49
+ export const NOTICE_ACTION_ID_RE = /^[a-z0-9-]{1,32}$/;
@@ -163,6 +163,20 @@ export interface ServerSettings {
163
163
  readonly workerDeadlineMs?: number;
164
164
  readonly queueMax?: number;
165
165
  };
166
+ /**
167
+ * The published-hook call deadline (knowledge C7): the per-call cap,
168
+ * mirroring `SIGRUN_PUBLISHED_HOOK_DEADLINE` (env wins). Default
169
+ * 30000 ms.
170
+ */
171
+ readonly publishedHookDeadlineMs?: number;
172
+ /**
173
+ * The decision-provider knob (warden Task 6): `SIGRUN_DECISION_TIMEOUT_MS`
174
+ * — the per-call timeout (default AND cap, default 15000 ms), a
175
+ * positive integer.
176
+ */
177
+ readonly decisions?: {
178
+ readonly timeoutMs?: number;
179
+ };
166
180
  /** The multi-user execution jail (M1). `mode` and `osUsers` are restart-required. */
167
181
  readonly isolation?: {
168
182
  /** `SIGRUN_ISOLATION` — auto, always, or off; default auto. */
@@ -406,6 +420,15 @@ export interface SettingsFile {
406
420
  * next naming call without a restart.
407
421
  */
408
422
  readonly namingModel?: string | false;
423
+ /**
424
+ * Sigrun: the decision providers' default model (warden Task 6), a
425
+ * non-empty `provider/model-id` spec validated exactly like
426
+ * `defaultModel`. Absent = the first model of the first-registered
427
+ * decision provider. LIVE — the decision registry reads it per
428
+ * `host.decisions.evaluate` call, so a PATCH reaches the next call
429
+ * without a restart.
430
+ */
431
+ readonly decisionModel?: string;
409
432
  /**
410
433
  * Sigrun: the env-driven OpenAI-compatible provider's endpoint
411
434
  * (ruling 7), applied when `OPENAI_BASE_URL` is absent.
@@ -441,6 +464,15 @@ export interface SettingsFile {
441
464
  * `defaultTools`.
442
465
  */
443
466
  readonly autoEnableCodemode?: boolean;
467
+ /**
468
+ * Sigrun: the decision surface's toggles (warden Task 6). `tool`
469
+ * (default false) gates the core `decision_evaluate` tool — read at
470
+ * each tool call; a disabled tool returns an error result naming the
471
+ * setting. LIVE.
472
+ */
473
+ readonly decisions?: {
474
+ readonly tool?: boolean;
475
+ };
444
476
  /**
445
477
  * Sigrun: the static boot configuration (see {@link ServerSettings}).
446
478
  * Deployment defaults under env — changes require a restart.
@@ -339,6 +339,12 @@ export interface InteractionAnswered {
339
339
  readonly status: "answered";
340
340
  readonly answer: InteractionAnswer;
341
341
  }
342
+ /** The response of `POST .../interactions/:callId/decline`. */
343
+ export interface InteractionDeclined {
344
+ readonly callId: string;
345
+ readonly status: "skipped";
346
+ readonly declinedVia: "button";
347
+ }
342
348
  /** One ambient surface on the wire (envelope + body + details). */
343
349
  export type AmbientWire = AmbientRecord;
344
350
  /** The response of `GET /v1/conversations/:id/ambient`. */
@@ -607,6 +613,41 @@ export interface MetaResponse {
607
613
  readonly contributor: string;
608
614
  }[];
609
615
  };
616
+ /**
617
+ * The published-hook registry (knowledge C7): one row per OWNED hook
618
+ * name — `provider` is the owner slug, `shadowed` the losing
619
+ * providers (configured losers before built-in losers). Ownership is
620
+ * first-listed over `extensions[]`, configured before built-ins;
621
+ * empty when nothing published.
622
+ */
623
+ readonly publishedHooks: readonly {
624
+ readonly name: string;
625
+ readonly provider: string;
626
+ readonly shadowed: readonly string[];
627
+ }[];
628
+ /**
629
+ * The decision-provider seam projection (warden Task 7): the
630
+ * registry's providers (id/label/extension/models/status), the
631
+ * resolved default model (the live `decisionModel` setting, else the
632
+ * first model of the first-registered provider), and the boot-merge
633
+ * collision record. Empty arrays and no default on the no-provider
634
+ * boot.
635
+ */
636
+ readonly decisions: {
637
+ readonly providers: readonly {
638
+ readonly id: string;
639
+ readonly label?: string;
640
+ readonly extension: string;
641
+ readonly models: readonly string[];
642
+ readonly status: AuthStatus;
643
+ }[];
644
+ readonly default?: string;
645
+ readonly collisions: readonly {
646
+ readonly id: string;
647
+ readonly winner: string;
648
+ readonly losers: readonly string[];
649
+ }[];
650
+ };
610
651
  }
611
652
  /**
612
653
  * Provider auth readiness statuses (Task 6, spec §6.4 + provider plugins
@@ -633,6 +674,18 @@ export interface AuthCheckProvider {
633
674
  readonly status: AuthStatus;
634
675
  /** How many models the provider currently serves (best-effort count). */
635
676
  readonly models: number;
677
+ /**
678
+ * Warden Task 7: `"chat"` (a chat-catalog provider) or `"decision"` (a
679
+ * decision provider from the warden seam). Absent = `"chat"` (older
680
+ * servers never carried the field); a chat and a decision provider
681
+ * sharing an id stay SEPARATE entries, one of each kind.
682
+ */
683
+ readonly kind?: "chat" | "decision";
684
+ /**
685
+ * The decision provider's bare model ids (warden Task 7) — present
686
+ * only on `kind: "decision"` entries (`models` is their count).
687
+ */
688
+ readonly modelIds?: readonly string[];
636
689
  /** The owning contributor's name; absent for the env-degenerate provider. */
637
690
  readonly owner?: string;
638
691
  readonly detail?: string;
@@ -736,6 +789,11 @@ export interface ExtensionSurfaceInfo {
736
789
  * answer with `ops` and NO `data` — channels fall back to a full
737
790
  * fetch (ops folding is U1). Absent → per-instance data. */
738
791
  readonly sharedData?: boolean;
792
+ /** The panel opts in to per-conversation attachment: channels attach
793
+ * it with `params: { conversationId }` of the OPEN conversation. The
794
+ * id is client-supplied — the extension must check access. Absent
795
+ * (the sparse rule) → the panel is not conversation-scoped. */
796
+ readonly perConversation?: true;
739
797
  }
740
798
  /** The `GET /v1/extensions` payload (spec §7.7). */
741
799
  export interface ExtensionsResponse {
@@ -1046,4 +1104,9 @@ export type HostEventWire = {
1046
1104
  readonly conversationId: number;
1047
1105
  readonly entryId: string;
1048
1106
  readonly rev: number;
1107
+ } | {
1108
+ /** Notices (notices spec §4): one user's notice set changed. The wire shape carries NO `user` — the hub-internal copy does, and the events route delivers only to streams whose principal IS that user. A keyed replace emits `cleared [oldId]` then `posted [newId]`; dismiss-all emits one `cleared` carrying every id. */
1109
+ readonly type: "notice.changed";
1110
+ readonly ids: readonly string[];
1111
+ readonly change: "posted" | "cleared";
1049
1112
  };
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sigrun/shared",
3
- "version": "0.7.0",
3
+ "version": "0.9.0",
4
4
  "description": "sigrun shared leaf package \u2014 theme tokens, turn/conversation shaping, and the channel wire types (pure leaf, zero dependencies)",
5
5
  "type": "module",
6
6
  "exports": {
@@ -44,6 +44,10 @@
44
44
  "types": "./dist/access.d.ts",
45
45
  "default": "./dist/access.js"
46
46
  },
47
+ "./notices": {
48
+ "types": "./dist/notices.d.ts",
49
+ "default": "./dist/notices.js"
50
+ },
47
51
  "./auth": {
48
52
  "types": "./dist/auth.d.ts",
49
53
  "default": "./dist/auth.js"
@@ -68,6 +72,10 @@
68
72
  "types": "./dist/jobs.d.ts",
69
73
  "default": "./dist/jobs.js"
70
74
  },
75
+ "./decisions": {
76
+ "types": "./dist/decisions.d.ts",
77
+ "default": "./dist/decisions.js"
78
+ },
71
79
  "./blocks": {
72
80
  "types": "./dist/blocks/index.d.ts",
73
81
  "default": "./dist/blocks/index.js"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sigrun/sigrun",
3
- "version": "0.7.0",
3
+ "version": "0.9.0",
4
4
  "description": "Self-hosted, multi-user personal-assistant server",
5
5
  "type": "module",
6
6
  "exports": {
@@ -45,12 +45,12 @@
45
45
  "@earendil-works/pi-tui": "^1.3.0",
46
46
  "@fastify/static": "^10.1.7",
47
47
  "@sigrun/ext-codemode": "0.1.2",
48
- "@sigrun/ext-curator": "0.2.0",
49
- "@sigrun/ext-gateway": "0.1.14",
48
+ "@sigrun/ext-curator": "0.3.0",
49
+ "@sigrun/ext-gateway": "0.1.18",
50
50
  "@sigrun/ext-mcp": "0.2.2",
51
51
  "@sigrun/ext-tool-search": "0.1.2",
52
52
  "@sigrun/oauth": "0.1.1",
53
- "@sigrun/shared": "0.7.0",
53
+ "@sigrun/shared": "0.9.0",
54
54
  "croner": "^10.0.1",
55
55
  "fastify": "^5.12.7",
56
56
  "semver": "^7.8.5",
@@ -61,9 +61,9 @@
61
61
  "@sigrun/shared"
62
62
  ],
63
63
  "optionalDependencies": {
64
- "@sigrun/sandbox-linux-arm64": "0.7.0",
65
- "@sigrun/sandbox-linux-x64": "0.7.0",
66
- "@sigrun/tui": "0.7.0"
64
+ "@sigrun/sandbox-linux-arm64": "0.9.0",
65
+ "@sigrun/sandbox-linux-x64": "0.9.0",
66
+ "@sigrun/tui": "0.9.0"
67
67
  },
68
68
  "devDependencies": {
69
69
  "@sigrun/memory-markdown": "file:../sigrun-memory-markdown",
@@ -0,0 +1 @@
1
+ .blk{min-width:0;margin:0}.blk-width{width:100%;container-type:inline-size}.blk-icon{vertical-align:-.15em;flex:none}.blk-unsupported{border:1px dashed var(--border);color:var(--muted);border-radius:8px;padding:.75rem 1rem;font-size:.9em}.blk-unsupported-note{color:var(--faint);margin:.25rem 0 0;font-size:.85em}.blk-stack{flex-direction:column;display:flex}.blk-columns{gap:1rem;display:flex}.blk-columns[data-stacked=true]{flex-direction:column}.blk-column{min-width:0}.blk-grid{gap:1rem;display:grid}.blk-grid-item[data-span=full]{grid-column:1/-1}.blk-section{border:1px solid var(--border);background:var(--surface);border-radius:10px;padding:.9rem 1.1rem}.blk-section-head{flex-wrap:wrap;align-items:baseline;gap:.25rem .75rem;margin-bottom:.6rem;display:flex}.blk-section-title{color:var(--text);font-size:.95em;font-weight:600}.blk-section-subtitle{color:var(--faint);font-size:.85em}.blk-section-toggle{color:inherit;cursor:pointer;font:inherit;background:0 0;border:0;align-items:center;gap:.4rem;padding:0;display:flex}.blk-section-caret{color:var(--faint);width:1em}.blk-markdown .md{font-size:.95em}.blk-fields dl{gap:.35rem;margin:0;display:grid}.blk-field-row{justify-content:space-between;gap:1rem;display:flex}.blk-field-row dt{color:var(--muted);flex:none}.blk-field-row dd{overflow-wrap:anywhere;text-align:end;gap:.4rem;margin:0;display:flex}.blk-stat{flex-direction:column;gap:.15rem;display:flex}.blk-stat[data-size=s]{font-size:.9em}.blk-stat[data-size=l]{font-size:1.15em}.blk-stat-top{color:var(--muted);align-items:center;gap:.4rem;font-size:.85em;display:flex}.blk-stat-value{font-variant-numeric:tabular-nums;font-size:1.6em;font-weight:650;line-height:1.2}.blk-stat[data-size=s] .blk-stat-value{font-size:1.3em}.blk-stat[data-size=l] .blk-stat-value{font-size:2em}.blk-stat-unit{color:var(--muted);font-size:.6em;font-weight:400}.blk-stat-caption{color:var(--faint);font-size:.8em}.blk-spark{color:var(--muted);width:100%;height:24px;margin-top:.25rem;display:block}.blk-callout{border-left:3px solid var(--muted);border-radius:0 8px 8px 0;padding:.6rem .9rem}.blk-callout[data-tone=accent]{border-left-color:var(--accent);background:var(--accent-bg)}.blk-callout[data-tone=good]{border-left-color:var(--ok);background:color-mix(in srgb, var(--ok) 10%, transparent)}.blk-callout[data-tone=warn]{border-left-color:var(--warn);background:color-mix(in srgb, var(--warn) 12%, transparent)}.blk-callout[data-tone=bad]{border-left-color:var(--danger);background:color-mix(in srgb, var(--danger) 10%, transparent)}.blk-callout[data-tone=info]{border-left-color:var(--muted);background:var(--code)}.blk-callout-title{font-weight:650}.blk-callout-body{margin-top:.25rem;font-size:.9em}.blk-image{border-radius:8px;max-width:100%;height:auto}.blk-image-fallback{border:1px dashed var(--border);color:var(--muted);border-radius:8px;padding:.75rem;font-size:.9em}.blk-diff-path{color:var(--faint);font-family:var(--mono);margin-bottom:.35rem;font-size:.8em}.blk-diff-panes{border-radius:8px;grid-template-columns:1fr 1fr;gap:.5rem;display:grid;overflow-x:auto}.blk-diff-panes pre{background:var(--code);font-family:var(--mono);white-space:pre-wrap;border-radius:6px;margin:0;padding:.6rem .75rem;font-size:.82em}.blk-diff-after{border:1px solid color-mix(in srgb, var(--ok) 35%, transparent)}.blk-diff-before{border:1px solid color-mix(in srgb, var(--danger) 35%, transparent)}@container (width<=40rem){.blk-diff-panes{grid-template-columns:1fr}}.blk-details summary{color:var(--muted);cursor:pointer;font-size:.9em}.blk-details-json{background:var(--code);font-family:var(--mono);white-space:pre-wrap;border-radius:6px;margin:.5rem 0 0;padding:.6rem .75rem;font-size:.82em}:root{--chart-1:var(--accent);--chart-2:#6fb3e0;--chart-3:#86c79b;--chart-4:#d9a35a;--chart-5:#b48ead;--chart-6:#e08f7a;--chart-7:#7fc7c7;--chart-8:#a9b665}[data-mode=light]{--chart-2:#3e78a8;--chart-3:#4a8a5f;--chart-4:#8a6116;--chart-5:#83619c;--chart-6:#b35c42;--chart-7:#3d8f8f;--chart-8:#6f7a2f}.blk-chart{flex-direction:column;gap:.35rem;min-width:0;display:flex}.blk-chart-head{flex-wrap:wrap;align-items:baseline;gap:.25rem .75rem;display:flex}.blk-chart-title{color:var(--muted);font-size:.85em}.blk-chart-legend{flex-wrap:wrap;gap:.25rem .9rem;margin-left:auto;display:flex}.blk-chart-legend[data-legend=below]{margin-left:0}.blk-chart-legend-item{color:var(--muted);align-items:center;gap:.35rem;font-size:.8em;display:inline-flex}.blk-chart-swatch{border-radius:2px;width:.9em;height:.6em;display:inline-block}.blk-chart-svg{width:100%;display:block}.blk-chart-grid{stroke:var(--border);stroke-dasharray:2 4;stroke-width:1px}.blk-chart-tick{fill:var(--faint);font-size:11px}.blk-chart-tick-line{stroke:var(--faint);stroke-width:1px}.blk-chart-y-caption{font-size:10px}.blk-chart-threshold{stroke-dasharray:6 4;stroke-width:1.5px}.blk-chart-threshold[data-tone=neutral]{stroke:var(--text)}.blk-chart-threshold[data-tone=accent]{stroke:var(--accent)}.blk-chart-threshold[data-tone=good]{stroke:var(--ok)}.blk-chart-threshold[data-tone=warn]{stroke:var(--warn)}.blk-chart-threshold[data-tone=bad]{stroke:var(--danger)}.blk-chart-threshold[data-tone=info]{stroke:var(--muted)}.blk-chart-threshold-label{font-size:10px}.blk-chart-threshold-label[data-tone=neutral]{fill:var(--text)}.blk-chart-threshold-label[data-tone=accent]{fill:var(--accent)}.blk-chart-threshold-label[data-tone=good]{fill:var(--ok)}.blk-chart-threshold-label[data-tone=warn]{fill:var(--warn)}.blk-chart-threshold-label[data-tone=bad]{fill:var(--danger)}.blk-chart-threshold-label[data-tone=info]{fill:var(--muted)}.blk-chart-spark-row{align-items:baseline;gap:.5rem;display:flex}.blk-chart-spark{flex:1;min-width:0;height:24px}.blk-chart-spark-name{color:var(--muted);text-overflow:ellipsis;white-space:nowrap;flex:none;font-size:.8em;overflow:hidden}.blk-chart-spark-value{font-variant-numeric:tabular-nums;flex:none;font-size:.9em;font-weight:650}.blk-meter{flex-direction:column;gap:.3rem;display:flex}.blk-meter-head{justify-content:space-between;gap:.75rem;display:flex}.blk-meter-label{color:var(--muted);font-size:.85em}.blk-meter-value{font-variant-numeric:tabular-nums;font-size:.9em}.blk-meter-track{background:var(--code);border-radius:999px;width:100%;height:8px;overflow:hidden}.blk-meter-fill{background:var(--muted);border-radius:999px;height:100%;transition:width .2s}.blk-meter[data-tone=accent] .blk-meter-fill{background:var(--accent)}.blk-meter[data-tone=good] .blk-meter-fill{background:var(--ok)}.blk-meter[data-tone=warn] .blk-meter-fill{background:var(--warn)}.blk-meter[data-tone=bad] .blk-meter-fill{background:var(--danger)}.blk-meter[data-tone=info] .blk-meter-fill{background:var(--muted)}.blk-log-lines{background:var(--code);font-family:var(--mono);border-radius:8px;max-height:20rem;padding:.55rem .75rem;font-size:.82em;line-height:1.45;overflow-y:auto}.blk-log-line{gap:.6rem;display:flex}.blk-log-line[data-wrap=true] .blk-log-text{white-space:pre-wrap}.blk-log-time{color:var(--faint);flex:none;font-size:.9em}.blk-log-level{text-transform:uppercase;flex:none;min-width:3.5em;font-size:.85em;font-weight:650}.blk-log-text{white-space:pre}.blk-tree{flex-direction:column;display:flex}.blk-tree-row{cursor:pointer;border-radius:6px;align-items:center;gap:.35rem;padding:.15rem .25rem;display:flex}.blk-tree-row:hover{background:var(--code)}.blk-tree-toggle{color:var(--faint);cursor:pointer;font:inherit;background:0 0;border:0;flex:none;justify-content:center;align-items:center;width:1.1rem;padding:0;display:inline-flex}.blk-tree-toggle:disabled{cursor:default}.blk-tree-caret{transition:transform .15s}.blk-tree-caret[data-open=true]{transform:rotate(90deg)}.blk-tree-dot{width:3px;height:3px;display:inline-block}.blk-tree-label{overflow-wrap:anywhere}.blk-tree-children{flex-direction:column;display:flex}.blk-tree-pending{color:var(--faint);padding:.15rem .25rem}.blk-actions{flex-wrap:wrap;gap:.5rem;margin-top:.5rem;display:flex}.blk-action{background:var(--surface-2);border:1px solid var(--border);color:var(--text);cursor:pointer;font:inherit;border-radius:8px;align-items:center;gap:.4rem;padding:.3rem .7rem;font-size:.85em;display:inline-flex}.blk-action:hover{border-color:var(--accent)}.blk-confirm{background:var(--surface);border:1px solid var(--border);border-radius:10px;max-width:24rem;margin-top:.5rem;padding:.8rem 1rem}.blk-confirm[data-tone=bad]{border-color:color-mix(in srgb, var(--danger) 50%, var(--border))}.blk-confirm[data-tone=warn]{border-color:color-mix(in srgb, var(--warn) 50%, var(--border))}.blk-confirm-title{font-weight:650}.blk-confirm-body{color:var(--muted);margin-top:.3rem;font-size:.9em}.blk-confirm-row{justify-content:flex-end;gap:.5rem;margin-top:.7rem;display:flex}.blk-confirm-row button{background:var(--surface-2);border:1px solid var(--border);color:var(--text);cursor:pointer;font:inherit;border-radius:8px;padding:.3rem .8rem;font-size:.85em}.blk-confirm-row .blk-confirm-ok{background:var(--accent-bg);border-color:var(--accent)}.blk-card{background:var(--surface-2);border:1px solid var(--border);border-radius:10px;gap:.6rem;min-width:0;display:flex;position:relative;overflow:hidden}.blk-card-stripe{width:3px;position:absolute;top:0;bottom:0;left:0}.blk-card-image[data-layout=top]{aspect-ratio:16/9;object-fit:cover;width:100%;height:auto;display:block}.blk-card-image[data-layout=thumb]{object-fit:cover;border-radius:8px;align-self:flex-start;width:3rem;height:3rem;margin:.6rem 0 .6rem .6rem}.blk-card:has(.blk-card-image[data-layout=top]){flex-direction:column}.blk-card-main{flex-direction:column;flex:1;gap:.35rem;min-width:0;padding:.6rem .7rem;display:flex}.blk-card-head{align-items:flex-start;gap:.5rem;min-width:0;display:flex}.blk-card-icon{color:var(--muted);margin-top:.1rem;display:inline-flex}.blk-card-titles{flex:1;min-width:0}.blk-card-eyebrow{color:var(--muted);overflow-wrap:anywhere;font-size:.78em}.blk-card-title{overflow-wrap:anywhere;font-weight:600}.blk-card-subtitle{color:var(--muted);overflow-wrap:anywhere;text-overflow:ellipsis;white-space:nowrap;font-size:.88em;overflow:hidden}.blk-card-body{min-width:0;font-size:.9em}.blk-card-body[data-clamped]{-webkit-line-clamp:4;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.blk-card-badges,.blk-card-meta,.blk-card-metrics{flex-wrap:wrap;gap:.4rem;display:flex}.blk-card-badge{background:var(--accent-bg);border-radius:999px;padding:.05rem .5rem;font-size:.75em}.blk-card-badge[data-tone=good]{color:var(--ok)}.blk-card-badge[data-tone=warn]{color:var(--warn)}.blk-card-badge[data-tone=bad]{color:var(--danger)}.blk-card-badge[data-tone=neutral]{color:var(--text)}.blk-card-badge[data-tone=info]{color:var(--muted)}.blk-card-meta{color:var(--muted);font-size:.8em}.blk-card-meta-item{overflow-wrap:anywhere;align-items:center;gap:.25rem;display:inline-flex}.blk-card-metric{flex-direction:column;display:inline-flex}.blk-card-metric-value{font-weight:600}.blk-card-metric-label{color:var(--muted);font-size:.75em}.blk-card-deps{color:var(--muted);overflow-wrap:anywhere;font-size:.8em}.blk-card-status{border:1px solid var(--border);white-space:nowrap;border-radius:999px;align-items:center;gap:.3rem;padding:.05rem .5rem;font-size:.75em;display:inline-flex}.blk-card-status[data-tone=good]{color:var(--ok)}.blk-card-status[data-tone=warn]{color:var(--warn)}.blk-card-status[data-tone=bad]{color:var(--danger)}.blk-card-spinner{border:2px solid var(--border);border-top-color:currentColor;border-radius:50%;width:.7em;height:.7em;animation:.9s linear infinite blk-card-spin;display:inline-block}@keyframes blk-card-spin{to{transform:rotate(360deg)}}.blk-card-actions{justify-content:flex-end;align-items:center;gap:.4rem;display:flex}.blk-card-actions .blk-actions{justify-content:flex-start;margin-top:0}.blk-card-overflow{position:relative}.blk-card-overflow>summary{cursor:pointer;list-style:none}.blk-card-overflow[open]>.blk-actions{background:var(--surface-2);border:1px solid var(--border);z-index:5;border-radius:8px;flex-direction:column;padding:.4rem;position:absolute;right:0}.blk-collection{flex-direction:column;gap:.6rem;display:flex}.blk-list-rows{flex-direction:column;gap:.4rem;margin:0;padding:0;list-style:none;display:flex}.blk-list-line{align-items:flex-start;gap:.5rem;min-width:0;display:flex}.blk-list-card{flex:1;min-width:0}.blk-list-card[role=button]{cursor:pointer}.blk-list-number{color:var(--muted);text-align:end;min-width:1.2rem;margin-top:.7rem;font-size:.85em}.blk-list-nested{margin:.4rem 0 0;padding:0;list-style:none}.blk-list-group{flex-direction:column;gap:.4rem;display:flex}.blk-list-heading{border-bottom:1px solid var(--border);overflow-wrap:anywhere;padding-bottom:.2rem;font-weight:600}.blk-quiet-toggle{color:var(--accent);cursor:pointer;font:inherit;background:0 0;border:none;align-self:flex-start;padding:.2rem 0;font-size:.85em}.blk-select,.blk-check{margin-top:.9rem}.blk-bulk{flex-wrap:wrap;align-items:center;gap:.4rem;display:flex}.blk-bulk-action,.blk-bulk-submit{background:var(--surface-2);border:1px solid var(--border);color:var(--text);cursor:pointer;font:inherit;border-radius:8px;padding:.3rem .8rem;font-size:.85em}.blk-bulk-form{align-items:center;gap:.4rem;display:flex}.blk-bulk-form input{background:var(--surface-2);border:1px solid var(--border);color:var(--text);font:inherit;border-radius:8px;padding:.25rem .5rem}.blk-table-wrap{overflow-x:auto}.blk-table{border-collapse:collapse;width:100%}.blk-table th{border-bottom:1px solid var(--border);text-align:start;padding:.4rem .6rem;font-weight:600}.blk-table td{border-bottom:1px solid var(--border);overflow-wrap:anywhere;padding:.4rem .6rem}.blk-table-sort{color:var(--text);cursor:pointer;font:inherit;background:0 0;border:none;padding:0;font-weight:600}.blk-table-sort[data-dir]:after{content:" " attr(data-dir)}.blk-table-pager{justify-content:center;align-items:center;gap:.6rem;margin-top:.6rem;display:flex}.blk-table-pager button{background:var(--surface-2);border:1px solid var(--border);color:var(--text);cursor:pointer;font:inherit;border-radius:8px;padding:.3rem .8rem}.blk-table-pager button:disabled{opacity:.5}.blk-table-compact{flex-direction:column;gap:.6rem;display:flex}.blk-table-card{border:1px solid var(--border);border-radius:10px;overflow:hidden}.blk-table-high,.blk-table-low-fields{grid-template-columns:auto 1fr;gap:.2rem .8rem;padding:.4rem .7rem;display:grid}.blk-table-field{display:contents}.blk-table-field dt{color:var(--muted);font-size:.8em}.blk-table-field dd{overflow-wrap:anywhere;margin:0}.blk-table-expand{color:var(--accent);cursor:pointer;font:inherit;background:0 0;border:none;padding:.2rem .7rem;font-size:.85em}.blk-grid-items{gap:.6rem;display:grid}.blk-grid-display[data-overflow=scroll] .blk-grid-items{grid-template-columns:none;grid-auto-flow:column}.blk-grid-card{cursor:pointer;min-width:0}.blk-lanes-row{align-items:flex-start;gap:.8rem;display:flex;overflow-x:auto}.blk-lane{flex:1 1 0;min-width:14rem}.blk-lane-heading{padding:.2rem .4rem;font-weight:600}.blk-lane-card{cursor:pointer;min-width:0;margin:.3rem 0}.blk-lane-switcher{font:inherit;margin-block-end:.4rem}.blk-move-to{position:relative}.blk-move-to-target{font:inherit;display:block}.blk-calendar-grid{grid-template-columns:repeat(7,1fr);gap:.2rem;display:grid}.blk-calendar-day{border:1px solid color-mix(in srgb, currentColor 12%, transparent);min-height:3.5rem;padding:.2rem}.blk-calendar-daynum{opacity:.6;font-size:.75em}.blk-calendar-item{cursor:pointer;font-size:.85em;position:relative}.blk-calendar-resize{cursor:ew-resize;inset-inline-end:0;width:.6rem;height:.6rem;display:inline-block;position:absolute;bottom:0}.blk-agenda-row{cursor:pointer;gap:.6rem;padding:.2rem 0;display:flex}.blk-agenda-when{opacity:.7;white-space:nowrap;font-size:.8em}.blk-lane-card,.blk-calendar-item,.blk-calendar-resize{touch-action:none}.blk-form{gap:var(--sp-3,.75rem);flex-direction:column;display:flex}.blk-form[data-mode=inline]{flex-direction:row;align-items:flex-end}.blk-field{flex-direction:column;gap:.25rem;display:flex}.blk-field-label{font-weight:500}.blk-field-help{color:var(--fg-dim,#888);font-size:.875em}.blk-field-error{color:var(--bad,#d33);font-size:.875em}.blk-choice{gap:1rem;display:flex}.blk-choice[data-preview=beside]{flex-direction:row}.blk-choice[data-preview=below]{flex-direction:column}.blk-choice-options{flex-direction:column;gap:.25rem;display:flex}.blk-choice-option{align-items:baseline;gap:.5rem;display:flex}.blk-choice-description{color:var(--fg-dim,#888);font-size:.875em}.blk-choice-preview{min-width:12rem}.blk-secret{align-items:center;gap:.5rem;display:flex}.blk-secret-status{color:var(--fg-dim,#888);font-size:.875em}.blk-list-entry{align-items:flex-start;gap:.5rem;display:flex}.blk-daterange{flex-wrap:wrap;gap:.5rem;display:flex}.blk-stepper-progress{color:var(--fg-dim,#888);font-size:.875em}.blk-stepper-nav{gap:.5rem;display:flex}.blk-form .blk-section{gap:var(--sp-3,.75rem);flex-direction:column;display:flex}.blk-form .blk-section-title{margin:0}.blk-field :is(input:not([type=radio],[type=checkbox],[type=file],[type=range],[type=color]),textarea,select){background:var(--bg,#111);border:1px solid var(--border,#333);box-sizing:border-box;color:var(--text,#ddd);font:inherit;border-radius:6px;width:100%;max-width:32rem;padding:.35rem .55rem}.blk-field textarea{max-width:48rem}.blk-field :is(input,textarea,select):focus-visible{border-color:var(--accent);outline:none}.blk-field .blk-daterange input{width:auto}.blk-secret-status{white-space:nowrap}.blk-field button{background:var(--surface-2);border:1px solid var(--border,#333);color:var(--text,#ddd);cursor:pointer;font:inherit;border-radius:6px;padding:.25rem .65rem;font-size:.85em}.blk-field button:hover{border-color:var(--accent)}.blk-form-submit{background:var(--accent);color:var(--bg,#111);cursor:pointer;font:inherit;border:none;border-radius:6px;align-self:flex-start;padding:.35rem 1rem;font-weight:600}.blk-form[data-mode=inline] .blk-form-submit{align-self:auto}.blk-stepper-nav button:not(.blk-form-submit){background:var(--surface-2);border:1px solid var(--border,#333);color:var(--text,#ddd);cursor:pointer;font:inherit;border-radius:6px;padding:.35rem .9rem}.blk-page{flex-direction:column;height:100%;min-height:0;display:flex}.blk-page-header{border-bottom:1px solid var(--border,#333);flex-wrap:wrap;align-items:center;gap:.75rem;padding:.75rem 1rem;display:flex}.blk-page-titles{flex:auto;min-width:0}.blk-page-title{margin:0;font-size:1.1rem}.blk-page-subtitle{color:var(--fg-subtle,#999);margin:0;font-size:.85rem}.blk-page-body{flex:auto;gap:1rem;min-height:0;padding:1rem;display:flex}.blk-page-sidebar{flex:0 0 16rem;overflow:auto}.blk-page-main{flex:auto;min-width:0;overflow:auto}.blk-page-detail{flex:0 0 24rem;overflow:auto}.blk-page-empty{text-align:center;color:var(--fg-subtle,#999);padding:3rem 1rem}.blk-page-empty-title{color:var(--fg,#ddd);font-size:1rem;font-weight:600}.blk-page-switcher{gap:.5rem;display:inline-flex}.blk-page-action{align-items:center;gap:.25rem;display:inline-flex}.blk-page-toggle{display:none}@container (width<=39.99rem){.blk-page-toggle{display:inline-flex}.blk-page-sidebar,.blk-page-detail{display:none}.blk-page-sidebar[data-open],.blk-page-detail[data-open]{background:var(--bg,#111);z-index:20;padding:1rem;display:block;position:absolute;inset:0;overflow:auto}.blk-page-sidebar[data-selection=list]{z-index:auto;background:0 0;flex:auto;padding:0;display:block;position:static}.blk-page{position:relative}}.blk-surface{min-height:0}.blk-surface>.blk-surface-toast{position:fixed;bottom:1rem;right:1rem}.blk-chat-toast{margin:.25rem 0 0}:root{--bg:#090d16;--surface:#0f1524;--surface-2:#161e31;--border:#1f2942;--text:#e2e8f3;--muted:#8e9ab2;--faint:#5d6984;--ok:#5fd4a8;--code:#ffffff0f;--accent:#d6a24a;--accent-bg:#d6a24a24;--warn:#d9a35a;--danger:#e0707a;--serif:Georgia, "Iowan Old Style", serif;--sans:Inter, -apple-system, "Segoe UI", system-ui, sans-serif;--mono:"JetBrains Mono", ui-monospace, Menlo, monospace;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}[data-mode=light]{--warn:#8a6116;--danger:#b3363f;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}a{color:var(--accent)}[data-mode=light] a{color:var(--text);text-decoration:underline;-webkit-text-decoration-color:var(--accent);text-decoration-color:var(--accent)}*{box-sizing:border-box}html,body{height:100%;margin:0}body{font:14px/1.5 var(--sans);background:var(--bg);color:var(--text);overflow:hidden}#root{height:100%}.app-root{height:100%;display:flex;overflow:hidden}.app-boot,.app-refused{height:100%;color:var(--muted);text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:.5rem;padding:2rem;display:flex}.app-refused h1{color:var(--danger);margin:0;font-size:1.1rem}.app-refused p{max-width:70ch;font-family:var(--mono);word-break:break-all;font-size:.8rem}.side-drawer{background:var(--bg);flex:none;min-width:0;display:flex}.rail{border-right:1px solid var(--border);background:var(--bg);flex-direction:column;flex:none;align-items:center;gap:4px;width:52px;padding:12px 0;display:flex}.rail-brand{width:30px;height:30px;color:var(--accent);border:1px solid var(--border);border-radius:8px;place-items:center;margin-bottom:14px;display:grid}.rail-brand svg{width:18px;height:18px}.rail-btn{width:36px;height:36px;color:var(--faint);cursor:pointer;background:0 0;border:none;border-radius:8px;place-items:center;padding:0;display:grid;position:relative}.rail-btn:hover,.rail-btn-active{color:var(--text);background:var(--surface-2)}.rail-btn-active:before{content:"";background:var(--accent);border-radius:2px;width:2px;position:absolute;top:9px;bottom:9px;left:-8px}.rail-btn svg{width:18px;height:18px}.rail-spacer{flex:1}.rail-health{background:var(--ok);width:8px;height:8px;box-shadow:0 0 0 3px color-mix(in srgb, var(--ok) 15%, transparent);border-radius:50%;flex:none;margin:8px 0 10px}.rail-health[data-health=degraded]{background:var(--warn);box-shadow:0 0 0 3px color-mix(in srgb, var(--warn) 18%, transparent)}.rail-user{text-overflow:ellipsis;white-space:nowrap;max-width:44px;color:var(--muted);text-align:center;flex:none;margin:6px 0 2px;font-size:.68rem;overflow:hidden}.session-list{background:var(--surface);border-right:1px solid var(--border);flex-direction:column;flex:none;width:264px;min-height:0;padding:.4rem;display:flex}.session-search-row{gap:8px;margin:4px 2px 6px;display:flex}.session-search{border:1px solid var(--border);background:var(--bg);min-width:0;height:32px;color:var(--text);font:inherit;border-radius:8px;flex:1;padding:0 10px;font-size:13px}.session-search::placeholder{color:var(--faint)}.session-search:focus-visible{border-color:var(--accent);outline:none}.session-new{border:1px solid var(--border);width:32px;height:32px;color:var(--text);cursor:pointer;background:0 0;border-radius:8px;flex:none;place-items:center;padding:0;display:grid}.session-new:hover,.session-new:focus-visible{background:var(--surface-2)}.session-new svg{width:16px;height:16px}.session-list ul{flex:1;margin:.25rem 0 0;padding:0;list-style:none;overflow:auto}.session-group{letter-spacing:.04em;color:var(--faint);padding:10px 16px 4px;font-size:11px}.session-item{min-height:32px;color:var(--muted);border-radius:6px;align-items:center;gap:6px;margin:1px 8px;padding:0 6px 0 10px;display:flex;position:relative}.session-item:hover,.session-item:focus-within{background:var(--surface-2);color:var(--text)}.session-item-active{background:var(--accent-bg);color:var(--text)}.session-fork-mark{width:14px;color:var(--faint);text-align:right;flex:none;font-size:12px}.session-select{text-align:left;min-width:0;color:inherit;cursor:pointer;font:inherit;background:0 0;border:none;flex:1;padding:6px 0;display:block}.session-name{white-space:nowrap;text-overflow:ellipsis;display:block;overflow:hidden}.session-age{color:var(--faint);flex:none;font-size:11px}.session-row-actions{flex:none;display:flex;position:relative}.session-menu-toggle{width:22px;height:22px;color:var(--faint);cursor:pointer;background:0 0;border:none;border-radius:5px;place-items:center;padding:0;font-size:13px;line-height:1;display:grid}.session-menu-toggle svg{width:14px;height:14px}.session-menu-toggle{opacity:0;transition:opacity 80ms}.session-item:hover .session-menu-toggle,.session-item:focus-within .session-menu-toggle{opacity:1}.session-item:hover .session-age,.session-item:focus-within .session-age{opacity:0}.session-menu-toggle:hover,.session-menu-toggle:focus-visible{color:var(--text);background:var(--bg)}.session-menu{z-index:30;border:1px solid var(--border);background:var(--surface-2);border-radius:8px;flex-direction:column;min-width:130px;padding:4px;display:flex;position:absolute;top:24px;right:0;box-shadow:0 8px 24px #0000004d}.session-menu button{color:var(--text);font:inherit;text-align:left;cursor:pointer;background:0 0;border:none;border-radius:6px;padding:6px 10px;font-size:13px}.session-menu button:hover,.session-menu button:focus-visible{background:var(--accent-bg)}.session-rename-input{border:1px solid var(--accent);background:var(--bg);min-width:0;color:var(--text);font:inherit;border-radius:6px;flex:1;padding:3px 6px;font-size:13px}.session-empty{color:var(--faint);text-align:center;padding:16px;font-size:13px}.session-archived-toggle{width:calc(100% - 16px);color:var(--faint);font:inherit;cursor:pointer;background:0 0;border:none;border-radius:6px;flex:none;margin:6px 8px 2px;padding:5px 10px;font-size:12px}.session-archived-toggle:hover,.session-archived-toggle:focus-visible{background:var(--surface-2);color:var(--muted)}.session-archived-toggle[aria-pressed=true]{color:var(--text)}.session-item-archived>.session-fork-mark,.session-item-archived>.session-select,.session-item-archived>.session-age{opacity:.55}.side-error{color:var(--danger);margin:0;padding:6px 10px;font-size:12px}.main-column{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.main-body{flex:1;min-height:0;display:flex}.ext-surface{flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.chat-header{border-bottom:1px solid var(--border);background:var(--bg);flex:none;align-items:center;gap:10px;min-width:0;height:48px;padding:0 16px 0 24px;display:flex}.chat-title{color:var(--text);cursor:text;white-space:nowrap;text-overflow:ellipsis;background:0 0;border:none;min-width:0;padding:0;font-family:inherit;font-size:14px;font-weight:600;overflow:hidden}.chat-title-input{font:inherit;color:var(--text);background:var(--surface);border:1px solid var(--accent);border-radius:6px;width:min(360px,60vw);min-width:0;max-width:100%;padding:2px 8px;font-size:14px;font-weight:600}.chat-header-spacer{flex:1;min-width:12px}.icon-btn{width:30px;height:30px;color:var(--muted);cursor:pointer;background:0 0;border:none;border-radius:6px;flex:none;place-items:center;padding:0;display:grid}.icon-btn:hover{background:var(--surface-2);color:var(--text)}.icon-btn[aria-pressed=true]{color:var(--text);background:var(--surface-2)}.icon-btn svg{width:16px;height:16px}.chat-menu-slot{display:inline-flex;position:relative}.chat-menu{z-index:60;background:var(--surface);border:1px solid var(--border);border-radius:8px;flex-direction:column;min-width:148px;padding:4px;display:flex;position:absolute;top:34px;right:0;box-shadow:0 10px 28px #00000059}.chat-menu button{color:var(--text);text-align:left;font:inherit;cursor:pointer;background:0 0;border:none;border-radius:6px;padding:6px 10px;font-size:13px}.chat-menu button:hover{background:var(--surface-2)}.shell-error{color:var(--danger);border-bottom:1px solid var(--border);margin:0;padding:.35rem 24px;font-size:12.5px}.chat-menu-toggle{display:none}.chat-column{background:var(--bg);flex-direction:column;flex:1;min-width:0;min-height:0;display:flex;position:relative}.chat-center{overscroll-behavior-x:none;flex:1;min-height:0;padding:28px 24px 8rem;overflow:hidden auto}.chat-fade{z-index:1;pointer-events:none;background:linear-gradient(to bottom, transparent 0%, color-mix(in srgb, var(--bg) 85%, transparent) 45%, var(--bg) 70%);-webkit-backdrop-filter:blur(1.5px);backdrop-filter:blur(1.5px);height:12rem;position:absolute;bottom:0;left:0;right:0;-webkit-mask-image:linear-gradient(#0000,#000 40%);mask-image:linear-gradient(#0000,#000 40%)}.chat-empty,.chat-loading{color:var(--faint);text-align:center}.turn-list{flex-direction:column;gap:1.1rem;width:100%;max-width:720px;margin:0 auto;display:flex}.turn{flex-direction:column;align-items:stretch;min-width:0;display:flex}.turn-user{align-items:flex-end}.turn-lineage{color:var(--faint);font:inherit;cursor:pointer;background:0 0;border:none;align-self:flex-start;padding:0;font-size:12px}.turn-lineage:hover,.turn-lineage:focus-visible{color:var(--muted);text-underline-offset:3px;text-decoration:underline}.entry-user{flex-direction:column;align-items:stretch;display:flex}.entry-user-message{overflow-wrap:anywhere;background:var(--surface-2);border:1px solid var(--border);border-radius:14px 14px 4px;max-width:min(60ch,100%);padding:9px 14px}.entry-user-message p{margin:.25rem 0}.entry-expanded{flex-direction:column;align-items:flex-end;gap:.3rem;display:flex}.entry-expanded-chip{border:1px solid var(--border);color:var(--muted);cursor:pointer;background:0 0;border-radius:6px;padding:.1rem .5rem;font-size:.75rem}.entry-expanded-chip:hover{color:var(--text)}.entry-expanded-text{border:1px dashed var(--border);max-width:min(78%,60ch);color:var(--muted);white-space:pre-wrap;word-break:break-word;border-radius:8px;align-self:flex-end;padding:6px 10px;font-size:.8rem}.entry-blocks{border:1px solid var(--border);border-radius:8px;margin:.5rem 0;padding:.5rem .75rem}.entry-blocks-title{color:var(--muted);margin-bottom:.25rem;font-size:.8rem}.entry-blocks-unknown{font-size:.8rem;font-style:italic}.entry-note summary{cursor:pointer;color:var(--muted);font-size:.8rem}.entry-note-text{color:var(--muted);white-space:pre-wrap;padding:6px 10px;font-size:.8rem}.entry-answer-chip{border:1px solid var(--border);color:var(--muted);border-radius:6px;margin-top:.3rem;padding:.1rem .5rem;font-size:.75rem;display:inline-block}.turn-prose{word-break:break-word;min-width:0}.md{min-width:0}.md-prose{font-family:var(--serif);font-size:15px;line-height:1.65}.md-bubble{font-size:14px;line-height:1.5}.md>:last-child{margin-bottom:0}.md p{margin:0 0 .75rem}.md-bubble p{margin:.25rem 0}.md h1,.md h2,.md h3,.md h4,.md h5,.md h6{font-family:var(--sans);color:var(--text);margin:1.1rem 0 .5rem;line-height:1.3}.md h1{font-size:1.25rem}.md h2{font-size:1.15rem}.md h3{font-size:1.05rem}.md h4,.md h5,.md h6{font-size:1rem}.md ul,.md ol{margin:0 0 .75rem;padding-left:1.4rem}.md li{margin:.15rem 0}.md blockquote{border-left:2px solid var(--border);color:var(--muted);margin:0 0 .75rem;padding:.1rem 0 .1rem .75rem}.md hr{border:0;border-top:1px solid var(--border);margin:1rem 0}.md img{max-width:100%}.md code{font-family:var(--mono);background:var(--code);border-radius:4px;padding:.1em .35em;font-size:.88em}.md-tbl{border:1px solid var(--border);font-family:var(--sans);border-radius:10px;margin:.35rem 0 .9rem;font-size:13px;overflow:hidden}.md-tbl-bar{border-bottom:1px solid var(--border);background:var(--surface);color:var(--faint);align-items:center;gap:.5rem;padding:.35rem .6rem;font-size:12px;display:flex}.md-tbl-bar input{min-width:0;color:var(--text);font:12px var(--sans);background:0 0;border:none;outline:none;flex:1}.md-tbl-count{color:var(--faint);white-space:nowrap;margin-left:auto;font-size:12px}.md-tbl-scroll{overscroll-behavior-x:contain;overflow-x:auto}.md-tbl table{border-collapse:collapse;width:100%}.md-tbl th,.md-tbl td{word-break:normal;overflow-wrap:normal}.md-tbl th{text-align:left;color:var(--muted);border-bottom:1px solid var(--border);background:var(--surface);padding:7px 10px;font-weight:500}.md-tbl td{border-bottom:1px solid var(--border);color:var(--text);padding:7px 10px}.md-tbl tbody tr:last-child td{border-bottom:none}.md-code{border:1px solid var(--border);background:color-mix(in srgb, var(--surface) 55%, var(--bg));border-radius:10px;margin:.35rem 0 .9rem}.md-code-head{border-bottom:1px solid var(--border);font-family:var(--sans);color:var(--faint);justify-content:space-between;align-items:center;padding:.3rem .6rem;font-size:11px;display:flex}.md-code-lang{font-family:var(--mono)}.md-code-copy{color:var(--faint);font:inherit;cursor:pointer;background:0 0;border:none;border-radius:5px;padding:1px 7px}.md-code-copy:hover,.md-code-copy:focus-visible{color:var(--text);background:var(--surface-2)}.md-code-copy[data-copied]{color:var(--ok)}.md-code pre{font:12.5px/1.55 var(--mono);color:var(--text);margin:0;padding:.6rem .75rem;overflow-x:auto}.md-code pre code{font:inherit;background:0 0;border-radius:0;padding:0}.entry-attachment{font-family:var(--mono);color:var(--muted);margin-left:.4rem;font-size:.75rem}.message-actions{opacity:0;align-items:center;gap:.15rem;min-height:24px;margin-top:2px;transition:opacity 80ms;display:flex}.message-actions[data-kind=user]{justify-content:flex-end}.turn:hover .message-actions,.turn:focus-within .message-actions{opacity:1}.message-action{color:var(--faint);font:inherit;cursor:pointer;background:0 0;border:none;border-radius:5px;padding:2px 7px;font-size:12px}.message-action:hover,.message-action:focus-visible{color:var(--text);background:var(--surface-2)}.message-action[data-copied]{color:var(--ok)}.message-meta{color:var(--faint);font-family:var(--mono);white-space:nowrap;margin-left:auto;font-size:11px}.activity-line{flex-direction:column;align-items:flex-start;margin-top:.35rem;display:flex}.activity-toggle{color:var(--muted);font-family:var(--mono);cursor:pointer;background:0 0;border:none;align-items:center;gap:.45rem;padding:1px 0;font-size:11.5px;display:inline-flex}.activity-toggle:hover,.activity-toggle:focus-visible{color:var(--text)}.activity-failed{color:var(--danger)}.activity-body{border-left:2px solid var(--border);flex-direction:column;gap:.15rem;width:100%;margin-top:.25rem;padding-left:.85rem;display:flex}.activity-thinking{color:var(--faint);white-space:pre-wrap;margin:.1rem 0 .25rem;font-size:.82rem;font-style:italic}.activity-spinner,.tool-row-spinner{border:1.5px solid var(--border);border-top-color:var(--accent);border-radius:50%;flex:none;width:9px;height:9px;animation:.8s linear infinite activity-spin}@keyframes activity-spin{to{transform:rotate(360deg)}}.entry-system,.entry-unknown{color:var(--muted);font-size:.8rem}.turn-compaction{color:var(--faint);letter-spacing:.05em;align-items:center;gap:12px;font-size:11px;display:flex}.turn-compaction:before,.turn-compaction:after{content:"";border-top:1px solid var(--border);flex:1}.chat-working{color:var(--muted);align-items:center;gap:.3rem;padding:.4rem .2rem;font-size:.8rem;display:flex}.chat-working-dot{background:var(--muted);border-radius:50%;width:6px;height:6px;animation:1.2s ease-in-out infinite working-bounce}.chat-working-dot:nth-child(2){animation-delay:.15s}.chat-working-dot:nth-child(3){animation-delay:.3s}@keyframes working-bounce{0%,to{opacity:.25;transform:translateY(0)}50%{opacity:1;transform:translateY(-3px)}}.chat-working-label{margin-left:.25rem}.chat-compaction-failure{color:var(--danger);margin:.25rem 0;font-size:.8rem}.tool-row{flex-direction:column;min-width:0;display:flex}.tool-row-head{align-items:center;gap:.4rem;min-width:0;display:flex}.tool-row-toggle{min-width:0;color:var(--muted);font-family:var(--mono);text-align:left;cursor:pointer;background:0 0;border:none;flex:1;align-items:baseline;gap:.5rem;padding:1px 0;font-size:12px;display:flex}.tool-row-toggle:hover,.tool-row-toggle:focus-visible{color:var(--text)}.tool-row[data-error] .tool-row-toggle{color:var(--danger)}.tool-row-glyph{flex:none}.tool-row-glyph[data-glyph=ok]{color:var(--ok)}.tool-row-glyph[data-glyph=error]{color:var(--danger)}.tool-row-glyph[data-glyph=pending]{color:var(--faint)}.tool-row-name{flex:none}.tool-row-preview{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.tool-row-actions{opacity:0;flex:none;gap:.15rem;transition:opacity 80ms;display:flex}.tool-row:hover .tool-row-actions,.tool-row:focus-within .tool-row-actions{opacity:1}.tool-row-detail{flex-direction:column;gap:.35rem;margin:.25rem 0 .35rem;display:flex}.tool-row-args,.tool-row-output{background:var(--code);font-family:var(--mono);white-space:pre;border-radius:6px;max-height:240px;margin:0;padding:.45rem .6rem;font-size:12px;overflow:auto}.tool-row-more{color:var(--faint);font:inherit;cursor:pointer;background:0 0;border:none;align-self:flex-start;padding:0;font-size:12px}.tool-row-more:hover,.tool-row-more:focus-visible{color:var(--text);text-underline-offset:3px;text-decoration:underline}.tool-row-diff{background:var(--code);font-family:var(--mono);white-space:pre;border-radius:6px;max-height:240px;margin:0;padding:.45rem .6rem;font-size:12px;overflow:auto}.tool-row-diff .diff-line-add{color:var(--ok)}.tool-row-diff .diff-line-del{color:var(--danger)}.tool-row-diff .diff-line-ctx{color:var(--muted)}.composer-slot{z-index:2;background:var(--bg);padding:.75rem 24px 1.1rem;position:absolute;bottom:0;left:0;right:0}.composer{border:1px solid var(--border);background:var(--surface);border-radius:14px;flex-direction:column;gap:.55rem;max-width:720px;margin:0 auto;padding:12px;display:flex}.composer-input{resize:none;width:100%;color:var(--text);font:inherit;background:0 0;border:none;min-height:1.6rem;max-height:40vh;padding:.35rem .25rem .45rem;transition:height .12s ease-out;overflow-y:auto}.composer-input:focus-visible{outline:1px solid var(--border);outline-offset:3px;border-radius:6px}.composer-toolbar{flex-wrap:nowrap;align-items:center;gap:4px;min-width:0;display:flex}.composer-toolbar>*{flex-shrink:0}.composer-toolbar>.composer-picker-model{flex-shrink:1;min-width:0}.composer-picker-model .composer-pill{min-width:0;max-width:100%}.composer-pill-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}@media (width<=600px){.composer-pill-prefix{display:none}}.composer-toolbar-spacer{flex:1}.composer-pill{height:28px;color:var(--muted);font:inherit;cursor:pointer;background:0 0;border:none;border-radius:7px;align-items:center;gap:6px;padding:0 9px;font-size:12.5px;display:inline-flex}.composer-pill:hover,.composer-pill[aria-expanded=true]{background:var(--surface-2);color:var(--text)}.composer-pill:disabled{opacity:.55;cursor:default}.composer-pill svg{width:15px;height:15px}.composer-pill-caret{color:var(--faint);font-size:10px}.composer-picker{min-width:0;display:inline-flex;position:relative}.composer-picker-menu{z-index:60;background:var(--surface);border:1px solid var(--border);border-radius:8px;flex-direction:column;gap:1px;min-width:210px;max-height:16rem;margin:0;padding:4px;list-style:none;display:flex;position:absolute;bottom:calc(100% + 6px);left:0;overflow:auto;box-shadow:0 10px 28px #00000059}.composer-picker-menu li{color:var(--text);cursor:pointer;white-space:nowrap;border-radius:6px;align-items:baseline;gap:8px;padding:6px 10px;font-size:13px;display:flex}.composer-picker-menu li[data-highlighted]{background:var(--accent-bg)}.composer-picker-check{color:var(--accent);font-size:12px}.composer-picker-id{color:var(--muted);font-family:var(--mono);margin-left:auto;padding-left:12px;font-size:11.5px}.composer-ring{color:var(--faint);justify-content:center;align-items:center;gap:6px;margin-right:6px;font-size:11.5px;display:inline-flex}.composer-ring-track{fill:none;stroke:var(--border);stroke-width:3px}.composer-ring-fill{fill:none;stroke:var(--accent);stroke-width:3px;stroke-linecap:round}.composer-send{background:var(--accent);width:30px;height:30px;color:var(--bg);cursor:pointer;border:0;border-radius:8px;flex:none;place-items:center;padding:0;display:grid}.composer-send svg{width:16px;height:16px}.composer-send.composer-send-disabled{background:var(--surface-2);color:var(--faint);cursor:default}.composer-queued{color:var(--warn);white-space:nowrap;font-size:12px}.composer-attach{padding:0 7px}.composer-attach[data-uploading]{opacity:.6;cursor:default}.composer-hint{text-align:center;max-width:720px;color:var(--faint);margin:6px auto 0;font-size:11px}.composer-attachments{flex-wrap:wrap;gap:.4rem;margin:0;padding:0;list-style:none;display:flex}.composer-attachment{border:1px solid var(--border);color:var(--text);border-radius:6px;align-items:center;gap:.35rem;padding:.15rem .5rem;font-size:.78rem;display:flex}.composer-attachment-remove{color:var(--muted);cursor:pointer;background:0 0;border:none;padding:0;font-size:.9rem}.right-panel{background:var(--surface);border-left:1px solid var(--border);flex-direction:column;flex:none;width:280px;min-height:0;display:flex}.right-panel-title{color:var(--faint);letter-spacing:.04em;margin:14px 10px 8px;font-size:11px;font-weight:500}.right-panel-body{flex-direction:column;flex:1;min-height:0;display:flex}.outline{flex-direction:column;flex:1;gap:1px;min-height:0;padding:0 .5rem .75rem;display:flex;overflow-y:auto}.outline-empty{color:var(--faint);margin:.25rem .75rem;font-size:12.5px}.outline-item{text-align:left;color:var(--muted);font:12.5px/1.35 var(--sans);cursor:pointer;background:0 0;border:none;border-left:2px solid #0000;border-radius:0 6px 6px 0;padding:6px 8px}.outline-text{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.outline-item[data-clamped=true] .outline-text{-webkit-mask-image:linear-gradient(#000 calc(100% - .7em),#0000);mask-image:linear-gradient(#000 calc(100% - .7em),#0000)}.outline-item:hover,.outline-item:focus-visible{background:var(--surface-2);color:var(--text)}.outline-item[aria-current=true]{color:var(--text);border-left-color:var(--accent)}.workspace-browser{flex-direction:column;height:100%;min-height:0;padding:.6rem .8rem;display:flex}.workspace-title{color:var(--faint);text-transform:uppercase;letter-spacing:.5px;align-items:center;margin:0 0 .6rem;font-size:12px;font-weight:600;display:flex}.workspace-close{color:var(--muted);cursor:pointer;text-transform:none;background:0 0;border:none;margin-left:auto;padding:0 .2rem;font-size:14px;display:none}.workspace-tree,.workspace-children{margin:0;padding:0;list-style:none}.workspace-tree{font-family:var(--mono);flex:1;min-height:0;font-size:12px;overflow:auto}.workspace-dir,.workspace-file{width:100%;color:inherit;text-align:left;cursor:pointer;font:inherit;background:0 0;border:none;border-radius:5px;padding:.2rem .3rem;display:block}.workspace-file{color:var(--muted)}.workspace-dir:hover,.workspace-file:hover{background:var(--surface-2)}.workspace-file:hover{color:var(--text)}.workspace-file[data-selected]{background:var(--surface-2);color:var(--text)}.file-preview{border-top:1px solid var(--border);background:var(--surface-2);max-height:40%;padding:.6rem .8rem;overflow:auto}.file-preview-path{color:var(--muted);word-break:break-all;margin:0 0 .4rem;font-size:.75rem}.file-preview-content{font-family:var(--mono);white-space:pre-wrap;word-break:break-word;margin:0;font-size:11px;overflow:auto}.file-preview-binary,.file-preview-loading,.workspace-empty,.workspace-loading{color:var(--faint);font-size:.8rem}.drawer-backdrop,.panel-backdrop{display:none}:root{--bottom-bar-h:52px}.bottom-bar,.bottom-sheet-backdrop{display:none}@media (width<=900px){.side-drawer .rail{display:none}.side-drawer .session-list{border-right:none;width:min(320px,85vw)}.bottom-bar{z-index:80;height:calc(var(--bottom-bar-h) + env(safe-area-inset-bottom));background:var(--bg);border-top:1px solid var(--border);padding-bottom:env(safe-area-inset-bottom);justify-content:space-around;align-items:stretch;display:flex;position:fixed;bottom:0;left:0;right:0}.bottom-bar-btn{color:var(--faint);cursor:pointer;background:0 0;border:none;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:2px;padding:6px 0 4px;display:flex}.bottom-bar-btn svg{width:20px;height:20px}.bottom-bar-btn:hover,.bottom-bar-btn-active{color:var(--text)}.bottom-bar-btn-active{box-shadow:inset 0 2px 0 var(--accent)}.bottom-bar-label{font-size:10px;line-height:1}.bottom-sheet-backdrop{z-index:95;background:#00000059;flex-direction:column;justify-content:flex-end;display:flex;position:fixed;inset:0}.bottom-sheet{background:var(--surface);border-top:1px solid var(--border);padding:8px 8px calc(8px + env(safe-area-inset-bottom));border-radius:12px 12px 0 0;flex-direction:column;gap:2px;max-height:60vh;display:flex;overflow-y:auto}.bottom-sheet-item{color:var(--text);cursor:pointer;text-align:left;background:0 0;border:none;border-radius:8px;align-items:center;gap:10px;padding:10px 12px;font-size:1rem;display:flex}.bottom-sheet-item:hover{background:var(--surface-2)}.bottom-sheet-item svg{width:18px;height:18px;color:var(--muted);flex:none}.side-drawer{z-index:90;transition:transform .18s;position:fixed;top:0;bottom:0;left:0;transform:translate(-100%)}.side-drawer[data-open]{transform:translate(0);box-shadow:0 0 32px #00000059}.chat-menu-toggle{display:grid}.right-panel{z-index:90;width:min(320px,85vw);position:fixed;top:0;bottom:0;right:0;box-shadow:-12px 0 32px #00000073}.workspace-close{display:block}.drawer-backdrop,.panel-backdrop{z-index:85;background:#00000059;display:block;position:fixed;inset:0}.chat-center{padding:20px 16px 8rem}.main-column{padding-bottom:calc(var(--bottom-bar-h) + env(safe-area-inset-bottom))}.chat-header{padding:0 12px 0 16px}.composer-slot{padding:.5rem 16px .9rem}.settings-layout{flex-direction:column;gap:.5rem;padding:.6rem 12px .6rem 16px}.settings-nav{flex-flow:row;gap:.2rem;width:auto;padding-left:0;overflow:auto hidden}.settings-nav .settings-nav-group{flex-direction:row;align-items:center;gap:.2rem}.settings-nav-item{white-space:nowrap;flex:none}.settings-section{padding:0 4px 1.5rem 0;overflow-y:auto}}.composer-notice{color:var(--muted);margin:.25rem 0;font-size:.8rem}.composer-command-menu{border:1px solid var(--border);background:var(--surface-2);border-radius:8px;max-height:12rem;margin:0;padding:.25rem 0;font-size:.8rem;list-style:none;overflow:auto}.composer-command-menu li{cursor:pointer;align-items:baseline;gap:.5rem;padding:.3rem .6rem;display:flex}.composer-command-menu li[data-highlighted]{background:var(--accent-bg)}.composer-command-name{font-weight:600}.composer-command-args{color:var(--muted);font-family:var(--mono)}.composer-command-description{color:var(--muted)}.settings-page{background:var(--bg);flex-direction:column;flex:1;min-width:0;min-height:0;display:flex}.settings-panel{flex-direction:column;flex:1;min-height:0;padding:0;display:flex}.settings-head{border-bottom:1px solid var(--border);background:var(--bg);flex:none;align-items:center;gap:.5rem;height:48px;padding:0 16px 0 24px;display:flex}.settings-title{letter-spacing:.2px;font-weight:650}.settings-head .spacer{flex:1}.settings-body{flex-direction:column;gap:.625rem;min-width:0;max-width:min(100%,52rem);display:flex}.settings-search{background:var(--surface-2);border:1px solid var(--border);color:var(--text);font:inherit;border-radius:6px;width:16rem;max-width:40vw;padding:.3rem .6rem;font-size:13px}.settings-search:focus-visible{border-color:var(--accent);outline:none}:is(.settings-provider-save,.settings-provider-clear,.settings-provider-refresh,.token-create,.token-copy,.token-dismiss,.token-revoke,.token-revoke-cancel,.token-revoke-confirm,.account-remove,.settings-ext-save,.settings-ext-secret-set,.settings-ext-secret-delete,.settings-ext-secret-add,.settings-restart){background:var(--surface-2);border:1px solid var(--border);color:var(--text);cursor:pointer;font:inherit;border-radius:6px;padding:.3rem .8rem;font-size:13px}:is(.settings-provider-save,.token-create,.settings-ext-save){background:var(--accent);border-color:var(--accent);color:var(--bg);font-weight:600}:is(.token-revoke-confirm,.account-remove):hover{border-color:var(--danger)}:is(.settings-provider-save,.settings-provider-clear,.settings-provider-refresh,.token-create,.settings-ext-save,.settings-ext-secret-set,.settings-ext-secret-add):disabled{cursor:default;opacity:.5}.token-name-input{background:var(--bg);border:1px solid var(--border);color:var(--text);font:inherit;border-radius:6px;min-width:14rem;padding:.3rem .5rem;font-size:13px}.settings-layout{flex:1;gap:.75rem;min-width:0;min-height:0;padding:.75rem 1rem .75rem 0;display:flex}.settings-nav{flex-direction:column;flex:none;gap:.2rem;width:11rem;padding-left:.5rem;display:flex;overflow-y:auto}.settings-nav-item{text-align:left;color:var(--muted);cursor:pointer;background:0 0;border:none;border-radius:5px;padding:.3rem .6rem;font-size:13px}.settings-nav-item:hover{background:var(--surface-2)}.settings-nav-item[data-active]{background:var(--accent-bg);color:var(--text)}.settings-nav-group{flex-direction:column;gap:.2rem;display:flex}.settings-section{flex:1;min-width:0;padding:0 1rem 1.5rem .5rem;overflow-y:auto}.settings-field{border:none;flex-direction:column;gap:.25rem;margin:0;padding:0;display:flex}.settings-label{color:var(--muted);font-size:12px;font-family:var(--sans)}.settings-checkbox{flex-flow:wrap;align-items:center;gap:.4rem;font-size:13px}.settings-checkbox .settings-note{flex-basis:100%}.settings-tools{flex-flow:wrap;gap:.25rem .75rem;display:flex}.settings-tools .settings-note{flex-basis:100%;min-width:0}.settings-note{color:var(--faint);margin:0;font-size:11px}.settings-select-wrap{width:fit-content;max-width:100%;position:relative}.settings-select-wrap:after{content:"▾";color:var(--muted);pointer-events:none;font-size:11px;position:absolute;top:50%;right:.55rem;transform:translateY(-50%)}.settings-field select{appearance:none;background:var(--bg);color:var(--text);border:1px solid var(--border);font:inherit;cursor:pointer;border-radius:6px;max-width:100%;padding:.35rem 1.7rem .35rem .6rem;font-size:13px}.settings-mode-row{background:var(--bg);border:1px solid var(--border);border-radius:8px;gap:3px;width:fit-content;padding:3px;display:flex}.settings-mode{color:var(--muted);font:inherit;cursor:pointer;background:0 0;border:none;border-radius:6px;padding:.25rem .85rem;font-size:13px}.settings-mode:hover{color:var(--text)}.settings-mode[aria-pressed=true]{background:var(--surface-2);color:var(--text);box-shadow:inset 0 0 0 1px var(--border)}.settings-palettes{flex-wrap:wrap;gap:8px;display:flex}.settings-palette{border:1px solid var(--border);cursor:pointer;border-radius:8px;justify-content:center;align-items:center;gap:5px;width:56px;height:34px;padding:0;display:flex}.settings-palette[aria-pressed=true]{outline:2px solid var(--accent);outline-offset:2px}.settings-swatch-dot{border-radius:50%;flex:none;width:8px;height:8px}.settings-accents{flex-wrap:wrap;gap:10px;display:flex}.settings-accent{border:1px solid var(--border);cursor:pointer;border-radius:50%;width:20px;height:20px;padding:0}.settings-accent[aria-pressed=true]{outline:2px solid var(--accent);outline-offset:2px}.settings-thinking{font-family:var(--mono);background:var(--bg);color:var(--text);border:1px solid var(--border);resize:vertical;box-sizing:border-box;border-radius:4px;width:100%;max-width:100%;padding:.4rem;font-size:12px}.settings-actions{align-items:center;gap:.625rem;display:flex}.settings-save{background:var(--accent);color:var(--bg);cursor:pointer;border:none;border-radius:6px;padding:.3rem .9rem;font-weight:600}.settings-save:disabled{opacity:.5;cursor:default}.interaction-cards,.ambient-panels{max-height:40vh;overflow-y:auto}.interaction-cards{flex-direction:column;gap:.5rem;display:flex}.interaction-card{border:1px solid var(--warn);background:color-mix(in srgb, var(--warn) 8%, var(--surface));border-radius:8px;max-width:720px;padding:.7rem .9rem}.interaction-card-title{align-items:center;gap:.5rem;margin-bottom:.35rem;display:flex}.interaction-kind{font-family:var(--mono);color:var(--muted);background:color-mix(in srgb, var(--warn) 14%, transparent);border-radius:4px;padding:.1rem .45rem;font-size:11px}.interaction-expiry{color:var(--muted);font-size:.75rem}.interaction-text{white-space:pre-wrap;margin:.35rem 0}.interaction-diff{grid-template-columns:1fr 1fr;gap:.5rem;margin:.5rem 0;display:grid}.interaction-diff pre{background:var(--surface);font-family:var(--mono);border-radius:6px;max-height:16rem;margin:0;padding:.5rem;font-size:12px;overflow:auto}.interaction-diff-before{color:var(--danger)}.interaction-diff-after{color:var(--ok)}.interaction-options,.interaction-fields{flex-direction:column;gap:.4rem;margin:.5rem 0;display:flex}.interaction-option{border:1px solid var(--border);cursor:pointer;border-radius:6px;grid-template-columns:auto 1fr;align-items:baseline;gap:.4rem;padding:.4rem .6rem;display:grid}.interaction-option input{align-self:center}.interaction-option-label{font-weight:500}.interaction-option-danger{border-color:color-mix(in srgb, var(--danger) 45%, var(--border))}.interaction-option-warn{border-color:color-mix(in srgb, var(--warn) 45%, var(--border))}.interaction-option-ok{border-color:color-mix(in srgb, var(--ok) 45%, var(--border))}.interaction-option-description{color:var(--muted);grid-column:2;font-size:.8rem}.interaction-field{flex-direction:column;gap:.25rem;display:flex}.interaction-field-label{color:var(--muted);font-size:.8rem}.interaction-field input{border:1px solid var(--border);background:var(--surface);color:var(--text);font:inherit;border-radius:6px;padding:.4rem .6rem}.interaction-submit{border:1px solid var(--border);background:var(--ok);color:var(--bg);cursor:pointer;border-radius:6px;align-self:flex-start;padding:.35rem .9rem;font-weight:600}.interaction-submit:disabled{opacity:.5;cursor:default}.interaction-details,.ambient-details{color:var(--muted);margin-top:.4rem;font-size:.75rem}.interaction-details pre,.ambient-details pre{background:var(--surface);border-radius:6px;max-height:12rem;margin:.3rem 0 0;padding:.5rem;overflow:auto}.ambient-panels{flex-direction:column;gap:.5rem;display:flex}.ambient-surface{border:1px solid var(--border);background:var(--surface);border-radius:8px;max-width:720px;padding:.5rem .7rem}.ambient-surface-title{color:var(--faint);justify-content:space-between;margin-bottom:.3rem;font-size:.72rem;display:flex}.ambient-key{font-family:var(--mono)}.ambient-line{font-family:var(--mono);white-space:pre-wrap;flex-wrap:wrap;gap:.75rem;font-size:12px;display:flex}.ambient-segment-right{margin-left:auto}.ambient-rows{flex-direction:column;gap:.2rem;margin:.25rem 0 0;padding:0;list-style:none;display:flex}.ambient-row{align-items:baseline;gap:.45rem;font-size:.85rem;display:flex}.ambient-row[data-status=running] .ambient-row-glyph{color:var(--warn)}.ambient-row[data-status=completed],.ambient-row[data-status=complete],.ambient-row[data-status=passed]{color:var(--muted);text-decoration:line-through;-webkit-text-decoration-color:color-mix(in srgb, var(--muted) 60%, transparent);text-decoration-color:color-mix(in srgb, var(--muted) 60%, transparent)}.ambient-row[data-status=failed],.ambient-row[data-status=blocked]{color:var(--danger)}.ambient-row-glyph{font-family:var(--mono);flex:none}.ambient-row-spinner{color:var(--muted);font-size:.78rem;font-style:italic}.ambient-row-detail{color:var(--muted);font-size:.8rem}.ambient-row-deps{color:var(--muted);font-family:var(--mono);font-size:.72rem}.ambient-metrics{color:var(--muted);font-family:var(--mono);margin-left:auto;font-size:.72rem}.ambient-quiet-summary{color:var(--faint);font-size:.75rem}.ambient-gauge{flex-direction:column;gap:.35rem;display:flex}.ambient-gauge-label{color:var(--muted);font-size:.8rem}.ambient-gauge-bar{background:color-mix(in srgb, var(--faint) 25%, transparent);border-radius:3px;height:6px;overflow:hidden}.ambient-gauge-fill{background:var(--ok);height:100%;transition:width .3s}.ambient-recent-output{background:color-mix(in srgb, var(--border) 40%, transparent);font-family:var(--mono);border-radius:6px;max-height:8rem;margin:0;padding:.4rem;font-size:11px;overflow:auto}.ambient-ledger{flex-direction:column;gap:.2rem;max-height:10rem;margin:.25rem 0 0;padding:0;list-style:none;display:flex;overflow:auto}.ambient-ledger-entry{align-items:baseline;gap:.45rem;font-size:.8rem;display:flex}.ambient-ledger-kind{font-family:var(--mono);color:var(--muted);flex:none;font-size:.7rem}.ambient-ledger-detail{color:var(--muted);font-size:.75rem}.auth-screen{place-items:center;height:100%;padding:1rem;display:grid;overflow:auto}.auth-card{background:var(--surface);border:1px solid var(--border);border-radius:12px;flex-direction:column;gap:.9rem;width:min(24rem,100%);padding:1.5rem 1.5rem 1.25rem;display:flex;box-shadow:0 12px 40px #00000040}.auth-card h1{font-size:1.15rem;font-family:var(--serif);margin:0}.auth-message{color:var(--muted);margin:0;font-size:.85rem}.auth-identity{font-family:var(--mono);color:var(--text);word-break:break-all;margin:0;font-size:.85rem}.auth-field{color:var(--muted);flex-direction:column;gap:.3rem;font-size:.8rem;display:flex}.auth-field input{font:inherit;color:var(--text);background:var(--bg);border:1px solid var(--border);border-radius:8px;padding:.5rem .65rem}.auth-field input:focus-visible{outline:1px solid var(--accent);border-color:var(--accent)}.auth-optional{color:var(--faint);font-size:.72rem}.auth-submit{font:inherit;color:var(--text);background:var(--accent-bg);border:1px solid var(--accent);cursor:pointer;border-radius:8px;padding:.5rem .9rem}.auth-submit:disabled{opacity:.6;cursor:default}.auth-error{color:var(--danger);word-break:break-word;margin:0;font-size:.8rem}.share-overlay{z-index:60;background:#00000073;place-items:center;padding:1rem;display:grid;position:fixed;inset:0}.share-menu{background:var(--surface);border:1px solid var(--border);border-radius:12px;flex-direction:column;gap:.8rem;width:min(22rem,100%);padding:1rem 1.25rem 1.1rem;display:flex;box-shadow:0 12px 40px #00000040}.share-head{justify-content:space-between;align-items:baseline;gap:.5rem;display:flex}.share-head h2{font-size:1rem;font-family:var(--serif);margin:0}.share-close{font:inherit;color:var(--muted);cursor:pointer;background:0 0;border:none;padding:0;font-size:.75rem}.share-close:hover{color:var(--text)}.share-scopes{flex-direction:column;gap:.4rem;display:flex}.share-scope{font:inherit;text-align:left;color:var(--text);background:var(--bg);border:1px solid var(--border);cursor:pointer;border-radius:8px;flex-direction:column;gap:.1rem;padding:.45rem .65rem;display:flex}.share-scope[data-selected]{border-color:var(--accent);background:var(--accent-bg)}.share-scope-hint{color:var(--muted);font-size:.72rem}.share-level{gap:.4rem;display:flex}.share-level-btn{font:inherit;color:var(--muted);background:var(--bg);border:1px solid var(--border);cursor:pointer;border-radius:8px;flex:1;padding:.35rem .5rem;font-size:.8rem}.share-level-btn[data-selected]{color:var(--text);border-color:var(--accent);background:var(--accent-bg)}.share-field{color:var(--muted);flex-direction:column;gap:.3rem;font-size:.8rem;display:flex}.share-field input{font:inherit;color:var(--text);background:var(--bg);border:1px solid var(--border);border-radius:8px;padding:.45rem .6rem}.share-warning{color:var(--warn);margin:0;font-size:.8rem}.settings-ext-list{gap:.75rem}.settings-ext .settings-field+.settings-field{margin-top:.9rem}.settings-ext{border:1px solid var(--border);border-radius:4px;margin:0;padding:.5rem .75rem .75rem}.settings-ext-name{padding:0 .35rem;font-weight:600}.settings-ext-meta{color:var(--muted);margin-left:.4rem;font-size:11px;font-weight:400}.settings-ext-settings{font-family:var(--mono);background:var(--bg);color:var(--text);border:1px solid var(--border);resize:vertical;box-sizing:border-box;border-radius:4px;width:100%;max-width:100%;padding:.4rem;font-size:12px}.settings-ext-row{flex-wrap:wrap;align-items:center;gap:.4rem;margin-top:.35rem;display:flex}.settings-ext-key{font-family:var(--mono);font-size:12px}.settings-ext-source{color:var(--muted);font-size:11px}.settings-ext-row input{font-family:var(--mono);background:var(--bg);color:var(--text);border:1px solid var(--border);border-radius:6px;min-width:8rem;padding:.35rem .5rem;font-size:12px}.token-reveal{border:1px solid color-mix(in srgb, var(--accent) 40%, var(--border))}.token-secret,.token-snippet{font-family:var(--mono);background:var(--bg);border:1px solid var(--border);word-break:break-all;-webkit-user-select:all;user-select:all;border-radius:4px;margin-top:.25rem;padding:.3rem .45rem;font-size:12px;display:block}.token-secret{color:var(--accent)}.settings-provider-list{gap:.75rem}.settings-provider{border:1px solid var(--border);border-radius:4px;margin:0;padding:.5rem .75rem .75rem}.settings-provider-name{flex-wrap:wrap;align-items:center;gap:.4rem;padding:0 .35rem;font-weight:600;display:flex}.settings-provider-status{font-size:10px;font-weight:600;font-family:var(--mono);border:1px solid var(--border);color:var(--muted);white-space:nowrap;border-radius:999px;padding:.05rem .4rem}.settings-provider-status[data-status=ready]{color:var(--ok);border-color:color-mix(in srgb, var(--ok) 40%, transparent)}.settings-provider-status[data-status=degraded],.settings-provider-status[data-status=invalid]{color:var(--danger);border-color:color-mix(in srgb, var(--danger) 40%, transparent)}.settings-provider-meta{color:var(--muted);font-size:11px;font-weight:400}.settings-provider-row{flex-wrap:wrap;align-items:center;gap:.4rem;margin-top:.35rem;display:flex}.settings-provider-row input{font-family:var(--mono);background:var(--bg);color:var(--text);border:1px solid var(--border);border-radius:6px;flex:10rem;min-width:10rem;max-width:22rem;padding:.35rem .5rem;font-size:12px}.turn-timeline{flex-direction:column;gap:.5rem;display:flex}.turn-timeline>*+*{border-top:1px solid color-mix(in srgb, var(--border) 55%, transparent);padding-top:.5rem}.timeline-thinking{opacity:.75;white-space:pre-wrap;font-style:italic}.turn-assistant[data-live=true] .turn-timeline{border-left:2px solid color-mix(in srgb, var(--border) 80%, transparent);padding-left:.6rem}.settings-version{color:var(--text-dim,color-mix(in srgb, var(--text) 55%, transparent));-webkit-user-select:text;user-select:text;margin:.8rem 0 0;font-size:.82rem}.gallery{height:100%;min-height:0;display:flex}.gallery-list{border-right:1px solid var(--border,#333);flex:0 0 14rem;padding:1rem;overflow:auto}.gallery-list ul{margin:0;padding:0;list-style:none}.gallery-list button{text-align:left;width:100%;padding:.25rem .5rem;display:block}.gallery-main{flex:auto;min-width:0;padding:1rem;overflow:auto}.gallery-hint{color:var(--fg-subtle,#999)}.gallery-sample{flex-direction:column;min-width:0;height:100%;display:flex}.gallery-sample>.blk-surface{flex:auto;min-height:0}.rail-bell{position:relative}.rail-bell-badge{background:var(--danger);color:var(--bg);pointer-events:none;border-radius:8px;padding:1px 5px;font-size:10px;line-height:1.2;position:absolute;top:2px;right:2px}.notices-pane{flex-direction:column;gap:8px;min-height:0;padding:8px;display:flex;overflow-y:auto}.notices-pane-overlay{background:var(--surface);border-left:1px solid var(--border);z-index:40;width:min(360px,90vw);position:fixed;top:0;bottom:0;right:0;box-shadow:-8px 0 24px #00000059}.notices-pane-head{justify-content:space-between;align-items:baseline;margin:0 0 2px;font-size:13px;font-weight:600;display:flex}.notices-pane-clear{color:var(--muted);cursor:pointer;background:0 0;border:0;padding:0;font-size:11px}.notices-pane-clear:hover{color:var(--text)}.notices-pane-empty{color:var(--muted);font-size:12px}.notice-card{background:var(--surface-2);border:1px solid var(--border);color:var(--text);border-left-width:3px;border-radius:6px;flex-direction:column;gap:4px;padding:6px 8px;display:flex}.notice-tone-neutral,.notice-tone-accent,.notice-tone-info{border-left-color:var(--accent)}.notice-tone-good{border-left-color:var(--ok)}.notice-tone-warn{border-left-color:var(--warn)}.notice-tone-bad{border-left-color:var(--danger)}.notice-card-row{justify-content:space-between;align-items:flex-start;gap:8px;display:flex}.notice-card-title{font-size:12px}.notice-card-close{color:var(--muted);cursor:pointer;background:0 0;border:0;padding:0 2px;font-size:11px}.notice-card-body{color:var(--text);white-space:pre-wrap;margin:0;font-size:12px}.notice-card-meta{color:var(--muted);margin:0;font-size:10px}.notice-card-conversation{color:var(--accent);cursor:pointer;font-size:inherit;background:0 0;border:0;padding:0;text-decoration:underline}.notice-card-actions{flex-wrap:wrap;gap:6px;display:flex}.notice-card-action,.notice-peek-action{border:1px solid var(--border);color:var(--text);cursor:pointer;background:0 0;border-radius:4px;padding:1px 6px;font-size:11px}.notice-card-action:disabled{opacity:.5;cursor:default}.notice-card-result{color:var(--accent);margin:0;font-size:11px}.inline-notices{flex-direction:column;gap:6px;margin:0 10px 6px;display:flex}.inline-notices .notice-card{flex-direction:row;align-items:center;gap:8px;padding:6px 8px}.inline-notices .notice-card-row{flex:1;align-items:center}.inline-notices .notice-card-body,.inline-notices .notice-card-meta{display:none}.inline-notices-more{color:var(--accent);cursor:pointer;background:0 0;border:0;align-self:flex-start;padding:0 2px;font-size:11px}.notice-peek{background:var(--surface-2);border:1px solid var(--accent);z-index:50;border-radius:8px;align-items:center;gap:8px;padding:6px 8px;font-size:12px;display:flex;position:fixed;top:52px;left:60px;box-shadow:0 6px 18px #00000080}.notice-peek-body{color:var(--text);cursor:pointer;background:0 0;border:0;padding:0;font-size:12px}.notice-peek-close{color:var(--muted);cursor:pointer;background:0 0;border:0;padding:0 2px}.chat-header-bell,.phone-header{display:none}@media (width<=900px){.chat-header-bell{align-items:center;display:inline-flex}.chat-header-bell .rail-bell{border-radius:6px;width:30px;height:30px}.phone-header{border-bottom:1px solid var(--border);background:var(--bg);flex:none;align-items:center;height:48px;padding:0 12px 0 16px;display:flex}.phone-header-spacer{flex:1}.phone-header .rail-bell{border-radius:6px;width:30px;height:30px}.notices-pane-overlay{border-left:none;border-top:1px solid var(--border);width:auto;top:48px;left:0}.right-panel[data-panel=notices]{top:48px;left:0;right:0;bottom:calc(var(--bottom-bar-h) + env(safe-area-inset-bottom));width:auto}.right-panel[data-panel=notices] .notices-pane{flex:1;min-height:0}.notice-peek{box-shadow:none;border-top:none;border-left:none;border-right:none;border-radius:0;justify-content:space-between;padding:6px 12px;top:48px;left:0;right:0}}