@vitortrack777/djinnai 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -63,6 +63,7 @@ o pedido, o modelo, o esforço e o modo de permissão, mais o contexto do projet
63
63
  | Contexto e **Nova conversa**, no topo | Quantos tokens a conversa já carrega (o agente relê tudo a cada passo). Acima de 100k a tela sugere uma conversa nova; o botão (ou `/novo`) começa uma sessão limpa. Cada `djinn` também começa numa sessão nova |
64
64
  | Caixa de pedido | Enter envia, Shift+Enter quebra a linha. Com o agente trabalhando, Enter põe a mensagem na fila e o botão vira **parar** |
65
65
  | `/` | Lista `/novo` (conversa nova), os comandos do ambiente (`/start`, `/restart api`, `/logs --tail=100 api`, `/status`…) e as skills do Claude Code. A saída do ambiente aparece na tela, e o botão de parar encerra o comando (útil no `logs -f`) |
66
+ | Uso do plano, no topo, e `/usage` | O topo mostra quanto já foi usado da sessão de 5h, da semana e do limite do modelo escolhido, quando o plano tem um. Passe o mouse para ver quando renova. Acima de 80%, um aviso aparece sobre a caixa de pedido. Clicar no topo ou digitar `/usage` abre o detalhe, com tokens e custo equivalente por modelo desde que o DjinnAI abriu. Os números são os mesmos do `/usage` do Claude Code e a consulta não gasta tokens |
66
67
  | Seletor de modelo | Os modelos que a sua conta do Claude Code oferece ou qualquer modelo instalado no Ollama. O modelo do Ollama roda **dentro do Claude Code**, com as mesmas ferramentas e os mesmos `CLAUDE.md` |
67
68
  | Esforço | Baixo a Máximo, repassado como `--effort` (vale a partir da próxima mensagem com o agente parado) |
68
69
  | Modo, no topo | **Planejar** (planeja e pede aprovação do plano; aprovar passa para Editar), **Perguntar** (pede permissão para cada edição e comando), **Editar** (edita sem perguntar; comandos fora das regras do projeto pedem permissão), **Automático** (o Claude Code decide o que é seguro). Muda na hora, mesmo no meio de uma resposta |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vitortrack777/djinnai",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "DjinnAI: aplicativo local para conversar com o agente do Claude Code (Claude ou modelos do Ollama) e rodar os comandos do ambiente do projeto.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -9,7 +9,7 @@
9
9
  },
