friend-assistant 0.1.38 → 0.1.40

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/BUILD.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "friend-assistant",
3
- "version": "0.1.38",
4
- "builtAt": "2026-10-12T14:21:14.686Z"
3
+ "version": "0.1.40",
4
+ "builtAt": "2026-10-13T02:23:53.362Z"
5
5
  }
package/dist/friend.mjs CHANGED
@@ -695,8 +695,8 @@ var TOOL_DEFS = [
695
695
  },
696
696
  {
697
697
  name: "video.play",
698
- description: "Play a video or a song from the internet inside Friend: a link to YouTube or almost any video site, or words to search for on YouTube (a title, a channel, a topic). Use this, not the browser: never open the site in Chrome. It plays on the owner's Friend screen (output screen) or in a window on the PC (output host); leave output out to use the owner's choice. start is where to begin, in seconds. Say in a few words what is playing. If Friend is missing a helper program the tool says which one and how to install it: pass that on in plain words.",
699
- input: z4.object({ url: z4.string().max(2e3).optional(), query: z4.string().max(200).optional(), output: z4.enum(["screen", "host"]).optional(), start: z4.number().min(0).max(86400).optional() }).strict(),
698
+ description: "Play a video or a song from the internet inside Friend: a link to YouTube or almost any video site, or words to search for on YouTube (a title, a channel, a topic). Use this, not the browser: never open the site in Chrome. It plays on the owner's Friend screen (output screen) or in a window on the PC (output host); leave output out to use the owner's choice. start is where to begin, in seconds. A YouTube video normally plays in YouTube's own player inside the card; if it will not play there (the owner of the video blocked it from being shown elsewhere), call again with mode stream, which plays it through Friend. Say in a few words what is playing. If Friend is missing a helper program the tool says which one and how to install it: pass that on in plain words.",
699
+ input: z4.object({ url: z4.string().max(2e3).optional(), query: z4.string().max(200).optional(), output: z4.enum(["screen", "host"]).optional(), start: z4.number().min(0).max(86400).optional(), mode: z4.enum(["embed", "stream"]).optional() }).strict(),
700
700
  baseTier: "T1",
701
701
  target: "gateway"
702
702
  },