10
10
  "scripts": {
11
11
  "start": "node index.js",
12
- "test": "node web/src/lib/markdown.test.js && node web/src/lib/turns.test.js",
12
+ "test": "node web/src/lib/markdown.test.js && node web/src/lib/turns.test.js && node web/src/lib/limits.test.js",
13
13
  "build": "vite build --config web/vite.config.js",
14
14
  "prepublishOnly": "npm run build",
15
15
  "setup": "bash ./djinn.sh install",
package/server.js CHANGED
@@ -3,6 +3,7 @@ import { randomBytes } from 'node:crypto';
3
3
  import { createReadStream, createWriteStream, existsSync, mkdirSync } from 'node:fs';
4
4
  import { mkdir, readFile, writeFile } from 'node:fs/promises';
5
5
  import { createServer } from 'node:http';
6
+ import os from 'node:os';
6
7
  import path from 'node:path';
7
8
  import { fileURLToPath } from 'node:url';
8
9
  import { promisify } from 'node:util';
@@ -12,6 +13,8 @@ const MIME = { '.html': 'text/html', '.js': 'text/javascript', '.css': 'text/css
12
13
  const OLLAMA_URL = 'http://127.0.0.1:11434';
13
14
  const MAX_FOLDERS = 150;
14
15
  const INIT_TIMEOUT_MS = 20000;
16
+ const USAGE_TIMEOUT_MS = 15000;
17
+ const PLAN_CACHE_MS = 60000;
15
18
 
16
19
  const APP_COMMANDS = [
17
20
  ['start', 'Sobe o stack e builda só o que mudou'],
@@ -99,6 +102,46 @@ const killGroup = (child, signal = 'SIGTERM') => {
99
102
  } catch {}
100
103
  };
101
104
 
105
+ function planUsage() {
106
+ const env = { ...process.env };
107
+ delete env.ANTHROPIC_API_KEY;
108
+ const child = spawn('claude', ['-p', '--input-format', 'stream-json', '--output-format', 'stream-json', '--verbose'], { cwd: os.tmpdir(), env });
109
+ return new Promise((resolve) => {
110
+ const done = (value) => {
111
+ clearTimeout(timer);
112
+ child.kill();
113
+ resolve(value);
114
+ };
115
+ const timer = setTimeout(done, USAGE_TIMEOUT_MS, null);
116
+ child.on('error', () => done(null));
117
+ child.stdin.on('error', () => {});
118
+ eachLine(child.stdout, (line) => {
119
+ try {
120
+ const event = JSON.parse(line);
121
+ if (event.response?.request_id === 'usage') done(event.response.response ?? null);
122
+ } catch {}
123
+ });
124
+ for (const [id, subtype] of [['init', 'initialize'], ['usage', 'get_usage']]) {
125
+ child.stdin.write(`${JSON.stringify({ type: 'control_request', request_id: id, request: { subtype } })}\n`);
126
+ }
127
+ });
128
+ }
129
+
130
+ function totalUsage(usageByProcess) {
131
+ const total = {};
132
+ for (const { agent, models } of usageByProcess.values()) {
133
+ for (const [model, usage] of Object.entries(models)) {
134
+ const sum = (total[model] ??= { model, agent, input: 0, cacheRead: 0, cacheWrite: 0, output: 0, cost: 0 });
135
+ sum.input += usage.inputTokens ?? 0;
136
+ sum.cacheRead += usage.cacheReadInputTokens ?? 0;
137
+ sum.cacheWrite += usage.cacheCreationInputTokens ?? 0;
138
+ sum.output += usage.outputTokens ?? 0;
139
+ sum.cost += usage.costUSD ?? 0;
140
+ }
141
+ }
142
+ return Object.values(total);
143
+ }
144
+
102
145
  const readBody = async (request) => {
103
146
  let body = '';
104
147
  for await (const chunk of request) body += chunk;
@@ -115,6 +158,19 @@ export function startServer({ projectDir, appScript, version, port = 0 }) {
115
158
  let busy = false;
116
159
  let app = null;
117
160
  let record = null;
161
+ const usageByProcess = new Map();
162
+ const plan = { at: 0, value: null, pending: null };
163
+
164
+ async function currentPlan() {
165
+ if (Date.now() - plan.at < PLAN_CACHE_MS) return plan.value;
166
+ plan.pending ??= planUsage().finally(() => {
167
+ plan.pending = null;
168
+ });
169
+ const fresh = await plan.pending;
170
+ if (!fresh?.rate_limits) return plan.value ?? fresh;
171
+ Object.assign(plan, { at: Date.now(), value: fresh });
172
+ return fresh;
173
+ }
118
174
 
119
175
  const broadcast = (event, keep = true) => {
120
176
  if (keep) history.push(event);
@@ -163,6 +219,7 @@ export function startServer({ projectDir, appScript, version, port = 0 }) {
163
219
  return;
164
220
  }
165
221
  if (event.subtype === 'session_state_changed') busy = event.state !== 'idle';
222
+ if (event.type === 'result' && event.modelUsage) usageByProcess.set(current, { agent, models: event.modelUsage });
166
223
  broadcast(event, event.type !== 'stream_event');
167
224
  });
168
225
  child.stderr.on('data', (chunk) => { errors = (errors + chunk).slice(-2000); });
@@ -217,7 +274,7 @@ export function startServer({ projectDir, appScript, version, port = 0 }) {
217
274
  const current = await ensureSession(settings);
218
275
  const init = await Promise.race([current.init, new Promise((resolve) => setTimeout(resolve, INIT_TIMEOUT_MS, null))]);
219
276
  const branch = await promisify(execFile)('git', ['branch', '--show-current'], { cwd: projectDir }).then(({ stdout }) => stdout.trim(), () => '');
220
- const appNames = new Set(['novo', ...APP_COMMANDS.map(([name]) => name)]);
277
+ const appNames = new Set(['novo', 'usage', ...APP_COMMANDS.map(([name]) => name)]);
221
278
  const claudeModels = (init?.models ?? []).map((m) => ({ key: `claude:${m.value}`, name: m.value === 'default' ? 'Padrão' : m.displayName, tag: m.description?.split(' · ')[0] ?? 'Claude' }));
222
279
  return {
223
280
  project: path.basename(projectDir),
@@ -229,12 +286,21 @@ export function startServer({ projectDir, appScript, version, port = 0 }) {
229
286
  appCommands: [...appNames],
230
287
  commands: [
231
288
  { key: 'novo', name: '/novo', description: 'Começa uma conversa nova' },
289
+ { key: 'usage', name: '/usage', description: 'Limites do plano e uso por modelo' },
232
290
  ...APP_COMMANDS.map(([key, description]) => ({ key, name: `/${key}`, description })),
233
291
  ...(init?.commands ?? []).filter((c) => !appNames.has(c.name)).map((c) => ({ key: `claude-${c.name}`, name: `/${c.name}`, description: c.description.split(/(?<=\.)\s/)[0].slice(0, 110) })),
234
292
  ],
235
293
  settings: { model: settings.model, effort: settings.effort, mode: settings.mode },
236
294
  };
237
295
  },
296
+ 'GET /api/usage': async () => {
297
+ const info = await currentPlan();
298
+ return {
299
+ subscription: info?.subscription_type ?? '',
300
+ limits: info?.rate_limits?.limits ?? null,
301
+ models: totalUsage(usageByProcess),
302
+ };
303
+ },
238
304
  'POST /api/settings': async (request) => {
239
305
  const { model, effort, mode } = await readBody(request);
240
306
  await saveSettings(projectDir, { model, effort, mode });
@@ -1 +1 @@
1
- .lattice-loader{--ll-n: 3;--ll-cell: 6px;--ll-gap: 2px;--ll-font: 14px;--ll-color: currentColor;--ll-mark: #22c55e;--ll-idle: .15;--ll-glow: currentColor;--ll-mark-glow: #22c55e;--ll-peak: 1;--ll-cycle: 864ms;--ll-ease-out: cubic-bezier(.23, 1, .32, 1);--ll-ease-in-out: cubic-bezier(.77, 0, .175, 1);position:relative;display:inline-flex;align-items:center;gap:calc(var(--ll-font) * .625);font-family:inherit;font-size:var(--ll-font);line-height:1}.lattice-loader__grid{display:grid;flex:none}.lattice-loader__layer{grid-area:1 / 1;display:grid;grid-template-columns:repeat(var(--ll-n),var(--ll-cell));gap:var(--ll-gap)}.lattice-loader__cell{width:var(--ll-cell);height:var(--ll-cell);border-radius:max(1px,calc(var(--ll-cell) * .25));background:var(--ll-color);opacity:var(--ll-idle)}.lattice-loader[data-shape=round] .lattice-loader__cell{border-radius:50%}.lattice-loader[data-glow] .lattice-loader__run .lattice-loader__cell:not([data-hole]){box-shadow:0 0 calc(var(--ll-cell) * 1.2) calc(var(--ll-cell) * .12) var(--ll-glow)}.lattice-loader[data-glow] .lattice-loader__mark .lattice-loader__cell[data-on]{box-shadow:0 0 calc(var(--ll-cell) * 1.2) calc(var(--ll-cell) * .12) var(--ll-mark-glow)}.lattice-loader__run{transition:opacity .2s ease}.lattice-loader__run .lattice-loader__cell{animation:lattice-on var(--ll-cycle) var(--ll-ease-in-out) infinite}.lattice-loader__run .lattice-loader__cell[data-lit="45"]{animation-name:lattice-on-45}.lattice-loader__run .lattice-loader__cell[data-lit="35"]{animation-name:lattice-on-35}.lattice-loader__run .lattice-loader__cell[data-lit="25"]{animation-name:lattice-on-25}.lattice-loader__run .lattice-loader__cell[data-hole]{animation:none;opacity:calc(var(--ll-idle) * .47)}.lattice-loader__mark{opacity:0;transform:scale(.9);transform-origin:center;transition:opacity .16s var(--ll-ease-out),transform .16s var(--ll-ease-out)}.lattice-loader__mark .lattice-loader__cell{transition:opacity .2s ease,background-color .2s ease}.lattice-loader__mark .lattice-loader__cell[data-on]{background:var(--ll-mark);opacity:var(--ll-peak)}.lattice-loader:not([data-status=working]) .lattice-loader__run{opacity:0}.lattice-loader:not([data-status=working]) .lattice-loader__run .lattice-loader__cell{animation-play-state:paused}.lattice-loader:not([data-status=working]) .lattice-loader__mark{opacity:1;transform:none;transition:opacity .2s ease,transform .2s var(--ll-ease-out)}.lattice-loader__label{position:relative;display:inline-block;font-weight:500}.lattice-loader__text{position:absolute;top:0;left:0;white-space:nowrap;opacity:0;filter:blur(2px);transition:opacity .2s ease,filter .2s ease}.lattice-loader__text[data-active]{position:static;opacity:1;filter:blur(0)}.lattice-loader__timer{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:calc(var(--ll-font) * .875);font-variant-numeric:tabular-nums;opacity:.6}.lattice-loader__sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}@keyframes lattice-on{0%,to{opacity:var(--ll-idle)}18%,42%{opacity:var(--ll-peak)}62%{opacity:var(--ll-idle)}}@keyframes lattice-on-45{0%,to{opacity:var(--ll-idle)}13%,31%{opacity:var(--ll-peak)}45%{opacity:var(--ll-idle)}}@keyframes lattice-on-35{0%,to{opacity:var(--ll-idle)}10%,24%{opacity:var(--ll-peak)}35%{opacity:var(--ll-idle)}}@keyframes lattice-on-25{0%,to{opacity:var(--ll-idle)}7%,17%{opacity:var(--ll-peak)}25%{opacity:var(--ll-idle)}}@media(prefers-reduced-motion:reduce){.lattice-loader__run{--ll-peak: .7}.lattice-loader__run .lattice-loader__cell{animation-delay:0ms!important;animation-duration:1.4s!important}.lattice-loader .lattice-loader__mark{transform:none}.lattice-loader .lattice-loader__text{filter:none}}.prompt-bar{--pb-bg: #27272a;--pb-ink: #f5f5f5;--pb-menu: #323236;--pb-w: 400px;--pb-radius: 16px;--pb-press: .96;--pb-spark: #b39dff;--pb-ease-out: cubic-bezier(.23, 1, .32, 1);--pb-muted: color-mix(in srgb, var(--pb-ink) 55%, transparent);--pb-hover: color-mix(in srgb, var(--pb-ink) 8%, transparent);position:relative;width:min(var(--pb-w),100%);color:var(--pb-ink);font-family:inherit;font-size:14px;line-height:22px}.prompt-bar__menu{max-height:min(360px,55vh);overflow-y:auto;position:absolute;right:0;bottom:calc(100% + 8px);left:0;z-index:2;padding:4px;border-radius:12px;background:var(--pb-menu);box-shadow:0 10px 30px -10px #00000059,0 1px 2px #00000014;transform-origin:bottom center;animation:prompt-bar-pop .18s var(--pb-ease-out) both}.prompt-bar__menu[data-kind=model]{right:auto;width:200px;transform-origin:bottom left}@keyframes prompt-bar-pop{0%{opacity:0;transform:translateY(4px) scale(.98)}}.prompt-bar__glow{position:absolute;right:4px;left:4px;border-radius:8px;background:var(--pb-hover);opacity:0;pointer-events:none;transition:top .22s var(--pb-ease-out),height .22s var(--pb-ease-out),opacity .15s ease}.prompt-bar__row{position:relative;z-index:1;display:flex;align-items:center;gap:10px;width:100%;height:36px;padding:0 8px;border:0;border-radius:8px;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer;outline:none;-webkit-tap-highlight-color:transparent}.prompt-bar__row-icon{display:inline-flex;flex:none;justify-content:center;width:20px;color:color-mix(in srgb,var(--pb-ink) 70%,transparent)}.prompt-bar__row-name{flex:none;font-size:13px;font-weight:500}.prompt-bar__row-desc{flex:1 1 auto;min-width:0;overflow:hidden;color:var(--pb-muted);font-size:12px;white-space:nowrap;text-overflow:ellipsis}.prompt-bar__row-tag{flex:none;margin-left:auto;color:var(--pb-muted);font-size:11px}.prompt-bar__row-check{display:inline-flex;flex:none;justify-content:center;width:16px;opacity:0}.prompt-bar__row-check[data-on]{opacity:1}.prompt-bar__empty{display:flex;align-items:center;height:36px;padding:0 8px;color:var(--pb-muted);font-size:12px}.prompt-bar__field{position:relative;isolation:isolate;display:flex;flex-direction:column;gap:8px;padding:12px;border-radius:var(--pb-radius);background:var(--pb-bg);cursor:text}.prompt-bar__field:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;border-radius:inherit;background:radial-gradient(140% 120% at 0% 100%,color-mix(in srgb,var(--pb-spark) 26%,transparent),transparent 62%);opacity:0;pointer-events:none;transition:opacity .5s ease}.prompt-bar__field[data-max]:before{opacity:1}.prompt-bar__sparks{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;width:100%;height:100%;border-radius:inherit;pointer-events:none}.prompt-bar__chips{display:flex;flex-wrap:wrap;gap:6px}.prompt-bar__chip{display:inline-flex;align-items:center;gap:6px;height:26px;padding:0 4px 0 8px;border-radius:8px;background:var(--pb-hover);font-size:12px;animation:prompt-bar-pop .2s var(--pb-ease-out) both}.prompt-bar__chip-name{max-width:144px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.prompt-bar__chip-x{display:inline-grid;place-items:center;width:18px;height:18px;padding:0;border:0;border-radius:5px;background:transparent;color:inherit;opacity:.6;cursor:pointer;outline:none;transition:opacity .12s ease,background-color .12s ease}.prompt-bar__chip-x:hover{background:color-mix(in srgb,var(--pb-ink) 10%,transparent);opacity:1}.prompt-bar__input{display:block;width:100%;padding:0;border:0;background:transparent;color:inherit;font:inherit;font-size:14px;line-height:22px;resize:none;outline:none;overflow-wrap:anywhere}.prompt-bar__input::placeholder{color:color-mix(in srgb,var(--pb-ink) 45%,transparent)}@media(pointer:coarse){.prompt-bar__input{font-size:16px}}.prompt-bar__bar{display:flex;align-items:center;gap:4px}.prompt-bar__spacer{flex:1 1 auto}.prompt-bar__tool,.prompt-bar__pick,.prompt-bar__send{flex:none;border:0;font:inherit;cursor:pointer;outline:none;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;touch-action:manipulation}.prompt-bar__tool{display:inline-grid;place-items:center;width:28px;height:28px;padding:0;border-radius:8px;background:transparent;color:color-mix(in srgb,var(--pb-ink) 60%,transparent);transition:background-color .15s ease,color .15s ease,transform .16s var(--pb-ease-out)}.prompt-bar__tool:active{transform:scale(.94)}.prompt-bar__pick{display:inline-flex;align-items:center;gap:4px;height:28px;padding:0 8px;border-radius:8px;background:transparent;color:color-mix(in srgb,var(--pb-ink) 70%,transparent);font-size:12px;font-weight:500;transition:background-color .15s ease,color .15s ease}.prompt-bar__tool[data-on],.prompt-bar__pick[data-on]{background:var(--pb-hover);color:var(--pb-ink)}@media(hover:hover)and (pointer:fine){.prompt-bar__tool:hover,.prompt-bar__pick:hover{background:var(--pb-hover);color:var(--pb-ink)}}.prompt-bar__pick[data-max]{color:var(--pb-spark)}.prompt-bar__menu[data-kind=effort]{right:auto;width:248px;padding:12px 14px 14px;transform-origin:bottom left}.prompt-bar__effort-head{display:flex;align-items:center;gap:8px;font-size:13px;line-height:18px}.prompt-bar__effort-title{color:var(--pb-muted)}.prompt-bar__effort-level{font-weight:500}.prompt-bar__effort-help{display:inline-flex;margin-left:auto;color:var(--pb-muted)}.prompt-bar__effort-ends{display:flex;justify-content:space-between;margin-top:12px;color:var(--pb-muted);font-size:12px;line-height:16px}.prompt-bar__effort-track{position:relative;height:22px;margin-top:8px;border-radius:11px;background:var(--pb-hover);cursor:pointer;outline:none;touch-action:none;user-select:none;-webkit-user-select:none}.prompt-bar__effort-fill{position:absolute;top:0;bottom:0;left:0;width:var(--pb-effort-fill);border-radius:11px;background:color-mix(in srgb,var(--pb-ink) 18%,transparent);transition:width .22s var(--pb-ease-out),background-color .3s ease}.prompt-bar__effort-dot{position:absolute;top:50%;width:4px;height:4px;margin:-2px 0 0 -2px;border-radius:50%;background:color-mix(in srgb,var(--pb-ink) 30%,transparent)}.prompt-bar__effort-thumb{position:absolute;top:-3px;left:var(--pb-effort-x);width:14px;height:28px;margin-left:-7px;border-radius:7px;background:var(--pb-ink);box-shadow:0 2px 6px #00000040;transition:left .22s var(--pb-ease-out),background-color .3s ease}.prompt-bar[data-max] .prompt-bar__effort-fill{background:color-mix(in srgb,var(--pb-spark) 35%,transparent)}.prompt-bar[data-max] .prompt-bar__effort-thumb{background:var(--pb-spark)}.prompt-bar__eq{display:flex;align-items:center;gap:2.5px;height:14px}.prompt-bar__eq i{display:block;width:2.5px;height:100%;border-radius:999px;background:currentColor;transform-origin:center;animation:prompt-bar-eq .9s ease-in-out infinite}.prompt-bar__eq i:nth-child(2){animation-delay:.15s}.prompt-bar__eq i:nth-child(3){animation-delay:.3s}@keyframes prompt-bar-eq{0%,to{transform:scaleY(.35)}50%{transform:scaleY(1)}}.prompt-bar__send{position:relative;display:inline-grid;place-items:center;width:28px;height:28px;padding:0;border-radius:8px;background:color-mix(in srgb,var(--pb-ink) 12%,var(--pb-bg));color:color-mix(in srgb,var(--pb-ink) 55%,var(--pb-bg));transition:background-color .2s ease,color .2s ease,transform .16s var(--pb-ease-out)}.prompt-bar__send:disabled{cursor:default}.prompt-bar__send[data-armed]{background:var(--pb-ink);color:var(--pb-bg)}.prompt-bar__send[data-pressed]{transform:scale(var(--pb-press))}.prompt-bar__glyph{display:block;width:16px;height:16px;transform-origin:50% 50%}@media(prefers-reduced-motion:reduce){.prompt-bar__menu,.prompt-bar__chip{animation:none}.prompt-bar__glow{transition:opacity .15s ease}.prompt-bar__effort-fill,.prompt-bar__effort-thumb{transition:background-color .3s ease}.prompt-bar__tool:active,.prompt-bar__send[data-pressed]{transform:none}}.rubber-segment{--rs-track: #27272a;--rs-thumb: #fafafa;--rs-ink: #fafafa;--rs-ink-active: #18181b;--rs-radius: 10px;--rs-inset: 3px;--rs-thumb-radius: 7px;--rs-h: 36px;--rs-font: 13px;--rs-pad: 14px;--rs-min: 44px;--rs-idle: .7;--rs-hover: .9;--rs-ease-out: cubic-bezier(.23, 1, .32, 1);position:relative;display:inline-grid;grid-auto-flow:column;grid-auto-columns:auto;vertical-align:middle;padding:var(--rs-inset);border-radius:var(--rs-radius);background:var(--rs-track);font-family:inherit;touch-action:pan-y;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.rubber-segment[data-equal]{grid-auto-columns:minmax(0,1fr)}.rubber-segment[aria-disabled=true]{opacity:.5;pointer-events:none}.rubber-segment__item{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:calc(var(--rs-h) - var(--rs-inset) * 2);min-width:var(--rs-min);margin:0;padding:0 var(--rs-pad);border:0;border-radius:var(--rs-thumb-radius);background:none;color:var(--rs-ink);opacity:var(--rs-idle);font:inherit;font-size:var(--rs-font);font-weight:500;line-height:1;white-space:nowrap;cursor:pointer;outline:none;transition:opacity .16s ease,transform .16s var(--rs-ease-out)}.rubber-segment__item[aria-checked=true]{cursor:default}.rubber-segment[data-draggable] .rubber-segment__item[aria-checked=true]{cursor:grab}.rubber-segment[data-held],.rubber-segment[data-held] .rubber-segment__item{cursor:grabbing}.rubber-segment__item[data-pressed]{transform:scale(.96)}.rubber-segment__item:focus-visible{outline:2px solid var(--rs-thumb);outline-offset:3px}@media(hover:hover)and (pointer:fine){.rubber-segment__item[aria-checked=false]:hover{opacity:var(--rs-hover)}}.rubber-segment__thumb{position:absolute;inset:var(--rs-inset);display:grid;grid-auto-flow:column;grid-auto-columns:auto;background:var(--rs-thumb);color:var(--rs-ink-active);pointer-events:none}.rubber-segment[data-equal] .rubber-segment__thumb{grid-auto-columns:minmax(0,1fr)}.rubber-segment__copy{color:inherit;opacity:1;cursor:default}@media(prefers-reduced-motion:reduce){.rubber-segment__item{transition:opacity .16s ease}}.status-mark{--sm-size: 20px;--sm-stroke: 2;--sm-color: currentColor;--sm-done: #22c55e;--sm-error: #ef4444;--sm-fill: .06;--sm-font: 14px;--sm-draw: .24s;--sm-strike-delay: .18s;--sm-muted: .55;--sm-check-delay: .12s;--sm-label-o: .65;--sm-ease-out: cubic-bezier(.23, 1, .32, 1);--sm-ease-in-out: cubic-bezier(.77, 0, .175, 1);position:relative;display:inline-flex;align-items:center;gap:calc(var(--sm-size) * .5);vertical-align:middle;line-height:1}.status-mark__glyph{flex:none;overflow:visible;color:var(--sm-color);transition:color .2s ease}.status-mark[data-status=done] .status-mark__glyph{color:var(--sm-done)}.status-mark[data-status=failed] .status-mark__glyph{color:var(--sm-error)}.status-mark__track{fill:currentColor;stroke:currentColor;stroke-width:var(--sm-stroke);fill-opacity:0;stroke-opacity:0;transition:fill-opacity .18s ease,stroke-opacity .2s ease}.status-mark[data-status=running] .status-mark__track{stroke-opacity:.2}.status-mark[data-status=done] .status-mark__track,.status-mark[data-status=failed] .status-mark__track{fill-opacity:var(--sm-fill)}.status-mark__ring{fill:none;stroke:currentColor;stroke-width:var(--sm-stroke);stroke-linecap:round;opacity:var(--sm-muted);transition:opacity .2s ease}.status-mark[data-status=running] .status-mark__ring,.status-mark[data-status=done] .status-mark__ring,.status-mark[data-status=failed] .status-mark__ring{opacity:1}.status-mark__check,.status-mark__cross{fill:none;stroke:currentColor;stroke-width:var(--sm-stroke);stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1 2;stroke-dashoffset:1.05;opacity:0;transition:stroke-dashoffset .16s var(--sm-ease-out),opacity 0ms linear .16s}.status-mark[data-status=done] .status-mark__check,.status-mark[data-status=failed] .status-mark__cross,.status-mark[data-status=cancelled] .status-mark__cross{stroke-dashoffset:0;opacity:1;transition:stroke-dashoffset var(--sm-draw) var(--sm-ease-out) var(--sm-check-delay),opacity 0ms linear var(--sm-check-delay)}.status-mark__label{position:relative;color:var(--sm-color);font-size:var(--sm-font);line-height:1.25;opacity:var(--sm-label-o);transition:opacity .2s ease}.status-mark[data-status=running]{--sm-label-o: 1}.status-mark[data-status=done]{--sm-label-o: .6}.status-mark[data-status=failed]{--sm-label-o: 1}.status-mark[data-status=cancelled]{--sm-label-o: .55}.status-mark__strike{position:absolute;top:50%;right:0;left:0;height:max(1px,calc(var(--sm-font) / 14));background:currentColor;transform:scaleX(0);transform-origin:left center;translate:0 -50%;pointer-events:none;transition:transform .16s var(--sm-ease-out)}.status-mark[data-status=done][data-strike] .status-mark__strike{transform:scaleX(1);transition:transform .28s var(--sm-ease-out) var(--sm-strike-delay)}.status-mark__sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}@keyframes sm-breathe{50%{opacity:.45}}@media(prefers-reduced-motion:reduce){.status-mark[data-indeterminate] .status-mark__ring{animation:sm-breathe 1.4s var(--sm-ease-in-out) infinite}.status-mark__check,.status-mark__cross{stroke-dashoffset:0;transition:opacity .2s ease}.status-mark__strike{opacity:0;transform:scaleX(1)!important;transition:opacity .2s ease}.status-mark[data-status=done][data-strike] .status-mark__strike{opacity:1}}.thought-line{--tl-ease-out: cubic-bezier(.23, 1, .32, 1);--tl-ease-in-out: cubic-bezier(.77, 0, .175, 1);--tl-font: 16px;--tl-color: currentColor;--tl-glyph: currentColor;--tl-settle: .35s;--tl-blur: 2px;--tl-shimmer: 1.8s;--tl-done: .75;--tl-timer: .55;display:inline-flex;flex-direction:column;align-items:flex-start;color:var(--tl-color);font-family:inherit;font-size:var(--tl-font);font-weight:500;line-height:1.2}.thought-line__head{position:relative;display:inline-flex;align-items:center;gap:.3em;margin:0;padding:0;border:0;background:none;color:inherit;font:inherit;text-align:left;white-space:nowrap;outline:none;cursor:default}.thought-line__head[data-toggle]{cursor:pointer;-webkit-tap-highlight-color:transparent}.thought-line__glyph{display:inline-flex;flex:none;width:1.1em;height:1.1em;margin-right:.2em;color:var(--tl-glyph)}.thought-line__glyph svg{display:block;width:100%;height:100%}.thought-line__dot{width:.5em;height:.5em;margin:auto;border-radius:50%;background:currentColor}.thought-line__label{display:inline-grid}.thought-line__text{grid-area:1 / 1;width:max-content;opacity:0;filter:blur(var(--tl-blur));transition:opacity var(--tl-settle) var(--tl-ease-out),filter var(--tl-settle) var(--tl-ease-out)}.thought-line__text[data-active]{opacity:1;filter:blur(0)}.thought-line__text--done[data-active]{opacity:var(--tl-done)}.thought-line__breath{display:inline-block}.thought-line[data-working] .thought-line__breath[data-shimmer]{background:linear-gradient(100deg,color-mix(in srgb,var(--tl-color) 50%,transparent) 30%,var(--tl-color) 50%,color-mix(in srgb,var(--tl-color) 50%,transparent) 70%);background-size:250% 100%;background-position:125% 0;-webkit-background-clip:text;background-clip:text;color:transparent;-webkit-text-fill-color:transparent;animation:thought-line-shimmer var(--tl-shimmer) linear infinite}@keyframes thought-line-shimmer{to{background-position:-125% 0}}.thought-line__timer{font-variant-numeric:tabular-nums;opacity:var(--tl-timer);transition:opacity var(--tl-settle) ease,transform var(--tl-settle) var(--tl-ease-in-out)}.thought-line__timer[data-done]{opacity:var(--tl-done)}.thought-line__chevron{display:inline-flex;margin-left:.1em;opacity:0;transition:opacity .2s ease,transform .2s var(--tl-ease-out)}.thought-line__chevron[data-on]{opacity:.55}.thought-line[data-open] .thought-line__chevron{transform:rotate(180deg)}.thought-line__sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.thought-line__trace{display:grid;grid-template-rows:0fr;width:0;min-width:100%;transition:grid-template-rows var(--tl-settle) var(--tl-ease-out)}.thought-line__trace[data-open]{grid-template-rows:1fr}.thought-line__fold{min-height:0;overflow-x:visible;overflow-y:clip}.thought-line__steps{display:flex;flex-direction:column;gap:.45em;width:max-content;padding:.6em 0 .2em 1.6em;font-size:.875em;font-weight:400;white-space:nowrap}.thought-line__step{display:flex;align-items:center;gap:.5em;opacity:1;transform:translateY(0);transition:opacity .2s var(--tl-ease-out),transform .2s var(--tl-ease-out)}@starting-style{.thought-line__step{opacity:0;transform:translateY(-4px)}}.thought-line__mark{display:inline-grid;flex:none;place-items:center;width:1em;height:1em;opacity:.55}.thought-line__pulse{display:block;width:.4em;height:.4em;border-radius:50%;background:currentColor;animation:thought-line-pulse 1.6s var(--tl-ease-in-out) infinite}@keyframes thought-line-pulse{0%,to{opacity:.55}50%{opacity:1}}.thought-line__step-text{transition:opacity var(--tl-settle) ease}.thought-line__step[data-done] .thought-line__step-text{opacity:.55}@media(prefers-reduced-motion:reduce){.thought-line__text{filter:none!important;transition:opacity var(--tl-settle) ease}.thought-line__timer{transition:opacity var(--tl-settle) ease}.thought-line__step{transform:none!important;transition:opacity .2s ease}.thought-line__pulse{animation-duration:2.4s}}:root{color-scheme:dark;--bg: #18181b;--panel: #232327;--line: #2f2f35;--ink: #f4f4f5;--muted: #a1a1aa;--accent: #b39dff;--danger: #f87171;--warn: #fbbf24}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{background:var(--bg);color:var(--ink);font:14px/1.55 Inter,ui-sans-serif,system-ui,-apple-system,Segoe UI,sans-serif}.app{display:flex;flex-direction:column;height:100%;max-width:860px;margin:0 auto;padding:0 16px}.app--empty{align-items:center;justify-content:center;color:var(--muted)}.app__header{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;padding:16px 0;border-bottom:1px solid var(--line)}.app__title{font-size:18px;font-weight:700;letter-spacing:.02em;color:var(--accent)}.app__meta{color:var(--muted);font-size:12px}.app__controls{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.app__context{color:var(--muted);font-size:12px;font-variant-numeric:tabular-nums}.app__context[data-warn]{color:var(--warn)}.app__new{font:inherit;font-size:13px;color:var(--ink);background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:5px 10px;cursor:pointer}.app__new:disabled{opacity:.5;cursor:default}.app__turns{flex:1;overflow-y:auto;padding:20px 0;display:flex;flex-direction:column;gap:28px}.app__hint{color:var(--muted);max-width:560px;margin:15vh auto 0;text-align:center}.app__composer{display:flex;flex-direction:column;align-items:center;gap:8px;padding:12px 0 20px}.app__composer>div{width:min(820px,100%)}.app__attachments{display:flex;gap:8px;flex-wrap:wrap}.app__attachment{position:relative;padding:0;border:1px solid var(--line);border-radius:8px;background:none;cursor:pointer}.app__attachment img{display:block;height:64px;border-radius:8px}.app__attachment span{position:absolute;top:2px;right:4px;color:var(--ink);text-shadow:0 0 3px #000}.turn{display:flex;flex-direction:column;gap:10px}.turn__prompt{align-self:flex-end;max-width:85%;background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:8px 14px;white-space:pre-wrap;overflow-wrap:anywhere}.turn__text{overflow-wrap:anywhere}.turn__text>:first-child{margin-top:0}.turn__text>:last-child{margin-bottom:0}.turn__text p,.turn__text ul,.turn__text ol{margin:0 0 8px}.turn__text a{color:var(--accent)}.turn__text code{font:12.5px ui-monospace,JetBrains Mono,monospace;background:var(--panel);border-radius:4px;padding:1px 4px}.turn__text pre{background:#111113;border:1px solid var(--line);border-radius:10px;padding:10px 12px;overflow:auto}.turn__text pre code{background:none;padding:0}.turn__text table{border-collapse:collapse;margin:0 0 8px}.turn__text th,.turn__text td{border:1px solid var(--line);padding:4px 8px;text-align:left}.turn__tool{display:flex;gap:10px;align-items:flex-start;font-size:13px}.turn__target{color:var(--muted);font-family:ui-monospace,JetBrains Mono,monospace;overflow-wrap:anywhere}.turn__detail{color:var(--muted);font-size:12px}.turn__detail--error{color:var(--danger)}.turn__log{margin:0;max-height:420px;overflow:auto;background:#111113;border:1px solid var(--line);border-radius:10px;padding:10px 12px;font:12px/1.5 ui-monospace,JetBrains Mono,monospace;white-space:pre-wrap}.turn__warning,.turn__error{border-radius:10px;padding:8px 12px;font-size:13px}.turn__warning{background:#fbbf2414;color:var(--warn)}.turn__error{background:#f8717114;color:var(--danger);white-space:pre-wrap}.turn__footer{display:flex;align-items:center;gap:14px;flex-wrap:wrap;color:var(--muted)}.turn__usage{font-size:12px}.turn__images{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:6px}.turn__images img{max-height:120px;border-radius:8px}.ask{border:1px solid var(--line);background:var(--panel);border-radius:12px;padding:12px 14px;display:flex;flex-direction:column;gap:10px}.ask--done{padding:6px 12px;color:var(--muted);font-size:12px}.ask__title{font-weight:600}.ask__reason{color:var(--warn);font-size:12px}.ask__code{margin:0;max-height:300px;overflow:auto;background:#111113;border-radius:8px;padding:8px 10px;font:12px/1.5 ui-monospace,JetBrains Mono,monospace;white-space:pre-wrap}.ask__del{color:var(--danger)}.ask__add{color:#4ade80}.ask__plan{max-height:420px;overflow:auto}.ask__actions{display:flex;gap:8px;flex-wrap:wrap}.ask__actions button,.ask__option{font:inherit;color:var(--ink);background:#2c2c31;border:1px solid var(--line);border-radius:8px;padding:6px 12px;cursor:pointer}.ask__actions button:disabled{opacity:.5;cursor:default}.ask__actions .ask__primary{background:var(--ink);color:var(--bg);border-color:var(--ink)}.ask__question,.ask__options{display:flex;flex-direction:column;gap:6px}.ask__option{display:flex;flex-direction:column;align-items:flex-start;text-align:left}.ask__option span{color:var(--muted);font-size:12px}.ask__option[data-on]{border-color:var(--accent);background:#b39dff1f}.ask__other{font:inherit;color:var(--ink);background:#111113;border:1px solid var(--line);border-radius:8px;padding:6px 10px}
1
+ .lattice-loader{--ll-n: 3;--ll-cell: 6px;--ll-gap: 2px;--ll-font: 14px;--ll-color: currentColor;--ll-mark: #22c55e;--ll-idle: .15;--ll-glow: currentColor;--ll-mark-glow: #22c55e;--ll-peak: 1;--ll-cycle: 864ms;--ll-ease-out: cubic-bezier(.23, 1, .32, 1);--ll-ease-in-out: cubic-bezier(.77, 0, .175, 1);position:relative;display:inline-flex;align-items:center;gap:calc(var(--ll-font) * .625);font-family:inherit;font-size:var(--ll-font);line-height:1}.lattice-loader__grid{display:grid;flex:none}.lattice-loader__layer{grid-area:1 / 1;display:grid;grid-template-columns:repeat(var(--ll-n),var(--ll-cell));gap:var(--ll-gap)}.lattice-loader__cell{width:var(--ll-cell);height:var(--ll-cell);border-radius:max(1px,calc(var(--ll-cell) * .25));background:var(--ll-color);opacity:var(--ll-idle)}.lattice-loader[data-shape=round] .lattice-loader__cell{border-radius:50%}.lattice-loader[data-glow] .lattice-loader__run .lattice-loader__cell:not([data-hole]){box-shadow:0 0 calc(var(--ll-cell) * 1.2) calc(var(--ll-cell) * .12) var(--ll-glow)}.lattice-loader[data-glow] .lattice-loader__mark .lattice-loader__cell[data-on]{box-shadow:0 0 calc(var(--ll-cell) * 1.2) calc(var(--ll-cell) * .12) var(--ll-mark-glow)}.lattice-loader__run{transition:opacity .2s ease}.lattice-loader__run .lattice-loader__cell{animation:lattice-on var(--ll-cycle) var(--ll-ease-in-out) infinite}.lattice-loader__run .lattice-loader__cell[data-lit="45"]{animation-name:lattice-on-45}.lattice-loader__run .lattice-loader__cell[data-lit="35"]{animation-name:lattice-on-35}.lattice-loader__run .lattice-loader__cell[data-lit="25"]{animation-name:lattice-on-25}.lattice-loader__run .lattice-loader__cell[data-hole]{animation:none;opacity:calc(var(--ll-idle) * .47)}.lattice-loader__mark{opacity:0;transform:scale(.9);transform-origin:center;transition:opacity .16s var(--ll-ease-out),transform .16s var(--ll-ease-out)}.lattice-loader__mark .lattice-loader__cell{transition:opacity .2s ease,background-color .2s ease}.lattice-loader__mark .lattice-loader__cell[data-on]{background:var(--ll-mark);opacity:var(--ll-peak)}.lattice-loader:not([data-status=working]) .lattice-loader__run{opacity:0}.lattice-loader:not([data-status=working]) .lattice-loader__run .lattice-loader__cell{animation-play-state:paused}.lattice-loader:not([data-status=working]) .lattice-loader__mark{opacity:1;transform:none;transition:opacity .2s ease,transform .2s var(--ll-ease-out)}.lattice-loader__label{position:relative;display:inline-block;font-weight:500}.lattice-loader__text{position:absolute;top:0;left:0;white-space:nowrap;opacity:0;filter:blur(2px);transition:opacity .2s ease,filter .2s ease}.lattice-loader__text[data-active]{position:static;opacity:1;filter:blur(0)}.lattice-loader__timer{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:calc(var(--ll-font) * .875);font-variant-numeric:tabular-nums;opacity:.6}.lattice-loader__sr{position:absolute;width:1px;height:1px;margin:-1px;padding:0;border:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}@keyframes lattice-on{0%,to{opacity:var(--ll-idle)}18%,42%{opacity:var(--ll-peak)}62%{opacity:var(--ll-idle)}}@keyframes lattice-on-45{0%,to{opacity:var(--ll-idle)}13%,31%{opacity:var(--ll-peak)}45%{opacity:var(--ll-idle)}}@keyframes lattice-on-35{0%,to{opacity:var(--ll-idle)}10%,24%{opacity:var(--ll-peak)}35%{opacity:var(--ll-idle)}}@keyframes lattice-on-25{0%,to{opacity:var(--ll-idle)}7%,17%{opacity:var(--ll-peak)}25%{opacity:var(--ll-idle)}}@media(prefers-reduced-motion:reduce){.lattice-loader__run{--ll-peak: .7}.lattice-loader__run .lattice-loader__cell{animation-delay:0ms!important;animation-duration:1.4s!important}.lattice-loader .lattice-loader__mark{transform:none}.lattice-loader .lattice-loader__text{filter:none}}.prompt-bar{--pb-bg: #27272a;--pb-ink: #f5f5f5;--pb-menu: #323236;--pb-w: 400px;--pb-radius: 16px;--pb-press: .96;--pb-spark: #b39dff;--pb-ease-out: cubic-bezier(.23, 1, .32, 1);--pb-muted: color-mix(in srgb, var(--pb-ink) 55%, transparent);--pb-hover: color-mix(in srgb, var(--pb-ink) 8%, transparent);position:relative;width:min(var(--pb-w),100%);color:var(--pb-ink);font-family:inherit;font-size:14px;line-height:22px}.prompt-bar__menu{max-height:min(360px,55vh);overflow-y:auto;position:absolute;right:0;bottom:calc(100% + 8px);left:0;z-index:2;padding:4px;border-radius:12px;background:var(--pb-menu);box-shadow:0 10px 30px -10px #00000059,0 1px 2px #00000014;transform-origin:bottom center;animation:prompt-bar-pop .18s var(--pb-ease-out) both}.prompt-bar__menu[data-kind=model]{right:auto;width:200px;transform-origin:bottom left}@keyframes prompt-bar-pop{0%{opacity:0;transform:translateY(4px) scale(.98)}}.prompt-bar__glow{position:absolute;right:4px;left:4px;border-radius:8px;background:var(--pb-hover);opacity:0;pointer-events:none;transition:top .22s var(--pb-ease-out),height .22s var(--pb-ease-out),opacity .15s ease}.prompt-bar__row{position:relative;z-index:1;display:flex;align-items:center;gap:10px;width:100%;height:36px;padding:0 8px;border:0;border-radius:8px;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer;outline:none;-webkit-tap-highlight-color:transparent}.prompt-bar__row-icon{display:inline-flex;flex:none;justify-content:center;width:20px;color:color-mix(in srgb,var(--pb-ink) 70%,transparent)}.prompt-bar__row-name{flex:none;font-size:13px;font-weight:500}.prompt-bar__row-desc{flex:1 1 auto;min-width:0;overflow:hidden;color:var(--pb-muted);font-size:12px;white-space:nowrap;text-overflow:ellipsis}.prompt-bar__row-tag{flex:none;margin-left:auto;color:var(--pb-muted);font-size:11px}.prompt-bar__row-check{display:inline-flex;flex:none;justify-content:center;width:16px;opacity:0}.prompt-bar__row-check[data-on]{opacity:1}.prompt-bar__empty{display:flex;align-items:center;height:36px;padding:0 8px;color:var(--pb-muted);font-size:12px}.prompt-bar__field{position:relative;isolation:isolate;display:flex;flex-direction:column;gap:8px;padding:12px;border-radius:var(--pb-radius);background:var(--pb-bg);cursor:text}.prompt-bar__field:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;border-radius:inherit;background:radial-gradient(140% 120% at 0% 100%,color-mix(in srgb,var(--pb-spark) 26%,transparent),transparent 62%);opacity:0;pointer-events:none;transition:opacity .5s ease}.prompt-bar__field[data-max]:before{opacity:1}.prompt-bar__sparks{position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1;width:100%;height:100%;border-radius:inherit;pointer-events:none}.prompt-bar__chips{display:flex;flex-wrap:wrap;gap:6px}.prompt-bar__chip{display:inline-flex;align-items:center;gap:6px;height:26px;padding:0 4px 0 8px;border-radius:8px;background:var(--pb-hover);font-size:12px;animation:prompt-bar-pop .2s var(--pb-ease-out) both}.prompt-bar__chip-name{max-width:144px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.prompt-bar__chip-x{display:inline-grid;place-items:center;width:18px;height:18px;padding:0;border:0;border-radius:5px;background:transparent;color:inherit;opacity:.6;cursor:pointer;outline:none;transition:opacity .12s ease,background-color .12s ease}.prompt-bar__chip-x:hover{background:color-mix(in srgb,var(--pb-ink) 10%,transparent);opacity:1}.prompt-bar__input{display:block;width:100%;padding:0;border:0;background:transparent;color:inherit;font:inherit;font-size:14px;line-height:22px;resize:none;outline:none;overflow-wrap:anywhere}.prompt-bar__input::placeholder{color:color-mix(in srgb,var(--pb-ink) 45%,transparent)}@media(pointer:coarse){.prompt-bar__input{font-size:16px}}.prompt-bar__bar{display:flex;align-items:center;gap:4px}.prompt-bar__spacer{flex:1 1 auto}.prompt-bar__tool,.prompt-bar__pick,.prompt-bar__send{flex:none;border:0;font:inherit;cursor:pointer;outline:none;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;touch-action:manipulation}.prompt-bar__tool{display:inline-grid;place-items:center;width:28px;height:28px;padding:0;border-radius:8px;background:transparent;color:color-mix(in srgb,var(--pb-ink) 60%,transparent);transition:background-color .15s ease,color .15s ease,transform .16s var(--pb-ease-out)}.prompt-bar__tool:active{transform:scale(.94)}.prompt-bar__pick{display:inline-flex;align-items:center;gap:4px;height:28px;padding:0 8px;border-radius:8px;background:transparent;color:color-mix(in srgb,var(--pb-ink) 70%,transparent);font-size:12px;font-weight:500;transition:background-color .15s ease,color .15s ease}.prompt-bar__tool[data-on],.prompt-bar__pick[data-on]{background:var(--pb-hover);color:var(--pb-ink)}@media(hover:hover)and (pointer:fine){.prompt-bar__tool:hover,.prompt-bar__pick:hover{background:var(--pb-hover);color:var(--pb-ink)}}.prompt-bar__pick[data-max]{color:var(--pb-spark)}.prompt-bar__menu[data-kind=effort]{right:auto;width:248px;padding:12px 14px 14px;transform-origin:bottom left}.prompt-bar__effort-head{display:flex;align-items:center;gap:8px;font-size:13px;line-height:18px}.prompt-bar__effort-title{color:var(--pb-muted)}.prompt-bar__effort-level{font-weight:500}.prompt-bar__effort-help{display:inline-flex;margin-left:auto;color:var(--pb-muted)}.prompt-bar__effort-ends{display:flex;justify-content:space-between;margin-top:12px;color:var(--pb-muted);font-size:12px;line-height:16px}.prompt-bar__effort-track{position:relative;height:22px;margin-top:8px;border-radius:11px;background:var(--pb-hover);cursor:pointer;outline:none;touch-action:none;user-select:none;-webkit-user-select:none}.prompt-bar__effort-fill{position:absolute;top:0;bottom:0;left:0;width:var(--pb-effort-fill);border-radius:11px;background:color-mix(in srgb,var(--pb-ink) 18%,transparent);transition:width .22s var(--pb-ease-out),background-color .3s ease}.prompt-bar__effort-dot{position:absolute;top:50%;width:4px;height:4px;margin:-2px 0 0 -2px;border-radius:50%;background:color-mix(in srgb,var(--pb-ink) 30%,transparent)}.prompt-bar__effort-thumb{position:absolute;top:-3px;left:var(--pb-effort-x);width:14px;height:28px;margin-left:-7px;border-radius:7px;background:var(--pb-ink);box-shadow:0 2px 6px #00000040;transition:left .22s var(--pb-ease-out),background-color .3s ease}.prompt-bar[data-max] .prompt-bar__effort-fill{background:color-mix(in srgb,var(--pb-spark) 35%,transparent)}.prompt-bar[data-max] .prompt-bar__effort-thumb{background:var(--pb-spark)}.prompt-bar__eq{display:flex;align-items:center;gap:2.5px;height:14px}.prompt-bar__eq i{display:block;width:2.5px;height:100%;border-radius:999px;background:currentColor;transform-origin:center;animation:prompt-bar-eq .9s ease-in-out infinite}.prompt-bar__eq i:nth-child(2){animation-delay:.15s}.prompt-bar__eq i:nth-child(3){animation-delay:.3s}@keyframes prompt-bar-eq{0%,to{transform:scaleY(.35)}50%{transform:scaleY(1)}}.prompt-bar__send{position:relative;display:inline-grid;place-items:center;width:28px;height:28px;padding:0;border-radius:8px;background:color-mix(in srgb,var(--pb-ink) 12%,var(--pb-bg));color:color-mix(in srgb,var(--pb-ink) 55%,var(--pb-bg));transition:background-color .2s ease,color .2s ease,transform .16s var(--pb-ease-out)}.prompt-bar__send:disabled{cursor:default}.prompt-bar__send[data-armed]{background:var(--pb-ink);color:var(--pb-bg)}.prompt-bar__send[data-pressed]{transform:scale(var(--pb-press))}.prompt-bar__glyph{display:block;width:16px;height:16px;transform-origin:50% 50%}@media(prefers-reduced-motion:reduce){.prompt-bar__menu,.prompt-bar__chip{animation:none}.prompt-bar__glow{transition:opacity .15s ease}.prompt-bar__effort-fill,.prompt-bar__effort-thumb{transition:background-color .3s ease}.prompt-bar__tool:active,.prompt-bar__send[data-pressed]{transform:none}}.rubber-segment{--rs-track: #27272a;--rs-thumb: #fafafa;--rs-ink: #fafafa;--rs-ink-active: #18181b;--rs-radius: 10px;--rs-inset: 3px;--rs-thumb-radius: 7px;--rs-h: 36px;--rs-font: 13px;--rs-pad: 14px;--rs-min: 44px;--rs-idle: .7;--rs-hover: .9;--rs-ease-out: cubic-bezier(.23, 1, .32, 1);position:relative;display:inline-grid;grid-auto-flow:column;grid-auto-columns:auto;vertical-align:middle;padding:var(--rs-inset);border-radius:var(--rs-radius);background:var(--rs-track);font-family:inherit;touch-action:pan-y;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.rubber-segment[data-equal]{grid-auto-columns:minmax(0,1fr)}.rubber-segment[aria-disabled=true]{opacity:.5;pointer-events:none}.rubber-segment__item{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:calc(var(--rs-h) - var(--rs-inset) * 2);min-width:var(--rs-min);margin:0;padding:0 var(--rs-pad);border:0;border-radius:var(--rs-thumb-radius);background:none;color:var(--rs-ink);opacity:var(--rs-idle);font:inherit;font-size:var(--rs-font);font-weight:500;line-height:1;white-space:nowrap;cursor:pointer;outline:none;transition:opacity .16s ease,transform .16s var(--rs-ease-out)}.rubber-segment__item[aria-checked=true]{cursor:default}.rubber-segment[data-draggable] .rubber-segment__item[aria-checked=true]{cursor:grab}.rubber-segment[data-held],.rubber-segment[data-held] .rubber-segment__item{cursor:grabbing}.rubber-segment__item[data-pressed]{transform:scale(.96)}.rubber-segment__item:focus-visible{outline:2px solid var(--rs-thumb);outline-offset:3px}@media(hover:hover)and (pointer:fine){.rubber-segment__item[aria-checked=false]:hover{opacity:var(--rs-hover)}}.rubber-segment__thumb{position:absolute;inset:var(--rs-inset);display:grid;grid-auto-flow:column;grid-auto-columns:auto;background:var(--rs-thumb);color:var(--rs-ink-active);pointer-events:none}.rubber-segment[data-equal] .rubber-segment__thumb{grid-auto-columns:minmax(0,1fr)}.rubber-segment__copy{color:inherit;opacity:1;cursor:default}@media(prefers-reduced-motion:reduce){.rubber-segment__item{transition:opacity .16s ease}}.status-mark{--sm-size: 20px;--sm-stroke: 2;--sm-color: currentColor;--sm-done: #22c55e;--sm-error: #ef4444;--sm-fill: .06;--sm-font: 14px;--sm-draw: .24s;--sm-strike-delay: .18s;--sm-muted: .55;--sm-check-delay: .12s;--sm-label-o: .65;--sm-ease-out: cubic-bezier(.23, 1, .32, 1);--sm-ease-in-out: cubic-bezier(.77, 0, .175, 1);position:relative;display:inline-flex;align-items:center;gap:calc(var(--sm-size) * .5);vertical-align:middle;line-height:1}.status-mark__glyph{flex:none;overflow:visible;color:var(--sm-color);transition:color .2s ease}.status-mark[data-status=done] .status-mark__glyph{color:var(--sm-done)}.status-mark[data-status=failed] .status-mark__glyph{color:var(--sm-error)}.status-mark__track{fill:currentColor;stroke:currentColor;stroke-width:var(--sm-stroke);fill-opacity:0;stroke-opacity:0;transition:fill-opacity .18s ease,stroke-opacity .2s ease}.status-mark[data-status=running] .status-mark__track{stroke-opacity:.2}.status-mark[data-status=done] .status-mark__track,.status-mark[data-status=failed] .status-mark__track{fill-opacity:var(--sm-fill)}.status-mark__ring{fill:none;stroke:currentColor;stroke-width:var(--sm-stroke);stroke-linecap:round;opacity:var(--sm-muted);transition:opacity .2s ease}.status-mark[data-status=running] .status-mark__ring,.status-mark[data-status=done] .status-mark__ring,.status-mark[data-status=failed] .status-mark__ring{opacity:1}.status-mark__check,.status-mark__cross{fill:none;stroke:currentColor;stroke-width:var(--sm-stroke);stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1 2;stroke-dashoffset:1.05;opacity:0;transition:stroke-dashoffset .16s var(--sm-ease-out),opacity 0ms linear .16s}.status-mark[data-status=done] .status-mark__check,.status-mark[data-status=failed] .status-mark__cross,.status-mark[data-status=cancelled] .status-mark__cross{stroke-dashoffset:0;opacity:1;transition:stroke-dashoffset var(--sm-draw) var(--sm-ease-out) var(--sm-check-delay),opacity 0ms linear var(--sm-check-delay)}.status-mark__label{position:relative;color:var(--sm-color);font-size:var(--sm-font);line-height:1.25;opacity:var(--sm-label-o);transition:opacity .2s ease}.status-mark[data-status=running]{--sm-label-o: 1}.status-mark[data-status=done]{--sm-label-o: .6}.status-mark[data-status=failed]{--sm-label-o: 1}.status-mark[data-status=cancelled]{--sm-label-o: .55}.status-mark__strike{position:absolute;top:50%;right:0;left:0;height:max(1px,calc(var(--sm-font) / 14));background:currentColor;transform:scaleX(0);transform-origin:left center;translate:0 -50%;pointer-events:none;transition:transform .16s var(--sm-ease-out)}.status-mark[data-status=done][data-strike] .status-mark__strike{transform:scaleX(1);transition:transform .28s var(--sm-ease-out) var(--sm-strike-delay)}.status-mark__sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}@keyframes sm-breathe{50%{opacity:.45}}@media(prefers-reduced-motion:reduce){.status-mark[data-indeterminate] .status-mark__ring{animation:sm-breathe 1.4s var(--sm-ease-in-out) infinite}.status-mark__check,.status-mark__cross{stroke-dashoffset:0;transition:opacity .2s ease}.status-mark__strike{opacity:0;transform:scaleX(1)!important;transition:opacity .2s ease}.status-mark[data-status=done][data-strike] .status-mark__strike{opacity:1}}.thought-line{--tl-ease-out: cubic-bezier(.23, 1, .32, 1);--tl-ease-in-out: cubic-bezier(.77, 0, .175, 1);--tl-font: 16px;--tl-color: currentColor;--tl-glyph: currentColor;--tl-settle: .35s;--tl-blur: 2px;--tl-shimmer: 1.8s;--tl-done: .75;--tl-timer: .55;display:inline-flex;flex-direction:column;align-items:flex-start;color:var(--tl-color);font-family:inherit;font-size:var(--tl-font);font-weight:500;line-height:1.2}.thought-line__head{position:relative;display:inline-flex;align-items:center;gap:.3em;margin:0;padding:0;border:0;background:none;color:inherit;font:inherit;text-align:left;white-space:nowrap;outline:none;cursor:default}.thought-line__head[data-toggle]{cursor:pointer;-webkit-tap-highlight-color:transparent}.thought-line__glyph{display:inline-flex;flex:none;width:1.1em;height:1.1em;margin-right:.2em;color:var(--tl-glyph)}.thought-line__glyph svg{display:block;width:100%;height:100%}.thought-line__dot{width:.5em;height:.5em;margin:auto;border-radius:50%;background:currentColor}.thought-line__label{display:inline-grid}.thought-line__text{grid-area:1 / 1;width:max-content;opacity:0;filter:blur(var(--tl-blur));transition:opacity var(--tl-settle) var(--tl-ease-out),filter var(--tl-settle) var(--tl-ease-out)}.thought-line__text[data-active]{opacity:1;filter:blur(0)}.thought-line__text--done[data-active]{opacity:var(--tl-done)}.thought-line__breath{display:inline-block}.thought-line[data-working] .thought-line__breath[data-shimmer]{background:linear-gradient(100deg,color-mix(in srgb,var(--tl-color) 50%,transparent) 30%,var(--tl-color) 50%,color-mix(in srgb,var(--tl-color) 50%,transparent) 70%);background-size:250% 100%;background-position:125% 0;-webkit-background-clip:text;background-clip:text;color:transparent;-webkit-text-fill-color:transparent;animation:thought-line-shimmer var(--tl-shimmer) linear infinite}@keyframes thought-line-shimmer{to{background-position:-125% 0}}.thought-line__timer{font-variant-numeric:tabular-nums;opacity:var(--tl-timer);transition:opacity var(--tl-settle) ease,transform var(--tl-settle) var(--tl-ease-in-out)}.thought-line__timer[data-done]{opacity:var(--tl-done)}.thought-line__chevron{display:inline-flex;margin-left:.1em;opacity:0;transition:opacity .2s ease,transform .2s var(--tl-ease-out)}.thought-line__chevron[data-on]{opacity:.55}.thought-line[data-open] .thought-line__chevron{transform:rotate(180deg)}.thought-line__sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.thought-line__trace{display:grid;grid-template-rows:0fr;width:0;min-width:100%;transition:grid-template-rows var(--tl-settle) var(--tl-ease-out)}.thought-line__trace[data-open]{grid-template-rows:1fr}.thought-line__fold{min-height:0;overflow-x:visible;overflow-y:clip}.thought-line__steps{display:flex;flex-direction:column;gap:.45em;width:max-content;padding:.6em 0 .2em 1.6em;font-size:.875em;font-weight:400;white-space:nowrap}.thought-line__step{display:flex;align-items:center;gap:.5em;opacity:1;transform:translateY(0);transition:opacity .2s var(--tl-ease-out),transform .2s var(--tl-ease-out)}@starting-style{.thought-line__step{opacity:0;transform:translateY(-4px)}}.thought-line__mark{display:inline-grid;flex:none;place-items:center;width:1em;height:1em;opacity:.55}.thought-line__pulse{display:block;width:.4em;height:.4em;border-radius:50%;background:currentColor;animation:thought-line-pulse 1.6s var(--tl-ease-in-out) infinite}@keyframes thought-line-pulse{0%,to{opacity:.55}50%{opacity:1}}.thought-line__step-text{transition:opacity var(--tl-settle) ease}.thought-line__step[data-done] .thought-line__step-text{opacity:.55}@media(prefers-reduced-motion:reduce){.thought-line__text{filter:none!important;transition:opacity var(--tl-settle) ease}.thought-line__timer{transition:opacity var(--tl-settle) ease}.thought-line__step{transform:none!important;transition:opacity .2s ease}.thought-line__pulse{animation-duration:2.4s}}:root{color-scheme:dark;--bg: #18181b;--panel: #232327;--line: #2f2f35;--ink: #f4f4f5;--muted: #a1a1aa;--accent: #b39dff;--danger: #f87171;--warn: #fbbf24}*{box-sizing:border-box}html,body,#root{height:100%;margin:0}body{background:var(--bg);color:var(--ink);font:14px/1.55 Inter,ui-sans-serif,system-ui,-apple-system,Segoe UI,sans-serif}.app{display:flex;flex-direction:column;height:100%;max-width:1280px;margin:0 auto;padding:0 clamp(16px,3vw,40px)}.app--empty{align-items:center;justify-content:center;color:var(--muted)}.app__header{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;padding:16px 0;border-bottom:1px solid var(--line)}.app__title{font-size:18px;font-weight:700;letter-spacing:.02em;color:var(--accent)}.app__meta{color:var(--muted);font-size:12px}.app__controls{display:flex;align-items:center;gap:10px;flex-wrap:wrap}.app__context{color:var(--muted);font-size:12px;font-variant-numeric:tabular-nums}.app__context[data-warn]{color:var(--warn)}.app__plan{display:flex;gap:10px;font:inherit;font-size:12px;font-variant-numeric:tabular-nums;color:var(--muted);background:none;border:0;padding:0;cursor:pointer}.app__plan span[data-warn]{color:var(--warn);font-weight:600}.app__new{font:inherit;font-size:13px;color:var(--ink);background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:5px 10px;cursor:pointer}.app__new:disabled{opacity:.5;cursor:default}.app__turns{flex:1;overflow-y:auto;padding:20px 0;display:flex;flex-direction:column;gap:28px}.app__hint{color:var(--muted);max-width:560px;margin:15vh auto 0;text-align:center}.app__composer{display:flex;flex-direction:column;align-items:center;gap:8px;padding:12px 0 20px}.app__composer>div{width:100%}.app__attachments{display:flex;gap:8px;flex-wrap:wrap}.app__attachment{position:relative;padding:0;border:1px solid var(--line);border-radius:8px;background:none;cursor:pointer}.app__attachment img{display:block;height:64px;border-radius:8px}.app__attachment span{position:absolute;top:2px;right:4px;color:var(--ink);text-shadow:0 0 3px #000}.turn{display:flex;flex-direction:column;gap:10px}.turn__prompt{align-self:flex-end;max-width:85%;background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:8px 14px;white-space:pre-wrap;overflow-wrap:anywhere}.turn__text{overflow-wrap:anywhere}.turn__text>:first-child{margin-top:0}.turn__text>:last-child{margin-bottom:0}.turn__text p,.turn__text ul,.turn__text ol{margin:0 0 8px}.turn__text a{color:var(--accent)}.turn__text code{font:12.5px ui-monospace,JetBrains Mono,monospace;background:var(--panel);border-radius:4px;padding:1px 4px}.turn__text pre{background:#111113;border:1px solid var(--line);border-radius:10px;padding:10px 12px;overflow:auto}.turn__text pre code{background:none;padding:0}.turn__text table{border-collapse:collapse;margin:0 0 8px}.turn__text th,.turn__text td{border:1px solid var(--line);padding:4px 8px;text-align:left}.turn__tool{display:flex;gap:10px;align-items:flex-start;font-size:13px}.turn__target{color:var(--muted);font-family:ui-monospace,JetBrains Mono,monospace;overflow-wrap:anywhere}.turn__detail{color:var(--muted);font-size:12px}.turn__detail--error{color:var(--danger)}.turn__log{margin:0;max-height:420px;overflow:auto;background:#111113;border:1px solid var(--line);border-radius:10px;padding:10px 12px;font:12px/1.5 ui-monospace,JetBrains Mono,monospace;white-space:pre-wrap}.turn__warning,.turn__error{border-radius:10px;padding:8px 12px;font-size:13px}.turn__warning{background:#fbbf2414;color:var(--warn)}.turn__error{background:#f8717114;color:var(--danger);white-space:pre-wrap}.turn__footer{display:flex;align-items:center;gap:14px;flex-wrap:wrap;color:var(--muted)}.turn__usage{font-size:12px}.turn__images{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:6px}.turn__images img{max-height:120px;border-radius:8px}.ask{border:1px solid var(--line);background:var(--panel);border-radius:12px;padding:12px 14px;display:flex;flex-direction:column;gap:10px}.ask--done{padding:6px 12px;color:var(--muted);font-size:12px}.ask__title{font-weight:600}.ask__reason{color:var(--warn);font-size:12px}.ask__code{margin:0;max-height:300px;overflow:auto;background:#111113;border-radius:8px;padding:8px 10px;font:12px/1.5 ui-monospace,JetBrains Mono,monospace;white-space:pre-wrap}.ask__del{color:var(--danger)}.ask__add{color:#4ade80}.ask__plan{max-height:420px;overflow:auto}.ask__actions{display:flex;gap:8px;flex-wrap:wrap}.ask__actions button,.ask__option{font:inherit;color:var(--ink);background:#2c2c31;border:1px solid var(--line);border-radius:8px;padding:6px 12px;cursor:pointer}.ask__actions button:disabled{opacity:.5;cursor:default}.ask__actions .ask__primary{background:var(--ink);color:var(--bg);border-color:var(--ink)}.ask__question,.ask__options{display:flex;flex-direction:column;gap:6px}.ask__option{display:flex;flex-direction:column;align-items:flex-start;text-align:left}.ask__option span{color:var(--muted);font-size:12px}.ask__option[data-on]{border-color:var(--accent);background:#b39dff1f}.ask__other{font:inherit;color:var(--ink);background:#111113;border:1px solid var(--line);border-radius:8px;padding:6px 10px}.usage{width:min(860px,calc(100vw - 32px));max-height:calc(100vh - 64px);overflow:auto;color:var(--ink);background:var(--bg);border:1px solid var(--line);border-radius:14px;padding:18px 20px}.usage::backdrop{background:#0000008c}.usage h3{font-size:13px;color:var(--muted);text-transform:uppercase;letter-spacing:.04em;margin:18px 0 10px}.usage__head{display:flex;align-items:center;justify-content:space-between;gap:12px}.usage__limit{margin-bottom:14px}.usage__row{display:flex;justify-content:space-between;gap:12px}.usage__bar{height:8px;border-radius:4px;background:var(--panel);overflow:hidden;margin:6px 0 4px}.usage__bar>div{height:100%;background:var(--accent)}.usage__bar>div[data-warn]{background:var(--warn)}.usage__row b[data-warn]{color:var(--warn)}.usage__note{color:var(--muted);font-size:12px;margin:0}.usage__table{width:100%;border-collapse:collapse;font-size:13px;font-variant-numeric:tabular-nums;margin-bottom:12px}.usage__table th,.usage__table td{border-bottom:1px solid var(--line);padding:6px 8px;text-align:right;white-space:nowrap}.usage__table th:first-child,.usage__table td:first-child{text-align:left}.usage__table th{color:var(--muted);font-weight:500}.usage__tag{margin-left:6px;font-size:11px;color:var(--muted);border:1px solid var(--line);border-radius:6px;padding:0 5px}