@@ -1279,6 +1279,7 @@ function commandToAction(c) {
1279
1279
 
1280
1280
  // ../protocol/src/video.ts
1281
1281
  var VIDEO_OUTPUTS = ["screen", "host"];
1282
+ var VIDEO_YOUTUBE = ["embed", "stream"];
1282
1283
  var VIDEO_LIMITS = {
1283
1284
  /** The tallest picture asked for, in pixels (a lower one saves the connection and the PC). */
1284
1285
  maxHeight: { min: 240, max: 1080, def: 720 },
@@ -2012,6 +2013,7 @@ function sandboxError(type, props, requireHtml) {
2012
2013
  }
2013
2014
  var MEDIA_SRC = /^\/api\/media\/[0-9a-f]{32}$/;
2014
2015
  var VIDEO_SRC = /^\/api\/video\/[0-9a-f]{32}$/;
2016
+ var YOUTUBE_ID = /^[A-Za-z0-9_-]{11}$/;
2015
2017
  var NOT_IN_COMPOSITE = /* @__PURE__ */ new Set(["group", "tabs", "sandbox"]);
2016
2018
  var MAX_PARTS = 8;
2017
2019
  var MEDIA_TYPES = /* @__PURE__ */ new Set(["image", "video", "pdf"]);
@@ -2031,6 +2033,11 @@ function partsError(parts, what) {
2031
2033
  function propsError(type, props, requireAll) {
2032
2034
  const sandbox = sandboxError(type, props, requireAll);
2033
2035
  if (sandbox) return sandbox;
2036
+ if (type === "video" && "embed" in props) {
2037
+ if (typeof props.embed !== "string" || !YOUTUBE_ID.test(props.embed)) return "A video's embed must be a YouTube video id.";
2038
+ if ("start" in props && (typeof props.start !== "number" || !Number.isFinite(props.start) || props.start < 0 || props.start > 86400)) return "A video's start must be a number of seconds.";
2039
+ return null;
2040
+ }
2034
2041
  if (MEDIA_TYPES.has(type) && (requireAll || "src" in props)) {
2035
2042
  if (typeof props.src !== "string" || !(MEDIA_SRC.test(props.src) || type === "video" && VIDEO_SRC.test(props.src))) return `An ${type} object needs src from file.present (a file the owner approved), not a web address.`;
2036
2043
  }
@@ -2499,7 +2506,7 @@ Music
2499
2506
 
2500
2507
  Video from the internet
2501
2508
  - When the owner asks to play a video, a song or a clip from YouTube or any website, use video.play: it plays inside Friend (on the screen, in a card with its own controls) or in a window on the PC. Never open the site in the owner's Chrome or any browser (the browser tools, the shell, a link) to play something: that is not what they want. If video.play cannot work (Web video is switched off, a helper is missing), say so and what to do, instead of opening a browser.
2502
- - You can play a video from YouTube or almost any video site with video.play: give it the link the owner gave you (url), or words to search on YouTube (query). It plays on the Friend screen, or in a window on the PC when the owner says "on the PC" or "in a window" (output host). Use video.control to pause, resume, seek (a time in seconds), set the volume or stop, and video.check when a video will not play: it names the helper program that is missing (yt-dlp, ffmpeg or mpv) and the command to install it, which you pass on in plain words. If the tool says Web video is not switched on, tell the owner to turn it on in Plugins, Web video: you cannot do that yourself. Say in a few words what is playing; never read out links. Never say you cannot play videos.
2509
+ - You can play a video from YouTube or almost any video site with video.play: give it the link the owner gave you (url), or words to search on YouTube (query). It plays on the Friend screen, or in a window on the PC when the owner says "on the PC" or "in a window" (output host). Use video.control to pause, resume, seek (a time in seconds), set the volume or stop, and video.check when a video will not play: it names the helper program that is missing (yt-dlp, ffmpeg or mpv) and the command to install it, which you pass on in plain words. If the tool says Web video is not switched on, tell the owner to turn it on in Plugins, Web video: you cannot do that yourself. A YouTube video normally plays in YouTube's own player inside the card; if the owner says it will not play (a video that its owner blocked from being shown elsewhere), call video.play again with mode stream. Say in a few words what is playing; never read out links. Never say you cannot play videos.
2503
2510
 
2504
2511
  Languages
2505
2512
  - Answer in the language the owner speaks to you. They may use English, Hindi or Marathi, or mix them in one sentence. Write Hindi and Marathi in Devanagari script, never in Roman letters, and keep English words, names and technical terms in Latin letters. Your voice reads each script with its own voice, so a mixed sentence like "\u0906\u091C \u0915\u093E weather \u092C\u0939\u0941\u0924 \u0905\u091A\u094D\u091B\u093E \u0939\u0948" is spoken correctly, and Roman-letter Hindi would not be. Keep spoken sentences short and end Hindi and Marathi sentences with \u0964 or a full stop. In Hindi and Marathi verbs change with the speaker's gender: talk about yourself in the gender of your voice, which the language note of each request states (a woman's voice says "\u092E\u0948\u0902 \u0915\u0930 \u0930\u0939\u0940 \u0939\u0942\u0901", never "\u092E\u0948\u0902 \u0915\u0930 \u0930\u0939\u093E \u0939\u0942\u0901").
@@ -3116,7 +3123,8 @@ function sanitizeVideo(raw) {
3116
3123
  allowedSites: normalizeSites(r.allowedSites),
3117
3124
  ytdlp: program(r.ytdlp),
3118
3125
  ffmpeg: program(r.ffmpeg),
3119
- autoInstall: r.autoInstall !== false
3126
+ autoInstall: r.autoInstall !== false,
3127
+ youtube: VIDEO_YOUTUBE.includes(r.youtube) ? r.youtube : "embed"
3120
3128
  };
3121
3129
  }
3122
3130
  function sanitizeChrome(raw) {
@@ -6062,7 +6070,7 @@ function ffmpegArgs(info, o) {
6062
6070
  if (info.transcodeVideo) args.push("-c:v", "libx264", "-preset", "veryfast", "-crf", "23", "-pix_fmt", "yuv420p", "-vf", `scale=-2:'min(ih,${Math.round(o.maxHeight)})'`);
6063
6071
  else args.push("-c:v", "copy");
6064
6072
  if (info.transcodeAudio) args.push("-c:a", "aac", "-b:a", "128k", "-ac", "2");
6065
- else args.push("-c:a", "copy");
6073
+ else args.push("-c:a", "copy", "-bsf:a", "aac_adtstoasc");
6066
6074
  args.push("-max_muxing_queue_size", "1024", "-t", String(Math.round(o.maxMinutes * 60)), "-movflags", "frag_keyframe+empty_moov+default_base_moof", "-f", "mp4", "pipe:1");
6067
6075
  return args;
6068
6076
  }
@@ -6206,6 +6214,67 @@ async function videoStatus(config, deps = {}) {
6206
6214
  return { ytdlp: asStatus(ytdlp), ffmpeg: asStatus(ffmpeg), mpv: asStatus(mpv) };
6207
6215
  }
6208
6216
 
6217
+ // ../server/src/video/youtube.ts
6218
+ var YOUTUBE_ID2 = /^[A-Za-z0-9_-]{11}$/;
6219
+ var HOSTS = /* @__PURE__ */ new Set(["youtube.com", "www.youtube.com", "m.youtube.com", "music.youtube.com", "youtube-nocookie.com", "www.youtube-nocookie.com", "youtu.be"]);
6220
+ function youtubeId(raw) {
6221
+ let u;
6222
+ try {
6223
+ u = new URL(typeof raw === "string" ? raw.trim() : "");
6224
+ } catch {
6225
+ return null;
6226
+ }
6227
+ if (u.protocol !== "https:" && u.protocol !== "http:" || u.username || u.password || u.port) return null;
6228
+ const host = u.hostname.toLowerCase();
6229
+ if (!HOSTS.has(host)) return null;
6230
+ const parts = u.pathname.split("/").filter(Boolean);
6231
+ const first2 = parts[0] ?? "";
6232
+ let id2 = null;
6233
+ if (host === "youtu.be") id2 = first2 || null;
6234
+ else if (first2 === "watch") id2 = u.searchParams.get("v");
6235
+ else if (["shorts", "live", "embed", "v"].includes(first2)) id2 = parts[1] ?? null;
6236
+ return id2 !== null && YOUTUBE_ID2.test(id2) ? id2 : null;
6237
+ }
6238
+ var clean = (v, max) => typeof v === "string" ? v.replace(/[\u0000-\u001f\u007f]/g, " ").replace(/\s+/g, " ").trim().slice(0, max) : "";
6239
+ async function titleOfYoutube(id2, d = {}) {
6240
+ const fallback = { title: "YouTube video", uploader: "", embeddable: true };
6241
+ const ctl = new AbortController();
6242
+ const timer = setTimeout(() => ctl.abort(), d.timeoutMs ?? 5e3);
6243
+ try {
6244
+ const url = `https://www.youtube.com/oembed?url=${encodeURIComponent(`https://www.youtube.com/watch?v=${id2}`)}&format=json`;
6245
+ const res = await (d.fetch ?? fetch)(url, { signal: ctl.signal });
6246
+ if (res.status === 401 || res.status === 403) return { ...fallback, embeddable: false };
6247
+ if (!res.ok) return fallback;
6248
+ const j = await res.json();
6249
+ return { title: clean(j.title, 200) || fallback.title, uploader: clean(j.author_name, 100), embeddable: true };
6250
+ } catch {
6251
+ return fallback;
6252
+ } finally {
6253
+ clearTimeout(timer);
6254
+ }
6255
+ }
6256
+ async function searchYoutube(query, d) {
6257
+ const q = query.replace(/[\u0000-\u001f\u007f]/g, " ").trim().slice(0, 200);
6258
+ if (!q) return { ok: false, error: "Tell me what to play: a link to a video, or what to search for." };
6259
+ let res;
6260
+ try {
6261
+ res = await (d.run ?? ytRun)(d.ytdlp, ["--ignore-config", "--no-warnings", "--flat-playlist", "--skip-download", "--socket-timeout", "15", "-J", "--", `ytsearch1:${q}`], { timeoutMs: 3e4, maxBytes: 4e6 });
6262
+ } catch {
6263
+ return { ok: false, error: "Friend could not start yt-dlp." };
6264
+ }
6265
+ if (res.code !== 0) return { ok: false, error: sentenceFor(res.err) };
6266
+ let data;
6267
+ try {
6268
+ data = JSON.parse(res.out);
6269
+ } catch {
6270
+ return { ok: false, error: "Friend could not get that video." };
6271
+ }
6272
+ const e = Array.isArray(data.entries) ? data.entries[0] : void 0;
6273
+ if (!e) return { ok: false, error: "Friend did not find a video for that." };
6274
+ if (typeof e.id !== "string" || !YOUTUBE_ID2.test(e.id)) return { ok: false, error: "Friend did not find a video for that." };
6275
+ return { ok: true, id: e.id, title: clean(e.title, 200) || "YouTube video", uploader: clean(e.uploader ?? e.channel, 100), live: e.is_live === true };
6276
+ }
6277
+
6209
6278
  // ../server/src/video/hub.ts
6210
6279
  var TICKET_MS = 10 * 60 * 1e3;
6211
6280
  var CARD = "video-now";
@@ -6294,23 +6363,63 @@ var VideoHub = class {
6294
6363
  this.tokens.set(id2, { info, startSec, expires: now + TTL_MS });
6295
6364
  return { id: CARD, props: { title: info.title, src: `/api/video/${id2}` } };
6296
6365
  }
6366
+ /** Fetches what is missing (when the owner allows it), waiting a while, then says it is still going. */
6367
+ async ensureTools(need, cfg) {
6368
+ const status2 = await this.ensureStatus();
6369
+ if (!need.length || !cfg.autoInstall || !this.d.provisioner) return { ok: true, status: status2 };
6370
+ const job = this.d.provisioner.ensure(need);
6371
+ const first2 = await Promise.race([job.then((r) => ({ r })), new Promise((res) => setTimeout(() => res({ slow: true }), this.d.waitMs ?? 25e3))]);
6372
+ if ("slow" in first2) {
6373
+ void job.then(() => this.refresh()).catch(() => {
6374
+ });
6375
+ return { ok: false, text: "Friend is downloading the video tools it needs (first time only, it can take a minute or two). Ask again in a minute." };
6376
+ }
6377
+ if (!first2.r.ok) return { ok: false, text: first2.r.error };
6378
+ return { ok: true, status: await this.refresh() };
6379
+ }
6380
+ /** A YouTube video in YouTube's own player, inside the card. A link needs nothing; a search needs yt-dlp, for the list of results only. */
6381
+ async playEmbedded(args, linkId, cfg) {
6382
+ const start2 = typeof args.start === "number" && args.start > 0 ? Math.floor(args.start) : 0;
6383
+ let id2;
6384
+ let title2;
6385
+ let uploader;
6386
+ if (linkId) {
6387
+ const v = await vetVideoUrl(args.url, { allowedSites: cfg.allowedSites, ...this.d.resolve ? { resolve: this.d.resolve } : {} });
6388
+ if (!v.ok) return { ok: false, text: v.error };
6389
+ id2 = linkId;
6390
+ const t = await titleOfYoutube(id2, { fetch: this.d.fetch });
6391
+ if (!t.embeddable) return null;
6392
+ ({ title: title2, uploader } = t);
6393
+ } else {
6394
+ const sites = cfg.allowedSites;
6395
+ if (sites.length && !sites.some((s) => s === "youtube.com" || s.endsWith(".youtube.com"))) return { ok: false, text: `A search uses YouTube, which is not on your allowed list (${sites.join(", ")}).` };
6396
+ const status0 = await this.ensureStatus();
6397
+ const got = await this.ensureTools(this.missing(status0, ["yt-dlp"]), cfg);
6398
+ if (!got.ok) return got;
6399
+ if (!got.status.ytdlp.found) return { ok: false, text: got.status.ytdlp.install ?? "yt-dlp is not found on this PC." };
6400
+ const found = await searchYoutube(args.query, { ytdlp: got.status.ytdlp.path ?? "yt-dlp", run: this.d.run });
6401
+ if (!found.ok) return { ok: false, text: found.error };
6402
+ ({ id: id2, title: title2, uploader } = found);
6403
+ }
6404
+ await this.stopEverything();
6405
+ this.now = { output: "screen", title: title2, uploader, embed: id2 };
6406
+ return { ok: true, text: `Playing "${title2}"${uploader ? ` by ${uploader}` : ""} on your Friend screen.`, show: { id: CARD, props: { title: title2, embed: id2, ...start2 > 0 ? { start: start2 } : {} } } };
6407
+ }
6297
6408
  async play(args) {
6298
6409
  const cfg = this.d.config().video;
6299
6410
  if (!cfg.installed || !cfg.enabled) return { ok: false, text: "Web video is not switched on. The owner can install and turn it on in Plugins, Web video." };
6300
6411
  const output = args.output ?? cfg.output;
6301
- let status2 = await this.ensureStatus();
6302
- const need = this.missing(status2, this.wanted(output, status2));
6303
- if (need.length && cfg.autoInstall && this.d.provisioner) {
6304
- const job = this.d.provisioner.ensure(need);
6305
- const first2 = await Promise.race([job.then((r3) => ({ r: r3 })), new Promise((res) => setTimeout(() => res({ slow: true }), this.d.waitMs ?? 25e3))]);
6306
- if ("slow" in first2) {
6307
- void job.then(() => this.refresh()).catch(() => {
6308
- });
6309
- return { ok: false, text: "Friend is downloading the video tools it needs (first time only, it can take a minute or two). Ask again in a minute." };
6412
+ if (output === "screen" && (args.mode ?? cfg.youtube) === "embed") {
6413
+ const ytId = args.url ? youtubeId(args.url) : null;
6414
+ if (ytId || !args.url && args.query && args.query.trim()) {
6415
+ const emb = await this.playEmbedded(args, ytId, cfg);
6416
+ if (emb) return emb;
6310
6417
  }
6311
- if (!first2.r.ok) return { ok: false, text: first2.r.error };
6312
- status2 = await this.refresh();
6313
6418
  }
6419
+ let status2 = await this.ensureStatus();
6420
+ const got = await this.ensureTools(this.missing(status2, this.wanted(output, status2)), cfg);
6421
+ if (!got.ok) return got;
6422
+ status2 = got.status;
6314
6423
  if (!status2.ytdlp.found) return { ok: false, text: status2.ytdlp.install ?? "yt-dlp is not found on this PC." };
6315
6424
  const mpvWindow = output === "host" && status2.mpv.found && !!this.d.host;
6316
6425
  const browserWindow = output === "host" && !mpvWindow && !!this.d.openBrowser && !!this.d.windowUrl;
@@ -6392,8 +6501,12 @@ var VideoHub = class {
6392
6501
  return { ok: true, text: args.action === "seek" ? `Jumped to ${Math.round(args.seconds ?? 0)} seconds.` : args.action === "volume" ? `Volume ${Math.round(args.level ?? 50)}.` : args.action === "pause" ? "Paused." : "Playing again." };
6393
6502
  }
6394
6503
  if (args.action === "seek") {
6504
+ const at = Math.max(0, Math.floor(args.seconds ?? 0));
6505
+ if (now.embed) {
6506
+ return { ok: true, text: `Jumped to ${Math.round(args.seconds ?? 0)} seconds.`, show: { id: CARD, props: { title: now.title, embed: now.embed, ...at > 0 ? { start: at } : {} } } };
6507
+ }
6395
6508
  for (const s of this.streams.splice(0)) s.handle.stop();
6396
- const show2 = this.issue(now.info, Math.max(0, Math.floor(args.seconds ?? 0)));
6509
+ const show2 = this.issue(now.info, at);
6397
6510
  return { ok: true, text: `Jumped to ${Math.round(args.seconds ?? 0)} seconds.`, show: show2 };
6398
6511
  }
6399
6512
  return { ok: true, text: "On the Friend screen the video has its own buttons for pause, play and volume: use those." };
@@ -7701,8 +7814,8 @@ function cleanSpeech(text3, max = MAX_SPEECH) {
7701
7814
  }
7702
7815
  var sentences = (s) => s.split(/(?<=[.!?।])\s+/).map((x) => x.trim()).filter(Boolean);
7703
7816
  function shortForVoice(text3) {
7704
- const clean = cleanSpeech(text3);
7705
- const all = sentences(clean);
7817
+ const clean2 = cleanSpeech(text3);
7818
+ const all = sentences(clean2);
7706
7819
  let spoken = all.slice(0, SHORT_SENTENCES).join(" ");
7707
7820
  let truncated = all.length > SHORT_SENTENCES;
7708
7821
  if (spoken.length > SHORT_MAX) {
@@ -8501,7 +8614,7 @@ async function freshToken(source, tokens, refresh, clock2 = Date.now) {
8501
8614
  // ../server/src/music/soundcloud.ts
8502
8615
  var AUTH = "https://secure.soundcloud.com";
8503
8616
  var API2 = "https://api.soundcloud.com";
8504
- var HOSTS = /* @__PURE__ */ new Set(["secure.soundcloud.com", "api.soundcloud.com"]);
8617
+ var HOSTS2 = /* @__PURE__ */ new Set(["secure.soundcloud.com", "api.soundcloud.com"]);
8505
8618
  var ID3 = /^[0-9]{1,20}$/;
8506
8619
  var FALLBACK_TTL_S = 3600;
8507
8620
  var MAX_HOPS3 = 3;
@@ -8555,7 +8668,7 @@ var SoundCloudHub = class {
8555
8668
  this.d.tokens.forget("soundcloud");
8556
8669
  }
8557
8670
  async call(url, init) {
8558
- if (!HOSTS.has(new URL(url).host)) throw new Error("Friend only talks to SoundCloud's own addresses.");
8671
+ if (!HOSTS2.has(new URL(url).host)) throw new Error("Friend only talks to SoundCloud's own addresses.");
8559
8672
  const ctl = new AbortController();
8560
8673
  const timer = setTimeout(() => ctl.abort(), this.d.requestTimeoutMs ?? 8e3);
8561
8674
  try {
@@ -9326,7 +9439,7 @@ var MusicSources = class {
9326
9439
  // ../server/src/music/spotify.ts
9327
9440
  var AUTH2 = "https://accounts.spotify.com";
9328
9441
  var API3 = "https://api.spotify.com";
9329
- var HOSTS2 = /* @__PURE__ */ new Set(["accounts.spotify.com", "api.spotify.com"]);
9442
+ var HOSTS3 = /* @__PURE__ */ new Set(["accounts.spotify.com", "api.spotify.com"]);
9330
9443
  var SCOPES = "user-read-private user-read-email streaming user-modify-playback-state user-read-playback-state playlist-read-private";
9331
9444
  var PLAYLIST_ID = /^[A-Za-z0-9]{1,64}$/;
9332
9445
  var TRACK_ID = /^[A-Za-z0-9]{1,64}$/;
@@ -9372,7 +9485,7 @@ var SpotifyHub = class {
9372
9485
  this.d.tokens.forget("spotify");
9373
9486
  }
9374
9487
  async call(url, init) {
9375
- if (!HOSTS2.has(new URL(url).host)) throw new Error("Friend only talks to Spotify's own addresses.");
9488
+ if (!HOSTS3.has(new URL(url).host)) throw new Error("Friend only talks to Spotify's own addresses.");
9376
9489
  const ctl = new AbortController();
9377
9490
  const timer = setTimeout(() => ctl.abort(), this.d.requestTimeoutMs ?? 8e3);
9378
9491
  try {
@@ -9915,14 +10028,14 @@ function createZerodha(opts) {
9915
10028
  const f = opts.fetch ?? fetch;
9916
10029
  const now = opts.clock ?? Date.now;
9917
10030
  let session = null;
9918
- const clean = (message) => {
10031
+ const clean2 = (message) => {
9919
10032
  let out = message;
9920
10033
  for (const secret of [session?.accessToken, opts.apiSecret, opts.apiKey]) if (secret) out = out.split(secret).join("***");
9921
10034
  return out.slice(0, 200);
9922
10035
  };
9923
10036
  const fail = (status2, body) => {
9924
10037
  const b = rec(body);
9925
- const message = clean(str(b.message) || `Zerodha answered ${status2}`);
10038
+ const message = clean2(str(b.message) || `Zerodha answered ${status2}`);
9926
10039
  if (status2 === 403 || b.error_type === "TokenException") {
9927
10040
  session = null;
9928
10041
  return new BrokerError(message, "session");
@@ -9969,7 +10082,7 @@ function createZerodha(opts) {
9969
10082
  }
9970
10083
  const body = rec(await res.json().catch(() => ({})));
9971
10084
  const token = str(rec(body.data).access_token);
9972
- if (!res.ok || !token) throw new BrokerError(clean(str(body.message) || "Zerodha did not accept the login."), "auth");
10085
+ if (!res.ok || !token) throw new BrokerError(clean2(str(body.message) || "Zerodha did not accept the login."), "auth");
9973
10086
  session = { accessToken: token, expiresAt: nextSixIst(now()) };
9974
10087
  return session;
9975
10088
  }
@@ -10364,13 +10477,13 @@ var Memory = class {
10364
10477
  db;
10365
10478
  clock;
10366
10479
  add(text3, source) {
10367
- const clean = text3.replace(/\s+/g, " ").trim();
10368
- if (!clean) return { ok: false, error: "There is nothing to remember." };
10369
- if (clean.length > MAX_MEMORY_CHARS) return { ok: false, error: `That note is too long (the limit is ${MAX_MEMORY_CHARS} characters).` };
10370
- const same = this.db.prepare("select id from memories where lower(text) = lower(?)").get(clean);
10480
+ const clean2 = text3.replace(/\s+/g, " ").trim();
10481
+ if (!clean2) return { ok: false, error: "There is nothing to remember." };
10482
+ if (clean2.length > MAX_MEMORY_CHARS) return { ok: false, error: `That note is too long (the limit is ${MAX_MEMORY_CHARS} characters).` };
10483
+ const same = this.db.prepare("select id from memories where lower(text) = lower(?)").get(clean2);
10371
10484
  if (same) return { ok: true, id: same.id, duplicate: true };
10372
10485
  if (this.count() >= MAX_MEMORIES) return { ok: false, error: "Memory is full. Forget something first." };
10373
- const info = this.db.prepare("insert into memories (text, source, created_at) values (?, ?, ?)").run(clean, source, this.clock());
10486
+ const info = this.db.prepare("insert into memories (text, source, created_at) values (?, ?, ?)").run(clean2, source, this.clock());
10374
10487
  return { ok: true, id: Number(info.lastInsertRowid), duplicate: false };
10375
10488
  }
10376
10489
  count() {
@@ -12723,6 +12836,7 @@ var SettingsPatch = z11.object({
12723
12836
  maxMinutes: z11.number().int().min(VIDEO_LIMITS.maxMinutes.min).max(VIDEO_LIMITS.maxMinutes.max),
12724
12837
  allowedSites: z11.array(z11.string().trim().max(200)).max(VIDEO_LIMITS.sites.max),
12725
12838
  autoInstall: z11.boolean(),
12839
+ youtube: z11.enum(VIDEO_YOUTUBE),
12726
12840
  ytdlp: z11.string().trim().max(260).refine((v) => programProblem(v) === null, { message: "That is not a program name or path. Use a name like yt-dlp, or a path with no spaces." }),
12727
12841
  ffmpeg: z11.string().trim().max(260).refine((v) => programProblem(v) === null, { message: "That is not a program name or path. Use a name like ffmpeg, or a path with no spaces." })
12728
12842
  }).partial().strict(),
@@ -17690,7 +17804,7 @@ async function daemonCommand(args, io2, deps = realDeps) {
17690
17804
  import crossSpawn5 from "cross-spawn";
17691
17805
  var PACKAGE = "friend-assistant";
17692
17806
  var real = {
17693
- current: () => true ? "0.1.38" : "development",
17807
+ current: () => true ? "0.1.40" : "development",
17694
17808
  latest: () => new Promise((resolve13) => {
17695
17809
  const child = crossSpawn5("npm", ["view", PACKAGE, "version", "--prefer-online"], { stdio: ["ignore", "pipe", "ignore"] });
17696
17810
  let out = "";
@@ -17978,7 +18092,7 @@ async function run(argv, io2) {
17978
18092
  case "version":
17979
18093
  case "--version":
17980
18094
  case "-v":
17981
- io2.out(true ? "0.1.38" : "development");
18095
+ io2.out(true ? "0.1.40" : "development");
17982
18096
  return 0;
17983
18097
  case "lan":
17984
18098
  return await lanCommand(rest, io2);
@@ -1 +1 @@
1
- :root{--accent:#3fd8ff;--warn:#ffb454;--bad:#ff6b7a;--ok:#5ef0b0;--ink:#d4ecf7;--muted:#7fa3b6;--glass:#06141c9e;--edge:color-mix(in srgb, var(--accent) 48%, transparent);--ui:"Segoe UI", system-ui, -apple-system, "Helvetica Neue", Arial, sans-serif;--mono:"Cascadia Mono", "SF Mono", Consolas, ui-monospace, monospace;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{color:var(--ink);font:16px/1.5 var(--ui);-webkit-tap-highlight-color:transparent;background:#000;overflow:hidden}button,input{font:inherit;color:inherit}button{cursor:pointer}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.stage{touch-action:manipulation;background:#000;position:fixed;inset:0;overflow:hidden}.ambient{pointer-events:none;background:radial-gradient(ellipse at 50% 55%, color-mix(in srgb, var(--accent) 10%, transparent), transparent 62%), linear-gradient(#3fd8ff0b 1px, transparent 1px) 0 0 / 64px 64px, linear-gradient(90deg, #3fd8ff0b 1px, transparent 1px) 0 0 / 64px 64px;position:absolute;inset:0;-webkit-mask-image:radial-gradient(#000 30%,#0000 78%);mask-image:radial-gradient(#000 30%,#0000 78%)}.presence{z-index:1;transition:inset .7s cubic-bezier(.2,.7,.2,1),width .7s,height .7s,opacity .5s;position:absolute}.presence-full{inset:0}.presence-corner{left:max(10px, env(safe-area-inset-left));bottom:max(52px, calc(env(safe-area-inset-bottom) + 42px));width:clamp(96px,16vw,190px);height:clamp(96px,16vw,190px)}.objects{pointer-events:none;position:absolute;inset:0}.objects-stack{pointer-events:auto;padding:max(56px, env(safe-area-inset-top)) 14px 140px;flex-direction:column;gap:12px;display:flex;overflow-y:auto}.auto-grid{pointer-events:none;padding:max(24px, env(safe-area-inset-top)) 24px 24px clamp(120px, 20vw, 230px);grid-template-columns:repeat(auto-fit,minmax(min(280px,100%),1fr));align-content:safe center;align-items:start;gap:12px;display:grid;position:absolute;inset:0;overflow-y:auto}.auto-grid>.obj{pointer-events:auto}.objects-stack>.auto-grid{flex-direction:column;padding:0;display:flex;position:static;overflow:visible}.obj.leaving{pointer-events:none;animation:.35s forwards leave}@keyframes leave{to{opacity:0;transform:scale(.96)translateY(-6px)}}@media (prefers-reduced-motion:reduce){.obj.leaving{animation:none}}.glass{background:var(--glass);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border:1px solid var(--edge);box-shadow:0 0 22px color-mix(in srgb, var(--accent) 16%, transparent), inset 0 0 28px #3fd8ff0d;clip-path:polygon(0 0,calc(100% - 14px) 0,100% 14px,100% 100%,14px 100%,0 calc(100% - 14px))}.obj{pointer-events:auto;min-width:0;padding:16px 18px;animation:.45s both appear;overflow:auto}.obj.alert{border-color:var(--warn)}.overlay-layer{z-index:40;pointer-events:none;place-items:center;padding:16px;display:grid;position:fixed;inset:0}.overlay-backdrop{-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);pointer-events:auto;background:#02080ca8;animation:.3s both appear;position:absolute;inset:0}.obj.overlay{z-index:1;width:min(760px,94vw);max-height:80vh;box-shadow:0 0 40px color-mix(in srgb, var(--accent) 30%, transparent);position:relative}@keyframes appear{0%{opacity:0;transform:translateY(8px)scale(.985)}}.obj-close{width:44px;height:44px;color:var(--muted);background:0 0;border:0;font-size:1.5rem;line-height:1;position:absolute;top:2px;right:6px}.obj-close:hover{color:var(--accent)}.obj-title{letter-spacing:.16em;text-transform:uppercase;color:var(--accent);margin:0 36px 8px 0;font-size:.78rem;font-weight:600}.obj-md>:first-child{margin-top:0}.obj-md>:last-child{margin-bottom:0}.obj-md a{color:var(--accent)}.obj-md code{font-family:var(--mono);background:#3fd8ff1a;padding:0 4px;font-size:.9em}.obj-stat{gap:2px;display:grid}.obj-label{letter-spacing:.16em;text-transform:uppercase;color:var(--muted);font-size:.78rem}.obj-value{font-variant-numeric:tabular-nums;font-size:clamp(2rem,6vw,3.6rem);font-weight:300;line-height:1.05}.obj-value small{color:var(--muted);margin-left:4px;font-size:.4em}.obj-delta{color:var(--ok);font-size:.9rem}.obj-list{gap:4px;margin:0;padding-left:1.1rem;display:grid}.obj-list .done{color:var(--muted);text-decoration:line-through}.obj-table-wrap{overflow-x:auto}.obj-table{border-collapse:collapse;width:100%;font-size:.92rem}.obj-table th{text-align:left;letter-spacing:.14em;text-transform:uppercase;color:var(--accent);font-size:.72rem;font-weight:600}.obj-table th,.obj-table td{font-variant-numeric:tabular-nums;border-bottom:1px solid #3fd8ff2e;padding:6px 10px}.obj-code{font:.86rem/1.5 var(--mono);margin:0;overflow:auto}.obj-empty{color:var(--muted);margin:0}.integration-steps{color:var(--muted);gap:4px;margin:4px 0 10px;padding-left:1.2rem;font-size:.86rem;display:grid}.integration-steps li.done{color:var(--ok)}.obj-doc{max-height:70vh;overflow:auto}.obj-doc h1,.obj-doc h2,.obj-doc h3,.obj-doc h4{color:var(--accent);letter-spacing:.06em;font-weight:500}.obj-doc table{border-collapse:collapse;width:100%;font-size:.92rem}.obj-doc th,.obj-doc td{border:1px solid color-mix(in srgb, var(--accent) 22%, transparent);text-align:left;padding:5px 9px}.obj-doc th{color:var(--accent);letter-spacing:.14em;text-transform:uppercase;font-size:.72rem;font-weight:500}.obj-doc pre{border:1px solid color-mix(in srgb, var(--accent) 22%, transparent);font:.86rem/1.5 var(--mono);background:#3fd8ff0d;padding:8px 10px;overflow:auto}.obj-doc blockquote{border-left:2px solid var(--edge);color:var(--muted);margin:.6em 0;padding-left:12px}.obj-progress{gap:6px;min-width:0;display:grid}.obj-progress-head{justify-content:space-between;align-items:baseline;gap:12px;display:flex}.obj-progress-pct{font:1.1rem var(--mono);font-variant-numeric:tabular-nums}.obj-progress-bar{border:1px solid var(--edge);background:#3fd8ff12;height:8px}.obj-progress-bar i{background:var(--accent);height:100%;box-shadow:0 0 10px var(--accent);transition:width .4s;display:block}.obj-progress-detail{color:var(--muted);font-size:.82rem}.obj-checklist{gap:6px;margin:0;padding:0;list-style:none;display:grid}.obj-checklist li{align-items:center;gap:10px;display:flex}.obj-checklist .box{border:1px solid var(--accent);width:16px;height:16px;color:var(--accent);flex:none;place-items:center;font-size:.8rem;display:inline-grid}.obj-checklist .done{color:var(--muted)}.obj-checklist .done span:last-child{text-decoration:line-through}.obj-kv{gap:4px;margin:0;display:grid}.obj-kv>div{border-bottom:1px solid color-mix(in srgb, var(--accent) 16%, transparent);justify-content:space-between;gap:18px;padding:3px 0;display:flex}.obj-kv dt{color:var(--muted);letter-spacing:.14em;text-transform:uppercase;font-size:.78rem}.obj-kv dd{font-family:var(--mono);font-variant-numeric:tabular-nums;text-align:right;margin:0}.obj-countdown{justify-items:center;gap:2px;display:grid}.obj-countdown-time{font:300 clamp(2rem, 6vw, 3.4rem) var(--mono);font-variant-numeric:tabular-nums;text-shadow:0 0 14px var(--accent)}.obj-countdown.done .obj-countdown-time{color:var(--warn);text-shadow:0 0 14px var(--warn)}.obj-media{flex-direction:column;gap:6px;width:100%;max-height:100%;display:flex}.obj-media img,.obj-media video{object-fit:contain;border:1px solid var(--edge);background:#050b10;max-width:100%;max-height:50vh;margin:0 auto;display:block}.obj-pdf iframe{border:1px solid var(--edge);background:#050b10;width:100%;min-width:0;height:min(520px,62vh)}.obj-open{color:var(--accent);letter-spacing:.1em;text-transform:uppercase;font-size:.82rem}.obj-gallery-bar{justify-content:space-between;align-items:center;gap:10px;display:flex}.obj-gallery-bar span{color:var(--ink);justify-items:center;font-size:.86rem;display:grid}.obj-gallery-bar small{color:var(--muted);font-family:var(--mono)}.obj-gallery-bar button{border:1px solid var(--edge);min-width:44px;min-height:44px;color:var(--accent);cursor:pointer;background:0 0;font-size:1.3rem}.obj-gallery-bar button:disabled{opacity:.3;cursor:default}.obj-group{align-items:start;gap:14px;display:grid}.obj-group-grid{grid-template-columns:repeat(auto-fit,minmax(170px,1fr))}.obj-group-row{grid-auto-columns:minmax(150px,1fr);grid-auto-flow:column;overflow-x:auto}.obj-group-column{grid-template-columns:1fr}.obj-part{border:1px solid color-mix(in srgb, var(--accent) 20%, transparent);background:#3fd8ff0a;min-width:0;padding:8px 10px}.obj-tabs{border-bottom:1px solid var(--edge);gap:2px;margin-bottom:8px;display:flex;overflow-x:auto}.obj-tabs button{min-height:40px;color:var(--muted);letter-spacing:.14em;text-transform:uppercase;cursor:pointer;white-space:nowrap;background:0 0;border:0;padding:8px 14px;font-size:.78rem}.obj-tabs button.on{color:var(--accent);box-shadow:inset 0 -2px 0 var(--accent);text-shadow:0 0 8px var(--accent)}.obj-chart{width:100%;height:auto;display:block}.obj-chart .grid{stroke:#3fd8ff24;stroke-width:1px}.obj-chart .tick{fill:var(--muted);font:10px var(--mono);font-variant-numeric:tabular-nums}.legend{color:var(--muted);flex-wrap:wrap;gap:6px 14px;margin:6px 0 0;padding:0;font-size:.8rem;list-style:none;display:flex}.legend i{width:10px;height:10px;margin-right:6px;display:inline-block}.obj-gauge{justify-items:center;display:grid}.obj-gauge svg{width:min(100%,260px);height:auto}.obj-gauge .track{stroke:#3fd8ff26}.obj-gauge .value{stroke:var(--accent);filter:drop-shadow(0 0 6px var(--accent))}.obj-gauge.gauge-warn .value{stroke:var(--warn);filter:drop-shadow(0 0 6px var(--warn))}.obj-gauge.gauge-crit .value{stroke:var(--bad);filter:drop-shadow(0 0 6px var(--bad))}.gauge-read{align-items:baseline;gap:4px;margin-top:-62px;display:flex}.gauge-value{font-variant-numeric:tabular-nums;font-size:clamp(1.8rem,5vw,2.8rem);font-weight:300}.gauge-unit{color:var(--muted)}.obj-gauge .obj-label{margin-top:18px}.obj-timeline{border-left:1px solid var(--edge);gap:14px;margin:8px 0 0;padding:0 0 0 20px;list-style:none;display:grid}.obj-timeline li{gap:2px;display:grid;position:relative}.obj-timeline li:before{content:"";background:var(--accent);width:9px;height:9px;box-shadow:0 0 8px var(--accent);border-radius:50%;position:absolute;top:.5em;left:-25px}.obj-timeline time{font:.75rem/1.3 var(--mono);color:var(--accent)}.obj-timeline span{color:var(--muted);font-size:.9rem}.obj-graph{width:100%;height:auto;max-height:70vh;margin:0 auto;display:block}.obj[style*=" height:"] .obj-graph{max-height:calc(100% - 32px)}.obj-graph .edge{stroke:color-mix(in srgb, var(--accent) 55%, transparent);stroke-width:1.4px}.obj-graph .arrow{fill:var(--accent)}.obj-graph .node{fill:#3fd8ff26;stroke:var(--accent);stroke-width:1.5px}.obj-graph .node-label{fill:var(--ink);font:10px var(--ui)}.obj-graph .edge-label{fill:var(--muted);font:9px var(--ui)}.captions{z-index:20;left:50%;bottom:max(7%, env(safe-area-inset-bottom));text-align:center;pointer-events:none;text-shadow:0 0 18px #000,0 0 4px #000;text-wrap:balance;width:min(780px,100% - 32px);margin:0;font-size:clamp(1.1rem,2.6vw,1.6rem);font-weight:300;position:absolute;transform:translate(-50%)}.captions.done{animation:1.4s 8s forwards fadeOut}@keyframes fadeOut{to{opacity:0}}.command-bar{z-index:30;left:50%;bottom:max(14px, env(safe-area-inset-bottom));background:var(--glass);border:1px solid var(--edge);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);gap:8px;width:min(640px,100% - 24px);padding:8px;display:flex;position:absolute;transform:translate(-50%)}.command-bar input{background:0 0;border:0;outline:none;flex:1;min-height:44px;padding:0 10px;font-size:1.05rem}.command-bar button{border:1px solid var(--edge);background:0 0;min-width:44px;min-height:44px}.conn-badge{top:max(10px, env(safe-area-inset-top));font:500 .78rem var(--mono);letter-spacing:.08em;color:var(--warn);border:1px solid var(--warn);background:#0009;padding:6px 12px;position:absolute;right:12px}.mic-indicator{left:50%;top:max(12px, env(safe-area-inset-top));font:500 .82rem var(--mono);letter-spacing:.1em;text-transform:uppercase;color:#ffd9a0;border:1px solid var(--warn);background:#000000c7;align-items:center;gap:10px;padding:8px 16px;display:flex;position:absolute;transform:translate(-50%)}.mic-indicator i{background:var(--bad);width:10px;height:10px;box-shadow:0 0 10px var(--bad);border-radius:50%;animation:1s ease-in-out infinite mic-pulse}.mic-transcribing i{background:var(--warn);box-shadow:0 0 10px var(--warn)}@keyframes mic-pulse{50%{opacity:.35}}@media (prefers-reduced-motion:reduce){.mic-indicator i{animation:none}}.toasts{top:max(48px, env(safe-area-inset-top));gap:6px;width:min(420px,100% - 24px);display:grid;position:absolute;left:50%;transform:translate(-50%)}.toast{border:1px solid var(--edge);background:#000000d1;padding:10px 14px;font-size:.92rem}.toast-warn{border-color:var(--warn);color:#ffd9a0}.toast-error{border-color:var(--bad);color:#ffc2c9}.approval{border-color:var(--warn);background:#020c12eb;width:min(460px,100% - 24px);max-height:calc(100% - 24px);padding:20px;position:absolute;top:50%;left:50%;overflow:auto;transform:translate(-50%,-50%);box-shadow:0 0 0 100vmax #0000008c,0 0 30px #ffb45440}.plugins{flex-direction:column;width:min(560px,100% - 24px);display:flex;overflow:hidden}.plugins-body{min-height:0;padding-right:4px;overflow-y:auto}.plugins-heading{letter-spacing:.14em;text-transform:uppercase;color:var(--muted);margin:14px 0 6px;font-size:.78rem}.plugin-list{gap:8px;margin:0;padding:0;list-style:none;display:grid}.plugin-list li{background:#ffffff0a;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 10px;padding:8px 10px;display:flex}.plugin-info{flex:180px;min-width:0}.plugin-info .auth-note{font-size:.82rem}.plugin-actions{flex-wrap:wrap;gap:6px;display:flex}.plugin-actions button{border:1px solid var(--edge);background:0 0;padding:0 12px}.obj-sandbox{flex-direction:column;gap:6px;width:100%;min-width:min(560px,80vw);height:min(420px,60vh);display:flex}.obj-sandbox iframe{border:1px solid var(--edge);background:#050b10;flex:1;width:100%;min-height:200px}.camera-indicator{border-color:var(--bad);color:#ffc2c9;letter-spacing:.12em;text-transform:uppercase;background:#020c12e6;align-items:center;gap:10px;padding:6px 12px 6px 6px;font-size:.8rem;display:flex;position:absolute;bottom:12px;right:12px}.camera-indicator video{object-fit:cover;background:#000;width:72px;height:54px}.camera-indicator span:before{content:"";background:var(--bad);border-radius:50%;width:8px;height:8px;margin-right:8px;display:inline-block}.challenge,.enroll{border-color:var(--accent);box-shadow:0 0 0 100vmax #0000008c,0 0 30px #3fd8ff40}.challenge .approval-title,.enroll .approval-title{color:var(--accent)}.approval-head{align-items:center;gap:10px;display:flex}.approval-title{letter-spacing:.18em;text-transform:uppercase;color:var(--warn);font-size:.8rem}.tier{font:600 .74rem var(--mono);border:1px solid;padding:2px 8px}.tier-T2{color:var(--warn)}.tier-T3{color:var(--bad)}.approval-summary{font:.95rem/1.5 var(--mono);word-break:break-all;background:#ffffff0a;max-height:40vh;margin:14px 0;padding:10px 12px;overflow:auto}.approval-actions{flex-wrap:wrap;gap:8px;margin-top:14px;display:flex}.approval-actions button,.owner-menu button,.auth button{border:1px solid var(--edge);letter-spacing:.04em;background:0 0;padding:0 16px}button.primary{background:color-mix(in srgb, var(--accent) 22%, transparent);border-color:var(--accent)}button.danger{border-color:var(--bad);color:#ffc2c9}button:disabled{opacity:.4;cursor:not-allowed}.pinpad{justify-items:center;gap:8px;display:grid}.pin-dots{letter-spacing:.4em;min-height:1.6em;color:var(--accent);font-size:1.6rem}.pin-keys{grid-template-columns:repeat(3,64px);gap:8px;display:grid}.pin-keys button{border:1px solid var(--edge);background:#3fd8ff0d;font-size:1.2rem}.owner-menu{top:max(60px, env(safe-area-inset-top));background:#020c12f0;gap:8px;width:220px;padding:12px;display:grid;left:12px}.boot{background:#000;height:100%}.auth{gap:8px;width:min(380px,100% - 28px);padding:24px;display:grid;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%)}.auth h1{letter-spacing:.3em;text-transform:uppercase;color:var(--accent);margin:0 0 6px;font-size:1.1rem;font-weight:300}.auth label{letter-spacing:.12em;text-transform:uppercase;color:var(--muted);margin-top:6px;font-size:.78rem}.auth input{border:1px solid var(--edge);background:#ffffff0a;padding:0 12px}.auth button{margin-top:12px}.auth-note{color:var(--muted);margin:0;font-size:.9rem}.auth-error{color:#ffc2c9;margin:4px 0 0;font-size:.9rem}@media (width<=599px){.presence-full{inset:0}.captions{bottom:max(11%, env(safe-area-inset-bottom))}}@media (prefers-reduced-motion:reduce){.obj,.presence{transition:none;animation:none}}.status-badge{left:12px;bottom:max(12px, env(safe-area-inset-bottom));font:500 .78rem var(--mono);letter-spacing:.08em;color:var(--ink);border:1px solid var(--edge);background:#0000008c;align-items:center;gap:9px;max-width:min(60vw,360px);padding:6px 12px;display:flex;position:absolute}.status-badge span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.status-badge i{background:var(--muted);border-radius:50%;flex:none;width:9px;height:9px}.status-idle i{background:var(--ok);box-shadow:0 0 8px var(--ok)}.status-working i,.status-speaking i{background:var(--accent);box-shadow:0 0 10px var(--accent);animation:1s ease-in-out infinite mic-pulse}.status-listening i{background:var(--bad);box-shadow:0 0 10px var(--bad);animation:1s ease-in-out infinite mic-pulse}.status-waiting{border-color:var(--warn);color:#ffd9a0}.status-waiting i{background:var(--warn);box-shadow:0 0 10px var(--warn);animation:1s ease-in-out infinite mic-pulse}.status-offline{border-color:var(--warn);color:var(--warn)}.status-offline i{background:var(--warn)}@media (prefers-reduced-motion:reduce){.status-badge i{animation:none!important}}.clock{right:12px;bottom:max(12px, env(safe-area-inset-bottom));text-align:right;color:var(--muted);line-height:1.15;font-family:var(--mono);pointer-events:none;position:absolute}.clock b{color:var(--ink);letter-spacing:.06em;font-size:1.15rem;font-weight:500;display:block}.clock span{letter-spacing:.1em;text-transform:uppercase;font-size:.7rem}.settings{flex-direction:column;width:min(520px,100% - 24px);max-height:calc(100% - 24px);display:flex}.settings-body{gap:6px;min-height:0;padding-right:4px;display:grid;overflow-y:auto}.settings-field{gap:3px;display:grid}.settings-field>span{letter-spacing:.1em;text-transform:uppercase;color:var(--muted);font-size:.74rem}.settings-field input:not([type=range]):not([type=checkbox]),.settings-field select{border:1px solid var(--edge);color:var(--ink);min-height:40px;font:inherit;background:#ffffff0a;padding:0 10px}.settings-field select option{background:#06141c}.settings-check{align-items:center;gap:10px;min-height:40px;display:flex}.slash-list{border:1px solid var(--edge);background:#020c12f5;max-height:40vh;margin:0;padding:4px;list-style:none;position:absolute;bottom:calc(100% + 6px);left:0;right:0;overflow-y:auto}.slash-list li{cursor:pointer;align-items:baseline;gap:10px;padding:7px 10px;display:flex}.slash-list li.on,.slash-list li:hover{background:color-mix(in srgb, var(--accent) 18%, transparent)}.slash-list b{font:600 .9rem var(--mono);color:var(--accent)}.slash-list i{font:.78rem var(--mono);color:var(--warn);font-style:normal}.slash-list span{color:var(--muted);font-size:.82rem}.movable{position:absolute}.movable[data-panel=status],.movable[data-panel=clock]{cursor:grab;touch-action:none;pointer-events:auto}.movable:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.panel{resize:both;flex-direction:column;width:clamp(260px,28vw,420px);min-width:220px;min-height:140px;max-height:80vh;padding:0;display:flex;overflow:hidden}.panel-chat{height:62vh}.panel-tasks{width:clamp(240px,26vw,360px);height:40vh}.panel-head{cursor:grab;touch-action:none;border-bottom:1px solid var(--edge);-webkit-user-select:none;user-select:none;justify-content:space-between;align-items:center;gap:10px;padding:8px 12px;display:flex}.panel-head .obj-close{position:static}.chat-lines{flex:1;align-content:start;gap:8px;min-height:0;padding:10px 12px;display:grid;overflow-y:auto}.chat-line{white-space:pre-wrap;overflow-wrap:anywhere;max-width:92%;margin:0;padding:7px 10px;font-size:.9rem}.chat-user{background:color-mix(in srgb, var(--accent) 18%, transparent);border:1px solid var(--edge);justify-self:end}.chat-assistant{background:#ffffff0d;justify-self:start}.chat-form{border-top:1px solid var(--edge);gap:6px;padding:8px;display:flex}.chat-form input{border:1px solid var(--edge);min-width:0;color:var(--ink);min-height:40px;font:inherit;background:#ffffff0a;flex:1;padding:0 10px}.chat-form button{border:1px solid var(--edge);color:var(--ink);background:0 0;min-height:40px;padding:0 14px}.task-body{flex:1;min-height:0;padding:10px 12px;overflow-y:auto}.task-list{gap:8px;margin:0;padding:0;list-style:none;display:grid}.task-list li{border-left:3px solid var(--accent);background:#ffffff0a;gap:2px;padding:8px 10px;display:grid}.task-list li.overdue{border-left-color:var(--bad)}.task-title{overflow-wrap:anywhere;font-size:.95rem}.task-due{font:.75rem var(--mono);color:var(--muted)}.task-list li.overdue .task-due{color:var(--bad)}@media (width<=600px){.panel{resize:none;width:calc(100% - 24px);left:12px!important}.panel-chat{height:52vh;bottom:56px;top:auto!important}.panel-tasks{height:30vh;top:56px!important}}.help{flex-direction:column;width:min(560px,100% - 24px);max-height:calc(100% - 24px);display:flex}.help-list{gap:4px;min-height:0;margin:8px 0;display:grid;overflow-y:auto}.help-row{border-bottom:1px solid #ffffff0f;grid-template-columns:minmax(130px,38%) 1fr;gap:12px;padding:6px 4px;display:grid}.help-row dt{font:600 .9rem var(--mono);color:var(--accent);overflow-wrap:anywhere}.help-row dt i{color:var(--warn);font-style:normal;font-weight:400}.help-row dd{color:var(--ink);margin:0;font-size:.9rem}@media (width<=600px){.help-row{grid-template-columns:1fr;gap:2px}}.connectors{width:min(600px,100% - 24px);max-height:calc(100% - 24px);overflow-y:auto}.connector-form{gap:8px;display:grid}.connector-form textarea,.settings-field textarea{border:1px solid var(--edge);color:var(--ink);font:.85rem var(--mono);resize:vertical;background:#ffffff0a;padding:8px 10px}.connector-steps{color:var(--muted);gap:4px;margin:0;padding-left:20px;font-size:.88rem;display:grid}.connector-warning{border-left:3px solid var(--warn);color:#ffd9a0;padding-left:10px}.conn-status{font:.74rem var(--mono)}.conn-ready{color:var(--ok)}.conn-error{color:var(--bad)}.conn-connecting{color:var(--warn)}.conn-off{color:var(--muted)}.settings-wide{width:min(980px,100% - 24px);height:min(720px,100% - 24px)}.settings-layout{flex:1;grid-template-columns:190px 1fr;gap:16px;min-height:0;margin-top:8px;display:grid}.settings-tabs{align-content:start;gap:6px;display:grid}.settings-tab{text-align:left;color:var(--ink);background:0 0;border:1px solid #0000;gap:2px;padding:10px 12px;display:grid}.settings-tab small{color:var(--muted);font-size:.74rem}.settings-tab:hover{background:#ffffff0d}.settings-tab.on{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 16%, transparent)}.settings-wide .settings-body{align-content:start;padding-right:8px}@media (width<=700px){.settings-wide{height:calc(100% - 24px)}.settings-layout{grid-template-columns:1fr;gap:8px}.settings-tabs{grid-auto-columns:1fr;grid-auto-flow:column;overflow-x:auto}.settings-tab small{display:none}}.look-tab{grid-template-columns:minmax(220px,300px) 1fr;align-items:start;gap:18px;display:grid}.look-side{gap:10px;display:grid;position:sticky;top:0}.look-controls{gap:6px;min-width:0;display:grid}@media (width<=860px){.look-tab{grid-template-columns:1fr}.look-side{position:static}}.look-preview{border:1px solid var(--edge);background:#000;height:230px;position:relative;overflow:hidden}.look-preview-glow{background:radial-gradient(ellipse at 50% 55%, color-mix(in srgb, var(--accent) 22%, transparent), transparent 65%);position:absolute;inset:0}.look-preview-stage{position:absolute;inset:0}.look-preview-caption{text-align:center;text-shadow:0 0 10px #000;margin:0;position:absolute;bottom:8px;left:8px;right:8px}.look-preview .presence-full{inset:0}.theme-grid{grid-template-columns:repeat(auto-fill,minmax(118px,1fr));gap:8px;display:grid}.theme-card{border:1px solid var(--edge);color:var(--ink);text-align:left;background:#ffffff08;justify-items:start;gap:1px;padding:10px;display:grid}.theme-card i{background:var(--swatch);width:22px;height:22px;box-shadow:0 0 12px var(--swatch);border-radius:50%;margin-bottom:4px}.theme-card small{color:var(--muted);font-size:.72rem}.theme-card.on,.style-choice.on{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 18%, transparent)}.style-row{grid-template-columns:repeat(3,1fr);gap:8px;display:grid}.style-choice{border:1px solid var(--edge);color:var(--ink);text-align:left;background:#ffffff08;gap:2px;padding:10px;display:grid}.style-choice small{color:var(--muted);font-size:.72rem}.swatch-row{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.swatch{border:2px solid #0000;border-radius:50%;width:32px;height:32px;min-height:32px;padding:0}.swatch.on{box-shadow:0 0 0 2px var(--accent);border-color:#fff}.swatch-custom{color:var(--muted);align-items:center;gap:6px;font-size:.8rem;display:flex}.swatch-custom input[type=color]{border:1px solid var(--edge);background:0 0;width:40px;height:32px;padding:0}.captions-small{font-size:clamp(.9rem,2vw,1.15rem)}.captions-medium{font-size:clamp(1.1rem,2.6vw,1.6rem)}.captions-large{font-size:clamp(1.4rem,3.6vw,2.3rem)}.voice-hear{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.connector-command{border:1px solid var(--edge);font:.85rem var(--mono);-webkit-user-select:all;user-select:all;background:#ffffff0d;margin:0;padding:8px 10px;overflow-x:auto}html,body{overscroll-behavior:none}@media (pointer:coarse){.stage{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}}input,textarea,select,.connector-command{-webkit-user-select:text;user-select:text}.owner-menu{max-height:calc(100dvh - 80px);overflow-y:auto}.touch-controls{z-index:25;left:0;right:0;bottom:max(14px, env(safe-area-inset-bottom));pointer-events:none;justify-content:center;align-items:flex-end;gap:26px;display:flex;position:absolute}.touch-controls>*{pointer-events:auto}.touch-talk{justify-items:center;gap:6px;display:grid}.touch-hint{max-width:70vw;font:500 .74rem var(--mono);letter-spacing:.06em;color:var(--muted);text-align:center;text-shadow:0 0 6px #000,0 0 2px #000;padding:2px 10px}.touch-mic,.touch-side{border:1px solid var(--edge);color:var(--ink);background:var(--glass);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);touch-action:none;-webkit-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;border-radius:50%;place-items:center;padding:0;display:grid}.touch-mic{border-color:var(--accent);width:76px;height:76px;box-shadow:0 0 22px color-mix(in srgb, var(--accent) 30%, transparent)}.touch-mic.on{background:color-mix(in srgb, var(--bad) 40%, transparent);border-color:var(--bad);box-shadow:0 0 28px var(--bad);animation:1s ease-in-out infinite mic-pulse}.touch-side{touch-action:manipulation;width:52px;height:52px;margin-bottom:12px}@media (prefers-reduced-motion:reduce){.touch-mic.on{animation:none}}@media (pointer:coarse){.captions{bottom:calc(max(14px, env(safe-area-inset-bottom)) + 150px)}.status-badge,.clock{bottom:max(8px, env(safe-area-inset-bottom))}.presence-corner{bottom:calc(max(14px, env(safe-area-inset-bottom)) + 70px)}}@media (width<=600px) and (pointer:coarse){.panel-chat{bottom:calc(max(14px, env(safe-area-inset-bottom)) + 150px);height:min(48vh,100dvh - 260px)}.objects-stack{padding-bottom:190px}}.elsewhere{z-index:3000;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#000000c7;place-items:center;padding:16px;display:grid;position:fixed;inset:0}.elsewhere-card{border:1px solid var(--edge);background:var(--glass);max-width:380px;color:var(--ink);text-align:center;border-radius:16px;padding:24px}.elsewhere-card h2{margin:0 0 10px;font-size:1.15rem}.elsewhere-card p{color:var(--muted);margin:0 0 18px;line-height:1.45}.elsewhere-btn{border:1px solid var(--accent);background:color-mix(in srgb, var(--accent) 25%, transparent);min-height:48px;color:var(--ink);font:600 1rem var(--mono);cursor:pointer;border-radius:24px;padding:0 28px}.obj-grip{cursor:grab;touch-action:none;border-radius:8px 8px 0 0;height:22px;position:absolute;top:0;left:0;right:92px}.obj-grip:before{content:"";background:var(--muted);opacity:.35;border-radius:2px;width:34px;height:3px;margin-left:-17px;transition:opacity .15s;position:absolute;top:8px;left:50%}.obj:hover .obj-grip:before,.obj-grip:focus-visible:before{opacity:.9}.obj-grip:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.obj.dragging{cursor:grabbing;box-shadow:0 0 0 1px var(--accent), 0 8px 30px #00000080;-webkit-user-select:none;user-select:none;transition:none;animation:none}.obj-pin{width:44px;height:44px;color:var(--muted);opacity:.55;background:0 0;border:0;place-items:center;display:grid;position:absolute;top:2px;right:50px}.obj:hover .obj-pin,.obj-pin.on,.obj-pin:focus-visible{opacity:1}.obj-pin.on,.obj-pin:hover{color:var(--accent)}.obj.pinned{border-color:color-mix(in srgb, var(--accent) 55%, transparent)}.obj-resize{cursor:nwse-resize;touch-action:none;opacity:0;background:linear-gradient(135deg, transparent 55%, var(--accent) 56%, var(--accent) 64%, transparent 65%, transparent 76%, var(--accent) 77%, var(--accent) 85%, transparent 86%);width:22px;height:22px;transition:opacity .15s;position:absolute;bottom:0;right:0}.obj:hover .obj-resize,.obj.dragging .obj-resize{opacity:.7}@media (pointer:coarse){.obj-pin{opacity:1}.obj-resize{opacity:.7;width:30px;height:30px}.obj-grip{height:30px}.obj-grip:before{opacity:.7;top:12px}}.profile-badge{top:max(56px, calc(env(safe-area-inset-top) + 48px));border:1px solid var(--edge);background:var(--glass);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);color:var(--ink);cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none;border-radius:12px;align-items:center;gap:8px;padding:6px 12px 6px 8px;display:flex;position:fixed;left:12px}.profile-shield{color:var(--accent);flex:none}.profile-shield.member{color:#8ff0b0}.profile-shield.guest{color:var(--warn)}.profile-text{min-width:0;line-height:1.15;display:grid}.profile-text b{text-overflow:ellipsis;white-space:nowrap;max-width:130px;font-size:.86rem;font-weight:600;overflow:hidden}.profile-text small{font:500 .64rem var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}@media (width<=600px){.profile-text{display:none}.profile-badge{padding:4px 6px}}.hud{--hud-line:color-mix(in srgb, var(--accent) 62%, transparent);--hud-line-dim:color-mix(in srgb, var(--accent) 26%, transparent);--hud-glow:color-mix(in srgb, var(--accent) 42%, transparent);--hud-bg:#030d14d1;--hud-bg-hi:#081e2ae6;--cut:10px;color:var(--ink);font-family:var(--mono);-webkit-user-select:none;user-select:none}.hud-cut{background:var(--hud-line);clip-path:polygon(0 0, calc(100% - var(--cut)) 0, 100% var(--cut), 100% 100%, var(--cut) 100%, 0 calc(100% - var(--cut)));position:relative}.hud-cut:before{content:"";background:var(--hud-bg);clip-path:polygon(0 0, calc(100% - var(--cut) + 1px) 0, 100% calc(var(--cut) - 1px), 100% 100%, calc(var(--cut) - 1px) 100%, 0 calc(100% - var(--cut) + 1px));z-index:0;transition:background .14s ease-out;position:absolute;inset:1px}.hud-cut>*{z-index:1;position:relative}.hud-kicker{letter-spacing:.22em;text-transform:uppercase;color:var(--muted);margin:0 0 6px 2px;font-size:.62rem}.hud-profile{top:max(56px, calc(env(safe-area-inset-top) + 48px));cursor:grab;touch-action:none;align-items:center;display:flex;position:fixed;left:12px}.hud-emblem{z-index:2;background:radial-gradient(circle, var(--hud-bg-hi), var(--hud-bg));width:64px;height:64px;box-shadow:0 0 18px var(--hud-glow), inset 0 0 12px var(--hud-line-dim);border-radius:50%;flex:none;place-items:center;display:grid;position:relative}.hud-emblem-svg{color:var(--accent)}.hud-emblem-svg.member{color:#8ff0b0}.hud-emblem-svg.guest{color:var(--warn)}.hud-ring-chase{opacity:0;transform-origin:32px 32px}.hud-tag{--cut:9px;gap:1px;min-width:176px;margin-left:-14px;padding:6px 18px 7px 24px;line-height:1.15;display:grid}.hud-tag b{letter-spacing:.02em;text-overflow:ellipsis;white-space:nowrap;max-width:190px;font-size:.95rem;font-weight:600;overflow:hidden}.hud-tag small{letter-spacing:.16em;text-transform:uppercase;color:var(--muted);font-size:.62rem}.hud-tag .hud-tag-top{color:var(--accent);letter-spacing:.2em}.hud-tag:after{content:"";background:var(--accent);width:2px;box-shadow:0 0 8px var(--hud-glow);z-index:1;position:absolute;top:8px;bottom:8px;left:10px}.hud-profile.member .hud-tag:after{background:#8ff0b0}.hud-profile.guest .hud-tag:after{background:var(--warn)}.hud-clock{top:max(56px, calc(env(safe-area-inset-top) + 48px));cursor:grab;touch-action:none;text-align:left;position:fixed;left:332px}.hud-clock time{align-items:flex-end;gap:14px;display:flex}.hud-date{justify-items:start;line-height:1;display:grid}.hud-day{letter-spacing:.02em;text-shadow:0 0 14px var(--hud-glow);font-size:3.1rem;font-weight:700;display:flex}.hud-month{background:var(--accent);color:#031018;letter-spacing:.22em;text-transform:uppercase;clip-path:polygon(0 0,100% 0,calc(100% - 6px) 100%,0 100%);margin-top:2px;padding:1px 8px 1px 6px;font-size:.7rem;font-weight:700}.hud-weekday{letter-spacing:.2em;text-transform:uppercase;color:var(--muted);margin-top:3px;font-size:.64rem}.hud-time-block{gap:5px;min-width:150px;padding-bottom:4px;display:grid}.hud-clock-time{letter-spacing:.06em;align-items:baseline;font-size:1.55rem;display:flex}.hud-colon{color:var(--accent);margin:0 1px;font-style:normal}.hud-period{letter-spacing:.2em;color:var(--muted);margin-left:6px;font-size:.62rem}.hud-line{background:linear-gradient(90deg, var(--hud-line), transparent);height:1px;position:relative}.hud-line:after{content:"";border:1px solid var(--accent);background:var(--hud-bg);border-radius:50%;width:7px;height:7px;position:absolute;top:-3px;left:-3px}.hud-dot{background:var(--accent);width:5px;height:5px;box-shadow:0 0 8px var(--accent);border-radius:50%;position:absolute;top:-2px;left:0}.hud-digit{display:inline-block}.hud-launcher{left:12px;top:calc(max(56px, env(safe-area-inset-top) + 48px) + 86px);cursor:grab;touch-action:none;position:fixed}.hud-stack{gap:6px;margin:0;padding:0;list-style:none;display:grid}.hud-tab{--cut:9px;align-items:stretch;min-width:176px;transition:transform .14s ease-out,filter .14s ease-out;display:flex}.hud-tab-main{color:var(--ink);font:inherit;letter-spacing:.06em;text-align:left;cursor:pointer;background:0 0;border:0;flex:1;grid-template-columns:26px 1fr;align-items:center;gap:10px;min-height:40px;padding:7px 18px 9px 10px;font-size:.82rem;display:grid;position:relative;overflow:hidden}.hud-tab-main:focus-visible{outline:1px dashed var(--accent);outline-offset:-3px}.hud-icon{background:var(--hud-line-dim);width:26px;height:26px;color:var(--accent);place-items:center;font-size:.95rem;transition:background .14s ease-out,color .14s;display:grid}.hud-tab-label{text-transform:uppercase;letter-spacing:.14em;font-size:.74rem}.hud-tab-engaged{letter-spacing:.2em;color:var(--accent);opacity:0;font-size:.74rem;position:absolute;top:50%;left:46px;transform:translateY(-50%)}.hud-tab:after{content:"";background:var(--accent);width:26%;height:2px;box-shadow:0 0 6px var(--hud-glow);z-index:2;transition:width .22s ease-out;position:absolute;bottom:4px;left:12px}.hud-sweep,.hud-scan{pointer-events:none;opacity:0;position:absolute;inset:0}.hud-sweep{background:linear-gradient(100deg, transparent 30%, color-mix(in srgb, var(--accent) 38%, transparent) 50%, transparent 70%);transform:translate(-100%)}.hud-scan{background:linear-gradient(180deg, transparent, color-mix(in srgb, var(--accent) 55%, transparent) 50%, transparent);height:14px;inset:-14px 0 auto}.hud-ripple{background:radial-gradient(circle, color-mix(in srgb, var(--accent) 55%, transparent), transparent 62%);opacity:.9;pointer-events:none;border-radius:50%;animation:.6s ease-out forwards hud-ripple;position:absolute;transform:scale(0)}@media (hover:hover){.hud-tab:hover{filter:brightness(1.22);transform:translate(6px)}.hud-tab:hover:after{width:calc(100% - 24px)}.hud-tab:hover:before{background:var(--hud-bg-hi)}.hud-tab:hover .hud-icon{background:var(--accent);color:#031018}.hud-tab:hover .hud-sweep{opacity:1;animation:.6s ease-out hud-sweep}}.hud-tab:active{transform:translate(3px)scale(.97)}.hud-tab:active:before{background:color-mix(in srgb, var(--accent) 18%, var(--hud-bg))}.hud-tab.engaged .hud-tab-label{opacity:0}.hud-tab.engaged .hud-tab-engaged{opacity:1;animation:.65s steps(2,end) hud-flicker}.hud-tab.engaged .hud-scan{opacity:1;animation:.45s linear hud-scan}.hud-tab.current:before{background:var(--hud-bg-hi)}.hud-tab.current:after{width:calc(100% - 24px)}.hud-tab.current .hud-tab-title{color:var(--accent)}.hud-btn{background:var(--hud-line-dim);width:36px;height:32px;color:var(--ink);cursor:pointer;clip-path:polygon(7px 0,100% 0,calc(100% - 7px) 100%,0 100%);border:0;place-items:center;padding:0;transition:background .14s ease-out,color .14s,transform .1s;display:inline-grid;position:relative;overflow:hidden}.hud-btn sup{color:var(--accent);font-size:.55rem;position:absolute;top:3px;right:6px}.hud-btn.on,.hud-btn[aria-pressed=true]{color:var(--accent);background:color-mix(in srgb, var(--accent) 24%, transparent)}.hud-btn-main{background:var(--accent);color:#031018;width:52px;height:36px}.hud-btn:focus-visible{outline:1px dashed var(--accent);outline-offset:2px}@media (hover:hover){.hud-btn:hover{background:color-mix(in srgb, var(--accent) 44%, transparent);color:#fff}.hud-btn-main:hover{background:color-mix(in srgb, var(--accent) 78%, #fff);color:#031018}}.hud-btn:active{transform:scale(.94)}.hud-range{appearance:none;cursor:pointer;--fill:0%;background:0 0;width:100%;height:14px;margin:0}.hud-range::-webkit-slider-runnable-track{background:linear-gradient(90deg, var(--accent) var(--fill), var(--hud-line-dim) var(--fill));height:2px}.hud-range::-moz-range-track{background:var(--hud-line-dim);height:2px}.hud-range::-moz-range-progress{background:var(--accent);height:2px}.hud-range::-webkit-slider-thumb{-webkit-appearance:none;background:var(--accent);clip-path:polygon(0 0,100% 0,100% 70%,50% 100%,0 70%);width:9px;height:13px;box-shadow:0 0 8px var(--hud-glow);border:0;margin-top:-5.5px}.hud-range::-moz-range-thumb{background:var(--accent);border:0;border-radius:0;width:9px;height:13px}.hud-range:disabled{opacity:.4;cursor:default}.hud-chip{border:1px solid var(--hud-line-dim);color:var(--muted);font:inherit;letter-spacing:.16em;text-transform:uppercase;cursor:pointer;background:0 0;padding:4px 12px;font-size:.66rem;transition:color .14s,border-color .14s,background .14s}.hud-chip.on{color:var(--accent);border-color:var(--accent);background:color-mix(in srgb, var(--accent) 12%, transparent)}@media (hover:hover){.hud-chip:hover{color:var(--ink);border-color:var(--hud-line)}}.hud-mini{border:1px solid var(--hud-line-dim);width:30px;height:30px;color:var(--accent);font:inherit;cursor:pointer;background:0 0;align-self:center;margin-right:8px;font-size:1.05rem;transition:background .14s,color .14s}@media (hover:hover){.hud-mini:hover{background:var(--accent);color:#031018}}.hud-music{--cut:14px;cursor:grab;touch-action:none;padding:10px 14px 12px;position:fixed;bottom:12px;right:12px}.hud-music.mini{width:min(560px,100vw - 24px)}.hud-music.full{width:min(1000px,100vw - 24px);max-height:calc(100vh - 24px);padding:12px 16px 16px;overflow:auto}.hud-music-head{justify-content:space-between;align-items:center;margin-bottom:6px;display:flex}.hud-music-head .hud-kicker{margin:0}.hud-head-actions{gap:4px;display:flex}.hud-head-actions .hud-btn{width:30px;height:24px}.hud-music-body{align-items:center;gap:16px;display:flex}.hud-music.full .hud-music-body{align-items:stretch;gap:22px}.hud-music-left{flex:none;align-items:center;gap:12px;display:flex}.hud-music-main{flex:1;align-content:center;gap:8px;min-width:0;display:grid}.hud-now{gap:2px;min-width:0;display:grid}.hud-title{letter-spacing:.02em;white-space:nowrap;text-overflow:ellipsis;font-variant-ligatures:none;font-size:1rem;font-weight:600;overflow:hidden}.hud-music.full .hud-title{white-space:normal;font-size:1.35rem}.hud-sub{letter-spacing:.1em;text-transform:uppercase;color:var(--muted);white-space:nowrap;text-overflow:ellipsis;font-size:.7rem;overflow:hidden}.hud-timeline{grid-template-columns:auto 1fr auto;align-items:center;gap:10px;display:grid}.hud-time{letter-spacing:.1em;color:var(--muted);font-variant-numeric:tabular-nums;font-size:.7rem}.hud-controls{align-items:center;gap:6px;display:flex}.hud-controls .hud-btn:first-child{margin-right:6px}.hud-controls .hud-btn:last-child{margin-left:6px}.hud-volume{grid-template-columns:auto 1fr;align-items:center;gap:8px;max-width:260px;display:grid}.hud-unlock{border:1px solid var(--warn);color:var(--warn);font:inherit;letter-spacing:.16em;text-transform:uppercase;cursor:pointer;background:0 0;justify-self:start;padding:4px 12px;font-size:.66rem;animation:1.4s ease-in-out infinite hud-pulse}.hud-dial{--bass:0;flex:none;position:relative}.hud-dial-svg{width:100%;height:100%;position:absolute;inset:0;overflow:visible}.hud-dial-ticks{fill:none;stroke:var(--hud-line);stroke-width:3px;stroke-dasharray:1 5.02}.hud-dial-track{fill:none;stroke:var(--hud-line-dim);stroke-width:2px}.hud-dial-arc{fill:none;stroke:var(--accent);stroke-width:3px;stroke-linecap:butt;filter:drop-shadow(0 0 4px var(--hud-glow));transition:stroke-dasharray .25s linear}.hud-dial-inner{fill:none;stroke:var(--hud-line-dim);stroke-width:1px}.hud-needle{transform-origin:100px 100px;opacity:.85}.hud-needle line{stroke:var(--accent);stroke-width:1.4px;stroke-linecap:round}.hud-needle circle{fill:var(--accent);filter:drop-shadow(0 0 4px var(--accent))}.hud-spectrum{pointer-events:none;position:absolute;inset:0}.hud-cover{color:var(--hud-line);background:var(--hud-bg-hi) center / cover no-repeat;box-shadow:0 0 16px var(--hud-line-dim), inset 0 0 14px #0000008c;border:1px solid var(--hud-line);transform:scale(calc(1 + var(--bass) * .045));border-radius:50%;place-items:center;display:grid;position:absolute;inset:20%}.hud-levels{flex-direction:column-reverse;gap:3px;width:9px;height:220px;display:flex}.hud-levels i{background:var(--hud-line-dim);flex:1;transition:background 80ms linear,box-shadow 80ms linear;display:block}.hud-levels i.on{background:var(--accent);box-shadow:0 0 6px var(--hud-glow)}.hud-levels i:nth-child(n+10).on{background:var(--warn);box-shadow:0 0 6px color-mix(in srgb, var(--warn) 50%, transparent)}.hud-playlist{grid-template-rows:auto auto minmax(0,1fr);gap:8px;width:300px;min-width:0;max-height:340px;display:grid}.hud-tabs{flex-wrap:wrap;gap:6px;display:flex}.hud-search{border:1px solid var(--hud-line-dim);width:100%;color:var(--ink);font:inherit;background:#0000004d;padding:6px 10px;font-size:.8rem}.hud-search:focus{border-color:var(--accent);outline:none}.hud-list{align-content:start;gap:5px;min-height:0;margin:0;padding:0 4px 0 0;list-style:none;display:grid;overflow-y:auto}.hud-list .hud-tab{--cut:7px;min-width:0}.hud-list .hud-tab-main{grid-template-columns:1fr;gap:1px;min-height:0;padding:6px 12px 8px 14px;display:grid}.hud-tab-title{letter-spacing:.03em;white-space:nowrap;text-overflow:ellipsis;font-size:.8rem;overflow:hidden}.hud-list small{letter-spacing:.12em;text-transform:uppercase;color:var(--muted);white-space:nowrap;text-overflow:ellipsis;font-size:.62rem;overflow:hidden}.hud-source{letter-spacing:.18em;color:#031018;background:var(--accent);clip-path:polygon(0 0,100% 0,calc(100% - 4px) 100%,0 100%);vertical-align:1px;margin-left:8px;padding:0 5px;font-size:.56rem;font-style:normal}.hud-notice{border-left:2px solid var(--warn);letter-spacing:.06em;color:var(--warn);margin:0;padding:4px 10px;font-size:.7rem}.hud-empty{color:var(--muted);padding:10px 4px;font-size:.75rem}@keyframes hud-spin{to{transform:rotate(360deg)}}@keyframes hud-sweep{0%{transform:translate(-100%)}to{transform:translate(100%)}}@keyframes hud-scan{0%{top:-14px}to{top:calc(100% + 14px)}}@keyframes hud-ripple{to{opacity:0;transform:scale(1)}}@keyframes hud-flicker{0%,to{opacity:1}25%{opacity:.2}50%{opacity:1}75%{opacity:.45}}@keyframes hud-pulse{0%,to{opacity:1}50%{opacity:.45}}@keyframes hud-boot{0%{opacity:0;filter:brightness(2.2);transform:translate(-14px)}30%{opacity:1}42%{opacity:.35}56%{opacity:1}70%{opacity:.7}to{opacity:1;filter:none;transform:none}}@keyframes hud-roll{0%{opacity:0;transform:translateY(60%)}to{opacity:1;transform:none}}@keyframes hud-blink{0%,49%{opacity:1}50%,to{opacity:.25}}@keyframes hud-travel{0%{left:0}to{left:calc(100% - 5px)}}@keyframes hud-flare{0%{box-shadow:0 0 18px var(--hud-glow), 0 0 0 0 var(--accent)}60%{box-shadow:0 0 30px var(--accent), 0 0 0 14px transparent}to{box-shadow:0 0 18px var(--hud-glow), 0 0 0 0 transparent}}[data-hud-anim=full] .hud-boot{animation:.55s ease-out both hud-boot;animation-delay:calc(var(--i,0) * 80ms)}[data-hud-anim=full] .hud-ring-turn{transform-origin:32px 32px;animation:40s linear infinite hud-spin}[data-hud-anim=full] .hud-profile.speaking .hud-ring-turn{animation-duration:7s}[data-hud-anim=full] .hud-profile.speaking .hud-emblem{animation:.9s ease-out hud-flare}[data-hud-anim=full] .hud-profile.busy .hud-ring-chase{opacity:1;animation:1.5s linear infinite hud-spin}[data-hud-anim=full] .hud-profile.listening .hud-emblem{box-shadow:0 0 26px var(--accent), inset 0 0 14px var(--hud-line-dim)}[data-hud-anim=full] .hud-digit{animation:.35s ease-out hud-roll}[data-hud-anim=full] .hud-colon{animation:1s step-end infinite hud-blink}[data-hud-anim=full] .hud-dot{animation:1s linear infinite hud-travel}[data-hud-anim=full] .hud-dial.playing .hud-needle{animation:3s linear infinite hud-spin}[data-hud-anim=full] .hud-dial.playing .hud-cover{animation:22s linear infinite hud-spin-keep}@keyframes hud-spin-keep{to{rotate:360deg}}[data-hud-anim=full] .hud-tab-main:focus-visible{animation:1.6s ease-in-out infinite hud-pulse}[data-hud-anim=reduced] .hud-boot,[data-hud-anim=reduced] .hud-digit,[data-hud-anim=reduced] .hud-colon,[data-hud-anim=reduced] .hud-dot{animation:none}[data-hud-anim=reduced] .hud-needle{display:none}[data-hud-anim=off] .hud *,[data-hud-anim=off] .hud{transition:none!important;animation:none!important}[data-hud-anim=off] .hud-tab:hover{transform:none}[data-hud-anim=off] .hud-needle{display:none}@media (prefers-reduced-motion:reduce){.hud *,.hud{transition:none!important;animation:none!important}.hud-tab:hover{transform:none}}@media (width<=900px){.hud-clock{left:12px;top:calc(max(56px, env(safe-area-inset-top) + 48px) + 76px)}.hud-launcher{top:calc(max(56px, env(safe-area-inset-top) + 48px) + 180px)}}@media (width<=640px){.hud-tag{min-width:120px}.hud-tag b{max-width:110px}.hud-day{font-size:2.2rem}.hud-launcher .hud-tab{min-width:0}.hud-launcher .hud-tab-main{grid-template-columns:26px;padding:7px 8px 9px}.hud-launcher .hud-tab-label,.hud-launcher .hud-tab-engaged,.hud-launcher .hud-kicker{display:none}.hud-music.mini{bottom:56px}.hud-music.full .hud-music-body{flex-direction:column;align-items:center}.hud-music.full .hud-music-left{flex-wrap:wrap;justify-content:center}.hud-playlist{width:100%;max-height:220px}.hud-levels{height:120px}}
1
+ :root{--accent:#3fd8ff;--warn:#ffb454;--bad:#ff6b7a;--ok:#5ef0b0;--ink:#d4ecf7;--muted:#7fa3b6;--glass:#06141c9e;--edge:color-mix(in srgb, var(--accent) 48%, transparent);--ui:"Segoe UI", system-ui, -apple-system, "Helvetica Neue", Arial, sans-serif;--mono:"Cascadia Mono", "SF Mono", Consolas, ui-monospace, monospace;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{color:var(--ink);font:16px/1.5 var(--ui);-webkit-tap-highlight-color:transparent;background:#000;overflow:hidden}button,input{font:inherit;color:inherit}button{cursor:pointer}:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.stage{touch-action:manipulation;background:#000;position:fixed;inset:0;overflow:hidden}.ambient{pointer-events:none;background:radial-gradient(ellipse at 50% 55%, color-mix(in srgb, var(--accent) 10%, transparent), transparent 62%), linear-gradient(#3fd8ff0b 1px, transparent 1px) 0 0 / 64px 64px, linear-gradient(90deg, #3fd8ff0b 1px, transparent 1px) 0 0 / 64px 64px;position:absolute;inset:0;-webkit-mask-image:radial-gradient(#000 30%,#0000 78%);mask-image:radial-gradient(#000 30%,#0000 78%)}.presence{z-index:1;transition:inset .7s cubic-bezier(.2,.7,.2,1),width .7s,height .7s,opacity .5s;position:absolute}.presence-full{inset:0}.presence-corner{left:max(10px, env(safe-area-inset-left));bottom:max(52px, calc(env(safe-area-inset-bottom) + 42px));width:clamp(96px,16vw,190px);height:clamp(96px,16vw,190px)}.objects{pointer-events:none;position:absolute;inset:0}.objects-stack{pointer-events:auto;padding:max(56px, env(safe-area-inset-top)) 14px 140px;flex-direction:column;gap:12px;display:flex;overflow-y:auto}.auto-grid{pointer-events:none;padding:max(24px, env(safe-area-inset-top)) 24px 24px clamp(120px, 20vw, 230px);grid-template-columns:repeat(auto-fit,minmax(min(280px,100%),1fr));align-content:safe center;align-items:start;gap:12px;display:grid;position:absolute;inset:0;overflow-y:auto}.auto-grid>.obj{pointer-events:auto}.objects-stack>.auto-grid{flex-direction:column;padding:0;display:flex;position:static;overflow:visible}.obj.leaving{pointer-events:none;animation:.35s forwards leave}@keyframes leave{to{opacity:0;transform:scale(.96)translateY(-6px)}}@media (prefers-reduced-motion:reduce){.obj.leaving{animation:none}}.glass{background:var(--glass);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border:1px solid var(--edge);box-shadow:0 0 22px color-mix(in srgb, var(--accent) 16%, transparent), inset 0 0 28px #3fd8ff0d;clip-path:polygon(0 0,calc(100% - 14px) 0,100% 14px,100% 100%,14px 100%,0 calc(100% - 14px))}.obj{pointer-events:auto;min-width:0;padding:16px 18px;animation:.45s both appear;overflow:auto}.obj.alert{border-color:var(--warn)}.overlay-layer{z-index:40;pointer-events:none;place-items:center;padding:16px;display:grid;position:fixed;inset:0}.overlay-backdrop{-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);pointer-events:auto;background:#02080ca8;animation:.3s both appear;position:absolute;inset:0}.obj.overlay{z-index:1;width:min(760px,94vw);max-height:80vh;box-shadow:0 0 40px color-mix(in srgb, var(--accent) 30%, transparent);position:relative}@keyframes appear{0%{opacity:0;transform:translateY(8px)scale(.985)}}.obj-close{width:44px;height:44px;color:var(--muted);background:0 0;border:0;font-size:1.5rem;line-height:1;position:absolute;top:2px;right:6px}.obj-close:hover{color:var(--accent)}.obj-title{letter-spacing:.16em;text-transform:uppercase;color:var(--accent);margin:0 36px 8px 0;font-size:.78rem;font-weight:600}.obj-md>:first-child{margin-top:0}.obj-md>:last-child{margin-bottom:0}.obj-md a{color:var(--accent)}.obj-md code{font-family:var(--mono);background:#3fd8ff1a;padding:0 4px;font-size:.9em}.obj-stat{gap:2px;display:grid}.obj-label{letter-spacing:.16em;text-transform:uppercase;color:var(--muted);font-size:.78rem}.obj-value{font-variant-numeric:tabular-nums;font-size:clamp(2rem,6vw,3.6rem);font-weight:300;line-height:1.05}.obj-value small{color:var(--muted);margin-left:4px;font-size:.4em}.obj-delta{color:var(--ok);font-size:.9rem}.obj-list{gap:4px;margin:0;padding-left:1.1rem;display:grid}.obj-list .done{color:var(--muted);text-decoration:line-through}.obj-table-wrap{overflow-x:auto}.obj-table{border-collapse:collapse;width:100%;font-size:.92rem}.obj-table th{text-align:left;letter-spacing:.14em;text-transform:uppercase;color:var(--accent);font-size:.72rem;font-weight:600}.obj-table th,.obj-table td{font-variant-numeric:tabular-nums;border-bottom:1px solid #3fd8ff2e;padding:6px 10px}.obj-code{font:.86rem/1.5 var(--mono);margin:0;overflow:auto}.obj-empty{color:var(--muted);margin:0}.integration-steps{color:var(--muted);gap:4px;margin:4px 0 10px;padding-left:1.2rem;font-size:.86rem;display:grid}.integration-steps li.done{color:var(--ok)}.obj-doc{max-height:70vh;overflow:auto}.obj-doc h1,.obj-doc h2,.obj-doc h3,.obj-doc h4{color:var(--accent);letter-spacing:.06em;font-weight:500}.obj-doc table{border-collapse:collapse;width:100%;font-size:.92rem}.obj-doc th,.obj-doc td{border:1px solid color-mix(in srgb, var(--accent) 22%, transparent);text-align:left;padding:5px 9px}.obj-doc th{color:var(--accent);letter-spacing:.14em;text-transform:uppercase;font-size:.72rem;font-weight:500}.obj-doc pre{border:1px solid color-mix(in srgb, var(--accent) 22%, transparent);font:.86rem/1.5 var(--mono);background:#3fd8ff0d;padding:8px 10px;overflow:auto}.obj-doc blockquote{border-left:2px solid var(--edge);color:var(--muted);margin:.6em 0;padding-left:12px}.obj-progress{gap:6px;min-width:0;display:grid}.obj-progress-head{justify-content:space-between;align-items:baseline;gap:12px;display:flex}.obj-progress-pct{font:1.1rem var(--mono);font-variant-numeric:tabular-nums}.obj-progress-bar{border:1px solid var(--edge);background:#3fd8ff12;height:8px}.obj-progress-bar i{background:var(--accent);height:100%;box-shadow:0 0 10px var(--accent);transition:width .4s;display:block}.obj-progress-detail{color:var(--muted);font-size:.82rem}.obj-checklist{gap:6px;margin:0;padding:0;list-style:none;display:grid}.obj-checklist li{align-items:center;gap:10px;display:flex}.obj-checklist .box{border:1px solid var(--accent);width:16px;height:16px;color:var(--accent);flex:none;place-items:center;font-size:.8rem;display:inline-grid}.obj-checklist .done{color:var(--muted)}.obj-checklist .done span:last-child{text-decoration:line-through}.obj-kv{gap:4px;margin:0;display:grid}.obj-kv>div{border-bottom:1px solid color-mix(in srgb, var(--accent) 16%, transparent);justify-content:space-between;gap:18px;padding:3px 0;display:flex}.obj-kv dt{color:var(--muted);letter-spacing:.14em;text-transform:uppercase;font-size:.78rem}.obj-kv dd{font-family:var(--mono);font-variant-numeric:tabular-nums;text-align:right;margin:0}.obj-countdown{justify-items:center;gap:2px;display:grid}.obj-countdown-time{font:300 clamp(2rem, 6vw, 3.4rem) var(--mono);font-variant-numeric:tabular-nums;text-shadow:0 0 14px var(--accent)}.obj-countdown.done .obj-countdown-time{color:var(--warn);text-shadow:0 0 14px var(--warn)}.obj-media{flex-direction:column;gap:6px;width:100%;max-height:100%;display:flex}.obj-media img,.obj-media video{object-fit:contain;border:1px solid var(--edge);background:#050b10;max-width:100%;max-height:50vh;margin:0 auto;display:block}.obj-pdf iframe{border:1px solid var(--edge);background:#050b10;width:100%;min-width:0;height:min(520px,62vh)}.obj-open{color:var(--accent);letter-spacing:.1em;text-transform:uppercase;font-size:.82rem}.obj-gallery-bar{justify-content:space-between;align-items:center;gap:10px;display:flex}.obj-gallery-bar span{color:var(--ink);justify-items:center;font-size:.86rem;display:grid}.obj-gallery-bar small{color:var(--muted);font-family:var(--mono)}.obj-gallery-bar button{border:1px solid var(--edge);min-width:44px;min-height:44px;color:var(--accent);cursor:pointer;background:0 0;font-size:1.3rem}.obj-gallery-bar button:disabled{opacity:.3;cursor:default}.obj-group{align-items:start;gap:14px;display:grid}.obj-group-grid{grid-template-columns:repeat(auto-fit,minmax(170px,1fr))}.obj-group-row{grid-auto-columns:minmax(150px,1fr);grid-auto-flow:column;overflow-x:auto}.obj-group-column{grid-template-columns:1fr}.obj-part{border:1px solid color-mix(in srgb, var(--accent) 20%, transparent);background:#3fd8ff0a;min-width:0;padding:8px 10px}.obj-tabs{border-bottom:1px solid var(--edge);gap:2px;margin-bottom:8px;display:flex;overflow-x:auto}.obj-tabs button{min-height:40px;color:var(--muted);letter-spacing:.14em;text-transform:uppercase;cursor:pointer;white-space:nowrap;background:0 0;border:0;padding:8px 14px;font-size:.78rem}.obj-tabs button.on{color:var(--accent);box-shadow:inset 0 -2px 0 var(--accent);text-shadow:0 0 8px var(--accent)}.obj-chart{width:100%;height:auto;display:block}.obj-chart .grid{stroke:#3fd8ff24;stroke-width:1px}.obj-chart .tick{fill:var(--muted);font:10px var(--mono);font-variant-numeric:tabular-nums}.legend{color:var(--muted);flex-wrap:wrap;gap:6px 14px;margin:6px 0 0;padding:0;font-size:.8rem;list-style:none;display:flex}.legend i{width:10px;height:10px;margin-right:6px;display:inline-block}.obj-gauge{justify-items:center;display:grid}.obj-gauge svg{width:min(100%,260px);height:auto}.obj-gauge .track{stroke:#3fd8ff26}.obj-gauge .value{stroke:var(--accent);filter:drop-shadow(0 0 6px var(--accent))}.obj-gauge.gauge-warn .value{stroke:var(--warn);filter:drop-shadow(0 0 6px var(--warn))}.obj-gauge.gauge-crit .value{stroke:var(--bad);filter:drop-shadow(0 0 6px var(--bad))}.gauge-read{align-items:baseline;gap:4px;margin-top:-62px;display:flex}.gauge-value{font-variant-numeric:tabular-nums;font-size:clamp(1.8rem,5vw,2.8rem);font-weight:300}.gauge-unit{color:var(--muted)}.obj-gauge .obj-label{margin-top:18px}.obj-timeline{border-left:1px solid var(--edge);gap:14px;margin:8px 0 0;padding:0 0 0 20px;list-style:none;display:grid}.obj-timeline li{gap:2px;display:grid;position:relative}.obj-timeline li:before{content:"";background:var(--accent);width:9px;height:9px;box-shadow:0 0 8px var(--accent);border-radius:50%;position:absolute;top:.5em;left:-25px}.obj-timeline time{font:.75rem/1.3 var(--mono);color:var(--accent)}.obj-timeline span{color:var(--muted);font-size:.9rem}.obj-graph{width:100%;height:auto;max-height:70vh;margin:0 auto;display:block}.obj[style*=" height:"] .obj-graph{max-height:calc(100% - 32px)}.obj-graph .edge{stroke:color-mix(in srgb, var(--accent) 55%, transparent);stroke-width:1.4px}.obj-graph .arrow{fill:var(--accent)}.obj-graph .node{fill:#3fd8ff26;stroke:var(--accent);stroke-width:1.5px}.obj-graph .node-label{fill:var(--ink);font:10px var(--ui)}.obj-graph .edge-label{fill:var(--muted);font:9px var(--ui)}.captions{z-index:20;left:50%;bottom:max(7%, env(safe-area-inset-bottom));text-align:center;pointer-events:none;text-shadow:0 0 18px #000,0 0 4px #000;text-wrap:balance;width:min(780px,100% - 32px);margin:0;font-size:clamp(1.1rem,2.6vw,1.6rem);font-weight:300;position:absolute;transform:translate(-50%)}.captions.done{animation:1.4s 8s forwards fadeOut}@keyframes fadeOut{to{opacity:0}}.command-bar{z-index:30;left:50%;bottom:max(14px, env(safe-area-inset-bottom));background:var(--glass);border:1px solid var(--edge);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);gap:8px;width:min(640px,100% - 24px);padding:8px;display:flex;position:absolute;transform:translate(-50%)}.command-bar input{background:0 0;border:0;outline:none;flex:1;min-height:44px;padding:0 10px;font-size:1.05rem}.command-bar button{border:1px solid var(--edge);background:0 0;min-width:44px;min-height:44px}.conn-badge{top:max(10px, env(safe-area-inset-top));font:500 .78rem var(--mono);letter-spacing:.08em;color:var(--warn);border:1px solid var(--warn);background:#0009;padding:6px 12px;position:absolute;right:12px}.mic-indicator{left:50%;top:max(12px, env(safe-area-inset-top));font:500 .82rem var(--mono);letter-spacing:.1em;text-transform:uppercase;color:#ffd9a0;border:1px solid var(--warn);background:#000000c7;align-items:center;gap:10px;padding:8px 16px;display:flex;position:absolute;transform:translate(-50%)}.mic-indicator i{background:var(--bad);width:10px;height:10px;box-shadow:0 0 10px var(--bad);border-radius:50%;animation:1s ease-in-out infinite mic-pulse}.mic-transcribing i{background:var(--warn);box-shadow:0 0 10px var(--warn)}@keyframes mic-pulse{50%{opacity:.35}}@media (prefers-reduced-motion:reduce){.mic-indicator i{animation:none}}.toasts{top:max(48px, env(safe-area-inset-top));gap:6px;width:min(420px,100% - 24px);display:grid;position:absolute;left:50%;transform:translate(-50%)}.toast{border:1px solid var(--edge);background:#000000d1;padding:10px 14px;font-size:.92rem}.toast-warn{border-color:var(--warn);color:#ffd9a0}.toast-error{border-color:var(--bad);color:#ffc2c9}.approval{border-color:var(--warn);background:#020c12eb;width:min(460px,100% - 24px);max-height:calc(100% - 24px);padding:20px;position:absolute;top:50%;left:50%;overflow:auto;transform:translate(-50%,-50%);box-shadow:0 0 0 100vmax #0000008c,0 0 30px #ffb45440}.plugins{flex-direction:column;width:min(560px,100% - 24px);display:flex;overflow:hidden}.plugins-body{min-height:0;padding-right:4px;overflow-y:auto}.plugins-heading{letter-spacing:.14em;text-transform:uppercase;color:var(--muted);margin:14px 0 6px;font-size:.78rem}.plugin-list{gap:8px;margin:0;padding:0;list-style:none;display:grid}.plugin-list li{background:#ffffff0a;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 10px;padding:8px 10px;display:flex}.plugin-info{flex:180px;min-width:0}.plugin-info .auth-note{font-size:.82rem}.plugin-actions{flex-wrap:wrap;gap:6px;display:flex}.plugin-actions button{border:1px solid var(--edge);background:0 0;padding:0 12px}.obj-sandbox{flex-direction:column;gap:6px;width:100%;min-width:min(560px,80vw);height:min(420px,60vh);display:flex}.obj-sandbox iframe{border:1px solid var(--edge);background:#050b10;flex:1;width:100%;min-height:200px}.camera-indicator{border-color:var(--bad);color:#ffc2c9;letter-spacing:.12em;text-transform:uppercase;background:#020c12e6;align-items:center;gap:10px;padding:6px 12px 6px 6px;font-size:.8rem;display:flex;position:absolute;bottom:12px;right:12px}.camera-indicator video{object-fit:cover;background:#000;width:72px;height:54px}.camera-indicator span:before{content:"";background:var(--bad);border-radius:50%;width:8px;height:8px;margin-right:8px;display:inline-block}.challenge,.enroll{border-color:var(--accent);box-shadow:0 0 0 100vmax #0000008c,0 0 30px #3fd8ff40}.challenge .approval-title,.enroll .approval-title{color:var(--accent)}.approval-head{align-items:center;gap:10px;display:flex}.approval-title{letter-spacing:.18em;text-transform:uppercase;color:var(--warn);font-size:.8rem}.tier{font:600 .74rem var(--mono);border:1px solid;padding:2px 8px}.tier-T2{color:var(--warn)}.tier-T3{color:var(--bad)}.approval-summary{font:.95rem/1.5 var(--mono);word-break:break-all;background:#ffffff0a;max-height:40vh;margin:14px 0;padding:10px 12px;overflow:auto}.approval-actions{flex-wrap:wrap;gap:8px;margin-top:14px;display:flex}.approval-actions button,.owner-menu button,.auth button{border:1px solid var(--edge);letter-spacing:.04em;background:0 0;padding:0 16px}button.primary{background:color-mix(in srgb, var(--accent) 22%, transparent);border-color:var(--accent)}button.danger{border-color:var(--bad);color:#ffc2c9}button:disabled{opacity:.4;cursor:not-allowed}.pinpad{justify-items:center;gap:8px;display:grid}.pin-dots{letter-spacing:.4em;min-height:1.6em;color:var(--accent);font-size:1.6rem}.pin-keys{grid-template-columns:repeat(3,64px);gap:8px;display:grid}.pin-keys button{border:1px solid var(--edge);background:#3fd8ff0d;font-size:1.2rem}.owner-menu{top:max(60px, env(safe-area-inset-top));background:#020c12f0;gap:8px;width:220px;padding:12px;display:grid;left:12px}.boot{background:#000;height:100%}.auth{gap:8px;width:min(380px,100% - 28px);padding:24px;display:grid;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%)}.auth h1{letter-spacing:.3em;text-transform:uppercase;color:var(--accent);margin:0 0 6px;font-size:1.1rem;font-weight:300}.auth label{letter-spacing:.12em;text-transform:uppercase;color:var(--muted);margin-top:6px;font-size:.78rem}.auth input{border:1px solid var(--edge);background:#ffffff0a;padding:0 12px}.auth button{margin-top:12px}.auth-note{color:var(--muted);margin:0;font-size:.9rem}.auth-error{color:#ffc2c9;margin:4px 0 0;font-size:.9rem}@media (width<=599px){.presence-full{inset:0}.captions{bottom:max(11%, env(safe-area-inset-bottom))}}@media (prefers-reduced-motion:reduce){.obj,.presence{transition:none;animation:none}}.status-badge{left:12px;bottom:max(12px, env(safe-area-inset-bottom));font:500 .78rem var(--mono);letter-spacing:.08em;color:var(--ink);border:1px solid var(--edge);background:#0000008c;align-items:center;gap:9px;max-width:min(60vw,360px);padding:6px 12px;display:flex;position:absolute}.status-badge span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.status-badge i{background:var(--muted);border-radius:50%;flex:none;width:9px;height:9px}.status-idle i{background:var(--ok);box-shadow:0 0 8px var(--ok)}.status-working i,.status-speaking i{background:var(--accent);box-shadow:0 0 10px var(--accent);animation:1s ease-in-out infinite mic-pulse}.status-listening i{background:var(--bad);box-shadow:0 0 10px var(--bad);animation:1s ease-in-out infinite mic-pulse}.status-waiting{border-color:var(--warn);color:#ffd9a0}.status-waiting i{background:var(--warn);box-shadow:0 0 10px var(--warn);animation:1s ease-in-out infinite mic-pulse}.status-offline{border-color:var(--warn);color:var(--warn)}.status-offline i{background:var(--warn)}@media (prefers-reduced-motion:reduce){.status-badge i{animation:none!important}}.clock{right:12px;bottom:max(12px, env(safe-area-inset-bottom));text-align:right;color:var(--muted);line-height:1.15;font-family:var(--mono);pointer-events:none;position:absolute}.clock b{color:var(--ink);letter-spacing:.06em;font-size:1.15rem;font-weight:500;display:block}.clock span{letter-spacing:.1em;text-transform:uppercase;font-size:.7rem}.settings{flex-direction:column;width:min(520px,100% - 24px);max-height:calc(100% - 24px);display:flex}.settings-body{gap:6px;min-height:0;padding-right:4px;display:grid;overflow-y:auto}.settings-field{gap:3px;display:grid}.settings-field>span{letter-spacing:.1em;text-transform:uppercase;color:var(--muted);font-size:.74rem}.settings-field input:not([type=range]):not([type=checkbox]),.settings-field select{border:1px solid var(--edge);color:var(--ink);min-height:40px;font:inherit;background:#ffffff0a;padding:0 10px}.settings-field select option{background:#06141c}.settings-check{align-items:center;gap:10px;min-height:40px;display:flex}.slash-list{border:1px solid var(--edge);background:#020c12f5;max-height:40vh;margin:0;padding:4px;list-style:none;position:absolute;bottom:calc(100% + 6px);left:0;right:0;overflow-y:auto}.slash-list li{cursor:pointer;align-items:baseline;gap:10px;padding:7px 10px;display:flex}.slash-list li.on,.slash-list li:hover{background:color-mix(in srgb, var(--accent) 18%, transparent)}.slash-list b{font:600 .9rem var(--mono);color:var(--accent)}.slash-list i{font:.78rem var(--mono);color:var(--warn);font-style:normal}.slash-list span{color:var(--muted);font-size:.82rem}.movable{position:absolute}.movable[data-panel=status],.movable[data-panel=clock]{cursor:grab;touch-action:none;pointer-events:auto}.movable:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.panel{resize:both;flex-direction:column;width:clamp(260px,28vw,420px);min-width:220px;min-height:140px;max-height:80vh;padding:0;display:flex;overflow:hidden}.panel-chat{height:62vh}.panel-tasks{width:clamp(240px,26vw,360px);height:40vh}.panel-head{cursor:grab;touch-action:none;border-bottom:1px solid var(--edge);-webkit-user-select:none;user-select:none;justify-content:space-between;align-items:center;gap:10px;padding:8px 12px;display:flex}.panel-head .obj-close{position:static}.chat-lines{flex:1;align-content:start;gap:8px;min-height:0;padding:10px 12px;display:grid;overflow-y:auto}.chat-line{white-space:pre-wrap;overflow-wrap:anywhere;max-width:92%;margin:0;padding:7px 10px;font-size:.9rem}.chat-user{background:color-mix(in srgb, var(--accent) 18%, transparent);border:1px solid var(--edge);justify-self:end}.chat-assistant{background:#ffffff0d;justify-self:start}.chat-form{border-top:1px solid var(--edge);gap:6px;padding:8px;display:flex}.chat-form input{border:1px solid var(--edge);min-width:0;color:var(--ink);min-height:40px;font:inherit;background:#ffffff0a;flex:1;padding:0 10px}.chat-form button{border:1px solid var(--edge);color:var(--ink);background:0 0;min-height:40px;padding:0 14px}.task-body{flex:1;min-height:0;padding:10px 12px;overflow-y:auto}.task-list{gap:8px;margin:0;padding:0;list-style:none;display:grid}.task-list li{border-left:3px solid var(--accent);background:#ffffff0a;gap:2px;padding:8px 10px;display:grid}.task-list li.overdue{border-left-color:var(--bad)}.task-title{overflow-wrap:anywhere;font-size:.95rem}.task-due{font:.75rem var(--mono);color:var(--muted)}.task-list li.overdue .task-due{color:var(--bad)}@media (width<=600px){.panel{resize:none;width:calc(100% - 24px);left:12px!important}.panel-chat{height:52vh;bottom:56px;top:auto!important}.panel-tasks{height:30vh;top:56px!important}}.help{flex-direction:column;width:min(560px,100% - 24px);max-height:calc(100% - 24px);display:flex}.help-list{gap:4px;min-height:0;margin:8px 0;display:grid;overflow-y:auto}.help-row{border-bottom:1px solid #ffffff0f;grid-template-columns:minmax(130px,38%) 1fr;gap:12px;padding:6px 4px;display:grid}.help-row dt{font:600 .9rem var(--mono);color:var(--accent);overflow-wrap:anywhere}.help-row dt i{color:var(--warn);font-style:normal;font-weight:400}.help-row dd{color:var(--ink);margin:0;font-size:.9rem}@media (width<=600px){.help-row{grid-template-columns:1fr;gap:2px}}.connectors{width:min(600px,100% - 24px);max-height:calc(100% - 24px);overflow-y:auto}.connector-form{gap:8px;display:grid}.connector-form textarea,.settings-field textarea{border:1px solid var(--edge);color:var(--ink);font:.85rem var(--mono);resize:vertical;background:#ffffff0a;padding:8px 10px}.connector-steps{color:var(--muted);gap:4px;margin:0;padding-left:20px;font-size:.88rem;display:grid}.connector-warning{border-left:3px solid var(--warn);color:#ffd9a0;padding-left:10px}.conn-status{font:.74rem var(--mono)}.conn-ready{color:var(--ok)}.conn-error{color:var(--bad)}.conn-connecting{color:var(--warn)}.conn-off{color:var(--muted)}.settings-wide{width:min(980px,100% - 24px);height:min(720px,100% - 24px)}.settings-layout{flex:1;grid-template-columns:190px 1fr;gap:16px;min-height:0;margin-top:8px;display:grid}.settings-tabs{align-content:start;gap:6px;display:grid}.settings-tab{text-align:left;color:var(--ink);background:0 0;border:1px solid #0000;gap:2px;padding:10px 12px;display:grid}.settings-tab small{color:var(--muted);font-size:.74rem}.settings-tab:hover{background:#ffffff0d}.settings-tab.on{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 16%, transparent)}.settings-wide .settings-body{align-content:start;padding-right:8px}@media (width<=700px){.settings-wide{height:calc(100% - 24px)}.settings-layout{grid-template-columns:1fr;gap:8px}.settings-tabs{grid-auto-columns:1fr;grid-auto-flow:column;overflow-x:auto}.settings-tab small{display:none}}.look-tab{grid-template-columns:minmax(220px,300px) 1fr;align-items:start;gap:18px;display:grid}.look-side{gap:10px;display:grid;position:sticky;top:0}.look-controls{gap:6px;min-width:0;display:grid}@media (width<=860px){.look-tab{grid-template-columns:1fr}.look-side{position:static}}.look-preview{border:1px solid var(--edge);background:#000;height:230px;position:relative;overflow:hidden}.look-preview-glow{background:radial-gradient(ellipse at 50% 55%, color-mix(in srgb, var(--accent) 22%, transparent), transparent 65%);position:absolute;inset:0}.look-preview-stage{position:absolute;inset:0}.look-preview-caption{text-align:center;text-shadow:0 0 10px #000;margin:0;position:absolute;bottom:8px;left:8px;right:8px}.look-preview .presence-full{inset:0}.theme-grid{grid-template-columns:repeat(auto-fill,minmax(118px,1fr));gap:8px;display:grid}.theme-card{border:1px solid var(--edge);color:var(--ink);text-align:left;background:#ffffff08;justify-items:start;gap:1px;padding:10px;display:grid}.theme-card i{background:var(--swatch);width:22px;height:22px;box-shadow:0 0 12px var(--swatch);border-radius:50%;margin-bottom:4px}.theme-card small{color:var(--muted);font-size:.72rem}.theme-card.on,.style-choice.on{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 18%, transparent)}.style-row{grid-template-columns:repeat(3,1fr);gap:8px;display:grid}.style-choice{border:1px solid var(--edge);color:var(--ink);text-align:left;background:#ffffff08;gap:2px;padding:10px;display:grid}.style-choice small{color:var(--muted);font-size:.72rem}.swatch-row{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.swatch{border:2px solid #0000;border-radius:50%;width:32px;height:32px;min-height:32px;padding:0}.swatch.on{box-shadow:0 0 0 2px var(--accent);border-color:#fff}.swatch-custom{color:var(--muted);align-items:center;gap:6px;font-size:.8rem;display:flex}.swatch-custom input[type=color]{border:1px solid var(--edge);background:0 0;width:40px;height:32px;padding:0}.captions-small{font-size:clamp(.9rem,2vw,1.15rem)}.captions-medium{font-size:clamp(1.1rem,2.6vw,1.6rem)}.captions-large{font-size:clamp(1.4rem,3.6vw,2.3rem)}.voice-hear{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.connector-command{border:1px solid var(--edge);font:.85rem var(--mono);-webkit-user-select:all;user-select:all;background:#ffffff0d;margin:0;padding:8px 10px;overflow-x:auto}html,body{overscroll-behavior:none}@media (pointer:coarse){.stage{-webkit-touch-callout:none;-webkit-user-select:none;user-select:none}}input,textarea,select,.connector-command{-webkit-user-select:text;user-select:text}.owner-menu{max-height:calc(100dvh - 80px);overflow-y:auto}.touch-controls{z-index:25;left:0;right:0;bottom:max(14px, env(safe-area-inset-bottom));pointer-events:none;justify-content:center;align-items:flex-end;gap:26px;display:flex;position:absolute}.touch-controls>*{pointer-events:auto}.touch-talk{justify-items:center;gap:6px;display:grid}.touch-hint{max-width:70vw;font:500 .74rem var(--mono);letter-spacing:.06em;color:var(--muted);text-align:center;text-shadow:0 0 6px #000,0 0 2px #000;padding:2px 10px}.touch-mic,.touch-side{border:1px solid var(--edge);color:var(--ink);background:var(--glass);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);touch-action:none;-webkit-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;border-radius:50%;place-items:center;padding:0;display:grid}.touch-mic{border-color:var(--accent);width:76px;height:76px;box-shadow:0 0 22px color-mix(in srgb, var(--accent) 30%, transparent)}.touch-mic.on{background:color-mix(in srgb, var(--bad) 40%, transparent);border-color:var(--bad);box-shadow:0 0 28px var(--bad);animation:1s ease-in-out infinite mic-pulse}.touch-side{touch-action:manipulation;width:52px;height:52px;margin-bottom:12px}@media (prefers-reduced-motion:reduce){.touch-mic.on{animation:none}}@media (pointer:coarse){.captions{bottom:calc(max(14px, env(safe-area-inset-bottom)) + 150px)}.status-badge,.clock{bottom:max(8px, env(safe-area-inset-bottom))}.presence-corner{bottom:calc(max(14px, env(safe-area-inset-bottom)) + 70px)}}@media (width<=600px) and (pointer:coarse){.panel-chat{bottom:calc(max(14px, env(safe-area-inset-bottom)) + 150px);height:min(48vh,100dvh - 260px)}.objects-stack{padding-bottom:190px}}.elsewhere{z-index:3000;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);background:#000000c7;place-items:center;padding:16px;display:grid;position:fixed;inset:0}.elsewhere-card{border:1px solid var(--edge);background:var(--glass);max-width:380px;color:var(--ink);text-align:center;border-radius:16px;padding:24px}.elsewhere-card h2{margin:0 0 10px;font-size:1.15rem}.elsewhere-card p{color:var(--muted);margin:0 0 18px;line-height:1.45}.elsewhere-btn{border:1px solid var(--accent);background:color-mix(in srgb, var(--accent) 25%, transparent);min-height:48px;color:var(--ink);font:600 1rem var(--mono);cursor:pointer;border-radius:24px;padding:0 28px}.obj-grip{cursor:grab;touch-action:none;border-radius:8px 8px 0 0;height:22px;position:absolute;top:0;left:0;right:92px}.obj-grip:before{content:"";background:var(--muted);opacity:.35;border-radius:2px;width:34px;height:3px;margin-left:-17px;transition:opacity .15s;position:absolute;top:8px;left:50%}.obj:hover .obj-grip:before,.obj-grip:focus-visible:before{opacity:.9}.obj-grip:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.obj.dragging{cursor:grabbing;box-shadow:0 0 0 1px var(--accent), 0 8px 30px #00000080;-webkit-user-select:none;user-select:none;transition:none;animation:none}.obj-pin{width:44px;height:44px;color:var(--muted);opacity:.55;background:0 0;border:0;place-items:center;display:grid;position:absolute;top:2px;right:50px}.obj:hover .obj-pin,.obj-pin.on,.obj-pin:focus-visible{opacity:1}.obj-pin.on,.obj-pin:hover{color:var(--accent)}.obj.pinned{border-color:color-mix(in srgb, var(--accent) 55%, transparent)}.obj-resize{cursor:nwse-resize;touch-action:none;opacity:0;background:linear-gradient(135deg, transparent 55%, var(--accent) 56%, var(--accent) 64%, transparent 65%, transparent 76%, var(--accent) 77%, var(--accent) 85%, transparent 86%);width:22px;height:22px;transition:opacity .15s;position:absolute;bottom:0;right:0}.obj:hover .obj-resize,.obj.dragging .obj-resize{opacity:.7}@media (pointer:coarse){.obj-pin{opacity:1}.obj-resize{opacity:.7;width:30px;height:30px}.obj-grip{height:30px}.obj-grip:before{opacity:.7;top:12px}}.obj-media.obj-media-fill{height:100%;min-height:min(360px,60vh)}.obj-media-fill .obj-youtube{border:1px solid var(--edge);background:#000;flex:auto;width:100%;height:100%;min-height:0;display:block}.profile-badge{top:max(56px, calc(env(safe-area-inset-top) + 48px));border:1px solid var(--edge);background:var(--glass);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);color:var(--ink);cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none;border-radius:12px;align-items:center;gap:8px;padding:6px 12px 6px 8px;display:flex;position:fixed;left:12px}.profile-shield{color:var(--accent);flex:none}.profile-shield.member{color:#8ff0b0}.profile-shield.guest{color:var(--warn)}.profile-text{min-width:0;line-height:1.15;display:grid}.profile-text b{text-overflow:ellipsis;white-space:nowrap;max-width:130px;font-size:.86rem;font-weight:600;overflow:hidden}.profile-text small{font:500 .64rem var(--mono);letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}@media (width<=600px){.profile-text{display:none}.profile-badge{padding:4px 6px}}.hud{--hud-line:color-mix(in srgb, var(--accent) 62%, transparent);--hud-line-dim:color-mix(in srgb, var(--accent) 26%, transparent);--hud-glow:color-mix(in srgb, var(--accent) 42%, transparent);--hud-bg:#030d14d1;--hud-bg-hi:#081e2ae6;--cut:10px;color:var(--ink);font-family:var(--mono);-webkit-user-select:none;user-select:none}.hud-cut{background:var(--hud-line);clip-path:polygon(0 0, calc(100% - var(--cut)) 0, 100% var(--cut), 100% 100%, var(--cut) 100%, 0 calc(100% - var(--cut)));position:relative}.hud-cut:before{content:"";background:var(--hud-bg);clip-path:polygon(0 0, calc(100% - var(--cut) + 1px) 0, 100% calc(var(--cut) - 1px), 100% 100%, calc(var(--cut) - 1px) 100%, 0 calc(100% - var(--cut) + 1px));z-index:0;transition:background .14s ease-out;position:absolute;inset:1px}.hud-cut>*{z-index:1;position:relative}.hud-kicker{letter-spacing:.22em;text-transform:uppercase;color:var(--muted);margin:0 0 6px 2px;font-size:.62rem}.hud-profile{top:max(56px, calc(env(safe-area-inset-top) + 48px));cursor:grab;touch-action:none;align-items:center;display:flex;position:fixed;left:12px}.hud-emblem{z-index:2;background:radial-gradient(circle, var(--hud-bg-hi), var(--hud-bg));width:64px;height:64px;box-shadow:0 0 18px var(--hud-glow), inset 0 0 12px var(--hud-line-dim);border-radius:50%;flex:none;place-items:center;display:grid;position:relative}.hud-emblem-svg{color:var(--accent)}.hud-emblem-svg.member{color:#8ff0b0}.hud-emblem-svg.guest{color:var(--warn)}.hud-ring-chase{opacity:0;transform-origin:32px 32px}.hud-tag{--cut:9px;gap:1px;min-width:176px;margin-left:-14px;padding:6px 18px 7px 24px;line-height:1.15;display:grid}.hud-tag b{letter-spacing:.02em;text-overflow:ellipsis;white-space:nowrap;max-width:190px;font-size:.95rem;font-weight:600;overflow:hidden}.hud-tag small{letter-spacing:.16em;text-transform:uppercase;color:var(--muted);font-size:.62rem}.hud-tag .hud-tag-top{color:var(--accent);letter-spacing:.2em}.hud-tag:after{content:"";background:var(--accent);width:2px;box-shadow:0 0 8px var(--hud-glow);z-index:1;position:absolute;top:8px;bottom:8px;left:10px}.hud-profile.member .hud-tag:after{background:#8ff0b0}.hud-profile.guest .hud-tag:after{background:var(--warn)}.hud-clock{top:max(56px, calc(env(safe-area-inset-top) + 48px));cursor:grab;touch-action:none;text-align:left;position:fixed;left:332px}.hud-clock time{align-items:flex-end;gap:14px;display:flex}.hud-date{justify-items:start;line-height:1;display:grid}.hud-day{letter-spacing:.02em;text-shadow:0 0 14px var(--hud-glow);font-size:3.1rem;font-weight:700;display:flex}.hud-month{background:var(--accent);color:#031018;letter-spacing:.22em;text-transform:uppercase;clip-path:polygon(0 0,100% 0,calc(100% - 6px) 100%,0 100%);margin-top:2px;padding:1px 8px 1px 6px;font-size:.7rem;font-weight:700}.hud-weekday{letter-spacing:.2em;text-transform:uppercase;color:var(--muted);margin-top:3px;font-size:.64rem}.hud-time-block{gap:5px;min-width:150px;padding-bottom:4px;display:grid}.hud-clock-time{letter-spacing:.06em;align-items:baseline;font-size:1.55rem;display:flex}.hud-colon{color:var(--accent);margin:0 1px;font-style:normal}.hud-period{letter-spacing:.2em;color:var(--muted);margin-left:6px;font-size:.62rem}.hud-line{background:linear-gradient(90deg, var(--hud-line), transparent);height:1px;position:relative}.hud-line:after{content:"";border:1px solid var(--accent);background:var(--hud-bg);border-radius:50%;width:7px;height:7px;position:absolute;top:-3px;left:-3px}.hud-dot{background:var(--accent);width:5px;height:5px;box-shadow:0 0 8px var(--accent);border-radius:50%;position:absolute;top:-2px;left:0}.hud-digit{display:inline-block}.hud-launcher{left:12px;top:calc(max(56px, env(safe-area-inset-top) + 48px) + 86px);cursor:grab;touch-action:none;position:fixed}.hud-stack{gap:6px;margin:0;padding:0;list-style:none;display:grid}.hud-tab{--cut:9px;align-items:stretch;min-width:176px;transition:transform .14s ease-out,filter .14s ease-out;display:flex}.hud-tab-main{color:var(--ink);font:inherit;letter-spacing:.06em;text-align:left;cursor:pointer;background:0 0;border:0;flex:1;grid-template-columns:26px 1fr;align-items:center;gap:10px;min-height:40px;padding:7px 18px 9px 10px;font-size:.82rem;display:grid;position:relative;overflow:hidden}.hud-tab-main:focus-visible{outline:1px dashed var(--accent);outline-offset:-3px}.hud-icon{background:var(--hud-line-dim);width:26px;height:26px;color:var(--accent);place-items:center;font-size:.95rem;transition:background .14s ease-out,color .14s;display:grid}.hud-tab-label{text-transform:uppercase;letter-spacing:.14em;font-size:.74rem}.hud-tab-engaged{letter-spacing:.2em;color:var(--accent);opacity:0;font-size:.74rem;position:absolute;top:50%;left:46px;transform:translateY(-50%)}.hud-tab:after{content:"";background:var(--accent);width:26%;height:2px;box-shadow:0 0 6px var(--hud-glow);z-index:2;transition:width .22s ease-out;position:absolute;bottom:4px;left:12px}.hud-sweep,.hud-scan{pointer-events:none;opacity:0;position:absolute;inset:0}.hud-sweep{background:linear-gradient(100deg, transparent 30%, color-mix(in srgb, var(--accent) 38%, transparent) 50%, transparent 70%);transform:translate(-100%)}.hud-scan{background:linear-gradient(180deg, transparent, color-mix(in srgb, var(--accent) 55%, transparent) 50%, transparent);height:14px;inset:-14px 0 auto}.hud-ripple{background:radial-gradient(circle, color-mix(in srgb, var(--accent) 55%, transparent), transparent 62%);opacity:.9;pointer-events:none;border-radius:50%;animation:.6s ease-out forwards hud-ripple;position:absolute;transform:scale(0)}@media (hover:hover){.hud-tab:hover{filter:brightness(1.22);transform:translate(6px)}.hud-tab:hover:after{width:calc(100% - 24px)}.hud-tab:hover:before{background:var(--hud-bg-hi)}.hud-tab:hover .hud-icon{background:var(--accent);color:#031018}.hud-tab:hover .hud-sweep{opacity:1;animation:.6s ease-out hud-sweep}}.hud-tab:active{transform:translate(3px)scale(.97)}.hud-tab:active:before{background:color-mix(in srgb, var(--accent) 18%, var(--hud-bg))}.hud-tab.engaged .hud-tab-label{opacity:0}.hud-tab.engaged .hud-tab-engaged{opacity:1;animation:.65s steps(2,end) hud-flicker}.hud-tab.engaged .hud-scan{opacity:1;animation:.45s linear hud-scan}.hud-tab.current:before{background:var(--hud-bg-hi)}.hud-tab.current:after{width:calc(100% - 24px)}.hud-tab.current .hud-tab-title{color:var(--accent)}.hud-btn{background:var(--hud-line-dim);width:36px;height:32px;color:var(--ink);cursor:pointer;clip-path:polygon(7px 0,100% 0,calc(100% - 7px) 100%,0 100%);border:0;place-items:center;padding:0;transition:background .14s ease-out,color .14s,transform .1s;display:inline-grid;position:relative;overflow:hidden}.hud-btn sup{color:var(--accent);font-size:.55rem;position:absolute;top:3px;right:6px}.hud-btn.on,.hud-btn[aria-pressed=true]{color:var(--accent);background:color-mix(in srgb, var(--accent) 24%, transparent)}.hud-btn-main{background:var(--accent);color:#031018;width:52px;height:36px}.hud-btn:focus-visible{outline:1px dashed var(--accent);outline-offset:2px}@media (hover:hover){.hud-btn:hover{background:color-mix(in srgb, var(--accent) 44%, transparent);color:#fff}.hud-btn-main:hover{background:color-mix(in srgb, var(--accent) 78%, #fff);color:#031018}}.hud-btn:active{transform:scale(.94)}.hud-range{appearance:none;cursor:pointer;--fill:0%;background:0 0;width:100%;height:14px;margin:0}.hud-range::-webkit-slider-runnable-track{background:linear-gradient(90deg, var(--accent) var(--fill), var(--hud-line-dim) var(--fill));height:2px}.hud-range::-moz-range-track{background:var(--hud-line-dim);height:2px}.hud-range::-moz-range-progress{background:var(--accent);height:2px}.hud-range::-webkit-slider-thumb{-webkit-appearance:none;background:var(--accent);clip-path:polygon(0 0,100% 0,100% 70%,50% 100%,0 70%);width:9px;height:13px;box-shadow:0 0 8px var(--hud-glow);border:0;margin-top:-5.5px}.hud-range::-moz-range-thumb{background:var(--accent);border:0;border-radius:0;width:9px;height:13px}.hud-range:disabled{opacity:.4;cursor:default}.hud-chip{border:1px solid var(--hud-line-dim);color:var(--muted);font:inherit;letter-spacing:.16em;text-transform:uppercase;cursor:pointer;background:0 0;padding:4px 12px;font-size:.66rem;transition:color .14s,border-color .14s,background .14s}.hud-chip.on{color:var(--accent);border-color:var(--accent);background:color-mix(in srgb, var(--accent) 12%, transparent)}@media (hover:hover){.hud-chip:hover{color:var(--ink);border-color:var(--hud-line)}}.hud-mini{border:1px solid var(--hud-line-dim);width:30px;height:30px;color:var(--accent);font:inherit;cursor:pointer;background:0 0;align-self:center;margin-right:8px;font-size:1.05rem;transition:background .14s,color .14s}@media (hover:hover){.hud-mini:hover{background:var(--accent);color:#031018}}.hud-music{--cut:14px;cursor:grab;touch-action:none;padding:10px 14px 12px;position:fixed;bottom:12px;right:12px}.hud-music.mini{width:min(560px,100vw - 24px)}.hud-music.full{width:min(1000px,100vw - 24px);max-height:calc(100vh - 24px);padding:12px 16px 16px;overflow:auto}.hud-music-head{justify-content:space-between;align-items:center;margin-bottom:6px;display:flex}.hud-music-head .hud-kicker{margin:0}.hud-head-actions{gap:4px;display:flex}.hud-head-actions .hud-btn{width:30px;height:24px}.hud-music-body{align-items:center;gap:16px;display:flex}.hud-music.full .hud-music-body{align-items:stretch;gap:22px}.hud-music-left{flex:none;align-items:center;gap:12px;display:flex}.hud-music-main{flex:1;align-content:center;gap:8px;min-width:0;display:grid}.hud-now{gap:2px;min-width:0;display:grid}.hud-title{letter-spacing:.02em;white-space:nowrap;text-overflow:ellipsis;font-variant-ligatures:none;font-size:1rem;font-weight:600;overflow:hidden}.hud-music.full .hud-title{white-space:normal;font-size:1.35rem}.hud-sub{letter-spacing:.1em;text-transform:uppercase;color:var(--muted);white-space:nowrap;text-overflow:ellipsis;font-size:.7rem;overflow:hidden}.hud-timeline{grid-template-columns:auto 1fr auto;align-items:center;gap:10px;display:grid}.hud-time{letter-spacing:.1em;color:var(--muted);font-variant-numeric:tabular-nums;font-size:.7rem}.hud-controls{align-items:center;gap:6px;display:flex}.hud-controls .hud-btn:first-child{margin-right:6px}.hud-controls .hud-btn:last-child{margin-left:6px}.hud-volume{grid-template-columns:auto 1fr;align-items:center;gap:8px;max-width:260px;display:grid}.hud-unlock{border:1px solid var(--warn);color:var(--warn);font:inherit;letter-spacing:.16em;text-transform:uppercase;cursor:pointer;background:0 0;justify-self:start;padding:4px 12px;font-size:.66rem;animation:1.4s ease-in-out infinite hud-pulse}.hud-dial{--bass:0;flex:none;position:relative}.hud-dial-svg{width:100%;height:100%;position:absolute;inset:0;overflow:visible}.hud-dial-ticks{fill:none;stroke:var(--hud-line);stroke-width:3px;stroke-dasharray:1 5.02}.hud-dial-track{fill:none;stroke:var(--hud-line-dim);stroke-width:2px}.hud-dial-arc{fill:none;stroke:var(--accent);stroke-width:3px;stroke-linecap:butt;filter:drop-shadow(0 0 4px var(--hud-glow));transition:stroke-dasharray .25s linear}.hud-dial-inner{fill:none;stroke:var(--hud-line-dim);stroke-width:1px}.hud-needle{transform-origin:100px 100px;opacity:.85}.hud-needle line{stroke:var(--accent);stroke-width:1.4px;stroke-linecap:round}.hud-needle circle{fill:var(--accent);filter:drop-shadow(0 0 4px var(--accent))}.hud-spectrum{pointer-events:none;position:absolute;inset:0}.hud-cover{color:var(--hud-line);background:var(--hud-bg-hi) center / cover no-repeat;box-shadow:0 0 16px var(--hud-line-dim), inset 0 0 14px #0000008c;border:1px solid var(--hud-line);transform:scale(calc(1 + var(--bass) * .045));border-radius:50%;place-items:center;display:grid;position:absolute;inset:20%}.hud-levels{flex-direction:column-reverse;gap:3px;width:9px;height:220px;display:flex}.hud-levels i{background:var(--hud-line-dim);flex:1;transition:background 80ms linear,box-shadow 80ms linear;display:block}.hud-levels i.on{background:var(--accent);box-shadow:0 0 6px var(--hud-glow)}.hud-levels i:nth-child(n+10).on{background:var(--warn);box-shadow:0 0 6px color-mix(in srgb, var(--warn) 50%, transparent)}.hud-playlist{grid-template-rows:auto auto minmax(0,1fr);gap:8px;width:300px;min-width:0;max-height:340px;display:grid}.hud-tabs{flex-wrap:wrap;gap:6px;display:flex}.hud-search{border:1px solid var(--hud-line-dim);width:100%;color:var(--ink);font:inherit;background:#0000004d;padding:6px 10px;font-size:.8rem}.hud-search:focus{border-color:var(--accent);outline:none}.hud-list{align-content:start;gap:5px;min-height:0;margin:0;padding:0 4px 0 0;list-style:none;display:grid;overflow-y:auto}.hud-list .hud-tab{--cut:7px;min-width:0}.hud-list .hud-tab-main{grid-template-columns:1fr;gap:1px;min-height:0;padding:6px 12px 8px 14px;display:grid}.hud-tab-title{letter-spacing:.03em;white-space:nowrap;text-overflow:ellipsis;font-size:.8rem;overflow:hidden}.hud-list small{letter-spacing:.12em;text-transform:uppercase;color:var(--muted);white-space:nowrap;text-overflow:ellipsis;font-size:.62rem;overflow:hidden}.hud-source{letter-spacing:.18em;color:#031018;background:var(--accent);clip-path:polygon(0 0,100% 0,calc(100% - 4px) 100%,0 100%);vertical-align:1px;margin-left:8px;padding:0 5px;font-size:.56rem;font-style:normal}.hud-notice{border-left:2px solid var(--warn);letter-spacing:.06em;color:var(--warn);margin:0;padding:4px 10px;font-size:.7rem}.hud-empty{color:var(--muted);padding:10px 4px;font-size:.75rem}@keyframes hud-spin{to{transform:rotate(360deg)}}@keyframes hud-sweep{0%{transform:translate(-100%)}to{transform:translate(100%)}}@keyframes hud-scan{0%{top:-14px}to{top:calc(100% + 14px)}}@keyframes hud-ripple{to{opacity:0;transform:scale(1)}}@keyframes hud-flicker{0%,to{opacity:1}25%{opacity:.2}50%{opacity:1}75%{opacity:.45}}@keyframes hud-pulse{0%,to{opacity:1}50%{opacity:.45}}@keyframes hud-boot{0%{opacity:0;filter:brightness(2.2);transform:translate(-14px)}30%{opacity:1}42%{opacity:.35}56%{opacity:1}70%{opacity:.7}to{opacity:1;filter:none;transform:none}}@keyframes hud-roll{0%{opacity:0;transform:translateY(60%)}to{opacity:1;transform:none}}@keyframes hud-blink{0%,49%{opacity:1}50%,to{opacity:.25}}@keyframes hud-travel{0%{left:0}to{left:calc(100% - 5px)}}@keyframes hud-flare{0%{box-shadow:0 0 18px var(--hud-glow), 0 0 0 0 var(--accent)}60%{box-shadow:0 0 30px var(--accent), 0 0 0 14px transparent}to{box-shadow:0 0 18px var(--hud-glow), 0 0 0 0 transparent}}[data-hud-anim=full] .hud-boot{animation:.55s ease-out both hud-boot;animation-delay:calc(var(--i,0) * 80ms)}[data-hud-anim=full] .hud-ring-turn{transform-origin:32px 32px;animation:40s linear infinite hud-spin}[data-hud-anim=full] .hud-profile.speaking .hud-ring-turn{animation-duration:7s}[data-hud-anim=full] .hud-profile.speaking .hud-emblem{animation:.9s ease-out hud-flare}[data-hud-anim=full] .hud-profile.busy .hud-ring-chase{opacity:1;animation:1.5s linear infinite hud-spin}[data-hud-anim=full] .hud-profile.listening .hud-emblem{box-shadow:0 0 26px var(--accent), inset 0 0 14px var(--hud-line-dim)}[data-hud-anim=full] .hud-digit{animation:.35s ease-out hud-roll}[data-hud-anim=full] .hud-colon{animation:1s step-end infinite hud-blink}[data-hud-anim=full] .hud-dot{animation:1s linear infinite hud-travel}[data-hud-anim=full] .hud-dial.playing .hud-needle{animation:3s linear infinite hud-spin}[data-hud-anim=full] .hud-dial.playing .hud-cover{animation:22s linear infinite hud-spin-keep}@keyframes hud-spin-keep{to{rotate:360deg}}[data-hud-anim=full] .hud-tab-main:focus-visible{animation:1.6s ease-in-out infinite hud-pulse}[data-hud-anim=reduced] .hud-boot,[data-hud-anim=reduced] .hud-digit,[data-hud-anim=reduced] .hud-colon,[data-hud-anim=reduced] .hud-dot{animation:none}[data-hud-anim=reduced] .hud-needle{display:none}[data-hud-anim=off] .hud *,[data-hud-anim=off] .hud{transition:none!important;animation:none!important}[data-hud-anim=off] .hud-tab:hover{transform:none}[data-hud-anim=off] .hud-needle{display:none}@media (prefers-reduced-motion:reduce){.hud *,.hud{transition:none!important;animation:none!important}.hud-tab:hover{transform:none}}@media (width<=900px){.hud-clock{left:12px;top:calc(max(56px, env(safe-area-inset-top) + 48px) + 76px)}.hud-launcher{top:calc(max(56px, env(safe-area-inset-top) + 48px) + 180px)}}@media (width<=640px){.hud-tag{min-width:120px}.hud-tag b{max-width:110px}.hud-day{font-size:2.2rem}.hud-launcher .hud-tab{min-width:0}.hud-launcher .hud-tab-main{grid-template-columns:26px;padding:7px 8px 9px}.hud-launcher .hud-tab-label,.hud-launcher .hud-tab-engaged,.hud-launcher .hud-kicker{display:none}.hud-music.mini{bottom:56px}.hud-music.full .hud-music-body{flex-direction:column;align-items:center}.hud-music.full .hud-music-left{flex-wrap:wrap;justify-content:center}.hud-playlist{width:100%;max-height:220px}.hud-levels{height:120px}}