manifest 5.15.0 → 5.15.2

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.
@@ -177,12 +177,17 @@ let PricingSyncService = PricingSyncService_1 = class PricingSyncService {
177
177
  };
178
178
  const contextWindow = model.context_length;
179
179
  await this.pricingHistory.recordChange(existing, incoming, 'sync');
180
- await this.pricingRepo.upsert({
181
- ...incoming,
182
- ...(contextWindow != null && { context_window: contextWindow }),
183
- updated_at: now,
184
- }, ['model_name']);
185
- updated++;
180
+ let upserted = false;
181
+ if (existing) {
182
+ await this.pricingRepo.upsert({
183
+ model_name: canonical,
184
+ input_price_per_token: prompt,
185
+ output_price_per_token: completion,
186
+ ...(contextWindow != null && { context_window: contextWindow }),
187
+ updated_at: now,
188
+ }, ['model_name']);
189
+ upserted = true;
190
+ }
186
191
  const hasVendorPrefix = model.id.includes('/') && !model.id.startsWith('openrouter/');
187
192
  if (hasVendorPrefix) {
188
193
  try {
@@ -194,11 +199,14 @@ let PricingSyncService = PricingSyncService_1 = class PricingSyncService {
194
199
  ...(contextWindow != null && { context_window: contextWindow }),
195
200
  updated_at: now,
196
201
  }, ['model_name']);
202
+ upserted = true;
197
203
  }
198
204
  catch (copyErr) {
199
205
  this.logger.warn(`Failed to store OpenRouter copy for ${model.id}: ${copyErr instanceof Error ? copyErr.message : copyErr}`);
200
206
  }
201
207
  }
208
+ if (upserted)
209
+ updated++;
202
210
  }
203
211
  catch (err) {
204
212
  failed++;
@@ -1 +1 @@
1
- {"version":3,"file":"pricing-sync.service.js","sourceRoot":"","sources":["../../src/database/pricing-sync.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pricing-sync.service.js","sourceRoot":"","sources":["../../src/database/pricing-sync.service.ts"],"names":[],"mappings":"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"}
@@ -75,6 +75,9 @@ let ProxyService = ProxyService_1 = class ProxyService {
75
75
  ? await this.resolveService.resolveForTier(userId, 'simple')
76
76
  : await this.resolveService.resolve(userId, scoringMessages, undefined, undefined, body.max_tokens, recentTiers);
77
77
  if (!resolved.model || !resolved.provider) {
78
+ this.logger.warn(`No model available for user=${userId}: ` +
79
+ `tier=${resolved.tier} model=${resolved.model} provider=${resolved.provider} ` +
80
+ `confidence=${resolved.confidence} reason=${resolved.reason}`);
78
81
  throw new common_1.BadRequestException('No model available. Connect a provider in the Manifest dashboard.');
79
82
  }
80
83
  const apiKey = await this.routingService.getProviderApiKey(userId, resolved.provider);
@@ -1 +1 @@
1
- {"version":3,"file":"proxy.service.js","sourceRoot":"","sources":["../../../src/routing/proxy/proxy.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAwF;AACxF,wDAAoD;AACpD,wDAAoD;AACpD,uDAAkE;AAClE,yEAAoE;AACpE,0FAAqF;AASrF,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;AAChE,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAgB5B,IAAM,YAAY,oBAAlB,MAAM,YAAY;IAIJ;IACA;IACA;IACA;IACA;IAPF,MAAM,GAAG,IAAI,eAAM,CAAC,cAAY,CAAC,IAAI,CAAC,CAAC;IAExD,YACmB,cAA8B,EAC9B,cAA8B,EAC9B,cAA8B,EAC9B,QAAgC,EAChC,UAA6B;QAJ7B,mBAAc,GAAd,cAAc,CAAgB;QAC9B,mBAAc,GAAd,cAAc,CAAgB;QAC9B,mBAAc,GAAd,cAAc,CAAgB;QAC9B,aAAQ,GAAR,QAAQ,CAAwB;QAChC,eAAU,GAAV,UAAU,CAAmB;IAC7C,CAAC;IAEJ,KAAK,CAAC,YAAY,CAChB,MAAc,EACd,IAA6B,EAC7B,UAAkB,EAClB,QAAiB,EACjB,SAAkB,EAClB,MAAoB;QAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnE,MAAM,IAAI,4BAAmB,CAAC,4BAA4B,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,QAAQ,IAAI,SAAS,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YACxE,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,KAAK,MAAM;oBACxC,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;oBAClC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;gBACrC,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,KAAK,MAAM;oBAC9C,CAAC,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;oBACrC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,cAAc,EAAE,CAAC;gBACxC,MAAM,IAAI,sBAAa,CAAC;oBACtB,KAAK,EAAE;wBACL,OAAO,EAAE,mBAAmB,QAAQ,CAAC,UAAU,WAAW,GAAG,aAAa,SAAS,QAAQ,QAAQ,CAAC,MAAM,EAAE;wBAC5G,IAAI,EAAE,qBAAqB;wBAC3B,IAAI,EAAE,gBAAgB;qBACvB;iBACF,EAAE,GAAG,CAAC,CAAC;YACV,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC;QAKpC,MAAM,eAAe,GAAI,QAA4B;aAClD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,sBAAsB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;aAClD,KAAK,CAAC,CAAC,uBAAuB,CAAC,CAAC;QAOnC,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YAC7C,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;gBAAE,OAAO,KAAK,CAAC;YACpC,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ;gBAAE,OAAO,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;YAC7E,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,CACnB,CAAC,CAAmC,EAAE,EAAE,CACtC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CACrF,CAAC;YACJ,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QAKH,MAAM,QAAQ,GAAG,WAAW;YAC1B,CAAC,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC;YAC5D,CAAC,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC/B,MAAM,EACN,eAAe,EACf,SAAS,EACT,SAAS,EACT,IAAI,CAAC,UAAgC,EACrC,WAAW,CACZ,CAAC;QAEN,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;YAC1C,MAAM,IAAI,4BAAmB,CAC3B,mEAAmE,CACpE,CAAC;QACJ,CAAC;QAGD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,iBAAiB,CACxD,MAAM,EACN,QAAQ,CAAC,QAAQ,CAClB,CAAC;QACF,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,MAAM,IAAI,4BAAmB,CAC3B,kCAAkC,QAAQ,CAAC,QAAQ,4CAA4C,CAChG,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,eAAe,QAAQ,CAAC,IAAI,UAAU,QAAQ,CAAC,KAAK,aAAa,QAAQ,CAAC,QAAQ,eAAe,QAAQ,CAAC,UAAU,EAAE,CACvH,CAAC;QAGF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC/C,QAAQ,CAAC,QAAQ,EACjB,MAAM,EACN,QAAQ,CAAC,KAAK,EACd,IAAI,EACJ,MAAM,EACN,MAAM,CACP,CAAC;QAGF,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAY,CAAC,CAAC;QAE5D,OAAO;YACL,OAAO;YACP,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ,CAAC,IAAY;gBAC3B,KAAK,EAAE,QAAQ,CAAC,KAAK;gBACrB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,MAAM,EAAE,QAAQ,CAAC,MAAM;aACxB;SACF,CAAC;IACJ,CAAC;CACF,CAAA;AAjIY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,mBAAU,GAAE;qCAKwB,gCAAc;QACd,gCAAc;QACd,gCAAc;QACpB,iDAAsB;QACpB,uCAAiB;GARrC,YAAY,CAiIxB"}
1
+ {"version":3,"file":"proxy.service.js","sourceRoot":"","sources":["../../../src/routing/proxy/proxy.service.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ import { ResolveResponse } from './dto/resolve-response';
6
6
  export declare class ResolveService {
7
7
  private readonly routingService;
8
8
  private readonly pricingCache;
9
+ private readonly logger;
9
10
  constructor(routingService: RoutingService, pricingCache: ModelPricingCacheService);
10
11
  resolve(userId: string, messages: ScorerInput['messages'], tools?: ScorerInput['tools'], toolChoice?: unknown, maxTokens?: number, recentTiers?: MomentumInput['recentTiers']): Promise<ResolveResponse>;
11
12
  resolveForTier(userId: string, tier: Tier): Promise<ResolveResponse>;
@@ -8,15 +8,17 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
8
8
  var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
10
  };
11
+ var ResolveService_1;
11
12
  Object.defineProperty(exports, "__esModule", { value: true });
12
13
  exports.ResolveService = void 0;
13
14
  const common_1 = require("@nestjs/common");
14
15
  const routing_service_1 = require("./routing.service");
15
16
  const model_pricing_cache_service_1 = require("../model-prices/model-pricing-cache.service");
16
17
  const scorer_1 = require("./scorer");
17
- let ResolveService = class ResolveService {
18
+ let ResolveService = ResolveService_1 = class ResolveService {
18
19
  routingService;
19
20
  pricingCache;
21
+ logger = new common_1.Logger(ResolveService_1.name);
20
22
  constructor(routingService, pricingCache) {
21
23
  this.routingService = routingService;
22
24
  this.pricingCache = pricingCache;
@@ -28,6 +30,8 @@ let ResolveService = class ResolveService {
28
30
  const tiers = await this.routingService.getTiers(userId);
29
31
  const assignment = tiers.find((t) => t.tier === result.tier);
30
32
  if (!assignment) {
33
+ this.logger.warn(`No tier assignment found for user=${userId} tier=${result.tier} ` +
34
+ `(available tiers: ${tiers.map((t) => t.tier).join(', ') || 'none'})`);
31
35
  return {
32
36
  tier: result.tier,
33
37
  model: null,
@@ -39,6 +43,8 @@ let ResolveService = class ResolveService {
39
43
  }
40
44
  const model = await this.routingService.getEffectiveModel(userId, assignment);
41
45
  if (!model) {
46
+ this.logger.warn(`getEffectiveModel returned null for user=${userId} tier=${result.tier} ` +
47
+ `override=${assignment.override_model} auto=${assignment.auto_assigned_model}`);
42
48
  return {
43
49
  tier: result.tier,
44
50
  model: null,
@@ -49,6 +55,10 @@ let ResolveService = class ResolveService {
49
55
  };
50
56
  }
51
57
  const pricing = this.pricingCache.getByModel(model);
58
+ if (!pricing) {
59
+ this.logger.warn(`Pricing cache miss for model=${model} (user=${userId} tier=${result.tier}). ` +
60
+ `Provider will be null.`);
61
+ }
52
62
  return {
53
63
  tier: result.tier,
54
64
  model,
@@ -77,7 +87,7 @@ let ResolveService = class ResolveService {
77
87
  }
78
88
  };
79
89
  exports.ResolveService = ResolveService;
80
- exports.ResolveService = ResolveService = __decorate([
90
+ exports.ResolveService = ResolveService = ResolveService_1 = __decorate([
81
91
  (0, common_1.Injectable)(),
82
92
  __metadata("design:paramtypes", [routing_service_1.RoutingService,
83
93
  model_pricing_cache_service_1.ModelPricingCacheService])
@@ -1 +1 @@
1
- {"version":3,"file":"resolve.service.js","sourceRoot":"","sources":["../../src/routing/resolve.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resolve.service.js","sourceRoot":"","sources":["../../src/routing/resolve.service.ts"],"names":[],"mappings":"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"}
@@ -240,6 +240,12 @@ let RoutingService = RoutingService_1 = class RoutingService {
240
240
  if (match)
241
241
  return assignment.override_model;
242
242
  }
243
+ this.logger.warn(`Override ${assignment.override_model} falling through to auto ` +
244
+ `for user=${userId} tier=${assignment.tier} ` +
245
+ `(auto=${assignment.auto_assigned_model})`);
246
+ }
247
+ if (assignment.auto_assigned_model === null) {
248
+ this.logger.warn(`auto_assigned_model is null for user=${userId} tier=${assignment.tier}`);
243
249
  }
244
250
  return assignment.auto_assigned_model;
245
251
  }
@@ -1 +1 @@
1
- {"version":3,"file":"routing.service.js","sourceRoot":"","sources":["../../src/routing/routing.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"routing.service.js","sourceRoot":"","sources":["../../src/routing/routing.service.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -17,13 +17,13 @@ To resolve the conflict:`,(0,si.getConflictResolutionRecipe)(u,r))),c=a):sg.diag
17
17
  openclaw config set plugins.entries.manifest.config.endpoint https://app.manifest.build/otlp`:`Invalid apiKey format. Keys must start with '${be}'. Fix it via:
18
18
  openclaw config set manifest.apiKey ${be}YOUR_KEY`:`Missing apiKey. Set it via:
19
19
  openclaw config set manifest.apiKey ${be}YOUR_KEY
20
- or export MANIFEST_API_KEY=${be}YOUR_KEY`}var ca=me(AM()),la=me(Ni()),WI=me(GI()),zI=me(qI()),JI=me(Po());m();var en=null,tn=null,xc=null,bc=null;function rn(o,r){let i=new JI.Resource({"service.name":fr.SERVICE_NAME,"service.version":"5.15.0","manifest.plugin":"true"}),c=o.apiKey?{Authorization:`Bearer ${o.apiKey}`}:{},a=new WI.OTLPTraceExporter({url:`${o.endpoint}/v1/traces`,headers:c});en=new ca.BasicTracerProvider({resource:i,spanProcessors:[new ca.BatchSpanProcessor(a,{scheduledDelayMillis:5e3,maxQueueSize:2048,maxExportBatchSize:512})]}),en.register(),r.debug(`[manifest] Trace exporter -> ${o.endpoint}/v1/traces`);let u=new zI.OTLPMetricExporter({url:`${o.endpoint}/v1/metrics`,headers:c}),t=o.mode==="dev"?kc.METRICS_INTERVAL_MS:o.mode==="local"?Hc.METRICS_INTERVAL_MS:fr.METRICS_INTERVAL_MS;return tn=new la.MeterProvider({resource:i,readers:[new la.PeriodicExportingMetricReader({exporter:u,exportIntervalMillis:t})]}),It.setGlobalMeterProvider(tn),r.debug(`[manifest] Metrics exporter -> ${o.endpoint}/v1/metrics (interval=${t}ms)`),xc=Ke.getTracer("manifest-plugin","5.15.0"),bc=It.getMeter("manifest-plugin","5.15.0"),{tracer:xc,meter:bc}}async function nn(o){o.info("[manifest] Shutting down telemetry..."),en&&(await en.shutdown(),en=null),tn&&(await tn.shutdown(),tn=null),xc=null,bc=null,o.info("[manifest] Telemetry shut down")}m();var G5=5,$I=30*60*1e3,H5=3e3,k5=5*60*1e3,Y5=new Set(["system","developer"]),F5=10,on=new Map,XI=!1;function K5(){if(XI)return;XI=!0;let o=setInterval(()=>{let r=Date.now();for(let[i,c]of on)r-c.lastUpdated>$I&&on.delete(i)},k5);typeof o=="object"&&"unref"in o&&o.unref()}async function QI(o,r,i,c){K5();let u=`${o.endpoint.replace(/\/otlp(\/v1)?\/?$/,"")}/api/v1/routing/resolve`;try{if(!r||!Array.isArray(r)||r.length===0)return c.debug("[manifest] Routing resolve: no messages, skipping"),null;let t=r.filter(I=>I&&typeof I=="object"&&"role"in I&&!Y5.has(I.role)).slice(-F5).map(I=>({role:I.role,content:I.content}));if(t.length===0)return c.debug("[manifest] Routing resolve: no scorable messages, skipping"),null;let e=on.get(i),n=e&&Date.now()-e.lastUpdated<$I?e.tiers:void 0,s={messages:t};n&&(s.recentTiers=n);let l={"Content-Type":"application/json"};o.apiKey&&(l.Authorization=`Bearer ${o.apiKey}`);let E=await fetch(u,{method:"POST",headers:l,body:JSON.stringify(s),signal:AbortSignal.timeout(H5)});if(!E.ok)return c.debug(`[manifest] Routing resolve returned ${E.status}`),null;let A=await E.json();if(!A.model)return c.debug(`[manifest] Routing resolve: no model for tier=${A.tier}`),null;let y=on.get(i);return y?(y.tiers=[A.tier,...y.tiers].slice(0,G5),y.lastUpdated=Date.now()):on.set(i,{tiers:[A.tier],lastUpdated:Date.now()}),c.debug(`[manifest] Routing resolved: tier=${A.tier} model=${A.model} provider=${A.provider}`),{tier:A.tier,model:A.model,provider:A.provider??"unknown",reason:A.reason??""}}catch(t){let e=t instanceof Error?t.message:String(t);return c.debug(`[manifest] Routing resolve failed (${e})`),null}}function an(o,r,i){if(typeof o.registerProvider!="function"){i.debug("[manifest] registerProvider not available, skipping provider registration");return}let c=r.endpoint.replace(/\/otlp(\/v1)?\/?$/,"");try{o.registerProvider({id:"manifest",name:"Manifest Router",api:"openai-completions",baseUrl:c,apiKey:r.apiKey,models:["auto"]}),i.info("[manifest] Registered as OpenAI-compatible provider (proxy mode)")}catch(a){let u=a instanceof Error?a.message:String(a);i.debug(`[manifest] registerProvider failed (${u})`)}}var Sr=new Map,ZI,eC,tC,rC,j5,nC,oC,iC,aC;function un(o){ZI=o.createCounter(he.LLM_REQUESTS,{description:"Total LLM inference requests"}),eC=o.createCounter(he.LLM_TOKENS_INPUT,{description:"Total input tokens sent to LLM"}),tC=o.createCounter(he.LLM_TOKENS_OUTPUT,{description:"Total output tokens from LLM"}),rC=o.createCounter(he.LLM_TOKENS_CACHE_READ,{description:"Total cache-read tokens"}),j5=o.createHistogram(he.LLM_DURATION,{description:"LLM request duration in ms",unit:"ms"}),nC=o.createCounter(he.TOOL_CALLS,{description:"Total tool invocations"}),oC=o.createCounter(he.TOOL_ERRORS,{description:"Total tool errors"}),iC=o.createHistogram(he.TOOL_DURATION,{description:"Tool execution duration in ms",unit:"ms"}),aC=o.createCounter(he.MESSAGES_RECEIVED,{description:"Total messages received from users"})}function sn(o,r,i,c){o.on("message_received",a=>{let u=a.sessionKey||a.session?.key||`agent:${a.agent||"main"}:main`,t=a.channel||"unknown",e=r.startSpan(En.REQUEST,{kind:Ye.SERVER,attributes:{[b.SESSION_KEY]:u,[b.CHANNEL]:t}});Sr.set(u,{root:e}),aC.add(1,{[b.CHANNEL]:t}),c.debug(`[manifest] Root span started for session=${u}`)}),o.on("before_agent_start",a=>{let u=a.sessionKey||a.session?.key||`agent:${a.agent||"main"}:main`,t=a.agent||"main",e=Sr.get(u),n=e?.root?Ke.setSpan(Fe.active(),e.root):Fe.active(),s=r.startSpan(En.AGENT_TURN,{kind:Ye.INTERNAL,attributes:{[b.AGENT_NAME]:t,[b.SESSION_KEY]:u}},n);e?e.turn=s:Sr.set(u,{root:s,turn:s}),c.debug(`[manifest] Agent turn started: agent=${t}, session=${u}`)}),o.on("tool_result_persist",a=>{let u=a.toolName||a.tool||"unknown",t=a.durationMs||0,e=a.error==null,n=a.sessionKey||"unknown",s=Sr.get(n),l=s?.turn?Ke.setSpan(Fe.active(),s.turn):Fe.active(),E=r.startSpan(`${En.TOOL_PREFIX}${u}`,{kind:Ye.INTERNAL,attributes:{[b.TOOL_NAME]:u,[b.TOOL_SUCCESS]:String(e),[b.SESSION_KEY]:n}},l);e||(E.setStatus({code:ut.ERROR,message:a.error?.message||"Tool execution failed"}),oC.add(1,{[b.TOOL_NAME]:u})),E.end(),nC.add(1,{[b.TOOL_NAME]:u}),iC.record(t,{[b.TOOL_NAME]:u})}),o.on("agent_end",async a=>{let u=a.sessionKey||a.session?.key||`agent:${a.agent||"main"}:main`,t=a.messages||[],e=[...t].reverse().find(Y=>Y.role==="assistant"&&Y.usage),n=e?.model||a.model||"unknown",s=e?.provider||a.provider||"unknown",l=e?.usage||a.usage||{},E=l.input||l.inputTokens||0,A=l.output||l.outputTokens||0,y=l.cacheRead||l.cacheReadTokens||0,I=l.cacheWrite||l.cacheWriteTokens||0,Ce=n,Ge=s,yt=null,nt=null;if(Ce==="auto"&&i.mode!=="cloud"){let Y=await QI(i,t,u,c);Y&&(Ce=Y.model,Ge=Y.provider,yt=Y.tier,nt=Y.reason||null)}t.some(Y=>!Y||Y.role!=="user"?!1:typeof Y.content=="string"?Y.content.includes("HEARTBEAT_OK"):Array.isArray(Y.content)?Y.content.some(_a=>_a.type==="text"&&typeof _a.text=="string"&&_a.text.includes("HEARTBEAT_OK")):!1)&&(nt="heartbeat",yt="simple");let Te=Sr.get(u);if(Te?.turn){if(Te.turn.setAttributes({[b.MODEL]:Ce,[b.PROVIDER]:Ge,[b.INPUT_TOKENS]:E,[b.OUTPUT_TOKENS]:A,[b.CACHE_READ_TOKENS]:y,[b.CACHE_WRITE_TOKENS]:I}),yt&&Te.turn.setAttribute(b.ROUTING_TIER,yt),nt&&Te.turn.setAttribute(b.ROUTING_REASON,nt),a.success===!1){let Y=a.error?.message||a.errorMessage||"Agent turn failed";Te.turn.setStatus({code:ut.ERROR,message:typeof Y=="string"?Y.slice(0,500):String(Y)})}Te.turn.end()}Te?.root&&Te.root!==Te.turn&&Te.root.end(),Sr.delete(u);let xe={[b.MODEL]:Ce,[b.PROVIDER]:Ge};ZI.add(1,xe),eC.add(E,xe),tC.add(A,xe),y>0&&rC.add(y,xe),c.debug(`[manifest] agent_end tokens: in=${E}, out=${A}, cache=${y}`),c.debug(`[manifest] Trace completed for session=${u}`)}),c.debug("[manifest] All hooks registered")}async function cn(o){let r=o.endpoint.replace(/\/otlp(\/v1)?\/?$/,""),i={endpointReachable:!1,authValid:!1,agentName:null,error:null};try{let c=await fetch(`${r}/api/v1/health`,{signal:AbortSignal.timeout(5e3)});if(!c.ok)return i.error=`Health endpoint returned ${c.status}`,i;i.endpointReachable=!0}catch(c){let a=c instanceof Error?c.message:String(c);return i.error=`Cannot reach endpoint: ${a}`,i}try{let c=o.apiKey?{Authorization:`Bearer ${o.apiKey}`}:{},a=await fetch(`${r}/api/v1/agent/usage?range=24h`,{headers:c,signal:AbortSignal.timeout(5e3)});if(a.status===401||a.status===403)return i.error="API key rejected \u2014 check your mnfst_ key is correct",i;if(!a.ok)return i.error=`Usage endpoint returned ${a.status}`,i;i.authValid=!0;let u=await a.json();u&&typeof u.agentName=="string"&&(i.agentName=u.agentName)}catch(c){let a=c instanceof Error?c.message:String(c);return i.error=`Auth check failed: ${a}`,i}return i}var uC={today:"24h",week:"7d",month:"30d"};async function sC(o,r,i,c){let a=`${o}${r}`;try{let u=i?{Authorization:`Bearer ${i}`}:{},t=await fetch(a,{headers:u});return t.ok?{result:await t.json()}:{error:`API returned ${t.status}`}}catch(u){let t=u instanceof Error?u.message:String(u);return c.error(`[manifest] API call failed: ${t}`),{error:t}}}function ln(o,r,i){let c=r.endpoint.replace(/\/otlp(\/v1)?\/?$/,"");o.registerTool({name:"manifest_usage",description:"Get token consumption for this agent: total, input, output, cache-read tokens, and action count. Use when the user asks about token usage or consumption.",parameters:{type:"object",properties:{period:{type:"string",enum:["today","week","month"],default:"today",description:"Time period"}}},handler:async a=>{let u=uC[a.period||"today"]||"24h";return sC(c,`/api/v1/agent/usage?range=${u}`,r.apiKey,i)}}),o.registerTool({name:"manifest_costs",description:"Get cost breakdown for this agent in USD, grouped by model. Use when the user asks about costs, spending, or money burned.",parameters:{type:"object",properties:{period:{type:"string",enum:["today","week","month"],default:"week",description:"Time period"}}},handler:async a=>{let u=uC[a.period||"week"]||"7d";return sC(c,`/api/v1/agent/costs?range=${u}`,r.apiKey,i)}}),o.registerTool({name:"manifest_health",description:"Check whether Manifest observability is connected and working. Use when the user asks if monitoring is set up or wants a connectivity test.",parameters:{type:"object",properties:{}},handler:async()=>{let a=await cn(r);return a.error?{error:a.error}:{result:{endpointReachable:a.endpointReachable,authValid:a.authValid,agentName:a.agentName,status:"ok"}}}}),i.debug("[manifest] Registered agent tools: manifest_usage, manifest_costs, manifest_health")}var V=require("fs"),Oe=require("path"),Uc=require("os"),lC=require("crypto");var pa=(0,Oe.join)((0,Uc.homedir)(),".openclaw","manifest"),pn=(0,Oe.join)(pa,"config.json"),pC=(0,Oe.join)((0,Uc.homedir)(),".openclaw"),cC=(0,Oe.join)(pC,"openclaw.json"),q5=3e3;function W5(){(0,V.existsSync)(pa)||(0,V.mkdirSync)(pa,{recursive:!0,mode:448})}function z5(){if(W5(),(0,V.existsSync)(pn))try{let i=JSON.parse((0,V.readFileSync)(pn,"utf-8"));if(i.apiKey&&i.apiKey.startsWith(be))return i.apiKey}catch{}let o=`${be}local_${(0,lC.randomBytes)(24).toString("hex")}`,r={};if((0,V.existsSync)(pn))try{r=JSON.parse((0,V.readFileSync)(pn,"utf-8"))}catch{}return(0,V.writeFileSync)(pn,JSON.stringify({...r,apiKey:o},null,2),{mode:384}),o}function _C(o){if(!(0,V.existsSync)(o))return{};try{return JSON.parse((0,V.readFileSync)(o,"utf-8"))}catch{return{}}}function EC(o,r){let i=(0,Oe.dirname)(o);(0,V.existsSync)(i)||(0,V.mkdirSync)(i,{recursive:!0,mode:448});let c=`${o}.tmp.${process.pid}`;(0,V.writeFileSync)(c,JSON.stringify(r,null,2),{mode:384}),(0,V.renameSync)(c,o)}function Dc(o,r,i,c,a){let t={baseUrl:`http://${r}:${i}/v1`,api:"openai-completions",apiKey:c,models:[{id:"auto",name:"auto"}]};try{let e=_C(cC);e.models||(e.models={}),e.models.providers||(e.models.providers={}),e.models.providers.manifest=t,e.agents||(e.agents={}),e.agents.defaults||(e.agents.defaults={}),e.agents.defaults.models||(e.agents.defaults.models={});let n=e.agents.defaults.models;Array.isArray(n)?n.includes("manifest/auto")||n.push("manifest/auto"):typeof n=="object"&&("manifest/auto"in n||(n["manifest/auto"]={})),EC(cC,e),a.debug("[manifest] Wrote provider config to openclaw.json")}catch(e){let n=e instanceof Error?e.message:String(e);a.debug(`[manifest] Could not write openclaw.json: ${n}`)}try{if(o.config){o.config.models||(o.config.models={}),o.config.models.providers||(o.config.models.providers={}),o.config.models.providers.manifest=t,o.config.agents||(o.config.agents={}),o.config.agents.defaults||(o.config.agents.defaults={}),o.config.agents.defaults.models||(o.config.agents.defaults.models={});let e=o.config.agents.defaults.models;Array.isArray(e)?e.includes("manifest/auto")||e.push("manifest/auto"):typeof e=="object"&&("manifest/auto"in e||(e["manifest/auto"]={}))}a.debug("[manifest] Injected provider into runtime config")}catch(e){let n=e instanceof Error?e.message:String(e);a.debug(`[manifest] Could not inject runtime config: ${n}`)}}function Vc(o,r){let i=(0,Oe.join)(pC,"agents");if(!(0,V.existsSync)(i)){r.debug("[manifest] No agents directory found, skipping auth profile injection");return}let c={type:"api_key",provider:"manifest",key:o},a=0;try{let u=(0,V.readdirSync)(i,{withFileTypes:!0}).filter(t=>t.isDirectory());for(let t of u){let e=(0,Oe.join)(i,t.name,"agent","auth-profiles.json"),n=(0,Oe.dirname)(e);if(!(0,V.existsSync)(n))continue;let s=_C(e);s.version||(s.version=1),s.profiles||(s.profiles={});let l=s.profiles["manifest:default"];l&&l.key===o||(s.profiles["manifest:default"]=c,EC(e,s),a++)}}catch(u){let t=u instanceof Error?u.message:String(u);r.debug(`[manifest] Auth profile injection error: ${t}`)}a>0&&r.debug(`[manifest] Injected auth profile into ${a} agent(s)`)}async function J5(o,r){try{return(await fetch(`http://${o}:${r}/api/v1/health`,{signal:AbortSignal.timeout(q5)})).ok}catch{return!1}}function TC(o,r,i){let c=r.port,a=r.host,u=z5(),t=(0,Oe.join)(pa,"manifest.db");i.debug("[manifest] Local mode \u2014 starting embedded server..."),Dc(o,a,c,u,i),Vc(u,i);let e;try{e=require("./server")}catch(A){let y=A instanceof Error?A.message:String(A);i.error(`[manifest] Failed to load embedded server.
20
+ or export MANIFEST_API_KEY=${be}YOUR_KEY`}var ca=me(AM()),la=me(Ni()),WI=me(GI()),zI=me(qI()),JI=me(Po());m();var en=null,tn=null,xc=null,bc=null;function rn(o,r){let i=new JI.Resource({"service.name":fr.SERVICE_NAME,"service.version":"5.15.2","manifest.plugin":"true"}),c=o.apiKey?{Authorization:`Bearer ${o.apiKey}`}:{},a=new WI.OTLPTraceExporter({url:`${o.endpoint}/v1/traces`,headers:c});en=new ca.BasicTracerProvider({resource:i,spanProcessors:[new ca.BatchSpanProcessor(a,{scheduledDelayMillis:5e3,maxQueueSize:2048,maxExportBatchSize:512})]}),en.register(),r.debug(`[manifest] Trace exporter -> ${o.endpoint}/v1/traces`);let u=new zI.OTLPMetricExporter({url:`${o.endpoint}/v1/metrics`,headers:c}),t=o.mode==="dev"?kc.METRICS_INTERVAL_MS:o.mode==="local"?Hc.METRICS_INTERVAL_MS:fr.METRICS_INTERVAL_MS;return tn=new la.MeterProvider({resource:i,readers:[new la.PeriodicExportingMetricReader({exporter:u,exportIntervalMillis:t})]}),It.setGlobalMeterProvider(tn),r.debug(`[manifest] Metrics exporter -> ${o.endpoint}/v1/metrics (interval=${t}ms)`),xc=Ke.getTracer("manifest-plugin","5.15.2"),bc=It.getMeter("manifest-plugin","5.15.2"),{tracer:xc,meter:bc}}async function nn(o){o.info("[manifest] Shutting down telemetry..."),en&&(await en.shutdown(),en=null),tn&&(await tn.shutdown(),tn=null),xc=null,bc=null,o.info("[manifest] Telemetry shut down")}m();var G5=5,$I=30*60*1e3,H5=3e3,k5=5*60*1e3,Y5=new Set(["system","developer"]),F5=10,on=new Map,XI=!1;function K5(){if(XI)return;XI=!0;let o=setInterval(()=>{let r=Date.now();for(let[i,c]of on)r-c.lastUpdated>$I&&on.delete(i)},k5);typeof o=="object"&&"unref"in o&&o.unref()}async function QI(o,r,i,c){K5();let u=`${o.endpoint.replace(/\/otlp(\/v1)?\/?$/,"")}/api/v1/routing/resolve`;try{if(!r||!Array.isArray(r)||r.length===0)return c.debug("[manifest] Routing resolve: no messages, skipping"),null;let t=r.filter(I=>I&&typeof I=="object"&&"role"in I&&!Y5.has(I.role)).slice(-F5).map(I=>({role:I.role,content:I.content}));if(t.length===0)return c.debug("[manifest] Routing resolve: no scorable messages, skipping"),null;let e=on.get(i),n=e&&Date.now()-e.lastUpdated<$I?e.tiers:void 0,s={messages:t};n&&(s.recentTiers=n);let l={"Content-Type":"application/json"};o.apiKey&&(l.Authorization=`Bearer ${o.apiKey}`);let E=await fetch(u,{method:"POST",headers:l,body:JSON.stringify(s),signal:AbortSignal.timeout(H5)});if(!E.ok)return c.debug(`[manifest] Routing resolve returned ${E.status}`),null;let A=await E.json();if(!A.model)return c.debug(`[manifest] Routing resolve: no model for tier=${A.tier}`),null;let y=on.get(i);return y?(y.tiers=[A.tier,...y.tiers].slice(0,G5),y.lastUpdated=Date.now()):on.set(i,{tiers:[A.tier],lastUpdated:Date.now()}),c.debug(`[manifest] Routing resolved: tier=${A.tier} model=${A.model} provider=${A.provider}`),{tier:A.tier,model:A.model,provider:A.provider??"unknown",reason:A.reason??""}}catch(t){let e=t instanceof Error?t.message:String(t);return c.debug(`[manifest] Routing resolve failed (${e})`),null}}function an(o,r,i){if(typeof o.registerProvider!="function"){i.debug("[manifest] registerProvider not available, skipping provider registration");return}let c=r.endpoint.replace(/\/otlp(\/v1)?\/?$/,"");try{o.registerProvider({id:"manifest",name:"Manifest Router",api:"openai-completions",baseUrl:c,apiKey:r.apiKey,models:["auto"]}),i.info("[manifest] Registered as OpenAI-compatible provider (proxy mode)")}catch(a){let u=a instanceof Error?a.message:String(a);i.debug(`[manifest] registerProvider failed (${u})`)}}var Sr=new Map,ZI,eC,tC,rC,j5,nC,oC,iC,aC;function un(o){ZI=o.createCounter(he.LLM_REQUESTS,{description:"Total LLM inference requests"}),eC=o.createCounter(he.LLM_TOKENS_INPUT,{description:"Total input tokens sent to LLM"}),tC=o.createCounter(he.LLM_TOKENS_OUTPUT,{description:"Total output tokens from LLM"}),rC=o.createCounter(he.LLM_TOKENS_CACHE_READ,{description:"Total cache-read tokens"}),j5=o.createHistogram(he.LLM_DURATION,{description:"LLM request duration in ms",unit:"ms"}),nC=o.createCounter(he.TOOL_CALLS,{description:"Total tool invocations"}),oC=o.createCounter(he.TOOL_ERRORS,{description:"Total tool errors"}),iC=o.createHistogram(he.TOOL_DURATION,{description:"Tool execution duration in ms",unit:"ms"}),aC=o.createCounter(he.MESSAGES_RECEIVED,{description:"Total messages received from users"})}function sn(o,r,i,c){o.on("message_received",a=>{let u=a.sessionKey||a.session?.key||`agent:${a.agent||"main"}:main`,t=a.channel||"unknown",e=r.startSpan(En.REQUEST,{kind:Ye.SERVER,attributes:{[b.SESSION_KEY]:u,[b.CHANNEL]:t}});Sr.set(u,{root:e}),aC.add(1,{[b.CHANNEL]:t}),c.debug(`[manifest] Root span started for session=${u}`)}),o.on("before_agent_start",a=>{let u=a.sessionKey||a.session?.key||`agent:${a.agent||"main"}:main`,t=a.agent||"main",e=Sr.get(u),n=e?.root?Ke.setSpan(Fe.active(),e.root):Fe.active(),s=r.startSpan(En.AGENT_TURN,{kind:Ye.INTERNAL,attributes:{[b.AGENT_NAME]:t,[b.SESSION_KEY]:u}},n);e?e.turn=s:Sr.set(u,{root:s,turn:s}),c.debug(`[manifest] Agent turn started: agent=${t}, session=${u}`)}),o.on("tool_result_persist",a=>{let u=a.toolName||a.tool||"unknown",t=a.durationMs||0,e=a.error==null,n=a.sessionKey||"unknown",s=Sr.get(n),l=s?.turn?Ke.setSpan(Fe.active(),s.turn):Fe.active(),E=r.startSpan(`${En.TOOL_PREFIX}${u}`,{kind:Ye.INTERNAL,attributes:{[b.TOOL_NAME]:u,[b.TOOL_SUCCESS]:String(e),[b.SESSION_KEY]:n}},l);e||(E.setStatus({code:ut.ERROR,message:a.error?.message||"Tool execution failed"}),oC.add(1,{[b.TOOL_NAME]:u})),E.end(),nC.add(1,{[b.TOOL_NAME]:u}),iC.record(t,{[b.TOOL_NAME]:u})}),o.on("agent_end",async a=>{let u=a.sessionKey||a.session?.key||`agent:${a.agent||"main"}:main`,t=a.messages||[],e=[...t].reverse().find(Y=>Y.role==="assistant"&&Y.usage),n=e?.model||a.model||"unknown",s=e?.provider||a.provider||"unknown",l=e?.usage||a.usage||{},E=l.input||l.inputTokens||0,A=l.output||l.outputTokens||0,y=l.cacheRead||l.cacheReadTokens||0,I=l.cacheWrite||l.cacheWriteTokens||0,Ce=n,Ge=s,yt=null,nt=null;if(Ce==="auto"&&i.mode!=="cloud"){let Y=await QI(i,t,u,c);Y&&(Ce=Y.model,Ge=Y.provider,yt=Y.tier,nt=Y.reason||null)}t.some(Y=>!Y||Y.role!=="user"?!1:typeof Y.content=="string"?Y.content.includes("HEARTBEAT_OK"):Array.isArray(Y.content)?Y.content.some(_a=>_a.type==="text"&&typeof _a.text=="string"&&_a.text.includes("HEARTBEAT_OK")):!1)&&(nt="heartbeat",yt="simple");let Te=Sr.get(u);if(Te?.turn){if(Te.turn.setAttributes({[b.MODEL]:Ce,[b.PROVIDER]:Ge,[b.INPUT_TOKENS]:E,[b.OUTPUT_TOKENS]:A,[b.CACHE_READ_TOKENS]:y,[b.CACHE_WRITE_TOKENS]:I}),yt&&Te.turn.setAttribute(b.ROUTING_TIER,yt),nt&&Te.turn.setAttribute(b.ROUTING_REASON,nt),a.success===!1){let Y=a.error?.message||a.errorMessage||"Agent turn failed";Te.turn.setStatus({code:ut.ERROR,message:typeof Y=="string"?Y.slice(0,500):String(Y)})}Te.turn.end()}Te?.root&&Te.root!==Te.turn&&Te.root.end(),Sr.delete(u);let xe={[b.MODEL]:Ce,[b.PROVIDER]:Ge};ZI.add(1,xe),eC.add(E,xe),tC.add(A,xe),y>0&&rC.add(y,xe),c.debug(`[manifest] agent_end tokens: in=${E}, out=${A}, cache=${y}`),c.debug(`[manifest] Trace completed for session=${u}`)}),c.debug("[manifest] All hooks registered")}async function cn(o){let r=o.endpoint.replace(/\/otlp(\/v1)?\/?$/,""),i={endpointReachable:!1,authValid:!1,agentName:null,error:null};try{let c=await fetch(`${r}/api/v1/health`,{signal:AbortSignal.timeout(5e3)});if(!c.ok)return i.error=`Health endpoint returned ${c.status}`,i;i.endpointReachable=!0}catch(c){let a=c instanceof Error?c.message:String(c);return i.error=`Cannot reach endpoint: ${a}`,i}try{let c=o.apiKey?{Authorization:`Bearer ${o.apiKey}`}:{},a=await fetch(`${r}/api/v1/agent/usage?range=24h`,{headers:c,signal:AbortSignal.timeout(5e3)});if(a.status===401||a.status===403)return i.error="API key rejected \u2014 check your mnfst_ key is correct",i;if(!a.ok)return i.error=`Usage endpoint returned ${a.status}`,i;i.authValid=!0;let u=await a.json();u&&typeof u.agentName=="string"&&(i.agentName=u.agentName)}catch(c){let a=c instanceof Error?c.message:String(c);return i.error=`Auth check failed: ${a}`,i}return i}var uC={today:"24h",week:"7d",month:"30d"};async function sC(o,r,i,c){let a=`${o}${r}`;try{let u=i?{Authorization:`Bearer ${i}`}:{},t=await fetch(a,{headers:u});return t.ok?{result:await t.json()}:{error:`API returned ${t.status}`}}catch(u){let t=u instanceof Error?u.message:String(u);return c.error(`[manifest] API call failed: ${t}`),{error:t}}}function ln(o,r,i){let c=r.endpoint.replace(/\/otlp(\/v1)?\/?$/,"");o.registerTool({name:"manifest_usage",description:"Get token consumption for this agent: total, input, output, cache-read tokens, and action count. Use when the user asks about token usage or consumption.",parameters:{type:"object",properties:{period:{type:"string",enum:["today","week","month"],default:"today",description:"Time period"}}},handler:async a=>{let u=uC[a.period||"today"]||"24h";return sC(c,`/api/v1/agent/usage?range=${u}`,r.apiKey,i)}}),o.registerTool({name:"manifest_costs",description:"Get cost breakdown for this agent in USD, grouped by model. Use when the user asks about costs, spending, or money burned.",parameters:{type:"object",properties:{period:{type:"string",enum:["today","week","month"],default:"week",description:"Time period"}}},handler:async a=>{let u=uC[a.period||"week"]||"7d";return sC(c,`/api/v1/agent/costs?range=${u}`,r.apiKey,i)}}),o.registerTool({name:"manifest_health",description:"Check whether Manifest observability is connected and working. Use when the user asks if monitoring is set up or wants a connectivity test.",parameters:{type:"object",properties:{}},handler:async()=>{let a=await cn(r);return a.error?{error:a.error}:{result:{endpointReachable:a.endpointReachable,authValid:a.authValid,agentName:a.agentName,status:"ok"}}}}),i.debug("[manifest] Registered agent tools: manifest_usage, manifest_costs, manifest_health")}var V=require("fs"),Oe=require("path"),Uc=require("os"),lC=require("crypto");var pa=(0,Oe.join)((0,Uc.homedir)(),".openclaw","manifest"),pn=(0,Oe.join)(pa,"config.json"),pC=(0,Oe.join)((0,Uc.homedir)(),".openclaw"),cC=(0,Oe.join)(pC,"openclaw.json"),q5=3e3;function W5(){(0,V.existsSync)(pa)||(0,V.mkdirSync)(pa,{recursive:!0,mode:448})}function z5(){if(W5(),(0,V.existsSync)(pn))try{let i=JSON.parse((0,V.readFileSync)(pn,"utf-8"));if(i.apiKey&&i.apiKey.startsWith(be))return i.apiKey}catch{}let o=`${be}local_${(0,lC.randomBytes)(24).toString("hex")}`,r={};if((0,V.existsSync)(pn))try{r=JSON.parse((0,V.readFileSync)(pn,"utf-8"))}catch{}return(0,V.writeFileSync)(pn,JSON.stringify({...r,apiKey:o},null,2),{mode:384}),o}function _C(o){if(!(0,V.existsSync)(o))return{};try{return JSON.parse((0,V.readFileSync)(o,"utf-8"))}catch{return{}}}function EC(o,r){let i=(0,Oe.dirname)(o);(0,V.existsSync)(i)||(0,V.mkdirSync)(i,{recursive:!0,mode:448});let c=`${o}.tmp.${process.pid}`;(0,V.writeFileSync)(c,JSON.stringify(r,null,2),{mode:384}),(0,V.renameSync)(c,o)}function Dc(o,r,i,c,a){let t={baseUrl:`http://${r}:${i}/v1`,api:"openai-completions",apiKey:c,models:[{id:"auto",name:"auto"}]};try{let e=_C(cC);e.models||(e.models={}),e.models.providers||(e.models.providers={}),e.models.providers.manifest=t,e.agents||(e.agents={}),e.agents.defaults||(e.agents.defaults={}),e.agents.defaults.models||(e.agents.defaults.models={});let n=e.agents.defaults.models;Array.isArray(n)?n.includes("manifest/auto")||n.push("manifest/auto"):typeof n=="object"&&("manifest/auto"in n||(n["manifest/auto"]={})),EC(cC,e),a.debug("[manifest] Wrote provider config to openclaw.json")}catch(e){let n=e instanceof Error?e.message:String(e);a.debug(`[manifest] Could not write openclaw.json: ${n}`)}try{if(o.config){o.config.models||(o.config.models={}),o.config.models.providers||(o.config.models.providers={}),o.config.models.providers.manifest=t,o.config.agents||(o.config.agents={}),o.config.agents.defaults||(o.config.agents.defaults={}),o.config.agents.defaults.models||(o.config.agents.defaults.models={});let e=o.config.agents.defaults.models;Array.isArray(e)?e.includes("manifest/auto")||e.push("manifest/auto"):typeof e=="object"&&("manifest/auto"in e||(e["manifest/auto"]={}))}a.debug("[manifest] Injected provider into runtime config")}catch(e){let n=e instanceof Error?e.message:String(e);a.debug(`[manifest] Could not inject runtime config: ${n}`)}}function Vc(o,r){let i=(0,Oe.join)(pC,"agents");if(!(0,V.existsSync)(i)){r.debug("[manifest] No agents directory found, skipping auth profile injection");return}let c={type:"api_key",provider:"manifest",key:o},a=0;try{let u=(0,V.readdirSync)(i,{withFileTypes:!0}).filter(t=>t.isDirectory());for(let t of u){let e=(0,Oe.join)(i,t.name,"agent","auth-profiles.json"),n=(0,Oe.dirname)(e);if(!(0,V.existsSync)(n))continue;let s=_C(e);s.version||(s.version=1),s.profiles||(s.profiles={});let l=s.profiles["manifest:default"];l&&l.key===o||(s.profiles["manifest:default"]=c,EC(e,s),a++)}}catch(u){let t=u instanceof Error?u.message:String(u);r.debug(`[manifest] Auth profile injection error: ${t}`)}a>0&&r.debug(`[manifest] Injected auth profile into ${a} agent(s)`)}async function J5(o,r){try{return(await fetch(`http://${o}:${r}/api/v1/health`,{signal:AbortSignal.timeout(q5)})).ok}catch{return!1}}function TC(o,r,i){let c=r.port,a=r.host,u=z5(),t=(0,Oe.join)(pa,"manifest.db");i.debug("[manifest] Local mode \u2014 starting embedded server..."),Dc(o,a,c,u,i),Vc(u,i);let e;try{e=require("./server")}catch(A){let y=A instanceof Error?A.message:String(A);i.error(`[manifest] Failed to load embedded server.
21
21
  Error: ${y}
22
22
  This is a packaging error \u2014 please reinstall the manifest plugin.`);return}let n=`http://${a}:${c}/otlp`,s={...r,apiKey:u,endpoint:n},{tracer:l,meter:E}=rn(s,i);un(E),sn(o,l,s,i),an(o,s,i),typeof o.registerTool=="function"&&ln(o,s,i),i.info(`[manifest] \u{1F99A} View your Manifest Dashboard -> http://${a}:${c}`),o.registerService({id:"manifest-local",start:async()=>{try{await e.start({port:c,host:a,dbPath:t,quiet:!0}),i.info(`[manifest] Local server running on http://${a}:${c}`),i.info(`[manifest] Dashboard: http://${a}:${c}`),i.info(`[manifest] DB: ${t}`)}catch(A){let y=A instanceof Error?A.message:String(A);y.includes("EADDRINUSE")||y.includes("address already in use")?await J5(a,c)?i.info(`[manifest] Reusing existing server at http://${a}:${c}`):i.error(`[manifest] Port ${c} is already in use by another process.
23
23
  Change it with: openclaw config set plugins.entries.manifest.config.port ${c+1}
24
24
  Then restart the gateway.`):i.error(`[manifest] Failed to start local server: ${y}
25
25
  Try reinstalling: openclaw plugins install manifest
26
- Then restart: openclaw gateway restart`)}},stop:async()=>{await nn(i)}})}var fC=require("crypto"),Be=require("os");function SC(){return{optedOut:__fromEnv.MANIFEST_TELEMETRY_OPTOUT==="1"||__fromEnv.MANIFEST_TELEMETRY_OPTOUT==="true",packageVersion:"5.15.0"}}var X5="https://eu.i.posthog.com",$5="phc_g5pLOu5bBRjhVJBwAsx0eCzJFWq0cri2TyVLQLxf045";function Q5(){let o=`${(0,Be.hostname)()}-${(0,Be.platform)()}-${(0,Be.arch)()}`;return(0,fC.createHash)("sha256").update(o).digest("hex").slice(0,16)}function wc(o,r){let i=SC();if(i.optedOut)return;let c={api_key:$5,event:o,properties:{distinct_id:Q5(),os:(0,Be.platform)(),os_version:(0,Be.release)(),node_version:process.versions.node,package_version:i.packageVersion,mode:__fromEnv.MANIFEST_MODE??"local",...r},timestamp:new Date().toISOString()};fetch(`${X5}/capture`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(c)}).catch(()=>{})}module.exports={id:"manifest",name:"Manifest \u2014 Agent Observability",register(o){let r=o.logger||{info:(...e)=>console.log(...e),debug:()=>{},error:(...e)=>console.error(...e),warn:(...e)=>console.warn(...e)},i=Yc(o.pluginConfig);if(i.mode!=="dev"&&(wc("plugin_registered"),wc("plugin_mode_selected",{mode:i.mode})),i.mode==="local"){TC(o,i,r);return}let c=Fc(i);if(c){i.mode==="cloud"&&!i.apiKey?r.info(`[manifest] Cloud mode requires an API key:
26
+ Then restart: openclaw gateway restart`)}},stop:async()=>{await nn(i)}})}var fC=require("crypto"),Be=require("os");function SC(){return{optedOut:__fromEnv.MANIFEST_TELEMETRY_OPTOUT==="1"||__fromEnv.MANIFEST_TELEMETRY_OPTOUT==="true",packageVersion:"5.15.2"}}var X5="https://eu.i.posthog.com",$5="phc_g5pLOu5bBRjhVJBwAsx0eCzJFWq0cri2TyVLQLxf045";function Q5(){let o=`${(0,Be.hostname)()}-${(0,Be.platform)()}-${(0,Be.arch)()}`;return(0,fC.createHash)("sha256").update(o).digest("hex").slice(0,16)}function wc(o,r){let i=SC();if(i.optedOut)return;let c={api_key:$5,event:o,properties:{distinct_id:Q5(),os:(0,Be.platform)(),os_version:(0,Be.release)(),node_version:process.versions.node,package_version:i.packageVersion,mode:__fromEnv.MANIFEST_MODE??"local",...r},timestamp:new Date().toISOString()};fetch(`${X5}/capture`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(c)}).catch(()=>{})}module.exports={id:"manifest",name:"Manifest \u2014 Agent Observability",register(o){let r=o.logger||{info:(...e)=>console.log(...e),debug:()=>{},error:(...e)=>console.error(...e),warn:(...e)=>console.warn(...e)},i=Yc(o.pluginConfig);if(i.mode!=="dev"&&(wc("plugin_registered"),wc("plugin_mode_selected",{mode:i.mode})),i.mode==="local"){TC(o,i,r);return}let c=Fc(i);if(c){i.mode==="cloud"&&!i.apiKey?r.info(`[manifest] Cloud mode requires an API key:
27
27
  openclaw config set plugins.entries.manifest.config.apiKey mnfst_YOUR_KEY
28
28
  openclaw gateway restart
29
29
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "manifest",
3
- "version": "5.15.0",
3
+ "version": "5.15.2",
4
4
  "description": "Observability plugin for OpenClaw — traces, metrics, and cost tracking for your AI agent",
5
5
  "main": "dist/index.js",
6
6
  "license": "MIT",
@@ -1 +1 @@
1
- .setup-modal__overlay{background:#fbf9f3b3;backdrop-filter:blur(8px)}.setup-modal__nav{display:flex;align-items:center;justify-content:space-between;margin-top:var(--gap-lg)}.setup-modal__nav .modal-card__back-link{justify-content:flex-start;width:auto}.setup-modal__next{padding:10px 24px;border:none;border-radius:var(--radius);background:hsl(var(--foreground));color:hsl(var(--background));font-size:var(--font-size-sm);font-weight:600;font-family:var(--font-family);cursor:pointer;transition:opacity var(--transition-fast)}.setup-modal__next:hover{opacity:.85}.waiting-banner{display:flex;align-items:center;gap:var(--gap-sm);padding:12px 16px;margin-bottom:var(--gap-lg);background:hsl(var(--chart-1) / .08);border:1px solid hsl(var(--chart-1) / .2);border-radius:var(--radius);color:hsl(var(--muted-foreground));font-size:var(--font-size-sm);line-height:1.5}.waiting-banner i{flex-shrink:0;color:hsl(var(--chart-1));font-size:18px}.waiting-banner p{margin:0}.waiting-banner--success{border-color:hsl(var(--success) / .3);background:hsl(var(--success) / .06)}.waiting-banner--success i{color:hsl(var(--success))}.demo-dashboard{opacity:.5;pointer-events:none;user-select:none}.uplot,.uplot *,.uplot *:before,.uplot *:after{box-sizing:border-box}.uplot{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";line-height:1.5;width:min-content}.u-title{text-align:center;font-size:18px;font-weight:700}.u-wrap{position:relative;user-select:none}.u-over,.u-under{position:absolute}.u-under{overflow:hidden}.uplot canvas{display:block;position:relative;width:100%;height:100%}.u-axis{position:absolute}.u-legend{font-size:14px;margin:auto;text-align:center}.u-inline{display:block}.u-inline *{display:inline-block}.u-inline tr{margin-right:16px}.u-legend th{font-weight:600}.u-legend th>*{vertical-align:middle;display:inline-block}.u-legend .u-marker{width:1em;height:1em;margin-right:4px;background-clip:padding-box!important}.u-inline.u-live th:after{content:":";vertical-align:middle}.u-inline:not(.u-live) .u-value{display:none}.u-series>*{padding:4px}.u-series th{cursor:pointer}.u-legend .u-off>*{opacity:.3}.u-select{background:#00000012;position:absolute;pointer-events:none}.u-cursor-x,.u-cursor-y{position:absolute;left:0;top:0;pointer-events:none;will-change:transform}.u-hz .u-cursor-x,.u-vt .u-cursor-y{height:100%;border-right:1px dashed #607D8B}.u-hz .u-cursor-y,.u-vt .u-cursor-x{width:100%;border-bottom:1px dashed #607D8B}.u-cursor-pt{position:absolute;top:0;left:0;border-radius:50%;border:0 solid;pointer-events:none;will-change:transform;background-clip:padding-box!important}.u-axis.u-off,.u-select.u-off,.u-cursor-x.u-off,.u-cursor-y.u-off,.u-cursor-pt.u-off{display:none}@font-face{font-family:Bricolage Grotesque;font-style:normal;font-weight:400 700;font-stretch:100%;font-display:swap;src:url(/fonts/bricolage-grotesque-latin.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Bricolage Grotesque;font-style:normal;font-weight:400 700;font-stretch:100%;font-display:swap;src:url(/fonts/bricolage-grotesque-latin-ext.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:DM Sans;font-style:normal;font-weight:400 700;font-display:swap;src:url(/fonts/dm-sans-latin.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:DM Sans;font-style:normal;font-weight:400 700;font-display:swap;src:url(/fonts/dm-sans-latin-ext.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:400 500;font-display:swap;src:url(/fonts/jetbrains-mono-latin.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}.app-shell{display:flex;flex-direction:column;min-height:100vh}.app-body{display:flex;flex:1;padding-top:var(--header-height)}.theme-toggle{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;border-radius:var(--radius);background:transparent;border:1px solid hsl(var(--border));color:hsl(var(--muted-foreground));cursor:pointer;transition:all var(--transition-fast);padding:0}.theme-toggle__icon{display:flex;align-items:center;justify-content:center;line-height:1}.not-found{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:80vh;text-align:center;padding:var(--gap-xl)}.not-found__code{font-size:8rem;font-weight:800;letter-spacing:-.05em;line-height:1;background:linear-gradient(135deg,hsl(var(--primary)),hsl(var(--chart-1)));-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.not-found__title{font-size:var(--font-size-2xl);font-weight:700;color:hsl(var(--foreground));margin-top:var(--gap-md);letter-spacing:-.025em}.not-found__text{font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));margin-top:var(--gap-sm);max-width:360px}.not-found__link{display:inline-flex;align-items:center;gap:var(--gap-xs);margin-top:var(--gap-xl);padding:.625rem 1.25rem;background:hsl(var(--primary));color:hsl(var(--primary-foreground));border-radius:var(--radius);font-size:var(--font-size-sm);font-weight:600;text-decoration:none;transition:opacity var(--transition-fast)}.not-found__link:hover{opacity:.9}.auth-layout{display:flex;align-items:center;justify-content:center;min-height:100vh;padding:var(--gap-lg);background:hsl(var(--background))}.auth-card{width:100%;max-width:420px;background:hsl(var(--card));border:1px solid hsl(var(--border));border-radius:12px;padding:var(--gap-xl) var(--gap-xl) var(--gap-lg);box-shadow:var(--card-shadow);animation:fadeInUp .3s ease-out both}.auth-logo{text-align:center;margin-bottom:var(--gap-lg)}.auth-logo__link{display:inline-flex;align-items:center;gap:var(--gap-sm);font-size:var(--font-size-lg);font-weight:700;letter-spacing:-.025em;color:hsl(var(--foreground));text-decoration:none}.auth-logo__img{width:140px;height:auto;object-fit:contain}.auth-logo__img--dark,.dark .auth-logo__img--light{display:none}.dark .auth-logo__img--dark{display:inline-block}.auth-header{text-align:center;margin-bottom:var(--gap-lg)}.auth-header__title{font-size:var(--font-size-xl);font-weight:700;color:hsl(var(--foreground));letter-spacing:-.025em;line-height:1.2}.auth-header__subtitle{font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));margin-top:var(--gap-xs)}.auth-form{display:flex;flex-direction:column;gap:var(--gap-md);margin-bottom:var(--gap-lg)}.auth-form__label{display:flex;flex-direction:column;gap:var(--gap-xs);font-size:var(--font-size-sm);font-weight:500;color:hsl(var(--foreground))}.auth-form__input{height:2.75rem;padding:0 var(--gap-md);background:hsl(var(--background));color:hsl(var(--foreground));border:1px solid hsl(var(--input));border-radius:var(--radius);font-size:var(--font-size-sm);font-family:var(--font-family);transition:border-color var(--transition-fast);outline:none}.auth-form__input::placeholder{color:hsl(var(--muted-foreground))}.auth-form__input:focus{border-color:hsl(var(--primary));box-shadow:0 0 0 2px hsl(var(--primary) / .15)}.auth-form__actions{display:flex;justify-content:flex-end;margin-top:calc(-1 * var(--gap-xs))}.auth-form__forgot{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));text-decoration:none;transition:color var(--transition-fast)}.auth-form__forgot:hover{color:hsl(var(--foreground))}.auth-form__submit{height:2.75rem;background:hsl(var(--primary));color:hsl(var(--primary-foreground));border:none;border-radius:var(--radius);font-size:var(--font-size-sm);font-weight:600;font-family:var(--font-family);cursor:pointer;transition:opacity var(--transition-fast)}.auth-form__submit:hover:not(:disabled){opacity:.9}.auth-form__submit:disabled{opacity:.6;cursor:not-allowed}.auth-form__error{padding:var(--gap-sm) var(--gap-md);background:hsl(var(--destructive) / .1);color:hsl(var(--destructive));border:1px solid hsl(var(--destructive) / .2);border-radius:var(--radius);font-size:var(--font-size-xs)}.auth-form__success{padding:var(--gap-sm) var(--gap-md);background:#21c45d1a;color:#1a9948;border:1px solid hsl(142 71% 45% / .2);border-radius:var(--radius);font-size:var(--font-size-xs);line-height:1.5}.auth-form__link-btn{background:none;border:none;padding:0;font-size:var(--font-size-sm);font-family:var(--font-family);color:hsl(var(--primary));font-weight:500;cursor:pointer;text-decoration:underline;text-underline-offset:2px;transition:opacity var(--transition-fast)}.auth-form__link-btn:hover:not(:disabled){opacity:.8}.auth-form__link-btn:disabled{color:hsl(var(--muted-foreground));cursor:not-allowed;text-decoration:none}.auth-divider{display:flex;align-items:center;gap:var(--gap-md);margin-bottom:var(--gap-lg)}.auth-divider:before,.auth-divider:after{content:"";flex:1;height:1px;background:hsl(var(--border))}.auth-divider__text{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));text-transform:uppercase;letter-spacing:.05em}.auth-social-group{display:flex;flex-direction:column;gap:var(--gap-sm);margin-bottom:var(--gap-lg)}.auth-social-btn{display:flex;align-items:center;justify-content:center;gap:var(--gap-sm);width:100%;height:2.75rem;padding:0 var(--gap-md);background:hsl(var(--background));color:hsl(var(--foreground));border:1px solid hsl(var(--input));border-radius:var(--radius);font-size:var(--font-size-sm);font-weight:500;font-family:var(--font-family);cursor:pointer;transition:all var(--transition-fast)}.auth-social-btn:hover{background:hsl(var(--accent));border-color:hsl(var(--foreground) / .2)}.auth-social-btn__icon{display:flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0}.auth-social-btn--google:hover{border-color:#4285f4}.auth-social-btn--github:hover{border-color:#6e40c9}.auth-social-btn--discord:hover{border-color:#5865f2}.auth-footer{text-align:center;padding-top:var(--gap-md);border-top:1px solid hsl(var(--border));font-size:var(--font-size-sm);color:hsl(var(--muted-foreground))}.auth-footer__link{color:hsl(var(--foreground));font-weight:500;text-decoration:none;transition:color var(--transition-fast)}.auth-footer__link:hover{text-decoration:underline}.auth-terms{text-align:center;font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));line-height:1.5;margin-bottom:var(--gap-sm)}.auth-terms__link{color:hsl(var(--foreground));text-decoration:none}.auth-terms__link:hover{text-decoration:underline}@media(max-width:480px){.auth-card{padding:var(--gap-lg) var(--gap-md);border:none;box-shadow:none;background:transparent}}.summary-card{background:hsl(var(--card));border:none;border-radius:var(--radius);padding:var(--gap-lg);box-shadow:var(--card-shadow)}.panel{background:hsl(var(--card));border:none;border-radius:var(--radius);padding:var(--gap-lg);margin-bottom:var(--gap-lg);box-shadow:var(--card-shadow);overflow-x:auto;overflow-y:hidden}.view-more-link{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));text-decoration:none;transition:color .15s}.view-more-link:hover{color:hsl(var(--foreground))}.chart-card{background:hsl(var(--card));border:none;border-radius:var(--radius);margin-bottom:var(--gap-lg);box-shadow:var(--card-shadow);animation:fadeInUp .3s ease-out both}.chart-card__header{display:flex;align-items:stretch;border-bottom:1px solid hsl(var(--border))}.chart-card__stat{display:flex;flex-direction:column;justify-content:center;min-width:200px;gap:2px;padding:var(--gap-lg) var(--gap-xl);border-right:1px solid hsl(var(--border))}.chart-card__stat:first-child{padding-left:var(--gap-lg)}.chart-card__stat--clickable{cursor:pointer;transition:all var(--transition-fast);position:relative}.chart-card__stat--clickable:after{content:"";position:absolute;bottom:-1px;left:-1px;right:-1px;height:2px;background:transparent;transition:background var(--transition-fast)}.chart-card__stat--active:after{background:hsl(var(--chart-1))}.chart-card__stat--clickable:not(.chart-card__stat--active):hover:after{background:hsl(var(--border))}.chart-card__value-row{display:flex;align-items:center;gap:var(--gap-sm)}.chart-card__controls{margin-left:auto;display:flex;align-items:center;padding:var(--gap-md) var(--gap-lg) var(--gap-md) var(--gap-xl)}.chart-card__body{padding:var(--gap-md) var(--gap-lg) var(--gap-lg);overflow:hidden}.chart-card__body .u-wrap{overflow:hidden!important}.u-cursor-x{border-left:1px solid hsl(var(--foreground) / .7)!important;border-left-style:solid!important;opacity:0!important;transition:opacity 60ms ease!important}.u-wrap:hover .u-cursor-x{opacity:1!important}.u-cursor-y{display:none!important}.expandable-card .panel{overflow:hidden;max-height:320px;padding-bottom:var(--gap-2xl)}.expandable-card__fade{position:absolute;bottom:0;left:0;right:0;height:80px;background:linear-gradient(transparent,hsl(var(--card)) 60%);border-radius:0 0 var(--radius) var(--radius);display:flex;align-items:flex-end;justify-content:center;padding-bottom:16px;opacity:0;transition:opacity var(--transition-base)}.select{display:inline-flex;align-items:center;height:2.25rem;background:hsl(var(--background));color:hsl(var(--foreground));border:1px solid hsl(var(--input));border-radius:var(--radius);padding:0 2rem 0 .75rem;font-size:var(--font-size-sm);font-family:var(--font-family);cursor:pointer;transition:border-color var(--transition-fast),box-shadow var(--transition-fast);appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right .5rem center}.cost-range-filter{display:inline-flex;align-items:center;gap:4px}.cost-range-filter__input{width:80px;height:2.25rem;background:hsl(var(--background));color:hsl(var(--foreground));border:1px solid hsl(var(--input));border-radius:var(--radius);padding:0 .5rem;font-size:var(--font-size-sm);font-family:var(--font-family);transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.cost-range-filter__input::placeholder{color:hsl(var(--muted-foreground))}.cost-range-filter__input:focus-visible{outline:none;border-color:hsl(var(--ring));box-shadow:0 0 0 2px hsl(var(--ring) / .2)}.cost-range-filter__input::-webkit-inner-spin-button,.cost-range-filter__input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.cost-range-filter__input{-moz-appearance:textfield}.cost-range-filter__sep{color:hsl(var(--muted-foreground));font-size:var(--font-size-sm);user-select:none}.setup-steps{display:flex;flex-direction:column}.setup-steps__step{display:flex;gap:var(--gap-md)}.setup-steps__divider{height:1px;background:hsl(var(--border));margin:var(--gap-lg) 0}.setup-steps__number{width:28px;height:28px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:var(--font-size-xs);font-weight:600;background:hsl(var(--primary));color:hsl(var(--primary-foreground));flex-shrink:0;margin-top:2px}.setup-steps__content{flex:1;min-width:0}.btn--primary{background:hsl(var(--primary));color:hsl(var(--primary-foreground));gap:6px}.toast{position:fixed;bottom:var(--gap-lg);right:var(--gap-lg);display:flex;align-items:center;gap:10px;padding:12px 16px;border-radius:var(--radius);font-size:var(--font-size-sm);box-shadow:0 4px 16px #00000026;cursor:pointer;z-index:100;animation:toast-in .2s ease-out;max-width:420px}.toast--success{background:hsl(var(--card));border:1px solid hsl(var(--success) / .4);color:hsl(var(--foreground))}.toast--error{background:hsl(var(--card));border:1px solid hsl(var(--destructive) / .4);color:hsl(var(--foreground))}.toast__icon{flex-shrink:0;display:flex}.toast__message{line-height:1.4}@keyframes toast-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.btn--danger{background:hsl(var(--destructive));color:#fff}.btn--danger:hover{background:hsl(var(--destructive) / .9)}.settings-section__title--danger{color:hsl(var(--destructive))}.settings-card--danger{border-color:hsl(var(--destructive) / .3)}.settings-card--danger .settings-card__control{display:flex;justify-content:flex-end}.sidebar{width:var(--sidebar-width);height:calc(100vh - var(--header-height));position:fixed;top:var(--header-height);left:0;background:hsl(var(--sidebar-background));border-right:1px solid hsl(var(--sidebar-border));padding:var(--gap-md) 0;display:flex;flex-direction:column;z-index:10;overflow-y:auto}.sidebar__link--disabled{opacity:.4;pointer-events:none;cursor:default}.header{position:fixed;top:0;left:0;right:0;height:var(--header-height);background:hsl(var(--background));border-bottom:1px solid hsl(var(--border));display:flex;align-items:center;justify-content:space-between;padding:0 var(--gap-lg);z-index:40}.header__left{display:flex;align-items:center;gap:var(--gap-sm);min-width:0}.header__logo{display:flex;align-items:center;gap:var(--gap-sm);font-size:var(--font-size-sm);font-weight:700;letter-spacing:-.025em;color:hsl(var(--foreground));text-decoration:none}.header__logo-img{width:112px;height:auto;object-fit:contain;margin-bottom:9px}.header__logo-img--dark,.dark .header__logo-img--light{display:none}.dark .header__logo-img--dark{display:block}.header__mode-badge{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;padding:2px 7px;border-radius:var(--radius);background:hsl(var(--chart-4) / .15);color:hsl(var(--chart-4));line-height:1.4;user-select:none}.header__mode-badge--dev{background:#f9741526;color:#f97415}.header__separator{color:hsl(var(--muted-foreground));font-size:var(--font-size-sm);user-select:none}.header__breadcrumb-link{font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));text-decoration:none;transition:color var(--transition-fast)}.header__breadcrumb-link:hover{color:hsl(var(--foreground))}.header__breadcrumb-current{font-size:var(--font-size-sm);font-weight:500;color:hsl(var(--foreground))}.header__right{display:flex;align-items:center;align-self:stretch;gap:var(--gap-sm)}.header__avatar-btn{display:flex;align-items:center;justify-content:center;background:transparent;border:none;cursor:pointer;padding:2px;border-radius:50%;transition:opacity var(--transition-fast)}.header__avatar-btn:hover{opacity:.8}.header__avatar{width:28px;height:28px;border-radius:50%;background:hsl(var(--chart-1));color:#fff;display:flex;align-items:center;justify-content:center;font-size:var(--font-size-xs);font-weight:600}.header__dropdown{position:absolute;top:100%;right:0;min-width:220px;margin-top:4px;background:hsl(var(--popover));border:1px solid hsl(var(--border));border-radius:var(--radius);box-shadow:0 4px 16px #00000026;padding:4px;z-index:50;animation:fadeInUp .1s ease-out}.header__dropdown-header{padding:8px 8px 6px}.header__dropdown-name{display:block;font-size:var(--font-size-sm);font-weight:600;color:hsl(var(--foreground))}.header__dropdown-email{display:block;font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));margin-top:1px}.header__dropdown-divider{height:1px;background:hsl(var(--border));margin:4px 0}.header__dropdown-item{display:flex;align-items:center;gap:var(--gap-sm);width:100%;padding:6px 8px;border:none;background:transparent;color:hsl(var(--foreground));font-size:var(--font-size-sm);font-family:var(--font-family);border-radius:calc(var(--radius) - 2px);cursor:pointer;transition:background var(--transition-fast);text-decoration:none}.header__dropdown-item:hover{background:hsl(var(--accent))}.header__dropdown-item--danger{color:hsl(var(--foreground))}.header__dropdown-item--danger:hover{background:hsl(var(--accent))}.header__github-star{position:relative;display:flex;align-items:center}.header__github-star-btn{display:inline-flex;align-items:stretch;height:28px;border-radius:6px;border:1px solid hsl(var(--border));background:hsl(var(--card));color:hsl(var(--foreground));font-size:var(--font-size-xs);font-weight:600;font-family:var(--font-family);text-decoration:none;cursor:pointer;transition:all var(--transition-fast);white-space:nowrap;line-height:1;overflow:hidden}.header__github-star-btn:hover{border-color:hsl(var(--ring) / .3)}.header__github-star-action{display:flex;align-items:center;gap:6px;padding:0 10px;background:hsl(var(--muted));transition:background var(--transition-fast)}.header__github-star-btn:hover .header__github-star-action{background:hsl(var(--muted-foreground) / .15)}.header__github-icon{flex-shrink:0}.header__github-star-label{font-size:var(--font-size-xs);font-weight:600}.header__github-star-count{display:flex;align-items:center;padding:0 10px;font-size:var(--font-size-xs);font-weight:600;font-variant-numeric:tabular-nums;border-left:1px solid hsl(var(--border))}.header__github-star-close{position:absolute;top:-6px;right:-6px;width:16px;height:16px;border-radius:50%;border:1px solid hsl(var(--border));background:hsl(var(--card));color:hsl(var(--muted-foreground));display:flex;align-items:center;justify-content:center;cursor:pointer;opacity:0;transition:all var(--transition-fast);padding:0;line-height:1}.header__github-star:hover .header__github-star-close{opacity:1}.header__github-star-close:hover{background:hsl(var(--destructive));border-color:hsl(var(--destructive));color:#fff}.header__star-separator{width:1px;align-self:stretch;background:hsl(var(--border));margin:0 8px}.custom-select{position:relative;display:inline-block}.custom-select__trigger{display:inline-flex;align-items:center;gap:6px;height:2rem;padding:0 8px 0 10px;background:transparent;color:hsl(var(--foreground));border:1px solid hsl(var(--border));border-radius:var(--radius);font-size:var(--font-size-sm);font-family:var(--font-family);font-weight:400;cursor:pointer;transition:border-color var(--transition-fast);white-space:nowrap}.custom-select__trigger:hover,.custom-select__trigger--open{border-color:hsl(var(--foreground) / .3)}.custom-select__value{flex:1;text-align:left}.custom-select__chevron{color:hsl(var(--muted-foreground));flex-shrink:0;transition:transform var(--transition-fast)}.custom-select__trigger--open .custom-select__chevron{transform:rotate(180deg)}.custom-select__dropdown{position:absolute;top:calc(100% + 4px);left:0;min-width:max(100%,140px);background:hsl(var(--popover));border:1px solid hsl(var(--border));border-radius:var(--radius);box-shadow:0 4px 12px #00000014;padding:4px 0;z-index:50;animation:fadeInUp .1s ease-out}.custom-select__option{display:block;width:100%;padding:6px 14px;border:none;background:transparent;color:hsl(var(--popover-foreground));font-size:var(--font-size-sm);font-family:var(--font-family);cursor:pointer;transition:background var(--transition-fast);white-space:nowrap;text-align:left}.custom-select__option:hover{background:hsl(var(--accent))}.custom-select__option--selected{background:hsl(var(--accent));font-weight:500}.data-table__sortable{cursor:pointer;user-select:none}.data-table__sortable:hover{color:hsl(var(--foreground))}.status-badge--error,.status-badge--rate_limited{background:hsl(var(--destructive) / .1);color:hsl(var(--destructive))}.status-badge--rate_limited a{color:inherit;text-decoration:none}.status-badge--rate_limited a:hover{text-decoration:underline}.tier-badge{display:inline-flex;align-items:center;vertical-align:middle;font-size:var(--font-size-2xs, 10px);padding:1px 6px;border-radius:var(--radius-sm);font-weight:500;margin-left:6px;text-transform:uppercase;letter-spacing:.5px}.tier-badge--simple{background:hsl(var(--success) / .1);color:hsl(var(--success))}.tier-badge--standard{background:hsl(var(--chart-2) / .15);color:hsl(var(--chart-2))}.tier-badge--complex{background:hsl(var(--chart-5) / .15);color:hsl(var(--chart-5))}.tier-badge--reasoning{background:hsl(var(--destructive) / .1);color:hsl(var(--destructive))}.feed-item{display:flex;align-items:flex-start;gap:12px;padding:12px 0;border-bottom:1px solid hsl(var(--border));transition:background var(--transition-fast)}.skill-dot{width:6px;height:6px;border-radius:50%;flex-shrink:0;margin-top:7px;background:hsl(var(--muted-foreground))}.skill-dot--active{background:hsl(var(--chart-1))}.feed-item__icon{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;background:hsl(var(--muted));color:hsl(var(--muted-foreground));margin-top:2px}.feed-item__body{flex:1;min-width:0}.feed-item__desc{font-size:var(--font-size-sm);color:hsl(var(--foreground));line-height:1.4}.feed-item__sub{display:flex;align-items:center;gap:6px;margin-top:3px;font-size:var(--font-size-xs);color:hsl(var(--muted-foreground))}.feed-item__sub span+span:before{content:"·";margin-right:6px}.feed-item__status{flex-shrink:0;margin-top:4px}.empty-state__img-wrapper{position:relative;width:50%;margin:var(--gap-xl) auto 0;overflow:hidden}.empty-state__img-wrapper:after{content:"";position:absolute;inset:0;background:linear-gradient(to bottom,transparent 60%,hsl(var(--background)));pointer-events:none}.empty-state__img{display:block;width:100%}.dark .empty-state__img{filter:invert(.92) hue-rotate(180deg)}.agents-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:var(--gap-lg)}.agent-card{background:hsl(var(--card));border:1px solid hsl(var(--border));border-radius:var(--radius);padding:var(--gap-lg);box-shadow:var(--card-shadow);text-decoration:none;color:inherit;transition:all var(--transition-base);animation:fadeInUp .3s ease-out both}.agent-card:hover{box-shadow:var(--card-shadow-hover);border-color:hsl(var(--foreground) / .2)}.agent-card--skeleton{pointer-events:none}.agent-card__top{margin-bottom:var(--gap-sm)}.agent-card__name{font-size:var(--font-size-base);font-weight:600;color:hsl(var(--foreground))}.agent-card__stats{display:flex;flex-wrap:wrap;gap:var(--gap-sm) var(--gap-md);margin-bottom:var(--gap-md)}.agent-card__stat{display:flex;align-items:baseline;gap:4px}.agent-card__stat-value{font-size:var(--font-size-sm);font-weight:500;font-family:var(--font-mono);color:hsl(var(--foreground))}.agent-card__stat-label{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));width:55px;flex-shrink:0}.agent-card__chart{margin:0 calc(var(--gap-lg) * -1) calc(var(--gap-lg) * -1);overflow:hidden;border-radius:0 0 var(--radius) var(--radius);background:transparent}.agent-card__chart svg{width:100%;height:50px}.account-modal{position:fixed;inset:0;top:var(--header-height);z-index:30;background:hsl(var(--background));overflow-y:auto}.account-modal__inner{max-width:680px;margin-inline:auto;padding:var(--gap-xl) var(--gap-lg)}.account-modal__back{display:inline-flex;align-items:center;gap:4px;padding:0;border:none;background:transparent;color:hsl(var(--muted-foreground));font-size:var(--font-size-sm);font-family:var(--font-family);cursor:pointer;margin-bottom:var(--gap-lg);transition:color var(--transition-fast)}.account-modal__back:hover{color:hsl(var(--foreground))}.settings-section__title{font-size:var(--font-size-base);font-weight:600;color:hsl(var(--foreground));margin-bottom:var(--gap-md);margin-top:var(--gap-xl)}.settings-section__title:first-of-type{margin-top:0}.settings-card{background:hsl(var(--card));border:1px solid hsl(var(--border));border-radius:var(--radius);margin-bottom:var(--gap-lg);overflow:hidden}.settings-card__row{display:flex;align-items:center;justify-content:space-between;gap:var(--gap-xl);padding:var(--gap-lg);border-bottom:1px solid hsl(var(--border))}.settings-card__row:last-child{border-bottom:none}.settings-card__label{flex:1;min-width:0}.settings-card__label-title{display:block;font-size:var(--font-size-sm);font-weight:500;color:hsl(var(--foreground))}.settings-card__label-desc{display:block;font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));margin-top:2px}.settings-card__control{flex-shrink:0;width:260px}.settings-card__input{width:100%;height:2.25rem;padding:0 .75rem;background:hsl(var(--background));color:hsl(var(--foreground));border:1px solid hsl(var(--input));border-radius:var(--radius);font-size:var(--font-size-sm);font-family:var(--font-family);transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.settings-card__input:focus{outline:none;border-color:hsl(var(--ring));box-shadow:0 0 0 2px hsl(var(--ring) / .2)}.settings-card__input[readonly]{opacity:.6;cursor:default}.settings-card__footer{display:flex;justify-content:flex-end;padding:var(--gap-sm) var(--gap-lg);background:hsl(var(--muted) / .3);border-top:1px solid hsl(var(--border))}.settings-card__body{padding:var(--gap-md) var(--gap-lg)}.settings-card__desc{font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));margin-bottom:var(--gap-md)}.settings-card__id-row{display:inline-flex;align-items:center;gap:var(--gap-sm);padding:var(--gap-sm) var(--gap-md);background:hsl(var(--muted) / .5);border:1px solid hsl(var(--border));border-radius:var(--radius)}.settings-card__id-value{font-family:var(--font-mono);font-size:var(--font-size-sm);color:hsl(var(--foreground))}.settings-card__copy-btn{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;background:transparent;color:hsl(var(--muted-foreground));border-radius:calc(var(--radius) - 2px);cursor:pointer;transition:all var(--transition-fast)}.settings-card__copy-btn:hover{background:hsl(var(--accent));color:hsl(var(--foreground))}.theme-picker{display:flex;gap:var(--gap-sm)}.theme-picker__option{display:flex;align-items:center;gap:var(--gap-sm);padding:var(--gap-sm) var(--gap-md);border:1px solid hsl(var(--border));border-radius:var(--radius);background:transparent;color:hsl(var(--muted-foreground));font-size:var(--font-size-sm);font-family:var(--font-family);cursor:pointer;transition:all var(--transition-fast)}.theme-picker__option:hover{border-color:hsl(var(--foreground) / .3);color:hsl(var(--foreground))}.theme-picker__option--active{border-color:hsl(var(--chart-1));color:hsl(var(--foreground));background:hsl(var(--chart-1) / .08)}.modal{background:hsl(var(--background));border:none;border-radius:var(--radius);width:90%;max-width:680px;max-height:80vh;display:flex;flex-direction:column;box-shadow:var(--card-shadow),0 25px 50px -12px #00000040;animation:fadeInUp .2s ease-out}.modal-overlay{position:fixed;inset:0;z-index:100;background:#fbf9f3e0;backdrop-filter:blur(2px);display:flex;align-items:center;justify-content:center;padding:var(--gap-lg);animation:fadeIn .15s ease-out}.dark .modal-overlay{background:#000000b3}.modal-card{background:hsl(var(--card));border:1px solid hsl(var(--border));border-radius:16px;box-shadow:0 0 25px #00000015;width:100%;max-width:520px;padding:32px;animation:fadeInUp .2s ease-out}.modal-card__title{font-size:var(--font-size-xl);font-weight:700;color:hsl(var(--foreground));margin-bottom:4px}.modal-card__desc{font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));margin-bottom:var(--gap-lg);line-height:1.5}.modal-card__desc strong{color:hsl(var(--chart-1));font-weight:600}.modal-card__note{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));text-align:center;margin-bottom:var(--gap-md)}.modal-card__privacy{display:flex;align-items:flex-start;gap:var(--gap-sm);padding:10px 12px;background:hsl(var(--chart-1) / .08);border:1px solid hsl(var(--chart-1) / .2);border-radius:var(--radius);font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));line-height:1.5;margin-bottom:var(--gap-lg)}.modal-card__privacy svg{flex-shrink:0;margin-top:1px;color:hsl(var(--chart-1))}.modal-card__privacy strong{color:hsl(var(--chart-1))}.modal-card__field-label{display:block;font-size:var(--font-size-sm);font-weight:500;color:hsl(var(--foreground));margin-top:var(--gap-md);margin-bottom:6px}.modal-card__field-label:first-of-type{margin-top:0}.modal-card__input{width:100%;height:2.5rem;padding:0 12px;background:hsl(var(--background));color:hsl(var(--foreground));border:1px solid hsl(var(--input));border-radius:var(--radius);font-size:var(--font-size-sm);font-family:var(--font-family);outline:none;transition:border-color var(--transition-fast),box-shadow var(--transition-fast);margin-bottom:0;box-sizing:border-box}.modal-card__input:focus{border-color:hsl(var(--ring));box-shadow:0 0 0 2px hsl(var(--ring) / .2)}.modal-card__input::placeholder{color:hsl(var(--muted-foreground))}.modal-card__input--error{border-color:hsl(var(--destructive))}.modal-card__input--error:focus{border-color:hsl(var(--destructive));box-shadow:0 0 0 2px hsl(var(--destructive) / .2)}.modal-card__cta{display:flex;align-items:center;justify-content:center;gap:var(--gap-sm);width:100%;padding:12px;border:none;border-radius:var(--radius);background:#f97015;color:#fff;font-size:var(--font-size-base);font-weight:600;font-family:var(--font-family);cursor:pointer;transition:background var(--transition-fast)}.modal-card__cta:hover:not(:disabled){background:#ef6306}.modal-card__cta:disabled{opacity:.5;cursor:not-allowed}.modal-card__back-link{display:flex;align-items:center;justify-content:center;gap:4px;width:100%;padding:8px;margin-top:var(--gap-sm);border:none;background:transparent;color:hsl(var(--muted-foreground));font-size:var(--font-size-sm);font-family:var(--font-family);cursor:pointer;transition:color var(--transition-fast)}.modal-card__back-link:hover{color:hsl(var(--foreground))}.modal-card__footer{display:flex;justify-content:flex-end;margin-top:var(--gap-xl)}.modal-card__footer .btn:disabled{opacity:.4;cursor:not-allowed}.modal-stepper{display:flex;align-items:center;gap:0;margin-bottom:var(--gap-xl)}.modal-stepper__step{display:flex;align-items:center;gap:8px}.modal-stepper__circle{width:28px;height:28px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:var(--font-size-xs);font-weight:600;background:hsl(var(--muted));color:hsl(var(--muted-foreground));transition:all var(--transition-base)}.modal-stepper__step--active .modal-stepper__circle,.modal-stepper__step--done .modal-stepper__circle{background:hsl(var(--chart-1));color:#fff}.modal-stepper__label{font-size:var(--font-size-sm);font-weight:500;color:hsl(var(--muted-foreground))}.modal-stepper__step--active .modal-stepper__label,.modal-stepper__step--done .modal-stepper__label{color:hsl(var(--foreground))}.modal-stepper__line{flex:1;height:1px;background:hsl(var(--border));margin:0 12px;min-width:24px}@layer base{:root{--background: 45 49% 97%;--foreground: 222.2 84% 4.9%;--card: 44 60% 99%;--card-foreground: 222.2 84% 4.9%;--popover: 44 60% 99%;--popover-foreground: 222.2 84% 4.9%;--primary: 222.2 47.4% 11.2%;--primary-foreground: 45 30% 97%;--secondary: 40 33% 93%;--secondary-foreground: 222.2 47.4% 11.2%;--muted: 40 33% 93%;--muted-foreground: 215.4 16.3% 46.9%;--accent: 40 33% 93%;--accent-foreground: 222.2 47.4% 11.2%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 45 30% 97%;--border: 36 25% 88%;--input: 36 25% 88%;--ring: 222.2 84% 4.9%;--radius: .5rem;--chart-1: 178 75% 44%;--chart-2: 197 37% 24%;--chart-3: 167 70% 48%;--bar-input: 178 75% 34%;--bar-output: 178 55% 72%;--chart-4: 349 52% 61%;--chart-5: 43 96% 56%;--sidebar-background: 43 38% 95%;--sidebar-foreground: 240 5.3% 26.1%;--sidebar-primary: 240 5.9% 10%;--sidebar-primary-foreground: 45 30% 97%;--sidebar-accent: 40 28% 93%;--sidebar-accent-foreground: 240 5.9% 10%;--sidebar-border: 36 20% 89%;--sidebar-ring: 217.2 91.2% 59.8%;--success: 178 75% 44%;--success-foreground: 0 0% 100%}.dark{--background: 0 0% 9%;--foreground: 0 0% 93%;--card: 0 0% 11%;--card-foreground: 0 0% 93%;--popover: 0 0% 11%;--popover-foreground: 0 0% 93%;--primary: 0 0% 93%;--primary-foreground: 0 0% 9%;--secondary: 0 0% 15%;--secondary-foreground: 0 0% 93%;--muted: 0 0% 15%;--muted-foreground: 0 0% 55%;--accent: 0 0% 15%;--accent-foreground: 0 0% 93%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 0 0% 93%;--border: 0 0% 18%;--input: 0 0% 18%;--ring: 0 0% 60%;--chart-1: 178 70% 50%;--chart-2: 197 50% 55%;--chart-3: 167 70% 55%;--chart-4: 349 52% 65%;--chart-5: 43 96% 65%;--bar-input: 178 70% 40%;--bar-output: 178 50% 70%;--sidebar-background: 0 0% 7%;--sidebar-foreground: 0 0% 93%;--sidebar-primary: 0 0% 93%;--sidebar-primary-foreground: 0 0% 9%;--sidebar-accent: 0 0% 14%;--sidebar-accent-foreground: 0 0% 93%;--sidebar-border: 0 0% 18%;--sidebar-ring: 0 0% 60%;--success: 178 70% 50%;--success-foreground: 0 0% 100%}}:root{--sidebar-width: 230px;--header-height: 48px;--gap-xs: 4px;--gap-sm: 8px;--gap-md: 16px;--gap-lg: 24px;--gap-xl: 32px;--gap-2xl: 48px;--font-family: "Inter", -apple-system, BlinkMacSystemFont, system-ui, sans-serif;--font-mono: "JetBrains Mono", "SF Mono", ui-monospace, monospace;--font-size-xs: .75rem;--font-size-sm: .875rem;--font-size-base: .9375rem;--font-size-lg: 1.125rem;--font-size-xl: 1.5rem;--font-size-2xl: 1.875rem;--font-size-3xl: 2.25rem;--font-size-4xl: 3rem;--transition-fast: .15s cubic-bezier(.4, 0, .2, 1);--transition-base: .2s cubic-bezier(.4, 0, .2, 1);--card-shadow: rgba(0, 0, 0, .06) 0px 0px 0px 1px, rgba(0, 0, 0, .03) 0px 2px 6px 0px;--card-shadow-hover: rgba(0, 0, 0, .08) 0px 0px 0px 1px, rgba(0, 0, 0, .06) 0px 3px 8px 0px}.modal-terminal{border-radius:var(--radius);overflow:hidden;border:1px solid hsl(var(--border));margin-bottom:var(--gap-md)}.modal-terminal__header{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;background:hsl(var(--muted));border-bottom:1px solid hsl(var(--border))}.modal-terminal__dots{display:flex;gap:6px}.modal-terminal__dot{width:10px;height:10px;border-radius:50%}.modal-terminal__dot--red{background:#ff5f57}.modal-terminal__dot--yellow{background:#febc2e}.modal-terminal__dot--green{background:#28c840}.modal-terminal__tabs{display:flex;align-items:center;gap:4px;font-size:var(--font-size-xs)}.modal-terminal__tab{padding:0;border:none;background:transparent;color:hsl(var(--muted-foreground));font-size:var(--font-size-xs);font-family:var(--font-family);cursor:pointer;font-weight:500}.modal-terminal__tab--active{color:hsl(var(--foreground));font-weight:600}.modal-terminal__tab:focus-visible{outline:2px solid hsl(var(--ring));outline-offset:2px;border-radius:2px}.modal-terminal__tab-sep{color:hsl(var(--muted-foreground))}.modal-terminal__body{position:relative;padding:14px 16px;background:hsl(var(--background));font-family:var(--font-mono);font-size:var(--font-size-xs);line-height:1.7;color:hsl(var(--foreground))}.dark .modal-terminal__body{background:#080c16;color:#20dfd9}.modal-terminal__line--comment{color:hsl(var(--muted-foreground))}.modal-terminal__prompt{color:hsl(var(--chart-1));margin-right:8px}.dark .modal-terminal__prompt{color:hsl(var(--muted-foreground))}.modal-terminal__code{word-break:break-all}.modal-terminal__copy{position:absolute;top:12px;right:12px;padding:6px;border:none;border-radius:var(--radius);background:#0000000f;color:#0006;cursor:pointer;transition:all var(--transition-fast)}.modal-terminal__copy:hover{background:#0000001a;color:#000000b3}.dark .modal-terminal__copy{background:#ffffff1a;color:#ffffff80}.dark .modal-terminal__copy:hover{background:#fff3;color:#fffc}.modal-terminal__copy:focus-visible{outline:2px solid hsl(var(--ring));outline-offset:2px}.modal-key-box{border:1px solid hsl(var(--chart-5) / .3);border-radius:var(--radius);overflow:hidden;margin-bottom:var(--gap-lg)}.modal-key-box__header{display:flex;align-items:center;justify-content:space-between;padding:10px 14px}.modal-key-box__label{font-size:var(--font-size-xs);font-weight:600;letter-spacing:.05em;color:hsl(var(--muted-foreground))}.modal-key-box__copy{display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border:1px solid hsl(var(--border));border-radius:var(--radius);background:transparent;color:hsl(var(--foreground));font-size:var(--font-size-xs);font-family:var(--font-family);font-weight:500;cursor:pointer;transition:all var(--transition-fast)}.modal-key-box__copy:hover{background:hsl(var(--accent))}.modal-key-box__value{display:block;padding:12px 14px;background:hsl(var(--muted));color:hsl(var(--foreground));font-family:var(--font-mono);font-size:var(--font-size-xs);word-break:break-all;line-height:1.6}.dark .modal-key-box__value{background:#080c16;color:#20dfd9}.modal-key-box__warning{display:flex;align-items:flex-start;gap:var(--gap-sm);padding:10px 14px;background:hsl(var(--chart-5) / .08);border-top:1px solid hsl(var(--chart-5) / .2);font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));line-height:1.5}.modal-key-box__warning svg{flex-shrink:0;margin-top:1px;color:hsl(var(--chart-5))}.notif-hint{display:flex;align-items:flex-start;gap:10px;margin-top:var(--gap-xl);margin-bottom:var(--gap-md);padding:12px 16px;background:hsl(var(--chart-1) / .06);border:1px solid hsl(var(--chart-1) / .18);border-radius:var(--radius);font-size:var(--font-size-sm);color:hsl(var(--foreground));line-height:1.5}.notif-hint svg{flex-shrink:0;margin-top:2px;color:hsl(var(--chart-1))}.notif-hint p{margin:0}.settings-card--disabled{opacity:.45;pointer-events:none;user-select:none}.notif-table{width:100%;border-collapse:collapse;font-size:var(--font-size-sm)}.notif-table thead th{text-align:left;font-weight:500;font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));padding:var(--gap-sm) var(--gap-lg);border-bottom:1px solid hsl(var(--border));white-space:nowrap}.notif-table tbody td{padding:var(--gap-sm) var(--gap-lg);color:hsl(var(--foreground));border-bottom:1px solid hsl(var(--border));white-space:nowrap}.notif-table tbody tr:last-child td{border-bottom:none}.notif-table__mono{font-family:var(--font-mono)}.notif-table__row--disabled td{opacity:.45}.notif-table__row--disabled td:last-child{opacity:1}.notif-table__actions{text-align:right;display:flex;align-items:center;justify-content:flex-end;gap:var(--gap-sm)}.notification-rule__edit,.notification-rule__delete{color:hsl(var(--muted-foreground));padding:4px;height:auto}.notification-rule__edit:hover{color:hsl(var(--foreground))}.notification-rule__delete:hover{color:hsl(var(--destructive))}.notification-toggle{position:relative;display:inline-flex;cursor:pointer}.notification-toggle input{opacity:0;width:0;height:0;position:absolute}.notification-toggle__slider{width:36px;height:20px;background:hsl(var(--muted));border-radius:9999px;transition:background var(--transition-fast);position:relative}.notification-toggle__slider:after{content:"";position:absolute;width:16px;height:16px;border-radius:50%;background:#fff;top:2px;left:2px;transition:transform var(--transition-fast)}.notification-toggle input:checked+.notification-toggle__slider{background:hsl(var(--success))}.notification-toggle input:checked+.notification-toggle__slider:after{transform:translate(16px)}.notification-modal__select{width:100%;height:2.5rem}.provider-setup__title{margin:0 0 4px;font-size:var(--font-size-md);font-weight:600;color:hsl(var(--foreground))}.provider-setup__subtitle{margin:0 0 var(--gap-lg);font-size:var(--font-size-sm);color:hsl(var(--muted-foreground))}.provider-setup-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--gap-md)}.provider-setup-card{display:flex;align-items:center;gap:12px;padding:16px 20px;background:hsl(var(--card));border:1px solid hsl(var(--border));border-radius:var(--radius);cursor:pointer;text-align:left;font-family:var(--font-family);transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.provider-setup-card:hover{border-color:hsl(var(--foreground) / .3);box-shadow:0 1px 4px hsl(var(--foreground) / .06)}.provider-setup-card__logo{width:32px;height:32px;border-radius:6px;flex-shrink:0;object-fit:contain}.provider-setup-card__name{font-size:var(--font-size-sm);font-weight:600;color:hsl(var(--foreground))}.provider-setup-card__desc{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground))}.provider-modal-picker{display:flex;gap:var(--gap-sm)}.provider-modal-option{flex:1;display:flex;align-items:center;gap:8px;padding:10px 14px;background:hsl(var(--background));border:1px solid hsl(var(--border));border-radius:var(--radius);cursor:pointer;font-family:var(--font-family);font-size:var(--font-size-sm);font-weight:500;color:hsl(var(--muted-foreground));transition:border-color var(--transition-fast),color var(--transition-fast)}.provider-modal-option:hover{border-color:hsl(var(--foreground) / .3)}.provider-modal-option--active{border-color:hsl(var(--primary));color:hsl(var(--foreground))}.provider-modal-option__logo{width:22px;height:22px;border-radius:4px;object-fit:contain}.provider-card{background:hsl(var(--card));border:1px solid hsl(var(--border));border-radius:var(--radius);padding:16px 20px;margin-bottom:var(--gap-lg)}.provider-card__header{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.provider-card__label{font-size:var(--font-size-base);font-weight:600;color:hsl(var(--foreground));margin-bottom:0}.provider-card__actions{display:flex;gap:4px}.provider-card__body{display:flex;align-items:center;gap:12px}.provider-card__logo{width:36px;height:36px;border-radius:8px;flex-shrink:0;object-fit:contain}.provider-card__name{font-size:var(--font-size-sm);font-weight:600;color:hsl(var(--foreground))}.provider-card__meta{display:flex;align-items:center;gap:8px;font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));font-family:var(--font-mono);margin-top:2px}.provider-card__key{opacity:.5}.provider-card__email{display:flex;align-items:center;gap:4px;opacity:.7}.provider-card__menu{position:relative}.provider-card__menu-btn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;border-radius:var(--radius);background:transparent;color:hsl(var(--muted-foreground));cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast)}.provider-card__menu-btn:hover{background:hsl(var(--accent));color:hsl(var(--foreground))}.provider-card__dropdown{position:absolute;top:100%;right:0;min-width:150px;margin-top:4px;background:hsl(var(--popover));border:1px solid hsl(var(--border));border-radius:var(--radius);box-shadow:0 4px 12px hsl(var(--foreground) / .08);padding:4px;z-index:20;animation:fadeIn .1s ease-out}.provider-card__dropdown-item{display:flex;align-items:center;gap:8px;width:100%;padding:8px 10px;border:none;border-radius:calc(var(--radius) - 2px);background:transparent;color:hsl(var(--foreground));font-size:var(--font-size-sm);font-family:var(--font-family);cursor:pointer;transition:background var(--transition-fast)}.provider-card__dropdown-item:hover{background:hsl(var(--accent))}.provider-card__dropdown-item--danger:hover{background:hsl(var(--destructive) / .1);color:hsl(var(--destructive))}.masked-key{display:flex;align-items:center;gap:var(--gap-sm);padding:0 1px 0 14px;height:2.5rem;background:hsl(var(--muted) / .4);border:1px solid hsl(var(--border));border-radius:var(--radius)}.masked-key__value{flex:1;font-family:var(--font-mono);font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));letter-spacing:.02em}.masked-key__edit{flex-shrink:0;font-size:var(--font-size-xs);padding:4px 8px;height:auto;gap:4px}.modal-card__input--error{border-color:hsl(var(--destructive));margin-bottom:0}.modal-card__field-error{margin:4px 0 0;padding:0;font-size:var(--font-size-xs);color:hsl(var(--destructive));line-height:1.4}.modal-card__field-hint{margin:4px 0 0;padding:0;font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));line-height:1.4}.modal-card__footer--split{display:flex;justify-content:space-between;align-items:center}.cloud-email-info{display:flex;align-items:flex-start;gap:12px;padding:16px 20px;background:hsl(var(--card));border:1px solid hsl(var(--border));border-radius:var(--radius)}.cloud-email-info__icon{flex-shrink:0;margin-top:2px;color:hsl(var(--success))}.cloud-email-info__title{font-size:var(--font-size-sm);font-weight:600;color:hsl(var(--foreground));margin-bottom:2px}.cloud-email-info__desc{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));line-height:1.5}.limit-type-badge{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:9999px;font-size:var(--font-size-xs);font-weight:500;white-space:nowrap}.limit-type-badge--alert{background:hsl(var(--chart-1) / .1);color:hsl(var(--chart-1))}.limit-type-badge--hard{background:hsl(var(--chart-5) / .15);color:hsl(var(--chart-5))}.limits-warning-banner{display:flex;align-items:flex-start;gap:10px;margin-bottom:var(--gap-lg);padding:12px 16px;background:hsl(var(--destructive) / .06);border:1px solid hsl(var(--destructive) / .18);border-radius:var(--radius);font-size:var(--font-size-sm);color:hsl(var(--foreground));line-height:1.5}.limits-warning-banner svg{flex-shrink:0;margin-top:2px;color:hsl(var(--destructive))}.limits-routing-cta{display:flex;align-items:flex-start;gap:10px;margin-bottom:var(--gap-lg);padding:12px 16px;background:hsl(var(--chart-1) / .06);border:1px solid hsl(var(--chart-1) / .18);border-radius:var(--radius);font-size:var(--font-size-sm);color:hsl(var(--foreground));line-height:1.5}.limits-routing-cta svg{flex-shrink:0;margin-top:2px;color:hsl(var(--chart-1))}.limits-routing-cta p{margin:4px 0 0;color:hsl(var(--muted-foreground))}.limit-modal__row{display:grid;grid-template-columns:1fr 1fr;gap:var(--gap-md)}.limit-modal__row .modal-card__field-label{margin-top:0}.limit-type-selector{display:flex;gap:var(--gap-sm)}.limit-type-option{flex:1;display:flex;align-items:center;gap:8px;padding:10px 14px;background:hsl(var(--background));border:1px solid hsl(var(--border));border-radius:var(--radius);cursor:pointer;font-family:var(--font-family);font-size:var(--font-size-sm);font-weight:500;color:hsl(var(--muted-foreground));transition:border-color var(--transition-fast),color var(--transition-fast)}.limit-type-option:hover:not(:disabled){border-color:hsl(var(--foreground) / .3)}.limit-type-option--active{border-color:hsl(var(--primary));color:hsl(var(--foreground))}.limit-type-option--disabled{opacity:.45;cursor:not-allowed}.provider-modal__list{padding:8px 0;max-height:400px;overflow-y:auto}.provider-modal__footer{padding:16px 24px;border-top:1px solid hsl(var(--border));display:flex;justify-content:flex-end}.provider-toggle{display:flex;align-items:center;gap:var(--gap-sm);width:100%;padding:10px 24px;background:none;border:none;cursor:pointer;font-family:var(--font-family);text-align:left;transition:background var(--transition-fast)}.provider-toggle:hover{background:hsl(var(--muted) / .5)}.provider-toggle:focus-visible{outline:2px solid hsl(var(--ring));outline-offset:-2px}.provider-toggle:disabled{opacity:.6;cursor:not-allowed}.provider-toggle__icon{width:28px;height:28px;flex-shrink:0;display:flex;align-items:center;justify-content:center;color:hsl(var(--foreground))}.provider-toggle__info{flex:1;display:flex;flex-direction:column;gap:1px;min-width:0}.provider-toggle__name{font-size:var(--font-size-sm);font-weight:500;color:hsl(var(--foreground))}.provider-toggle__subtitle{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground))}.provider-toggle__switch{position:relative;width:36px;height:20px;background:hsl(var(--muted));border-radius:10px;flex-shrink:0;transition:background var(--transition-fast)}.provider-toggle__switch--on{background:hsl(var(--success))}.provider-toggle__switch-thumb{position:absolute;top:2px;left:2px;width:16px;height:16px;background:#fff;border-radius:50%;transition:transform var(--transition-fast);box-shadow:0 1px 2px #00000026}.provider-toggle__switch--on .provider-toggle__switch-thumb{transform:translate(16px)}.provider-toggle__badge{font-size:var(--font-size-xs);font-weight:500;color:hsl(var(--muted-foreground));padding:2px 8px;border-radius:9999px;background:hsl(var(--muted) / .6);white-space:nowrap;flex-shrink:0}.provider-toggle__badge--connected{color:hsl(var(--success));background:hsl(var(--success) / .12)}.provider-toggle__expand{padding:0 24px 12px 60px}.provider-toggle__key-row{display:flex;align-items:center;gap:8px}.provider-toggle__key-input{flex:1;height:2rem;padding:0 10px;background:hsl(var(--muted) / .4);color:hsl(var(--foreground));border:1px solid hsl(var(--border));border-radius:var(--radius);font-size:var(--font-size-sm);font-family:var(--font-family);outline:none;transition:border-color var(--transition-fast);box-sizing:border-box}.provider-toggle__key-input:focus{border-color:hsl(var(--ring));box-shadow:0 0 0 2px hsl(var(--ring) / .2)}.provider-toggle__key-input::placeholder{color:hsl(var(--muted-foreground) / .6)}.provider-toggle__disconnect-btn{color:hsl(var(--destructive));border-color:hsl(var(--destructive) / .3)}.provider-toggle__disconnect-btn:hover{background:hsl(var(--destructive) / .08)}.provider-detail{padding:20px 24px 24px;overflow:hidden}.provider-detail__header{display:flex;align-items:center;gap:var(--gap-sm);margin-bottom:20px}.provider-detail__back{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;padding:0;color:hsl(var(--muted-foreground));cursor:pointer;margin-bottom:12px;transition:color var(--transition-fast)}.provider-detail__back:hover{color:hsl(var(--foreground))}.provider-detail__icon{width:40px;height:40px;display:flex;align-items:center;justify-content:center;flex-shrink:0;color:hsl(var(--foreground))}.provider-detail__title-group{flex:1;min-width:0}.provider-detail__name{font-size:var(--font-size-md);font-weight:600;color:hsl(var(--foreground))}.provider-detail__subtitle{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground))}.provider-detail__field{margin-bottom:16px}.provider-detail__label{display:block;font-size:var(--font-size-sm);font-weight:500;color:hsl(var(--foreground));margin-bottom:6px}.provider-detail__input{width:100%;height:2.25rem;padding:0 12px;background:hsl(var(--muted) / .4);color:hsl(var(--foreground));border:1px solid hsl(var(--border));border-radius:var(--radius);font-size:var(--font-size-sm);font-family:var(--font-family);outline:none;transition:border-color var(--transition-fast);box-sizing:border-box}.provider-detail__input:focus{border-color:hsl(var(--ring));box-shadow:0 0 0 2px hsl(var(--ring) / .2)}.provider-detail__input::placeholder{color:hsl(var(--muted-foreground) / .6)}.provider-detail__input--disabled{opacity:.7;font-family:var(--font-mono, monospace);letter-spacing:.05em;cursor:not-allowed}.provider-detail__input--error{border-color:hsl(var(--destructive))}.provider-detail__input--error:focus{box-shadow:0 0 0 2px hsl(var(--destructive) / .2)}.provider-detail__error{font-size:var(--font-size-xs);color:hsl(var(--destructive));margin-top:4px}.provider-detail__key-row{display:flex;align-items:center;gap:8px}.provider-detail__key-row .provider-detail__input{flex:1;min-width:0}.provider-detail__key-row .btn{height:2.25rem;flex-shrink:0;white-space:nowrap}.provider-detail__action{width:auto;margin-top:4px;float:right}.provider-detail__no-key{font-size:var(--font-size-sm);color:hsl(var(--muted-foreground))}.provider-detail__disconnect{color:hsl(var(--destructive));border-color:hsl(var(--destructive) / .3)}.provider-detail__disconnect:hover{background:hsl(var(--destructive) / .08)}.provider-detail__disconnect-icon{width:2.25rem;height:2.25rem;display:flex;align-items:center;justify-content:center;background:none;border:1px solid hsl(var(--border));border-radius:var(--radius);color:hsl(var(--muted-foreground));cursor:pointer;flex-shrink:0;transition:background var(--transition-fast),color var(--transition-fast)}.provider-detail__disconnect-icon:hover{background:hsl(var(--muted) / .5);color:hsl(var(--foreground))}.provider-detail__disconnect-icon:disabled{opacity:.5;cursor:not-allowed}.provider-modal__view{animation:modalSlideIn .22s cubic-bezier(.22,1,.36,1) both}.provider-modal__view--from-left{animation-name:modalSlideFromLeft}.provider-modal__view--from-right{animation-name:modalSlideFromRight}@keyframes modalSlideFromRight{0%{opacity:0;transform:translate(40px)}to{opacity:1;transform:translate(0)}}@keyframes modalSlideFromLeft{0%{opacity:0;transform:translate(-40px)}to{opacity:1;transform:translate(0)}}@keyframes modalSlideIn{0%{opacity:0}to{opacity:1}}.provider-card__logo-letter{width:28px;height:28px;border-radius:6px;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;color:#fff;letter-spacing:-.02em}.routing-modal__header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px 16px;flex-shrink:0}.routing-modal__title{font-size:var(--font-size-lg);font-weight:600;color:hsl(var(--foreground))}.routing-modal__subtitle{font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));margin-top:2px}.routing-modal__search-wrap{position:relative;padding:0 24px;flex-shrink:0}.routing-modal__search-icon{position:absolute;left:38px;top:50%;transform:translateY(-50%);color:hsl(var(--muted-foreground) / .6);pointer-events:none}.routing-modal__search{width:100%;height:2.75rem;padding:0 16px 0 38px;background:hsl(var(--muted) / .4);color:hsl(var(--foreground));border:none;border-radius:var(--radius);font-size:var(--font-size-sm);font-family:var(--font-family);outline:none;transition:background var(--transition-fast),box-shadow var(--transition-fast);box-sizing:border-box}.routing-modal__search:focus{background:hsl(var(--muted) / .6);box-shadow:0 0 0 2px hsl(var(--ring) / .2)}.routing-modal__search::placeholder{color:hsl(var(--muted-foreground) / .7)}.routing-modal__list{overflow-y:auto;flex:1;min-height:0;padding:0;margin-top:12px;border-top:1px solid hsl(var(--border))}.routing-modal__group{border-bottom:1px solid hsl(var(--border))}.routing-modal__group:last-child{border-bottom:none}.routing-modal__group-header{display:flex;align-items:center;gap:8px;padding:10px 24px 6px;position:sticky;top:0;background:hsl(var(--card));z-index:1}.routing-modal__group-icon{display:flex;align-items:center;flex-shrink:0}.routing-modal__group-name{font-size:var(--font-size-xs);font-weight:600;color:hsl(var(--muted-foreground));text-transform:uppercase;letter-spacing:.04em}.routing-modal__model{display:flex;align-items:center;justify-content:space-between;gap:var(--gap-md);width:100%;padding:9px 24px 9px 48px;background:none;border:none;border-top:1px solid hsl(var(--border) / .5);cursor:pointer;font-family:var(--font-family);text-align:left;transition:background var(--transition-fast)}.routing-modal__model:first-child{border-top:none}.routing-modal__model:hover{background:hsl(var(--muted) / .5)}.routing-modal__model:focus-visible{outline:2px solid hsl(var(--ring));outline-offset:-2px}.routing-modal__model-label{font-size:var(--font-size-sm);font-weight:500;color:hsl(var(--foreground))}.routing-modal__model-id{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));font-family:var(--font-mono, monospace)}.routing-modal__recommended{font-size:var(--font-size-xs);color:hsl(var(--success));font-weight:500;margin-left:4px}.routing-modal__empty{padding:24px;text-align:center;font-size:var(--font-size-sm);color:hsl(var(--muted-foreground))}.routing-enable-card{display:flex;flex-direction:column;align-items:center;text-align:center;padding:48px 32px;background:hsl(var(--card));border:1px solid hsl(var(--border));border-radius:var(--radius)}.routing-enable-card__icon{color:hsl(var(--muted-foreground));margin-bottom:var(--gap-lg)}.routing-enable-card__title{font-size:var(--font-size-lg);font-weight:600;color:hsl(var(--foreground));margin:0 0 var(--gap-sm)}.routing-enable-card__desc{font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));max-width:400px;line-height:1.6;margin:0 0 var(--gap-xl)}.routing-page-header{display:flex;align-items:flex-start;justify-content:space-between}.routing-providers-info{display:inline-flex;align-items:center;gap:8px;margin-bottom:var(--gap-lg)}.routing-providers-info__icons{display:inline-flex;align-items:center;gap:4px}.routing-providers-info__icon{display:flex;align-items:center;position:relative;cursor:default}.routing-providers-info__label{font-size:var(--font-size-sm);font-weight:500;color:hsl(var(--muted-foreground))}.routing-cards{display:flex;flex-direction:column;gap:8px}.routing-card{display:flex;align-items:center;gap:var(--gap-lg);padding:16px 20px;background:hsl(var(--card));border:1px solid hsl(var(--border));border-radius:var(--radius)}.routing-card__header{flex:0 0 420px;max-width:420px;min-width:420px;display:flex;flex-direction:column;gap:2px}.routing-card__tier{font-size:var(--font-size-sm);font-weight:600;color:hsl(var(--foreground))}.routing-card__desc{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));line-height:1.4}.routing-card__body{flex:1;min-width:0}.routing-card__main{font-size:var(--font-size-sm);font-weight:500;color:hsl(var(--foreground));display:block}.routing-card__sub{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));display:block;margin-top:2px}.routing-card__override{display:inline-flex;align-items:center;gap:8px}.routing-card__override-icon{display:flex;align-items:center;flex-shrink:0}.routing-card__auto-tag{font-size:var(--font-size-xs);font-weight:600;line-height:1;padding:3px 6px;border-radius:4px;background:hsl(var(--success) / .15);color:hsl(var(--success));text-transform:lowercase;letter-spacing:.02em}.routing-card__empty{display:flex;flex-direction:column;gap:2px}.routing-card__empty-text{font-size:var(--font-size-sm);color:hsl(var(--muted-foreground))}.routing-card__empty-link{font-size:var(--font-size-xs);color:hsl(var(--foreground));text-decoration:underline;background:none;border:none;cursor:pointer;font-family:var(--font-family);padding:0;text-align:left}.routing-card__actions{flex-shrink:0}.routing-action{font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));background:none;border:none;cursor:pointer;font-family:var(--font-family);padding:4px 8px;transition:color var(--transition-fast)}.routing-action:hover{color:hsl(var(--foreground))}.routing-action:focus-visible{outline:2px solid hsl(var(--ring));outline-offset:2px;border-radius:var(--radius)}.routing-action--danger:hover{color:hsl(var(--destructive))}.routing-disable-btn{font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));background:none;border:none;cursor:pointer;font-family:var(--font-family);padding:8px 12px;border-radius:var(--radius);transition:color var(--transition-fast),background var(--transition-fast)}.routing-disable-btn:hover{color:hsl(var(--destructive));background:hsl(var(--destructive) / .08)}.routing-disable-btn:focus-visible{outline:2px solid hsl(var(--ring));outline-offset:2px}.routing-disable-btn:disabled{opacity:.6;cursor:not-allowed}.routing-footer__instructions{font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));background:none;border:none;cursor:pointer;font-family:var(--font-family);padding:8px 12px;border-radius:var(--radius);transition:color var(--transition-fast);text-decoration:underline;text-underline-offset:2px}.routing-footer__instructions:hover{color:hsl(var(--foreground))}.routing-footer__instructions:focus-visible{outline:2px solid hsl(var(--ring));outline-offset:2px}.routing-footer{display:flex;align-items:center;gap:var(--gap-md);margin-top:var(--gap-lg)}@media(max-width:768px){.routing-card{flex-direction:column;align-items:flex-start;gap:var(--gap-sm)}.routing-card__header{flex:none;max-width:100%;min-width:0}.routing-card__actions{align-self:flex-end}.provider-toggle__expand{padding-left:24px}}.info-tooltip{position:relative;display:inline-flex;align-items:center;margin-left:4px;cursor:help;vertical-align:middle}.info-tooltip__icon{color:hsl(var(--muted-foreground));opacity:.6;transition:opacity .15s}.info-tooltip:hover .info-tooltip__icon,.info-tooltip:focus .info-tooltip__icon{opacity:1}.info-tooltip__bubble{display:none;position:absolute;bottom:calc(100% + 8px);left:50%;transform:translate(-50%);padding:8px 12px;background:hsl(var(--popover));color:hsl(var(--popover-foreground));border:1px solid hsl(var(--border));border-radius:var(--radius);font-size:var(--font-size-xs);font-weight:400;line-height:1.5;white-space:normal;width:max-content;max-width:260px;box-shadow:0 2px 8px hsl(var(--foreground) / .08);z-index:50;pointer-events:none}.info-tooltip:hover .info-tooltip__bubble,.info-tooltip:focus .info-tooltip__bubble{display:block}.toast-container{position:fixed;bottom:var(--gap-lg);right:var(--gap-lg);z-index:200;display:flex;flex-direction:column;gap:var(--gap-sm);pointer-events:none;max-width:420px;width:100%}.toast{display:flex;align-items:flex-start;gap:var(--gap-sm);padding:12px var(--gap-md);border-radius:var(--radius);background:hsl(var(--card));border:1px solid hsl(var(--border));box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;pointer-events:auto;animation:toastSlideIn .2s ease-out}.toast--error .toast__icon{color:hsl(var(--destructive))}.toast--success .toast__icon{color:hsl(var(--success))}.toast--warning .toast__icon{color:hsl(var(--chart-5))}.toast__icon{flex-shrink:0;margin-top:1px}.toast__message{flex:1;font-size:var(--font-size-sm);color:hsl(var(--foreground));line-height:1.4;word-break:break-word}.toast__dismiss{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;background:transparent;color:hsl(var(--muted-foreground));border-radius:calc(var(--radius) - 2px);cursor:pointer;transition:all var(--transition-fast);margin:-2px -4px -2px 0}.toast__dismiss:hover{background:hsl(var(--muted));color:hsl(var(--foreground))}@keyframes toastSlideIn{0%{opacity:0;transform:translateY(8px) translate(8px)}to{opacity:1;transform:translateY(0) translate(0)}}@media(max-width:480px){.toast-container{left:var(--gap-sm);right:var(--gap-sm);bottom:var(--gap-sm);max-width:100%}}.model-filter{margin-bottom:var(--gap-lg)}.model-filter__row{display:flex;align-items:center;gap:var(--gap-md)}.model-filter__combobox{position:relative;flex:1;max-width:480px}.model-filter__input-wrapper{position:relative;display:flex;align-items:center}.model-filter__search-icon{position:absolute;left:12px;top:50%;transform:translateY(-50%);color:hsl(var(--muted-foreground));pointer-events:none}.model-filter__search{width:100%;height:2.5rem;padding:0 12px 0 2.25rem;background:hsl(var(--background));color:hsl(var(--foreground));border:none;border-radius:var(--radius);font-size:var(--font-size-base);font-family:var(--font-family);transition:box-shadow var(--transition-fast)}.model-filter__search::placeholder{color:hsl(var(--muted-foreground))}.model-filter__search:focus-visible{outline:none;box-shadow:0 0 0 2px hsl(var(--ring) / .25)}.model-filter__tags{display:flex;flex-wrap:wrap;gap:6px;margin-top:var(--gap-sm)}.model-filter__tag{display:inline-flex;align-items:center;gap:6px;height:1.75rem;padding:0 6px 0 10px;background:hsl(var(--secondary));border:1px solid hsl(var(--border));border-radius:9999px;font-size:var(--font-size-xs);line-height:1;white-space:nowrap;animation:fadeInUp .1s ease-out}.model-filter__tag--provider{padding-left:6px}.model-filter__tag-type{font-weight:600;line-height:1;color:hsl(var(--muted-foreground))}.model-filter__tag-value{font-weight:500;line-height:1;color:hsl(var(--foreground))}.model-filter__tag-remove{display:flex;align-items:center;justify-content:center;width:1.125rem;height:1.125rem;border:none;border-radius:9999px;background:transparent;color:hsl(var(--muted-foreground));cursor:pointer;transition:all var(--transition-fast)}.model-filter__tag-remove:hover{background:hsl(var(--muted));color:hsl(var(--foreground))}.model-filter__provider-icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;color:hsl(var(--muted-foreground))}.dark .model-filter__provider-icon--mono{filter:invert(1)}.model-filter__dropdown{position:absolute;top:calc(100% + 4px);left:0;width:100%;background:hsl(var(--popover));border:1px solid hsl(var(--border));border-radius:var(--radius);box-shadow:0 4px 12px #00000014;padding:4px 0;z-index:50;animation:fadeInUp .1s ease-out}.model-filter__dropdown-group+.model-filter__dropdown-group{border-top:1px solid hsl(var(--border));margin-top:4px;padding-top:4px}.model-filter__dropdown-label{padding:4px 14px;font-size:var(--font-size-xs);font-weight:600;color:hsl(var(--muted-foreground));text-transform:uppercase;letter-spacing:.05em}.model-filter__dropdown-item{display:flex;align-items:center;justify-content:space-between;width:100%;padding:7px 14px;border:none;background:transparent;color:hsl(var(--popover-foreground));font-size:var(--font-size-sm);font-family:var(--font-family);cursor:pointer;transition:background var(--transition-fast);text-align:left}.model-filter__dropdown-item:hover,.model-filter__dropdown-item--highlighted{background:hsl(var(--accent))}.model-filter__dropdown-item-name{display:flex;align-items:center;gap:8px}.model-filter__dropdown-item-type{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground))}.model-filter__summary{display:flex;align-items:center;gap:var(--gap-sm);font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));white-space:nowrap;margin-left:auto}.model-filter__clear-all{background:none;border:none;font-size:var(--font-size-sm);font-family:var(--font-family);color:hsl(var(--ring));cursor:pointer;padding:0;text-decoration:underline;text-underline-offset:2px;transition:color var(--transition-fast)}.model-filter__clear-all:hover{color:hsl(var(--foreground))}.model-filter__empty{text-align:center;padding:var(--gap-2xl) var(--gap-lg)}.model-filter__empty-title{font-size:var(--font-size-base);font-weight:500;color:hsl(var(--foreground));margin-bottom:var(--gap-xs)}.model-filter__empty-hint{font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));margin-bottom:var(--gap-md)}@media(max-width:640px){.model-filter__row{flex-direction:column;align-items:stretch}.model-filter__combobox{max-width:100%}.model-filter__summary{margin-left:0}}.version-indicator{position:fixed;bottom:var(--gap-md);right:var(--gap-md);z-index:40;font-size:var(--font-size-xs);font-family:var(--font-mono);color:hsl(var(--muted-foreground));opacity:.5;transition:opacity var(--transition-fast);cursor:default;user-select:none}.version-indicator:hover{opacity:1}.version-indicator--update{color:hsl(var(--success));opacity:.8;cursor:pointer}.version-indicator--update:hover{opacity:1}.version-indicator__tooltip-wrap{position:relative;display:inline-block}.version-indicator__bubble{display:none;position:absolute;bottom:calc(100% + 8px);right:0;padding:10px 12px;background:hsl(var(--popover));color:hsl(var(--popover-foreground));border:1px solid hsl(var(--border));border-radius:var(--radius);font-size:var(--font-size-xs);font-weight:400;line-height:1.5;white-space:nowrap;width:max-content;max-width:300px;box-shadow:0 2px 8px hsl(var(--foreground) / .08);z-index:50}.version-indicator__bubble:before{content:"";position:absolute;bottom:-8px;left:0;right:0;height:8px}.version-indicator__tooltip-wrap:hover .version-indicator__bubble{display:block}.version-indicator__range{display:block;margin-bottom:6px;color:hsl(var(--muted-foreground))}.version-indicator__command-row{display:flex;align-items:center;gap:6px;background:hsl(var(--muted));border-radius:calc(var(--radius) - 2px);padding:4px 4px 4px 8px}.version-indicator__command{flex:1;font-family:var(--font-mono);font-size:var(--font-size-xs);color:hsl(var(--foreground))}.version-indicator__copy-btn{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;border-radius:calc(var(--radius) - 2px);background:transparent;color:hsl(var(--muted-foreground));cursor:pointer;font-size:13px;transition:all var(--transition-fast);flex-shrink:0}.version-indicator__copy-btn:hover{background:hsl(var(--accent));color:hsl(var(--foreground))}@layer base{:root{--background: 45 49% 97%;--foreground: 222.2 84% 4.9%;--card: 44 60% 99%;--card-foreground: 222.2 84% 4.9%;--popover: 44 60% 99%;--popover-foreground: 222.2 84% 4.9%;--primary: 222.2 47.4% 11.2%;--primary-foreground: 45 30% 97%;--secondary: 40 33% 93%;--secondary-foreground: 222.2 47.4% 11.2%;--muted: 40 33% 93%;--muted-foreground: 215.4 16.3% 46.9%;--accent: 40 33% 93%;--accent-foreground: 222.2 47.4% 11.2%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 45 30% 97%;--border: 36 25% 88%;--input: 36 25% 88%;--ring: 222.2 84% 4.9%;--radius: .5rem;--chart-1: 178 75% 44%;--chart-2: 197 37% 24%;--chart-3: 167 70% 48%;--chart-4: 349 52% 61%;--chart-5: 43 96% 56%;--sidebar-background: 43 38% 95%;--sidebar-foreground: 240 5.3% 26.1%;--sidebar-primary: 240 5.9% 10%;--sidebar-primary-foreground: 45 30% 97%;--sidebar-accent: 40 28% 93%;--sidebar-accent-foreground: 240 5.9% 10%;--sidebar-border: 36 20% 89%;--sidebar-ring: 217.2 91.2% 59.8%;--success: 178 75% 44%;--success-foreground: 0 0% 100%}.dark{--background: 0 0% 9%;--foreground: 0 0% 93%;--card: 0 0% 11%;--card-foreground: 0 0% 93%;--popover: 0 0% 11%;--popover-foreground: 0 0% 93%;--primary: 0 0% 93%;--primary-foreground: 0 0% 9%;--secondary: 0 0% 15%;--secondary-foreground: 0 0% 93%;--muted: 0 0% 15%;--muted-foreground: 0 0% 55%;--accent: 0 0% 15%;--accent-foreground: 0 0% 93%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 0 0% 93%;--border: 0 0% 18%;--input: 0 0% 18%;--ring: 0 0% 60%;--chart-1: 178 70% 50%;--chart-2: 197 50% 55%;--chart-3: 167 70% 55%;--chart-4: 349 52% 65%;--chart-5: 43 96% 65%;--sidebar-background: 0 0% 7%;--sidebar-foreground: 0 0% 93%;--sidebar-primary: 0 0% 93%;--sidebar-primary-foreground: 0 0% 9%;--sidebar-accent: 0 0% 14%;--sidebar-accent-foreground: 0 0% 93%;--sidebar-border: 0 0% 18%;--sidebar-ring: 0 0% 60%;--success: 178 70% 50%;--success-foreground: 0 0% 100%}}:root{--sidebar-width: 230px;--header-height: 48px;--gap-xs: 4px;--gap-sm: 8px;--gap-md: 16px;--gap-lg: 24px;--gap-xl: 32px;--gap-2xl: 48px;--font-family: "DM Sans", -apple-system, BlinkMacSystemFont, system-ui, sans-serif;--font-heading: "Bricolage Grotesque", -apple-system, BlinkMacSystemFont, system-ui, sans-serif;--font-mono: "JetBrains Mono", "SF Mono", ui-monospace, monospace;--font-size-xs: .75rem;--font-size-sm: .875rem;--font-size-base: .9375rem;--font-size-lg: 1.125rem;--font-size-xl: 1.5rem;--font-size-2xl: 1.875rem;--font-size-3xl: 2.25rem;--font-size-4xl: 3rem;--transition-fast: .15s cubic-bezier(.4, 0, .2, 1);--transition-base: .2s cubic-bezier(.4, 0, .2, 1)}*,*:before,*:after{margin:0;padding:0;box-sizing:border-box;border-color:hsl(var(--border))}body{font-family:var(--font-family);font-feature-settings:"rlig" 1,"calt" 1;background:hsl(var(--background));color:hsl(var(--foreground));line-height:1.6;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;overflow-x:hidden}h1,h2,h3,h4,h5,h6{font-family:var(--font-heading)}.app-layout{display:flex;min-height:100vh}.main-content{flex:1;margin-left:var(--sidebar-width);padding:var(--gap-xl) var(--gap-xl) var(--gap-2xl);min-width:0}.main-content--full{margin-left:0}.container--sm{max-width:680px;margin-inline:auto}.container--md{max-width:1100px;margin-inline:auto}.container--full{max-width:100%}.page-header{display:flex;justify-content:space-between;align-items:flex-end;margin-bottom:var(--gap-xl);padding-bottom:var(--gap-lg);border-bottom:1px solid hsl(var(--border))}.page-header h1{font-size:var(--font-size-2xl);font-weight:700;letter-spacing:-.025em;line-height:1.2;color:hsl(var(--foreground))}.page-header .breadcrumb{font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));margin-top:2px}.header-controls{display:flex;gap:var(--gap-sm);align-items:center}.cards-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:var(--gap-md);margin-bottom:var(--gap-xl)}.summary-card{background:hsl(var(--card));border:none;border-radius:var(--radius);padding:var(--gap-lg);box-shadow:#00000014 0 0 0 1px;transition:box-shadow var(--transition-fast)}.summary-card__label{font-size:var(--font-size-sm);font-weight:500;color:hsl(var(--muted-foreground));display:flex;align-items:center;gap:var(--gap-sm)}.summary-card__value{font-size:var(--font-size-3xl);font-weight:700;letter-spacing:-.025em;margin-top:var(--gap-xs);line-height:1.1;color:hsl(var(--foreground))}.summary-card__subtitle{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));margin-top:var(--gap-sm)}.trend{display:inline-flex;align-items:center;gap:2px;font-size:var(--font-size-xs);font-weight:500;padding:2px 6px;border-radius:calc(var(--radius) - 4px);line-height:1.4}.trend--up{color:hsl(var(--success));background:hsl(var(--success) / .1)}.trend--down{color:hsl(var(--destructive));background:hsl(var(--destructive) / .1)}.panel{background:hsl(var(--card));border:none;border-radius:var(--radius);padding:var(--gap-lg);margin-bottom:var(--gap-lg);box-shadow:#00000014 0 0 0 1px}.panel__title{font-size:var(--font-size-sm);font-weight:600;color:hsl(var(--foreground));margin-bottom:var(--gap-lg)}.chart-card{background:hsl(var(--card));border:none;border-radius:var(--radius);margin-bottom:var(--gap-lg);box-shadow:#00000014 0 0 0 1px;animation:fadeInUp .3s ease-out both}.chart-card__header{display:flex;align-items:flex-end;border-bottom:1px solid hsl(var(--border))}.chart-card__stat{display:flex;flex-direction:column;gap:2px;padding-right:var(--gap-xl);border-right:1px solid hsl(var(--border))}.chart-card__stat:last-of-type{border-right:1px solid hsl(var(--border))}.chart-card__label{font-size:var(--font-size-sm);font-weight:500;color:hsl(var(--muted-foreground))}.chart-card__value{font-size:var(--font-size-2xl);font-weight:700;letter-spacing:-.025em;line-height:1.1;color:hsl(var(--foreground))}.chart-card__value-row{display:flex;align-items:baseline;gap:var(--gap-sm)}.chart-card__controls{margin-left:auto;display:flex;align-items:center}.chart-card__body{padding:var(--gap-md) var(--gap-lg) var(--gap-lg)}.panel__header{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--gap-lg)}.panel__tabs{display:inline-flex;height:2.25rem;align-items:center;border-radius:var(--radius);background:hsl(var(--muted));padding:3px;gap:1px}.panel__tab{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;padding:0 14px;height:100%;font-size:var(--font-size-sm);font-family:var(--font-family);font-weight:500;color:hsl(var(--muted-foreground));background:transparent;border:none;border-radius:calc(var(--radius) - 2px);cursor:pointer;transition:all var(--transition-fast)}.panel__tab:hover{color:hsl(var(--foreground))}.panel__tab--active{background:hsl(var(--background));color:hsl(var(--foreground));box-shadow:0 1px 2px #0000000f;font-weight:600}.two-col{display:grid;grid-template-columns:1fr 1fr;gap:var(--gap-lg);margin-bottom:var(--gap-lg)}.data-table{width:100%;border-collapse:collapse;font-size:var(--font-size-sm)}.data-table th{text-align:left;font-size:var(--font-size-xs);font-weight:500;color:hsl(var(--muted-foreground));padding:12px var(--gap-md);border-bottom:1px solid hsl(var(--border));height:40px}.data-table td{padding:12px var(--gap-md);border-bottom:1px solid hsl(var(--border));color:hsl(var(--foreground))}.data-table tbody tr{transition:background var(--transition-fast)}.data-table tbody tr:hover{background:hsl(var(--muted) / .5)}.data-table tr:last-child td{border-bottom:none}.status-badge{display:inline-flex;align-items:center;padding:2px 8px;border-radius:9999px;font-size:var(--font-size-xs);font-weight:500}.status-badge--ok{background:hsl(var(--success) / .1);color:hsl(var(--success))}.status-badge--retry{background:hsl(var(--chart-5) / .15);color:hsl(var(--chart-5))}.status-badge--error{background:hsl(var(--destructive) / .1);color:hsl(var(--destructive))}.security-event{display:flex;align-items:center;gap:var(--gap-md);padding:12px var(--gap-md);border-bottom:1px solid hsl(var(--border));transition:background var(--transition-fast);border-radius:calc(var(--radius) - 2px)}.security-event:last-child{border-bottom:none}.security-event:hover{background:hsl(var(--muted) / .5)}.security-event__dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.security-event__dot--critical{background:hsl(var(--destructive))}.security-event__dot--warning{background:hsl(var(--chart-5))}.security-event__dot--info{background:hsl(var(--chart-2))}.security-event__desc{flex:1;font-size:var(--font-size-sm);color:hsl(var(--foreground))}.security-event__badge{font-size:var(--font-size-xs);padding:2px 8px;border-radius:9999px;background:hsl(var(--muted));color:hsl(var(--muted-foreground));text-transform:capitalize}.security-event__time{font-size:var(--font-size-xs);font-family:var(--font-mono);color:hsl(var(--muted-foreground));white-space:nowrap}.feed-item{display:flex;align-items:center;gap:var(--gap-md);padding:10px 0;border-bottom:1px solid hsl(var(--border));transition:background var(--transition-fast)}.feed-item:hover{background:hsl(var(--muted) / .5);margin:0 calc(var(--gap-md) * -1);padding-left:var(--gap-md);padding-right:var(--gap-md);border-radius:calc(var(--radius) - 2px)}.feed-item:last-child{border-bottom:none}.feed-item__time{font-size:var(--font-size-xs);font-family:var(--font-mono);color:hsl(var(--muted-foreground));white-space:nowrap}.feed-item__desc{flex:1;font-size:var(--font-size-sm);color:hsl(var(--foreground))}.feed-item__meta{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground))}.model-bar{display:flex;align-items:center;gap:var(--gap-md);margin-bottom:12px;padding:6px 0}.model-bar__name{width:160px;font-size:var(--font-size-sm);font-family:var(--font-mono);color:hsl(var(--foreground));white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.model-bar__track{flex:1;height:6px;background:hsl(var(--muted));border-radius:9999px;overflow:hidden}.model-bar__fill{height:100%;border-radius:9999px;transition:width .5s cubic-bezier(.4,0,.2,1);background:hsl(var(--chart-1))!important}.model-bar__pct{width:48px;text-align:right;font-size:var(--font-size-sm);font-weight:600;color:hsl(var(--foreground))!important}.empty-state{text-align:center;padding:var(--gap-2xl) var(--gap-lg);color:hsl(var(--muted-foreground))}.empty-state__title{font-size:var(--font-size-lg);font-weight:500;margin-bottom:var(--gap-sm);color:hsl(var(--foreground))}.select{display:inline-flex;align-items:center;height:2.25rem;background:hsl(var(--background));color:hsl(var(--foreground));border:1px solid hsl(var(--input));border-radius:var(--radius);padding:0 2rem 0 .75rem;font-size:var(--font-size-sm);font-family:var(--font-family);cursor:pointer;transition:border-color var(--transition-fast),box-shadow var(--transition-fast);appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right .5rem center}.select:focus-visible{outline:none;border-color:hsl(var(--ring));box-shadow:0 0 0 2px hsl(var(--ring) / .2)}.select option{background:hsl(var(--popover));color:hsl(var(--popover-foreground))}.btn{display:inline-flex;align-items:center;justify-content:center;height:2.25rem;padding:0 1rem;border-radius:var(--radius);font-size:var(--font-size-sm);font-weight:500;font-family:var(--font-family);cursor:pointer;border:none;transition:all var(--transition-fast)}.btn--primary{background:hsl(var(--primary));color:hsl(var(--primary-foreground))}.btn--primary:hover{background:hsl(var(--primary) / .9)}.btn--ghost{background:transparent;color:hsl(var(--foreground))}.btn--ghost:hover{background:hsl(var(--accent));color:hsl(var(--accent-foreground))}.btn--outline{background:hsl(var(--background));color:hsl(var(--foreground));border:1px solid hsl(var(--input))}.btn--outline:hover{background:hsl(var(--accent));color:hsl(var(--accent-foreground))}.btn--sm{height:2rem;padding:0 .75rem;font-size:var(--font-size-xs)}.btn:focus-visible{outline:2px solid hsl(var(--ring));outline-offset:2px}.btn:disabled{opacity:.5;cursor:not-allowed}.sidebar{width:var(--sidebar-width);height:calc(100vh - var(--header-height));position:fixed;top:var(--header-height);left:0;background:hsl(var(--sidebar-background));border-right:1px solid hsl(var(--sidebar-border));padding:var(--gap-lg) 0 0 0;display:flex;flex-direction:column;z-index:10;overflow-y:auto}.sidebar__logo{padding:0 var(--gap-lg);margin-bottom:var(--gap-xl);font-size:var(--font-size-lg);font-weight:700;letter-spacing:-.025em;display:flex;align-items:center;gap:var(--gap-sm);color:hsl(var(--sidebar-foreground))}.sidebar__logo-dot{width:8px;height:8px;border-radius:50%;background:hsl(var(--success))}.sidebar__section-label{padding:var(--gap-md) var(--gap-lg) var(--gap-xs);font-size:var(--font-size-xs);font-weight:500;color:hsl(var(--muted-foreground));text-transform:uppercase;letter-spacing:.05em}.sidebar__link{display:flex;align-items:center;gap:var(--gap-sm);padding:6px var(--gap-lg);margin:1px .5rem;font-size:var(--font-size-sm);color:hsl(var(--sidebar-foreground));text-decoration:none;border-radius:var(--radius);transition:all var(--transition-fast)}.sidebar__link:hover{background:hsl(var(--sidebar-accent));color:hsl(var(--sidebar-accent-foreground))}.sidebar__link.active{background:hsl(var(--sidebar-accent));color:hsl(var(--sidebar-primary));font-weight:500}.sidebar__spacer{flex:1}.sidebar__feedback{display:block;padding:var(--gap-md) var(--gap-lg);border-top:1px solid hsl(var(--sidebar-border));text-decoration:none;color:hsl(var(--sidebar-foreground));transition:background var(--transition-fast);cursor:pointer}.sidebar__feedback:hover{background:hsl(var(--sidebar-accent))}.sidebar__feedback-title{display:flex;align-items:center;gap:var(--gap-sm);font-size:var(--font-size-sm);font-weight:500}.sidebar__feedback-hint{margin-top:var(--gap-xs);font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));line-height:1.4}.sidebar__footer{margin-top:auto;padding:var(--gap-md) var(--gap-lg);border-top:1px solid hsl(var(--sidebar-border))}.theme-toggle{display:flex;align-items:center;gap:var(--gap-sm);padding:6px 12px;border-radius:var(--radius);background:transparent;border:1px solid hsl(var(--border));color:hsl(var(--muted-foreground));font-size:var(--font-size-sm);font-family:var(--font-family);cursor:pointer;transition:all var(--transition-fast);width:100%}.theme-toggle:hover{background:hsl(var(--accent));color:hsl(var(--accent-foreground))}.theme-toggle__icon{font-size:14px;line-height:1;width:18px;text-align:center}.u-wrap{font-family:var(--font-family)!important}.u-legend{font-size:var(--font-size-xs)!important;font-family:var(--font-family)!important;color:hsl(var(--muted-foreground))!important;display:grid!important;grid-template-columns:2fr 1fr 1fr!important;width:100%!important;padding:var(--gap-sm) 0 0!important}.u-legend>tbody,.u-legend>thead{display:contents!important}.u-legend .u-series{display:flex!important;align-items:center!important;gap:4px!important;overflow:hidden!important;white-space:nowrap!important;min-width:0!important;padding:2px 0!important}.u-legend .u-series:first-child{justify-content:flex-start!important}.u-legend .u-series:not(:first-child){justify-content:flex-start!important;padding-left:var(--gap-sm)!important}.u-legend .u-value{font-family:var(--font-mono)!important;font-variant-numeric:tabular-nums!important;min-width:60px!important;display:inline-block!important;text-align:right!important}.u-legend .u-marker{border-radius:50%!important}.u-cursor-x,.u-cursor-y{border-color:hsl(var(--border))!important}.chart-tooltip{position:absolute;background:hsl(var(--popover));border:1px solid hsl(var(--border));border-radius:var(--radius);padding:8px 12px;font-size:var(--font-size-xs);color:hsl(var(--popover-foreground));pointer-events:none;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;z-index:100;white-space:nowrap}.expandable-card{position:relative;margin-bottom:var(--gap-lg);cursor:pointer}.expandable-card .panel{max-height:320px;overflow:hidden}.expandable-card__content{overflow:hidden}.expandable-card__fade{position:absolute;bottom:0;left:0;right:0;height:64px;background:linear-gradient(transparent,hsl(var(--card)) 70%);border-radius:0 0 var(--radius) var(--radius);display:flex;align-items:flex-end;justify-content:center;padding-bottom:12px;opacity:0;transition:opacity var(--transition-base)}.expandable-card:hover .expandable-card__fade{opacity:1}.expandable-card__btn{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;font-size:var(--font-size-xs);font-family:var(--font-family);font-weight:500;color:hsl(var(--foreground));background:hsl(var(--background));border:1px solid hsl(var(--border));border-radius:var(--radius);cursor:pointer;box-shadow:0 1px 3px #0000001a;transition:all var(--transition-fast)}.expandable-card__btn:hover{background:hsl(var(--accent))}.modal-backdrop{position:fixed;inset:0;z-index:50;background:#00000080;display:flex;align-items:center;justify-content:center;animation:fadeIn .15s ease-out}.modal{background:hsl(var(--background));border:none;border-radius:var(--radius);width:90%;max-width:680px;max-height:80vh;display:flex;flex-direction:column;box-shadow:#00000014 0 0 0 1px,0 25px 50px -12px #00000040;animation:fadeInUp .2s ease-out}.modal__header{display:flex;align-items:center;justify-content:space-between;padding:var(--gap-lg);border-bottom:1px solid hsl(var(--border));flex-shrink:0}.modal__title{font-size:var(--font-size-lg);font-weight:600;color:hsl(var(--foreground))}.modal__close{display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;border-radius:var(--radius);border:none;background:transparent;color:hsl(var(--muted-foreground));cursor:pointer;transition:all var(--transition-fast)}.modal__close:hover{background:hsl(var(--muted));color:hsl(var(--foreground))}.modal__body{padding:var(--gap-md) var(--gap-lg);overflow-y:auto;flex:1;min-height:0}.modal__footer{display:flex;justify-content:center;padding:var(--gap-md) var(--gap-lg);border-top:1px solid hsl(var(--border));flex-shrink:0}.modal__footer .btn{min-width:120px}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeInUp{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.cards-grid>*{animation:fadeInUp .3s ease-out both}.cards-grid>*:nth-child(1){animation-delay:0ms}.cards-grid>*:nth-child(2){animation-delay:50ms}.cards-grid>*:nth-child(3){animation-delay:.1s}.cards-grid>*:nth-child(4){animation-delay:.15s}.panel{animation:fadeInUp .3s ease-out both}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:hsl(var(--border));border-radius:3px}::-webkit-scrollbar-thumb:hover{background:hsl(var(--muted-foreground) / .3)}@media(max-width:1024px){.main-content{padding:var(--gap-lg) var(--gap-md) var(--gap-xl)}.two-col{grid-template-columns:1fr}.cards-grid{grid-template-columns:repeat(2,1fr)}.summary-card__value{font-size:var(--font-size-2xl)}}@media(max-width:768px){.main-content{margin-left:0;padding:var(--gap-md)}.sidebar{display:none}.cards-grid{grid-template-columns:1fr 1fr}.summary-card__value{font-size:var(--font-size-xl)}.page-header{flex-direction:column;align-items:flex-start;gap:var(--gap-md)}.container--sm,.container--md{max-width:100%}}@media(max-width:480px){.cards-grid{grid-template-columns:1fr}}
1
+ .setup-modal__overlay{background:#fbf9f3b3;backdrop-filter:blur(8px)}.setup-modal__nav{display:flex;align-items:center;justify-content:space-between;margin-top:var(--gap-lg)}.setup-modal__nav .modal-card__back-link{justify-content:flex-start;width:auto}.setup-modal__next{padding:10px 24px;border:none;border-radius:var(--radius);background:hsl(var(--foreground));color:hsl(var(--background));font-size:var(--font-size-sm);font-weight:600;font-family:var(--font-family);cursor:pointer;transition:opacity var(--transition-fast)}.setup-modal__next:hover{opacity:.85}.waiting-banner{display:flex;align-items:center;gap:var(--gap-sm);padding:12px 16px;margin-bottom:var(--gap-lg);background:hsl(var(--chart-1) / .08);border:1px solid hsl(var(--chart-1) / .2);border-radius:var(--radius);color:hsl(var(--muted-foreground));font-size:var(--font-size-sm);line-height:1.5}.waiting-banner i{flex-shrink:0;color:hsl(var(--chart-1));font-size:18px}.waiting-banner p{margin:0}.waiting-banner--success{border-color:hsl(var(--success) / .3);background:hsl(var(--success) / .06)}.waiting-banner--success i{color:hsl(var(--success))}.demo-dashboard{opacity:.5;pointer-events:none;user-select:none}.uplot,.uplot *,.uplot *:before,.uplot *:after{box-sizing:border-box}.uplot{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";line-height:1.5;width:min-content}.u-title{text-align:center;font-size:18px;font-weight:700}.u-wrap{position:relative;user-select:none}.u-over,.u-under{position:absolute}.u-under{overflow:hidden}.uplot canvas{display:block;position:relative;width:100%;height:100%}.u-axis{position:absolute}.u-legend{font-size:14px;margin:auto;text-align:center}.u-inline{display:block}.u-inline *{display:inline-block}.u-inline tr{margin-right:16px}.u-legend th{font-weight:600}.u-legend th>*{vertical-align:middle;display:inline-block}.u-legend .u-marker{width:1em;height:1em;margin-right:4px;background-clip:padding-box!important}.u-inline.u-live th:after{content:":";vertical-align:middle}.u-inline:not(.u-live) .u-value{display:none}.u-series>*{padding:4px}.u-series th{cursor:pointer}.u-legend .u-off>*{opacity:.3}.u-select{background:#00000012;position:absolute;pointer-events:none}.u-cursor-x,.u-cursor-y{position:absolute;left:0;top:0;pointer-events:none;will-change:transform}.u-hz .u-cursor-x,.u-vt .u-cursor-y{height:100%;border-right:1px dashed #607D8B}.u-hz .u-cursor-y,.u-vt .u-cursor-x{width:100%;border-bottom:1px dashed #607D8B}.u-cursor-pt{position:absolute;top:0;left:0;border-radius:50%;border:0 solid;pointer-events:none;will-change:transform;background-clip:padding-box!important}.u-axis.u-off,.u-select.u-off,.u-cursor-x.u-off,.u-cursor-y.u-off,.u-cursor-pt.u-off{display:none}@font-face{font-family:Bricolage Grotesque;font-style:normal;font-weight:400 700;font-stretch:100%;font-display:swap;src:url(/fonts/bricolage-grotesque-latin.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Bricolage Grotesque;font-style:normal;font-weight:400 700;font-stretch:100%;font-display:swap;src:url(/fonts/bricolage-grotesque-latin-ext.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:DM Sans;font-style:normal;font-weight:400 700;font-display:swap;src:url(/fonts/dm-sans-latin.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:DM Sans;font-style:normal;font-weight:400 700;font-display:swap;src:url(/fonts/dm-sans-latin-ext.woff2) format("woff2");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:JetBrains Mono;font-style:normal;font-weight:400 500;font-display:swap;src:url(/fonts/jetbrains-mono-latin.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}.app-shell{display:flex;flex-direction:column;min-height:100vh}.app-body{display:flex;flex:1;padding-top:var(--header-height)}.theme-toggle{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;border-radius:var(--radius);background:transparent;border:1px solid hsl(var(--border));color:hsl(var(--muted-foreground));cursor:pointer;transition:all var(--transition-fast);padding:0}.theme-toggle__icon{display:flex;align-items:center;justify-content:center;line-height:1}.not-found{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:80vh;text-align:center;padding:var(--gap-xl)}.not-found__code{font-size:8rem;font-weight:800;letter-spacing:-.05em;line-height:1;background:linear-gradient(135deg,hsl(var(--primary)),hsl(var(--chart-1)));-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.not-found__title{font-size:var(--font-size-2xl);font-weight:700;color:hsl(var(--foreground));margin-top:var(--gap-md);letter-spacing:-.025em}.not-found__text{font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));margin-top:var(--gap-sm);max-width:360px}.not-found__link{display:inline-flex;align-items:center;gap:var(--gap-xs);margin-top:var(--gap-xl);padding:.625rem 1.25rem;background:hsl(var(--primary));color:hsl(var(--primary-foreground));border-radius:var(--radius);font-size:var(--font-size-sm);font-weight:600;text-decoration:none;transition:opacity var(--transition-fast)}.not-found__link:hover{opacity:.9}.auth-layout{display:flex;align-items:center;justify-content:center;min-height:100vh;padding:var(--gap-lg);background:hsl(var(--background))}.auth-card{width:100%;max-width:420px;background:hsl(var(--card));border:1px solid hsl(var(--border));border-radius:12px;padding:var(--gap-xl) var(--gap-xl) var(--gap-lg);box-shadow:var(--card-shadow);animation:fadeInUp .3s ease-out both}.auth-logo{text-align:center;margin-bottom:var(--gap-lg)}.auth-logo__link{display:inline-flex;align-items:center;gap:var(--gap-sm);font-size:var(--font-size-lg);font-weight:700;letter-spacing:-.025em;color:hsl(var(--foreground));text-decoration:none}.auth-logo__img{width:140px;height:auto;object-fit:contain}.auth-logo__img--dark,.dark .auth-logo__img--light{display:none}.dark .auth-logo__img--dark{display:inline-block}.auth-header{text-align:center;margin-bottom:var(--gap-lg)}.auth-header__title{font-size:var(--font-size-xl);font-weight:700;color:hsl(var(--foreground));letter-spacing:-.025em;line-height:1.2}.auth-header__subtitle{font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));margin-top:var(--gap-xs)}.auth-form{display:flex;flex-direction:column;gap:var(--gap-md);margin-bottom:var(--gap-lg)}.auth-form__label{display:flex;flex-direction:column;gap:var(--gap-xs);font-size:var(--font-size-sm);font-weight:500;color:hsl(var(--foreground))}.auth-form__input{height:2.75rem;padding:0 var(--gap-md);background:hsl(var(--background));color:hsl(var(--foreground));border:1px solid hsl(var(--input));border-radius:var(--radius);font-size:var(--font-size-sm);font-family:var(--font-family);transition:border-color var(--transition-fast);outline:none}.auth-form__input::placeholder{color:hsl(var(--muted-foreground))}.auth-form__input:focus{border-color:hsl(var(--primary));box-shadow:0 0 0 2px hsl(var(--primary) / .15)}.auth-form__actions{display:flex;justify-content:flex-end;margin-top:calc(-1 * var(--gap-xs))}.auth-form__forgot{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));text-decoration:none;transition:color var(--transition-fast)}.auth-form__forgot:hover{color:hsl(var(--foreground))}.auth-form__submit{height:2.75rem;background:hsl(var(--primary));color:hsl(var(--primary-foreground));border:none;border-radius:var(--radius);font-size:var(--font-size-sm);font-weight:600;font-family:var(--font-family);cursor:pointer;transition:opacity var(--transition-fast)}.auth-form__submit:hover:not(:disabled){opacity:.9}.auth-form__submit:disabled{opacity:.6;cursor:not-allowed}.auth-form__error{padding:var(--gap-sm) var(--gap-md);background:hsl(var(--destructive) / .1);color:hsl(var(--destructive));border:1px solid hsl(var(--destructive) / .2);border-radius:var(--radius);font-size:var(--font-size-xs)}.auth-form__success{padding:var(--gap-sm) var(--gap-md);background:#21c45d1a;color:#1a9948;border:1px solid hsl(142 71% 45% / .2);border-radius:var(--radius);font-size:var(--font-size-xs);line-height:1.5}.auth-form__link-btn{background:none;border:none;padding:0;font-size:var(--font-size-sm);font-family:var(--font-family);color:hsl(var(--primary));font-weight:500;cursor:pointer;text-decoration:underline;text-underline-offset:2px;transition:opacity var(--transition-fast)}.auth-form__link-btn:hover:not(:disabled){opacity:.8}.auth-form__link-btn:disabled{color:hsl(var(--muted-foreground));cursor:not-allowed;text-decoration:none}.auth-divider{display:flex;align-items:center;gap:var(--gap-md);margin-bottom:var(--gap-lg)}.auth-divider:before,.auth-divider:after{content:"";flex:1;height:1px;background:hsl(var(--border))}.auth-divider__text{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));text-transform:uppercase;letter-spacing:.05em}.auth-social-group{display:flex;flex-direction:column;gap:var(--gap-sm);margin-bottom:var(--gap-lg)}.auth-social-btn{display:flex;align-items:center;justify-content:center;gap:var(--gap-sm);width:100%;height:2.75rem;padding:0 var(--gap-md);background:hsl(var(--background));color:hsl(var(--foreground));border:1px solid hsl(var(--input));border-radius:var(--radius);font-size:var(--font-size-sm);font-weight:500;font-family:var(--font-family);cursor:pointer;transition:all var(--transition-fast)}.auth-social-btn:hover{background:hsl(var(--accent));border-color:hsl(var(--foreground) / .2)}.auth-social-btn__icon{display:flex;align-items:center;justify-content:center;width:18px;height:18px;flex-shrink:0}.auth-social-btn--google:hover{border-color:#4285f4}.auth-social-btn--github:hover{border-color:#6e40c9}.auth-social-btn--discord:hover{border-color:#5865f2}.auth-footer{text-align:center;padding-top:var(--gap-md);border-top:1px solid hsl(var(--border));font-size:var(--font-size-sm);color:hsl(var(--muted-foreground))}.auth-footer__link{color:hsl(var(--foreground));font-weight:500;text-decoration:none;transition:color var(--transition-fast)}.auth-footer__link:hover{text-decoration:underline}.auth-terms{text-align:center;font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));line-height:1.5;margin-bottom:var(--gap-sm)}.auth-terms__link{color:hsl(var(--foreground));text-decoration:none}.auth-terms__link:hover{text-decoration:underline}@media(max-width:480px){.auth-card{padding:var(--gap-lg) var(--gap-md);border:none;box-shadow:none;background:transparent}}.summary-card{background:hsl(var(--card));border:none;border-radius:var(--radius);padding:var(--gap-lg);box-shadow:var(--card-shadow)}.panel{background:hsl(var(--card));border:none;border-radius:var(--radius);padding:var(--gap-lg);margin-bottom:var(--gap-lg);box-shadow:var(--card-shadow);overflow-x:auto;overflow-y:hidden}.view-more-link{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));text-decoration:none;transition:color .15s}.view-more-link:hover{color:hsl(var(--foreground))}.chart-card{background:hsl(var(--card));border:none;border-radius:var(--radius);margin-bottom:var(--gap-lg);box-shadow:var(--card-shadow);animation:fadeInUp .3s ease-out both}.chart-card__header{display:flex;align-items:stretch;border-bottom:1px solid hsl(var(--border))}.chart-card__stat{display:flex;flex-direction:column;justify-content:center;min-width:200px;gap:2px;padding:var(--gap-lg) var(--gap-xl);border-right:1px solid hsl(var(--border))}.chart-card__stat:first-child{padding-left:var(--gap-lg)}.chart-card__stat--clickable{cursor:pointer;transition:all var(--transition-fast);position:relative}.chart-card__stat--clickable:after{content:"";position:absolute;bottom:-1px;left:-1px;right:-1px;height:2px;background:transparent;transition:background var(--transition-fast)}.chart-card__stat--active:after{background:hsl(var(--chart-1))}.chart-card__stat--clickable:not(.chart-card__stat--active):hover:after{background:hsl(var(--border))}.chart-card__value-row{display:flex;align-items:center;gap:var(--gap-sm)}.chart-card__controls{margin-left:auto;display:flex;align-items:center;padding:var(--gap-md) var(--gap-lg) var(--gap-md) var(--gap-xl)}.chart-card__body{padding:var(--gap-md) var(--gap-lg) var(--gap-lg);overflow:hidden}.chart-card__body .u-wrap{overflow:hidden!important}.u-cursor-x{border-left:1px solid hsl(var(--foreground) / .7)!important;border-left-style:solid!important;opacity:0!important;transition:opacity 60ms ease!important}.u-wrap:hover .u-cursor-x{opacity:1!important}.u-cursor-y{display:none!important}.expandable-card .panel{overflow:hidden;max-height:320px;padding-bottom:var(--gap-2xl)}.expandable-card__fade{position:absolute;bottom:0;left:0;right:0;height:80px;background:linear-gradient(transparent,hsl(var(--card)) 60%);border-radius:0 0 var(--radius) var(--radius);display:flex;align-items:flex-end;justify-content:center;padding-bottom:16px;opacity:0;transition:opacity var(--transition-base)}.select{display:inline-flex;align-items:center;height:2.25rem;background:hsl(var(--background));color:hsl(var(--foreground));border:1px solid hsl(var(--input));border-radius:var(--radius);padding:0 2rem 0 .75rem;font-size:var(--font-size-sm);font-family:var(--font-family);cursor:pointer;transition:border-color var(--transition-fast),box-shadow var(--transition-fast);appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right .5rem center}.cost-range-filter{display:inline-flex;align-items:center;gap:4px}.cost-range-filter__input{width:80px;height:2.25rem;background:hsl(var(--background));color:hsl(var(--foreground));border:1px solid hsl(var(--input));border-radius:var(--radius);padding:0 .5rem;font-size:var(--font-size-sm);font-family:var(--font-family);transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.cost-range-filter__input::placeholder{color:hsl(var(--muted-foreground))}.cost-range-filter__input:focus-visible{outline:none;border-color:hsl(var(--ring));box-shadow:0 0 0 2px hsl(var(--ring) / .2)}.cost-range-filter__input::-webkit-inner-spin-button,.cost-range-filter__input::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.cost-range-filter__input{-moz-appearance:textfield}.cost-range-filter__sep{color:hsl(var(--muted-foreground));font-size:var(--font-size-sm);user-select:none}.setup-steps{display:flex;flex-direction:column}.setup-steps__step{display:flex;gap:var(--gap-md)}.setup-steps__divider{height:1px;background:hsl(var(--border));margin:var(--gap-lg) 0}.setup-steps__number{width:28px;height:28px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:var(--font-size-xs);font-weight:600;background:hsl(var(--primary));color:hsl(var(--primary-foreground));flex-shrink:0;margin-top:2px}.setup-steps__content{flex:1;min-width:0}.btn--primary{background:hsl(var(--primary));color:hsl(var(--primary-foreground));gap:6px}.toast{position:fixed;bottom:var(--gap-lg);right:var(--gap-lg);display:flex;align-items:center;gap:10px;padding:12px 16px;border-radius:var(--radius);font-size:var(--font-size-sm);box-shadow:0 4px 16px #00000026;cursor:pointer;z-index:100;animation:toast-in .2s ease-out;max-width:420px}.toast--success{background:hsl(var(--card));border:1px solid hsl(var(--success) / .4);color:hsl(var(--foreground))}.toast--error{background:hsl(var(--card));border:1px solid hsl(var(--destructive) / .4);color:hsl(var(--foreground))}.toast__icon{flex-shrink:0;display:flex}.toast__message{line-height:1.4}@keyframes toast-in{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.btn--danger{background:hsl(var(--destructive));color:#fff}.btn--danger:hover{background:hsl(var(--destructive) / .9)}.settings-section__title--danger{color:hsl(var(--destructive))}.settings-card--danger{border-color:hsl(var(--destructive) / .3)}.settings-card--danger .settings-card__control{display:flex;justify-content:flex-end}.sidebar{width:var(--sidebar-width);height:calc(100vh - var(--header-height));position:fixed;top:var(--header-height);left:0;background:hsl(var(--sidebar-background));border-right:1px solid hsl(var(--sidebar-border));padding:var(--gap-md) 0;display:flex;flex-direction:column;z-index:10;overflow-y:auto}.sidebar__link--disabled{opacity:.4;pointer-events:none;cursor:default}.header{position:fixed;top:0;left:0;right:0;height:var(--header-height);background:hsl(var(--background));border-bottom:1px solid hsl(var(--border));display:flex;align-items:center;justify-content:space-between;padding:0 var(--gap-lg);z-index:40}.header__left{display:flex;align-items:center;gap:var(--gap-sm);min-width:0}.header__logo{display:flex;align-items:center;gap:var(--gap-sm);font-size:var(--font-size-sm);font-weight:700;letter-spacing:-.025em;color:hsl(var(--foreground));text-decoration:none}.header__logo-img{width:112px;height:auto;object-fit:contain;margin-bottom:9px}.header__logo-img--dark,.dark .header__logo-img--light{display:none}.dark .header__logo-img--dark{display:block}.header__mode-badge{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;padding:2px 7px;border-radius:var(--radius);background:hsl(var(--success) / .15);color:hsl(var(--success));line-height:1.4;user-select:none}.header__mode-badge--dev{background:#f9741526;color:#f97415}.header__separator{color:hsl(var(--muted-foreground));font-size:var(--font-size-sm);user-select:none}.header__breadcrumb-link{font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));text-decoration:none;transition:color var(--transition-fast)}.header__breadcrumb-link:hover{color:hsl(var(--foreground))}.header__breadcrumb-current{font-size:var(--font-size-sm);font-weight:500;color:hsl(var(--foreground))}.header__right{display:flex;align-items:center;align-self:stretch;gap:var(--gap-sm)}.header__avatar-btn{display:flex;align-items:center;justify-content:center;background:transparent;border:none;cursor:pointer;padding:2px;border-radius:50%;transition:opacity var(--transition-fast)}.header__avatar-btn:hover{opacity:.8}.header__avatar{width:28px;height:28px;border-radius:50%;background:hsl(var(--chart-1));color:#fff;display:flex;align-items:center;justify-content:center;font-size:var(--font-size-xs);font-weight:600}.header__dropdown{position:absolute;top:100%;right:0;min-width:220px;margin-top:4px;background:hsl(var(--popover));border:1px solid hsl(var(--border));border-radius:var(--radius);box-shadow:0 4px 16px #00000026;padding:4px;z-index:50;animation:fadeInUp .1s ease-out}.header__dropdown-header{padding:8px 8px 6px}.header__dropdown-name{display:block;font-size:var(--font-size-sm);font-weight:600;color:hsl(var(--foreground))}.header__dropdown-email{display:block;font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));margin-top:1px}.header__dropdown-divider{height:1px;background:hsl(var(--border));margin:4px 0}.header__dropdown-item{display:flex;align-items:center;gap:var(--gap-sm);width:100%;padding:6px 8px;border:none;background:transparent;color:hsl(var(--foreground));font-size:var(--font-size-sm);font-family:var(--font-family);border-radius:calc(var(--radius) - 2px);cursor:pointer;transition:background var(--transition-fast);text-decoration:none}.header__dropdown-item:hover{background:hsl(var(--accent))}.header__dropdown-item--danger{color:hsl(var(--foreground))}.header__dropdown-item--danger:hover{background:hsl(var(--accent))}.header__github-star{position:relative;display:flex;align-items:center}.header__github-star-btn{display:inline-flex;align-items:stretch;height:28px;border-radius:6px;border:1px solid hsl(var(--border));background:hsl(var(--card));color:hsl(var(--foreground));font-size:var(--font-size-xs);font-weight:600;font-family:var(--font-family);text-decoration:none;cursor:pointer;transition:all var(--transition-fast);white-space:nowrap;line-height:1;overflow:hidden}.header__github-star-btn:hover{border-color:hsl(var(--ring) / .3)}.header__github-star-action{display:flex;align-items:center;gap:6px;padding:0 10px;background:hsl(var(--muted));transition:background var(--transition-fast)}.header__github-star-btn:hover .header__github-star-action{background:hsl(var(--muted-foreground) / .15)}.header__github-icon{flex-shrink:0}.header__github-star-label{font-size:var(--font-size-xs);font-weight:600}.header__github-star-count{display:flex;align-items:center;padding:0 10px;font-size:var(--font-size-xs);font-weight:600;font-variant-numeric:tabular-nums;border-left:1px solid hsl(var(--border))}.header__github-star-close{position:absolute;top:-6px;right:-6px;width:16px;height:16px;border-radius:50%;border:1px solid hsl(var(--border));background:hsl(var(--card));color:hsl(var(--muted-foreground));display:flex;align-items:center;justify-content:center;cursor:pointer;opacity:0;transition:all var(--transition-fast);padding:0;line-height:1}.header__github-star:hover .header__github-star-close{opacity:1}.header__github-star-close:hover{background:hsl(var(--destructive));border-color:hsl(var(--destructive));color:#fff}.header__star-separator{width:1px;align-self:stretch;background:hsl(var(--border));margin:0 8px}.custom-select{position:relative;display:inline-block}.custom-select__trigger{display:inline-flex;align-items:center;gap:6px;height:2rem;padding:0 8px 0 10px;background:transparent;color:hsl(var(--foreground));border:1px solid hsl(var(--border));border-radius:var(--radius);font-size:var(--font-size-sm);font-family:var(--font-family);font-weight:400;cursor:pointer;transition:border-color var(--transition-fast);white-space:nowrap}.custom-select__trigger:hover,.custom-select__trigger--open{border-color:hsl(var(--foreground) / .3)}.custom-select__value{flex:1;text-align:left}.custom-select__chevron{color:hsl(var(--muted-foreground));flex-shrink:0;transition:transform var(--transition-fast)}.custom-select__trigger--open .custom-select__chevron{transform:rotate(180deg)}.custom-select__dropdown{position:absolute;top:calc(100% + 4px);left:0;min-width:max(100%,140px);background:hsl(var(--popover));border:1px solid hsl(var(--border));border-radius:var(--radius);box-shadow:0 4px 12px #00000014;padding:4px 0;z-index:50;animation:fadeInUp .1s ease-out}.custom-select__option{display:block;width:100%;padding:6px 14px;border:none;background:transparent;color:hsl(var(--popover-foreground));font-size:var(--font-size-sm);font-family:var(--font-family);cursor:pointer;transition:background var(--transition-fast);white-space:nowrap;text-align:left}.custom-select__option:hover{background:hsl(var(--accent))}.custom-select__option--selected{background:hsl(var(--accent));font-weight:500}.data-table__sortable{cursor:pointer;user-select:none}.data-table__sortable:hover{color:hsl(var(--foreground))}.status-badge--error,.status-badge--rate_limited{background:hsl(var(--destructive) / .1);color:hsl(var(--destructive))}.status-badge--rate_limited a{color:inherit;text-decoration:none}.status-badge--rate_limited a:hover{text-decoration:underline}.tier-badge{display:inline-flex;align-items:center;vertical-align:middle;font-size:var(--font-size-2xs, 10px);padding:1px 6px;border-radius:var(--radius-sm);font-weight:500;margin-left:6px;text-transform:uppercase;letter-spacing:.5px}.tier-badge--simple{background:hsl(var(--success) / .1);color:hsl(var(--success))}.tier-badge--standard{background:hsl(var(--chart-2) / .15);color:hsl(var(--chart-2))}.tier-badge--complex{background:hsl(var(--chart-5) / .15);color:hsl(var(--chart-5))}.tier-badge--reasoning{background:hsl(var(--destructive) / .1);color:hsl(var(--destructive))}.feed-item{display:flex;align-items:flex-start;gap:12px;padding:12px 0;border-bottom:1px solid hsl(var(--border));transition:background var(--transition-fast)}.skill-dot{width:6px;height:6px;border-radius:50%;flex-shrink:0;margin-top:7px;background:hsl(var(--muted-foreground))}.skill-dot--active{background:hsl(var(--chart-1))}.feed-item__icon{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;background:hsl(var(--muted));color:hsl(var(--muted-foreground));margin-top:2px}.feed-item__body{flex:1;min-width:0}.feed-item__desc{font-size:var(--font-size-sm);color:hsl(var(--foreground));line-height:1.4}.feed-item__sub{display:flex;align-items:center;gap:6px;margin-top:3px;font-size:var(--font-size-xs);color:hsl(var(--muted-foreground))}.feed-item__sub span+span:before{content:"·";margin-right:6px}.feed-item__status{flex-shrink:0;margin-top:4px}.empty-state__img-wrapper{position:relative;width:50%;margin:var(--gap-xl) auto 0;overflow:hidden}.empty-state__img-wrapper:after{content:"";position:absolute;inset:0;background:linear-gradient(to bottom,transparent 60%,hsl(var(--background)));pointer-events:none}.empty-state__img{display:block;width:100%}.dark .empty-state__img{filter:invert(.92) hue-rotate(180deg)}.agents-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:var(--gap-lg)}.agent-card{background:hsl(var(--card));border:1px solid hsl(var(--border));border-radius:var(--radius);padding:var(--gap-lg);box-shadow:var(--card-shadow);text-decoration:none;color:inherit;transition:all var(--transition-base);animation:fadeInUp .3s ease-out both}.agent-card:hover{box-shadow:var(--card-shadow-hover);border-color:hsl(var(--foreground) / .2)}.agent-card--skeleton{pointer-events:none}.agent-card__top{margin-bottom:var(--gap-sm)}.agent-card__name{font-size:var(--font-size-base);font-weight:600;color:hsl(var(--foreground))}.agent-card__stats{display:flex;flex-wrap:wrap;gap:var(--gap-sm) var(--gap-md);margin-bottom:var(--gap-md)}.agent-card__stat{display:flex;align-items:baseline;gap:4px}.agent-card__stat-value{font-size:var(--font-size-sm);font-weight:500;font-family:var(--font-mono);color:hsl(var(--foreground))}.agent-card__stat-label{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));width:55px;flex-shrink:0}.agent-card__chart{margin:0 calc(var(--gap-lg) * -1) calc(var(--gap-lg) * -1);overflow:hidden;border-radius:0 0 var(--radius) var(--radius);background:transparent}.agent-card__chart svg{width:100%;height:50px}.account-modal{position:fixed;inset:0;top:var(--header-height);z-index:30;background:hsl(var(--background));overflow-y:auto}.account-modal__inner{max-width:680px;margin-inline:auto;padding:var(--gap-xl) var(--gap-lg)}.account-modal__back{display:inline-flex;align-items:center;gap:4px;padding:0;border:none;background:transparent;color:hsl(var(--muted-foreground));font-size:var(--font-size-sm);font-family:var(--font-family);cursor:pointer;margin-bottom:var(--gap-lg);transition:color var(--transition-fast)}.account-modal__back:hover{color:hsl(var(--foreground))}.settings-section__title{font-size:var(--font-size-base);font-weight:600;color:hsl(var(--foreground));margin-bottom:var(--gap-md);margin-top:var(--gap-xl)}.settings-section__title:first-of-type{margin-top:0}.settings-card{background:hsl(var(--card));border:1px solid hsl(var(--border));border-radius:var(--radius);margin-bottom:var(--gap-lg);overflow:hidden}.settings-card__row{display:flex;align-items:center;justify-content:space-between;gap:var(--gap-xl);padding:var(--gap-lg);border-bottom:1px solid hsl(var(--border))}.settings-card__row:last-child{border-bottom:none}.settings-card__label{flex:1;min-width:0}.settings-card__label-title{display:block;font-size:var(--font-size-sm);font-weight:500;color:hsl(var(--foreground))}.settings-card__label-desc{display:block;font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));margin-top:2px}.settings-card__control{flex-shrink:0;width:260px}.settings-card__input{width:100%;height:2.25rem;padding:0 .75rem;background:hsl(var(--background));color:hsl(var(--foreground));border:1px solid hsl(var(--input));border-radius:var(--radius);font-size:var(--font-size-sm);font-family:var(--font-family);transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.settings-card__input:focus{outline:none;border-color:hsl(var(--ring));box-shadow:0 0 0 2px hsl(var(--ring) / .2)}.settings-card__input[readonly]{opacity:.6;cursor:default}.settings-card__footer{display:flex;justify-content:flex-end;padding:var(--gap-sm) var(--gap-lg);background:hsl(var(--muted) / .3);border-top:1px solid hsl(var(--border))}.settings-card__body{padding:var(--gap-md) var(--gap-lg)}.settings-card__desc{font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));margin-bottom:var(--gap-md)}.settings-card__id-row{display:inline-flex;align-items:center;gap:var(--gap-sm);padding:var(--gap-sm) var(--gap-md);background:hsl(var(--muted) / .5);border:1px solid hsl(var(--border));border-radius:var(--radius)}.settings-card__id-value{font-family:var(--font-mono);font-size:var(--font-size-sm);color:hsl(var(--foreground))}.settings-card__copy-btn{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;background:transparent;color:hsl(var(--muted-foreground));border-radius:calc(var(--radius) - 2px);cursor:pointer;transition:all var(--transition-fast)}.settings-card__copy-btn:hover{background:hsl(var(--accent));color:hsl(var(--foreground))}.theme-picker{display:flex;gap:var(--gap-sm)}.theme-picker__option{display:flex;align-items:center;gap:var(--gap-sm);padding:var(--gap-sm) var(--gap-md);border:1px solid hsl(var(--border));border-radius:var(--radius);background:transparent;color:hsl(var(--muted-foreground));font-size:var(--font-size-sm);font-family:var(--font-family);cursor:pointer;transition:all var(--transition-fast)}.theme-picker__option:hover{border-color:hsl(var(--foreground) / .3);color:hsl(var(--foreground))}.theme-picker__option--active{border-color:hsl(var(--chart-1));color:hsl(var(--foreground));background:hsl(var(--chart-1) / .08)}.modal{background:hsl(var(--background));border:none;border-radius:var(--radius);width:90%;max-width:680px;max-height:80vh;display:flex;flex-direction:column;box-shadow:var(--card-shadow),0 25px 50px -12px #00000040;animation:fadeInUp .2s ease-out}.modal-overlay{position:fixed;inset:0;z-index:100;background:#fbf9f3e0;backdrop-filter:blur(2px);display:flex;align-items:center;justify-content:center;padding:var(--gap-lg);animation:fadeIn .15s ease-out}.dark .modal-overlay{background:#000000b3}.modal-card{background:hsl(var(--card));border:1px solid hsl(var(--border));border-radius:16px;box-shadow:0 0 25px #00000015;width:100%;max-width:520px;padding:32px;animation:fadeInUp .2s ease-out}.modal-card__title{font-size:var(--font-size-xl);font-weight:700;color:hsl(var(--foreground));margin-bottom:4px}.modal-card__desc{font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));margin-bottom:var(--gap-lg);line-height:1.5}.modal-card__desc strong{color:hsl(var(--chart-1));font-weight:600}.modal-card__note{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));text-align:center;margin-bottom:var(--gap-md)}.modal-card__privacy{display:flex;align-items:flex-start;gap:var(--gap-sm);padding:10px 12px;background:hsl(var(--chart-1) / .08);border:1px solid hsl(var(--chart-1) / .2);border-radius:var(--radius);font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));line-height:1.5;margin-bottom:var(--gap-lg)}.modal-card__privacy svg{flex-shrink:0;margin-top:1px;color:hsl(var(--chart-1))}.modal-card__privacy strong{color:hsl(var(--chart-1))}.modal-card__field-label{display:block;font-size:var(--font-size-sm);font-weight:500;color:hsl(var(--foreground));margin-top:var(--gap-md);margin-bottom:6px}.modal-card__field-label:first-of-type{margin-top:0}.modal-card__input{width:100%;height:2.5rem;padding:0 12px;background:hsl(var(--background));color:hsl(var(--foreground));border:1px solid hsl(var(--input));border-radius:var(--radius);font-size:var(--font-size-sm);font-family:var(--font-family);outline:none;transition:border-color var(--transition-fast),box-shadow var(--transition-fast);margin-bottom:0;box-sizing:border-box}.modal-card__input:focus{border-color:hsl(var(--ring));box-shadow:0 0 0 2px hsl(var(--ring) / .2)}.modal-card__input::placeholder{color:hsl(var(--muted-foreground))}.modal-card__input--error{border-color:hsl(var(--destructive))}.modal-card__input--error:focus{border-color:hsl(var(--destructive));box-shadow:0 0 0 2px hsl(var(--destructive) / .2)}.modal-card__cta{display:flex;align-items:center;justify-content:center;gap:var(--gap-sm);width:100%;padding:12px;border:none;border-radius:var(--radius);background:#f97015;color:#fff;font-size:var(--font-size-base);font-weight:600;font-family:var(--font-family);cursor:pointer;transition:background var(--transition-fast)}.modal-card__cta:hover:not(:disabled){background:#ef6306}.modal-card__cta:disabled{opacity:.5;cursor:not-allowed}.modal-card__back-link{display:flex;align-items:center;justify-content:center;gap:4px;width:100%;padding:8px;margin-top:var(--gap-sm);border:none;background:transparent;color:hsl(var(--muted-foreground));font-size:var(--font-size-sm);font-family:var(--font-family);cursor:pointer;transition:color var(--transition-fast)}.modal-card__back-link:hover{color:hsl(var(--foreground))}.modal-card__footer{display:flex;justify-content:flex-end;margin-top:var(--gap-xl)}.modal-card__footer .btn:disabled{opacity:.4;cursor:not-allowed}.modal-stepper{display:flex;align-items:center;gap:0;margin-bottom:var(--gap-xl)}.modal-stepper__step{display:flex;align-items:center;gap:8px}.modal-stepper__circle{width:28px;height:28px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:var(--font-size-xs);font-weight:600;background:hsl(var(--muted));color:hsl(var(--muted-foreground));transition:all var(--transition-base)}.modal-stepper__step--active .modal-stepper__circle,.modal-stepper__step--done .modal-stepper__circle{background:hsl(var(--chart-1));color:#fff}.modal-stepper__label{font-size:var(--font-size-sm);font-weight:500;color:hsl(var(--muted-foreground))}.modal-stepper__step--active .modal-stepper__label,.modal-stepper__step--done .modal-stepper__label{color:hsl(var(--foreground))}.modal-stepper__line{flex:1;height:1px;background:hsl(var(--border));margin:0 12px;min-width:24px}@layer base{:root{--background: 45 49% 97%;--foreground: 222.2 84% 4.9%;--card: 44 60% 99%;--card-foreground: 222.2 84% 4.9%;--popover: 44 60% 99%;--popover-foreground: 222.2 84% 4.9%;--primary: 222.2 47.4% 11.2%;--primary-foreground: 45 30% 97%;--secondary: 40 33% 93%;--secondary-foreground: 222.2 47.4% 11.2%;--muted: 40 33% 93%;--muted-foreground: 215.4 16.3% 46.9%;--accent: 40 33% 93%;--accent-foreground: 222.2 47.4% 11.2%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 45 30% 97%;--border: 36 25% 88%;--input: 36 25% 88%;--ring: 222.2 84% 4.9%;--radius: .5rem;--chart-1: 178 75% 44%;--chart-2: 197 37% 24%;--chart-3: 167 70% 48%;--bar-input: 178 75% 34%;--bar-output: 178 55% 72%;--chart-4: 349 52% 61%;--chart-5: 43 96% 56%;--sidebar-background: 43 38% 95%;--sidebar-foreground: 240 5.3% 26.1%;--sidebar-primary: 240 5.9% 10%;--sidebar-primary-foreground: 45 30% 97%;--sidebar-accent: 40 28% 93%;--sidebar-accent-foreground: 240 5.9% 10%;--sidebar-border: 36 20% 89%;--sidebar-ring: 217.2 91.2% 59.8%;--success: 178 75% 44%;--success-foreground: 0 0% 100%}.dark{--background: 0 0% 9%;--foreground: 0 0% 93%;--card: 0 0% 11%;--card-foreground: 0 0% 93%;--popover: 0 0% 11%;--popover-foreground: 0 0% 93%;--primary: 0 0% 93%;--primary-foreground: 0 0% 9%;--secondary: 0 0% 15%;--secondary-foreground: 0 0% 93%;--muted: 0 0% 15%;--muted-foreground: 0 0% 55%;--accent: 0 0% 15%;--accent-foreground: 0 0% 93%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 0 0% 93%;--border: 0 0% 18%;--input: 0 0% 18%;--ring: 0 0% 60%;--chart-1: 178 70% 50%;--chart-2: 197 50% 55%;--chart-3: 167 70% 55%;--chart-4: 349 52% 65%;--chart-5: 43 96% 65%;--bar-input: 178 70% 40%;--bar-output: 178 50% 70%;--sidebar-background: 0 0% 7%;--sidebar-foreground: 0 0% 93%;--sidebar-primary: 0 0% 93%;--sidebar-primary-foreground: 0 0% 9%;--sidebar-accent: 0 0% 14%;--sidebar-accent-foreground: 0 0% 93%;--sidebar-border: 0 0% 18%;--sidebar-ring: 0 0% 60%;--success: 178 70% 50%;--success-foreground: 0 0% 100%}}:root{--sidebar-width: 230px;--header-height: 48px;--gap-xs: 4px;--gap-sm: 8px;--gap-md: 16px;--gap-lg: 24px;--gap-xl: 32px;--gap-2xl: 48px;--font-family: "Inter", -apple-system, BlinkMacSystemFont, system-ui, sans-serif;--font-mono: "JetBrains Mono", "SF Mono", ui-monospace, monospace;--font-size-xs: .75rem;--font-size-sm: .875rem;--font-size-base: .9375rem;--font-size-lg: 1.125rem;--font-size-xl: 1.5rem;--font-size-2xl: 1.875rem;--font-size-3xl: 2.25rem;--font-size-4xl: 3rem;--transition-fast: .15s cubic-bezier(.4, 0, .2, 1);--transition-base: .2s cubic-bezier(.4, 0, .2, 1);--card-shadow: rgba(0, 0, 0, .06) 0px 0px 0px 1px, rgba(0, 0, 0, .03) 0px 2px 6px 0px;--card-shadow-hover: rgba(0, 0, 0, .08) 0px 0px 0px 1px, rgba(0, 0, 0, .06) 0px 3px 8px 0px}.modal-terminal{border-radius:var(--radius);overflow:hidden;border:1px solid hsl(var(--border));margin-bottom:var(--gap-md)}.modal-terminal__header{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;background:hsl(var(--muted));border-bottom:1px solid hsl(var(--border))}.modal-terminal__dots{display:flex;gap:6px}.modal-terminal__dot{width:10px;height:10px;border-radius:50%}.modal-terminal__dot--red{background:#ff5f57}.modal-terminal__dot--yellow{background:#febc2e}.modal-terminal__dot--green{background:#28c840}.modal-terminal__tabs{display:flex;align-items:center;gap:4px;font-size:var(--font-size-xs)}.modal-terminal__tab{padding:0;border:none;background:transparent;color:hsl(var(--muted-foreground));font-size:var(--font-size-xs);font-family:var(--font-family);cursor:pointer;font-weight:500}.modal-terminal__tab--active{color:hsl(var(--foreground));font-weight:600}.modal-terminal__tab:focus-visible{outline:2px solid hsl(var(--ring));outline-offset:2px;border-radius:2px}.modal-terminal__tab-sep{color:hsl(var(--muted-foreground))}.modal-terminal__body{position:relative;padding:14px 16px;background:hsl(var(--background));font-family:var(--font-mono);font-size:var(--font-size-xs);line-height:1.7;color:hsl(var(--foreground))}.dark .modal-terminal__body{background:#080c16;color:#20dfd9}.modal-terminal__line--comment{color:hsl(var(--muted-foreground))}.modal-terminal__prompt{color:hsl(var(--chart-1));margin-right:8px}.dark .modal-terminal__prompt{color:hsl(var(--muted-foreground))}.modal-terminal__code{word-break:break-all}.modal-terminal__copy{position:absolute;top:12px;right:12px;padding:6px;border:none;border-radius:var(--radius);background:#0000000f;color:#0006;cursor:pointer;transition:all var(--transition-fast)}.modal-terminal__copy:hover{background:#0000001a;color:#000000b3}.dark .modal-terminal__copy{background:#ffffff1a;color:#ffffff80}.dark .modal-terminal__copy:hover{background:#fff3;color:#fffc}.modal-terminal__copy:focus-visible{outline:2px solid hsl(var(--ring));outline-offset:2px}.modal-key-box{border:1px solid hsl(var(--chart-5) / .3);border-radius:var(--radius);overflow:hidden;margin-bottom:var(--gap-lg)}.modal-key-box__header{display:flex;align-items:center;justify-content:space-between;padding:10px 14px}.modal-key-box__label{font-size:var(--font-size-xs);font-weight:600;letter-spacing:.05em;color:hsl(var(--muted-foreground))}.modal-key-box__copy{display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border:1px solid hsl(var(--border));border-radius:var(--radius);background:transparent;color:hsl(var(--foreground));font-size:var(--font-size-xs);font-family:var(--font-family);font-weight:500;cursor:pointer;transition:all var(--transition-fast)}.modal-key-box__copy:hover{background:hsl(var(--accent))}.modal-key-box__value{display:block;padding:12px 14px;background:hsl(var(--muted));color:hsl(var(--foreground));font-family:var(--font-mono);font-size:var(--font-size-xs);word-break:break-all;line-height:1.6}.dark .modal-key-box__value{background:#080c16;color:#20dfd9}.modal-key-box__warning{display:flex;align-items:flex-start;gap:var(--gap-sm);padding:10px 14px;background:hsl(var(--chart-5) / .08);border-top:1px solid hsl(var(--chart-5) / .2);font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));line-height:1.5}.modal-key-box__warning svg{flex-shrink:0;margin-top:1px;color:hsl(var(--chart-5))}.notif-hint{display:flex;align-items:flex-start;gap:10px;margin-top:var(--gap-xl);margin-bottom:var(--gap-md);padding:12px 16px;background:hsl(var(--chart-1) / .06);border:1px solid hsl(var(--chart-1) / .18);border-radius:var(--radius);font-size:var(--font-size-sm);color:hsl(var(--foreground));line-height:1.5}.notif-hint svg{flex-shrink:0;margin-top:2px;color:hsl(var(--chart-1))}.notif-hint p{margin:0}.settings-card--disabled{opacity:.45;pointer-events:none;user-select:none}.notif-table{width:100%;border-collapse:collapse;font-size:var(--font-size-sm)}.notif-table thead th{text-align:left;font-weight:500;font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));padding:var(--gap-sm) var(--gap-lg);border-bottom:1px solid hsl(var(--border));white-space:nowrap}.notif-table tbody td{padding:var(--gap-sm) var(--gap-lg);color:hsl(var(--foreground));border-bottom:1px solid hsl(var(--border));white-space:nowrap}.notif-table tbody tr:last-child td{border-bottom:none}.notif-table__mono{font-family:var(--font-mono)}.notif-table__row--disabled td{opacity:.45}.notif-table__row--disabled td:last-child{opacity:1}.notif-table__actions{text-align:right;display:flex;align-items:center;justify-content:flex-end;gap:var(--gap-sm)}.notification-rule__edit,.notification-rule__delete{color:hsl(var(--muted-foreground));padding:4px;height:auto}.notification-rule__edit:hover{color:hsl(var(--foreground))}.notification-rule__delete:hover{color:hsl(var(--destructive))}.notification-toggle{position:relative;display:inline-flex;cursor:pointer}.notification-toggle input{opacity:0;width:0;height:0;position:absolute}.notification-toggle__slider{width:36px;height:20px;background:hsl(var(--muted));border-radius:9999px;transition:background var(--transition-fast);position:relative}.notification-toggle__slider:after{content:"";position:absolute;width:16px;height:16px;border-radius:50%;background:#fff;top:2px;left:2px;transition:transform var(--transition-fast)}.notification-toggle input:checked+.notification-toggle__slider{background:hsl(var(--success))}.notification-toggle input:checked+.notification-toggle__slider:after{transform:translate(16px)}.notification-modal__select{width:100%;height:2.5rem}.provider-setup__title{margin:0 0 4px;font-size:var(--font-size-md);font-weight:600;color:hsl(var(--foreground))}.provider-setup__subtitle{margin:0 0 var(--gap-lg);font-size:var(--font-size-sm);color:hsl(var(--muted-foreground))}.provider-setup-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--gap-md)}.provider-setup-card{display:flex;align-items:center;gap:12px;padding:16px 20px;background:hsl(var(--card));border:1px solid hsl(var(--border));border-radius:var(--radius);cursor:pointer;text-align:left;font-family:var(--font-family);transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.provider-setup-card:hover{border-color:hsl(var(--foreground) / .3);box-shadow:0 1px 4px hsl(var(--foreground) / .06)}.provider-setup-card__logo{width:32px;height:32px;border-radius:6px;flex-shrink:0;object-fit:contain}.provider-setup-card__name{font-size:var(--font-size-sm);font-weight:600;color:hsl(var(--foreground))}.provider-setup-card__desc{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground))}.provider-modal-picker{display:flex;gap:var(--gap-sm)}.provider-modal-option{flex:1;display:flex;align-items:center;gap:8px;padding:10px 14px;background:hsl(var(--background));border:1px solid hsl(var(--border));border-radius:var(--radius);cursor:pointer;font-family:var(--font-family);font-size:var(--font-size-sm);font-weight:500;color:hsl(var(--muted-foreground));transition:border-color var(--transition-fast),color var(--transition-fast)}.provider-modal-option:hover{border-color:hsl(var(--foreground) / .3)}.provider-modal-option--active{border-color:hsl(var(--primary));color:hsl(var(--foreground))}.provider-modal-option__logo{width:22px;height:22px;border-radius:4px;object-fit:contain}.provider-card{background:hsl(var(--card));border:1px solid hsl(var(--border));border-radius:var(--radius);padding:16px 20px;margin-bottom:var(--gap-lg)}.provider-card__header{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.provider-card__label{font-size:var(--font-size-base);font-weight:600;color:hsl(var(--foreground));margin-bottom:0}.provider-card__actions{display:flex;gap:4px}.provider-card__body{display:flex;align-items:center;gap:12px}.provider-card__logo{width:36px;height:36px;border-radius:8px;flex-shrink:0;object-fit:contain}.provider-card__name{font-size:var(--font-size-sm);font-weight:600;color:hsl(var(--foreground))}.provider-card__meta{display:flex;align-items:center;gap:8px;font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));font-family:var(--font-mono);margin-top:2px}.provider-card__key{opacity:.5}.provider-card__email{display:flex;align-items:center;gap:4px;opacity:.7}.provider-card__menu{position:relative}.provider-card__menu-btn{display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;border-radius:var(--radius);background:transparent;color:hsl(var(--muted-foreground));cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast)}.provider-card__menu-btn:hover{background:hsl(var(--accent));color:hsl(var(--foreground))}.provider-card__dropdown{position:absolute;top:100%;right:0;min-width:150px;margin-top:4px;background:hsl(var(--popover));border:1px solid hsl(var(--border));border-radius:var(--radius);box-shadow:0 4px 12px hsl(var(--foreground) / .08);padding:4px;z-index:20;animation:fadeIn .1s ease-out}.provider-card__dropdown-item{display:flex;align-items:center;gap:8px;width:100%;padding:8px 10px;border:none;border-radius:calc(var(--radius) - 2px);background:transparent;color:hsl(var(--foreground));font-size:var(--font-size-sm);font-family:var(--font-family);cursor:pointer;transition:background var(--transition-fast)}.provider-card__dropdown-item:hover{background:hsl(var(--accent))}.provider-card__dropdown-item--danger:hover{background:hsl(var(--destructive) / .1);color:hsl(var(--destructive))}.masked-key{display:flex;align-items:center;gap:var(--gap-sm);padding:0 1px 0 14px;height:2.5rem;background:hsl(var(--muted) / .4);border:1px solid hsl(var(--border));border-radius:var(--radius)}.masked-key__value{flex:1;font-family:var(--font-mono);font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));letter-spacing:.02em}.masked-key__edit{flex-shrink:0;font-size:var(--font-size-xs);padding:4px 8px;height:auto;gap:4px}.modal-card__input--error{border-color:hsl(var(--destructive));margin-bottom:0}.modal-card__field-error{margin:4px 0 0;padding:0;font-size:var(--font-size-xs);color:hsl(var(--destructive));line-height:1.4}.modal-card__field-hint{margin:4px 0 0;padding:0;font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));line-height:1.4}.modal-card__footer--split{display:flex;justify-content:space-between;align-items:center}.cloud-email-info{display:flex;align-items:flex-start;gap:12px;padding:16px 20px;background:hsl(var(--card));border:1px solid hsl(var(--border));border-radius:var(--radius)}.cloud-email-info__icon{flex-shrink:0;margin-top:2px;color:hsl(var(--success))}.cloud-email-info__title{font-size:var(--font-size-sm);font-weight:600;color:hsl(var(--foreground));margin-bottom:2px}.cloud-email-info__desc{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));line-height:1.5}.limit-type-badge{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:9999px;font-size:var(--font-size-xs);font-weight:500;white-space:nowrap}.limit-type-badge--alert{background:hsl(var(--chart-1) / .1);color:hsl(var(--chart-1))}.limit-type-badge--hard{background:hsl(var(--chart-5) / .15);color:hsl(var(--chart-5))}.limits-warning-banner{display:flex;align-items:flex-start;gap:10px;margin-bottom:var(--gap-lg);padding:12px 16px;background:hsl(var(--destructive) / .06);border:1px solid hsl(var(--destructive) / .18);border-radius:var(--radius);font-size:var(--font-size-sm);color:hsl(var(--foreground));line-height:1.5}.limits-warning-banner svg{flex-shrink:0;margin-top:2px;color:hsl(var(--destructive))}.limits-routing-cta{display:flex;align-items:flex-start;gap:10px;margin-bottom:var(--gap-lg);padding:12px 16px;background:hsl(var(--chart-1) / .06);border:1px solid hsl(var(--chart-1) / .18);border-radius:var(--radius);font-size:var(--font-size-sm);color:hsl(var(--foreground));line-height:1.5}.limits-routing-cta svg{flex-shrink:0;margin-top:2px;color:hsl(var(--chart-1))}.limits-routing-cta p{margin:4px 0 0;color:hsl(var(--muted-foreground))}.limit-modal__row{display:grid;grid-template-columns:1fr 1fr;gap:var(--gap-md)}.limit-modal__row .modal-card__field-label{margin-top:0}.limit-type-selector{display:flex;gap:var(--gap-sm)}.limit-type-option{flex:1;display:flex;align-items:center;gap:8px;padding:10px 14px;background:hsl(var(--background));border:1px solid hsl(var(--border));border-radius:var(--radius);cursor:pointer;font-family:var(--font-family);font-size:var(--font-size-sm);font-weight:500;color:hsl(var(--muted-foreground));transition:border-color var(--transition-fast),color var(--transition-fast)}.limit-type-option:hover:not(:disabled){border-color:hsl(var(--foreground) / .3)}.limit-type-option--active{border-color:hsl(var(--primary));color:hsl(var(--foreground))}.limit-type-option--disabled{opacity:.45;cursor:not-allowed}.provider-modal__list{padding:8px 0;max-height:400px;overflow-y:auto}.provider-modal__footer{padding:16px 24px;border-top:1px solid hsl(var(--border));display:flex;justify-content:flex-end}.provider-toggle{display:flex;align-items:center;gap:var(--gap-sm);width:100%;padding:10px 24px;background:none;border:none;cursor:pointer;font-family:var(--font-family);text-align:left;transition:background var(--transition-fast)}.provider-toggle:hover{background:hsl(var(--muted) / .5)}.provider-toggle:focus-visible{outline:2px solid hsl(var(--ring));outline-offset:-2px}.provider-toggle:disabled{opacity:.6;cursor:not-allowed}.provider-toggle__icon{width:28px;height:28px;flex-shrink:0;display:flex;align-items:center;justify-content:center;color:hsl(var(--foreground))}.provider-toggle__info{flex:1;display:flex;flex-direction:column;gap:1px;min-width:0}.provider-toggle__name{font-size:var(--font-size-sm);font-weight:500;color:hsl(var(--foreground))}.provider-toggle__subtitle{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground))}.provider-toggle__switch{position:relative;width:36px;height:20px;background:hsl(var(--muted));border-radius:10px;flex-shrink:0;transition:background var(--transition-fast)}.provider-toggle__switch--on{background:hsl(var(--success))}.provider-toggle__switch-thumb{position:absolute;top:2px;left:2px;width:16px;height:16px;background:#fff;border-radius:50%;transition:transform var(--transition-fast);box-shadow:0 1px 2px #00000026}.provider-toggle__switch--on .provider-toggle__switch-thumb{transform:translate(16px)}.provider-toggle__badge{font-size:var(--font-size-xs);font-weight:500;color:hsl(var(--muted-foreground));padding:2px 8px;border-radius:9999px;background:hsl(var(--muted) / .6);white-space:nowrap;flex-shrink:0}.provider-toggle__badge--connected{color:hsl(var(--success));background:hsl(var(--success) / .12)}.provider-toggle__expand{padding:0 24px 12px 60px}.provider-toggle__key-row{display:flex;align-items:center;gap:8px}.provider-toggle__key-input{flex:1;height:2rem;padding:0 10px;background:hsl(var(--muted) / .4);color:hsl(var(--foreground));border:1px solid hsl(var(--border));border-radius:var(--radius);font-size:var(--font-size-sm);font-family:var(--font-family);outline:none;transition:border-color var(--transition-fast);box-sizing:border-box}.provider-toggle__key-input:focus{border-color:hsl(var(--ring));box-shadow:0 0 0 2px hsl(var(--ring) / .2)}.provider-toggle__key-input::placeholder{color:hsl(var(--muted-foreground) / .6)}.provider-toggle__disconnect-btn{color:hsl(var(--destructive));border-color:hsl(var(--destructive) / .3)}.provider-toggle__disconnect-btn:hover{background:hsl(var(--destructive) / .08)}.provider-detail{padding:20px 24px 24px;overflow:hidden}.provider-detail__header{display:flex;align-items:center;gap:var(--gap-sm);margin-bottom:20px}.provider-detail__back{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;padding:0;color:hsl(var(--muted-foreground));cursor:pointer;margin-bottom:12px;transition:color var(--transition-fast)}.provider-detail__back:hover{color:hsl(var(--foreground))}.provider-detail__icon{width:40px;height:40px;display:flex;align-items:center;justify-content:center;flex-shrink:0;color:hsl(var(--foreground))}.provider-detail__title-group{flex:1;min-width:0}.provider-detail__name{font-size:var(--font-size-md);font-weight:600;color:hsl(var(--foreground))}.provider-detail__subtitle{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground))}.provider-detail__field{margin-bottom:16px}.provider-detail__label{display:block;font-size:var(--font-size-sm);font-weight:500;color:hsl(var(--foreground));margin-bottom:6px}.provider-detail__input{width:100%;height:2.25rem;padding:0 12px;background:hsl(var(--muted) / .4);color:hsl(var(--foreground));border:1px solid hsl(var(--border));border-radius:var(--radius);font-size:var(--font-size-sm);font-family:var(--font-family);outline:none;transition:border-color var(--transition-fast);box-sizing:border-box}.provider-detail__input:focus{border-color:hsl(var(--ring));box-shadow:0 0 0 2px hsl(var(--ring) / .2)}.provider-detail__input::placeholder{color:hsl(var(--muted-foreground) / .6)}.provider-detail__input--disabled{opacity:.7;font-family:var(--font-mono, monospace);letter-spacing:.05em;cursor:not-allowed}.provider-detail__input--error{border-color:hsl(var(--destructive))}.provider-detail__input--error:focus{box-shadow:0 0 0 2px hsl(var(--destructive) / .2)}.provider-detail__error{font-size:var(--font-size-xs);color:hsl(var(--destructive));margin-top:4px}.provider-detail__key-row{display:flex;align-items:center;gap:8px}.provider-detail__key-row .provider-detail__input{flex:1;min-width:0}.provider-detail__key-row .btn{height:2.25rem;flex-shrink:0;white-space:nowrap}.provider-detail__action{width:auto;margin-top:4px;float:right}.provider-detail__no-key{font-size:var(--font-size-sm);color:hsl(var(--muted-foreground))}.provider-detail__disconnect{color:hsl(var(--destructive));border-color:hsl(var(--destructive) / .3)}.provider-detail__disconnect:hover{background:hsl(var(--destructive) / .08)}.provider-detail__disconnect-icon{width:2.25rem;height:2.25rem;display:flex;align-items:center;justify-content:center;background:none;border:1px solid hsl(var(--border));border-radius:var(--radius);color:hsl(var(--muted-foreground));cursor:pointer;flex-shrink:0;transition:background var(--transition-fast),color var(--transition-fast)}.provider-detail__disconnect-icon:hover{background:hsl(var(--muted) / .5);color:hsl(var(--foreground))}.provider-detail__disconnect-icon:disabled{opacity:.5;cursor:not-allowed}.provider-modal__view{animation:modalSlideIn .22s cubic-bezier(.22,1,.36,1) both}.provider-modal__view--from-left{animation-name:modalSlideFromLeft}.provider-modal__view--from-right{animation-name:modalSlideFromRight}@keyframes modalSlideFromRight{0%{opacity:0;transform:translate(40px)}to{opacity:1;transform:translate(0)}}@keyframes modalSlideFromLeft{0%{opacity:0;transform:translate(-40px)}to{opacity:1;transform:translate(0)}}@keyframes modalSlideIn{0%{opacity:0}to{opacity:1}}.provider-card__logo-letter{width:28px;height:28px;border-radius:6px;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;color:#fff;letter-spacing:-.02em}.routing-modal__header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px 16px;flex-shrink:0}.routing-modal__title{font-size:var(--font-size-lg);font-weight:600;color:hsl(var(--foreground))}.routing-modal__subtitle{font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));margin-top:2px}.routing-modal__search-wrap{position:relative;padding:0 24px;flex-shrink:0}.routing-modal__search-icon{position:absolute;left:38px;top:50%;transform:translateY(-50%);color:hsl(var(--muted-foreground) / .6);pointer-events:none}.routing-modal__search{width:100%;height:2.75rem;padding:0 16px 0 38px;background:hsl(var(--muted) / .4);color:hsl(var(--foreground));border:none;border-radius:var(--radius);font-size:var(--font-size-sm);font-family:var(--font-family);outline:none;transition:background var(--transition-fast),box-shadow var(--transition-fast);box-sizing:border-box}.routing-modal__search:focus{background:hsl(var(--muted) / .6);box-shadow:0 0 0 2px hsl(var(--ring) / .2)}.routing-modal__search::placeholder{color:hsl(var(--muted-foreground) / .7)}.routing-modal__list{overflow-y:auto;flex:1;min-height:0;padding:0;margin-top:12px;border-top:1px solid hsl(var(--border))}.routing-modal__group{border-bottom:1px solid hsl(var(--border))}.routing-modal__group:last-child{border-bottom:none}.routing-modal__group-header{display:flex;align-items:center;gap:8px;padding:10px 24px 6px;position:sticky;top:0;background:hsl(var(--card));z-index:1}.routing-modal__group-icon{display:flex;align-items:center;flex-shrink:0}.routing-modal__group-name{font-size:var(--font-size-xs);font-weight:600;color:hsl(var(--muted-foreground));text-transform:uppercase;letter-spacing:.04em}.routing-modal__model{display:flex;align-items:center;justify-content:space-between;gap:var(--gap-md);width:100%;padding:9px 24px 9px 48px;background:none;border:none;border-top:1px solid hsl(var(--border) / .5);cursor:pointer;font-family:var(--font-family);text-align:left;transition:background var(--transition-fast)}.routing-modal__model:first-child{border-top:none}.routing-modal__model:hover{background:hsl(var(--muted) / .5)}.routing-modal__model:focus-visible{outline:2px solid hsl(var(--ring));outline-offset:-2px}.routing-modal__model-label{font-size:var(--font-size-sm);font-weight:500;color:hsl(var(--foreground))}.routing-modal__model-id{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));font-family:var(--font-mono, monospace)}.routing-modal__recommended{font-size:var(--font-size-xs);color:hsl(var(--success));font-weight:500;margin-left:4px}.routing-modal__empty{padding:24px;text-align:center;font-size:var(--font-size-sm);color:hsl(var(--muted-foreground))}.routing-enable-card{display:flex;flex-direction:column;align-items:center;text-align:center;padding:48px 32px;background:hsl(var(--card));border:1px solid hsl(var(--border));border-radius:var(--radius)}.routing-enable-card__icon{color:hsl(var(--muted-foreground));margin-bottom:var(--gap-lg)}.routing-enable-card__title{font-size:var(--font-size-lg);font-weight:600;color:hsl(var(--foreground));margin:0 0 var(--gap-sm)}.routing-enable-card__desc{font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));max-width:400px;line-height:1.6;margin:0 0 var(--gap-xl)}.routing-page-header{display:flex;align-items:flex-start;justify-content:space-between}.routing-providers-info{display:inline-flex;align-items:center;gap:8px;margin-bottom:var(--gap-lg)}.routing-providers-info__icons{display:inline-flex;align-items:center;gap:4px}.routing-providers-info__icon{display:flex;align-items:center;position:relative;cursor:default}.routing-providers-info__label{font-size:var(--font-size-sm);font-weight:500;color:hsl(var(--muted-foreground))}.routing-cards{display:flex;flex-direction:column;gap:8px}.routing-card{display:flex;align-items:center;gap:var(--gap-lg);padding:16px 20px;background:hsl(var(--card));border:1px solid hsl(var(--border));border-radius:var(--radius)}.routing-card__header{flex:0 0 420px;max-width:420px;min-width:420px;display:flex;flex-direction:column;gap:2px}.routing-card__tier{font-size:var(--font-size-sm);font-weight:600;color:hsl(var(--foreground))}.routing-card__desc{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));line-height:1.4}.routing-card__body{flex:1;min-width:0}.routing-card__main{font-size:var(--font-size-sm);font-weight:500;color:hsl(var(--foreground));display:block}.routing-card__sub{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));display:block;margin-top:2px}.routing-card__override{display:inline-flex;align-items:center;gap:8px}.routing-card__override-icon{display:flex;align-items:center;flex-shrink:0}.routing-card__auto-tag{font-size:var(--font-size-xs);font-weight:600;line-height:1;padding:3px 6px;border-radius:4px;background:hsl(var(--success) / .15);color:hsl(var(--success));text-transform:lowercase;letter-spacing:.02em}.routing-card__empty{display:flex;flex-direction:column;gap:2px}.routing-card__empty-text{font-size:var(--font-size-sm);color:hsl(var(--muted-foreground))}.routing-card__empty-link{font-size:var(--font-size-xs);color:hsl(var(--foreground));text-decoration:underline;background:none;border:none;cursor:pointer;font-family:var(--font-family);padding:0;text-align:left}.routing-card__actions{flex-shrink:0}.routing-action{font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));background:none;border:none;cursor:pointer;font-family:var(--font-family);padding:4px 8px;transition:color var(--transition-fast)}.routing-action:hover{color:hsl(var(--foreground))}.routing-action:focus-visible{outline:2px solid hsl(var(--ring));outline-offset:2px;border-radius:var(--radius)}.routing-action--danger:hover{color:hsl(var(--destructive))}.routing-disable-btn{font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));background:none;border:none;cursor:pointer;font-family:var(--font-family);padding:8px 12px;border-radius:var(--radius);transition:color var(--transition-fast),background var(--transition-fast)}.routing-disable-btn:hover{color:hsl(var(--destructive));background:hsl(var(--destructive) / .08)}.routing-disable-btn:focus-visible{outline:2px solid hsl(var(--ring));outline-offset:2px}.routing-disable-btn:disabled{opacity:.6;cursor:not-allowed}.routing-footer__instructions{font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));background:none;border:none;cursor:pointer;font-family:var(--font-family);padding:8px 12px;border-radius:var(--radius);transition:color var(--transition-fast);text-decoration:underline;text-underline-offset:2px}.routing-footer__instructions:hover{color:hsl(var(--foreground))}.routing-footer__instructions:focus-visible{outline:2px solid hsl(var(--ring));outline-offset:2px}.routing-footer{display:flex;align-items:center;gap:var(--gap-md);margin-top:var(--gap-lg)}@media(max-width:768px){.routing-card{flex-direction:column;align-items:flex-start;gap:var(--gap-sm)}.routing-card__header{flex:none;max-width:100%;min-width:0}.routing-card__actions{align-self:flex-end}.provider-toggle__expand{padding-left:24px}}.info-tooltip{position:relative;display:inline-flex;align-items:center;margin-left:4px;cursor:help;vertical-align:middle}.info-tooltip__icon{color:hsl(var(--muted-foreground));opacity:.6;transition:opacity .15s}.info-tooltip:hover .info-tooltip__icon,.info-tooltip:focus .info-tooltip__icon{opacity:1}.info-tooltip__bubble{display:none;position:absolute;bottom:calc(100% + 8px);left:50%;transform:translate(-50%);padding:8px 12px;background:hsl(var(--popover));color:hsl(var(--popover-foreground));border:1px solid hsl(var(--border));border-radius:var(--radius);font-size:var(--font-size-xs);font-weight:400;line-height:1.5;white-space:normal;width:max-content;max-width:260px;box-shadow:0 2px 8px hsl(var(--foreground) / .08);z-index:50;pointer-events:none}.info-tooltip:hover .info-tooltip__bubble,.info-tooltip:focus .info-tooltip__bubble{display:block}.toast-container{position:fixed;bottom:var(--gap-lg);right:var(--gap-lg);z-index:200;display:flex;flex-direction:column;gap:var(--gap-sm);pointer-events:none;max-width:420px;width:100%}.toast{display:flex;align-items:flex-start;gap:var(--gap-sm);padding:12px var(--gap-md);border-radius:var(--radius);background:hsl(var(--card));border:1px solid hsl(var(--border));box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;pointer-events:auto;animation:toastSlideIn .2s ease-out}.toast--error .toast__icon{color:hsl(var(--destructive))}.toast--success .toast__icon{color:hsl(var(--success))}.toast--warning .toast__icon{color:hsl(var(--chart-5))}.toast__icon{flex-shrink:0;margin-top:1px}.toast__message{flex:1;font-size:var(--font-size-sm);color:hsl(var(--foreground));line-height:1.4;word-break:break-word}.toast__dismiss{flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;background:transparent;color:hsl(var(--muted-foreground));border-radius:calc(var(--radius) - 2px);cursor:pointer;transition:all var(--transition-fast);margin:-2px -4px -2px 0}.toast__dismiss:hover{background:hsl(var(--muted));color:hsl(var(--foreground))}@keyframes toastSlideIn{0%{opacity:0;transform:translateY(8px) translate(8px)}to{opacity:1;transform:translateY(0) translate(0)}}@media(max-width:480px){.toast-container{left:var(--gap-sm);right:var(--gap-sm);bottom:var(--gap-sm);max-width:100%}}.model-filter{margin-bottom:var(--gap-lg)}.model-filter__row{display:flex;align-items:center;gap:var(--gap-md)}.model-filter__combobox{position:relative;flex:1;max-width:480px}.model-filter__input-wrapper{position:relative;display:flex;align-items:center}.model-filter__search-icon{position:absolute;left:12px;top:50%;transform:translateY(-50%);color:hsl(var(--muted-foreground));pointer-events:none}.model-filter__search{width:100%;height:2.5rem;padding:0 12px 0 2.25rem;background:hsl(var(--background));color:hsl(var(--foreground));border:none;border-radius:var(--radius);font-size:var(--font-size-base);font-family:var(--font-family);transition:box-shadow var(--transition-fast)}.model-filter__search::placeholder{color:hsl(var(--muted-foreground))}.model-filter__search:focus-visible{outline:none;box-shadow:0 0 0 2px hsl(var(--ring) / .25)}.model-filter__tags{display:flex;flex-wrap:wrap;gap:6px;margin-top:var(--gap-sm)}.model-filter__tag{display:inline-flex;align-items:center;gap:6px;height:1.75rem;padding:0 6px 0 10px;background:hsl(var(--secondary));border:1px solid hsl(var(--border));border-radius:9999px;font-size:var(--font-size-xs);line-height:1;white-space:nowrap;animation:fadeInUp .1s ease-out}.model-filter__tag--provider{padding-left:6px}.model-filter__tag-type{font-weight:600;line-height:1;color:hsl(var(--muted-foreground))}.model-filter__tag-value{font-weight:500;line-height:1;color:hsl(var(--foreground))}.model-filter__tag-remove{display:flex;align-items:center;justify-content:center;width:1.125rem;height:1.125rem;border:none;border-radius:9999px;background:transparent;color:hsl(var(--muted-foreground));cursor:pointer;transition:all var(--transition-fast)}.model-filter__tag-remove:hover{background:hsl(var(--muted));color:hsl(var(--foreground))}.model-filter__provider-icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;color:hsl(var(--muted-foreground))}.dark .model-filter__provider-icon--mono{filter:invert(1)}.model-filter__dropdown{position:absolute;top:calc(100% + 4px);left:0;width:100%;background:hsl(var(--popover));border:1px solid hsl(var(--border));border-radius:var(--radius);box-shadow:0 4px 12px #00000014;padding:4px 0;z-index:50;animation:fadeInUp .1s ease-out}.model-filter__dropdown-group+.model-filter__dropdown-group{border-top:1px solid hsl(var(--border));margin-top:4px;padding-top:4px}.model-filter__dropdown-label{padding:4px 14px;font-size:var(--font-size-xs);font-weight:600;color:hsl(var(--muted-foreground));text-transform:uppercase;letter-spacing:.05em}.model-filter__dropdown-item{display:flex;align-items:center;justify-content:space-between;width:100%;padding:7px 14px;border:none;background:transparent;color:hsl(var(--popover-foreground));font-size:var(--font-size-sm);font-family:var(--font-family);cursor:pointer;transition:background var(--transition-fast);text-align:left}.model-filter__dropdown-item:hover,.model-filter__dropdown-item--highlighted{background:hsl(var(--accent))}.model-filter__dropdown-item-name{display:flex;align-items:center;gap:8px}.model-filter__dropdown-item-type{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground))}.model-filter__summary{display:flex;align-items:center;gap:var(--gap-sm);font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));white-space:nowrap;margin-left:auto}.model-filter__clear-all{background:none;border:none;font-size:var(--font-size-sm);font-family:var(--font-family);color:hsl(var(--ring));cursor:pointer;padding:0;text-decoration:underline;text-underline-offset:2px;transition:color var(--transition-fast)}.model-filter__clear-all:hover{color:hsl(var(--foreground))}.model-filter__empty{text-align:center;padding:var(--gap-2xl) var(--gap-lg)}.model-filter__empty-title{font-size:var(--font-size-base);font-weight:500;color:hsl(var(--foreground));margin-bottom:var(--gap-xs)}.model-filter__empty-hint{font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));margin-bottom:var(--gap-md)}@media(max-width:640px){.model-filter__row{flex-direction:column;align-items:stretch}.model-filter__combobox{max-width:100%}.model-filter__summary{margin-left:0}}.version-indicator{position:fixed;bottom:var(--gap-md);right:var(--gap-md);z-index:40;font-size:var(--font-size-xs);font-family:var(--font-mono);color:hsl(var(--muted-foreground));opacity:.5;transition:opacity var(--transition-fast);cursor:default;user-select:none}.version-indicator:hover{opacity:1}.version-indicator--update{color:hsl(var(--success));opacity:.8;cursor:pointer}.version-indicator--update:hover{opacity:1}.version-indicator__tooltip-wrap{position:relative;display:inline-block}.version-indicator__bubble{display:none;position:absolute;bottom:calc(100% + 8px);right:0;padding:10px 12px;background:hsl(var(--popover));color:hsl(var(--popover-foreground));border:1px solid hsl(var(--border));border-radius:var(--radius);font-size:var(--font-size-xs);font-weight:400;line-height:1.5;white-space:nowrap;width:max-content;max-width:300px;box-shadow:0 2px 8px hsl(var(--foreground) / .08);z-index:50}.version-indicator__bubble:before{content:"";position:absolute;bottom:-8px;left:0;right:0;height:8px}.version-indicator__tooltip-wrap:hover .version-indicator__bubble{display:block}.version-indicator__range{display:block;margin-bottom:6px;color:hsl(var(--muted-foreground))}.version-indicator__command-row{display:flex;align-items:center;gap:6px;background:hsl(var(--muted));border-radius:calc(var(--radius) - 2px);padding:4px 4px 4px 8px}.version-indicator__command{flex:1;font-family:var(--font-mono);font-size:var(--font-size-xs);color:hsl(var(--foreground))}.version-indicator__copy-btn{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;border-radius:calc(var(--radius) - 2px);background:transparent;color:hsl(var(--muted-foreground));cursor:pointer;font-size:13px;transition:all var(--transition-fast);flex-shrink:0}.version-indicator__copy-btn:hover{background:hsl(var(--accent));color:hsl(var(--foreground))}@layer base{:root{--background: 45 49% 97%;--foreground: 222.2 84% 4.9%;--card: 44 60% 99%;--card-foreground: 222.2 84% 4.9%;--popover: 44 60% 99%;--popover-foreground: 222.2 84% 4.9%;--primary: 222.2 47.4% 11.2%;--primary-foreground: 45 30% 97%;--secondary: 40 33% 93%;--secondary-foreground: 222.2 47.4% 11.2%;--muted: 40 33% 93%;--muted-foreground: 215.4 16.3% 46.9%;--accent: 40 33% 93%;--accent-foreground: 222.2 47.4% 11.2%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 45 30% 97%;--border: 36 25% 88%;--input: 36 25% 88%;--ring: 222.2 84% 4.9%;--radius: .5rem;--chart-1: 178 75% 44%;--chart-2: 197 37% 24%;--chart-3: 167 70% 48%;--chart-4: 349 52% 61%;--chart-5: 43 96% 56%;--sidebar-background: 43 38% 95%;--sidebar-foreground: 240 5.3% 26.1%;--sidebar-primary: 240 5.9% 10%;--sidebar-primary-foreground: 45 30% 97%;--sidebar-accent: 40 28% 93%;--sidebar-accent-foreground: 240 5.9% 10%;--sidebar-border: 36 20% 89%;--sidebar-ring: 217.2 91.2% 59.8%;--success: 178 75% 44%;--success-foreground: 0 0% 100%}.dark{--background: 0 0% 9%;--foreground: 0 0% 93%;--card: 0 0% 11%;--card-foreground: 0 0% 93%;--popover: 0 0% 11%;--popover-foreground: 0 0% 93%;--primary: 0 0% 93%;--primary-foreground: 0 0% 9%;--secondary: 0 0% 15%;--secondary-foreground: 0 0% 93%;--muted: 0 0% 15%;--muted-foreground: 0 0% 55%;--accent: 0 0% 15%;--accent-foreground: 0 0% 93%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 0 0% 93%;--border: 0 0% 18%;--input: 0 0% 18%;--ring: 0 0% 60%;--chart-1: 178 70% 50%;--chart-2: 197 50% 55%;--chart-3: 167 70% 55%;--chart-4: 349 52% 65%;--chart-5: 43 96% 65%;--sidebar-background: 0 0% 7%;--sidebar-foreground: 0 0% 93%;--sidebar-primary: 0 0% 93%;--sidebar-primary-foreground: 0 0% 9%;--sidebar-accent: 0 0% 14%;--sidebar-accent-foreground: 0 0% 93%;--sidebar-border: 0 0% 18%;--sidebar-ring: 0 0% 60%;--success: 178 70% 50%;--success-foreground: 0 0% 100%}}:root{--sidebar-width: 230px;--header-height: 48px;--gap-xs: 4px;--gap-sm: 8px;--gap-md: 16px;--gap-lg: 24px;--gap-xl: 32px;--gap-2xl: 48px;--font-family: "DM Sans", -apple-system, BlinkMacSystemFont, system-ui, sans-serif;--font-heading: "Bricolage Grotesque", -apple-system, BlinkMacSystemFont, system-ui, sans-serif;--font-mono: "JetBrains Mono", "SF Mono", ui-monospace, monospace;--font-size-xs: .75rem;--font-size-sm: .875rem;--font-size-base: .9375rem;--font-size-lg: 1.125rem;--font-size-xl: 1.5rem;--font-size-2xl: 1.875rem;--font-size-3xl: 2.25rem;--font-size-4xl: 3rem;--transition-fast: .15s cubic-bezier(.4, 0, .2, 1);--transition-base: .2s cubic-bezier(.4, 0, .2, 1)}*,*:before,*:after{margin:0;padding:0;box-sizing:border-box;border-color:hsl(var(--border))}body{font-family:var(--font-family);font-feature-settings:"rlig" 1,"calt" 1;background:hsl(var(--background));color:hsl(var(--foreground));line-height:1.6;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;overflow-x:hidden}h1,h2,h3,h4,h5,h6{font-family:var(--font-heading)}.app-layout{display:flex;min-height:100vh}.main-content{flex:1;margin-left:var(--sidebar-width);padding:var(--gap-xl) var(--gap-xl) var(--gap-2xl);min-width:0}.main-content--full{margin-left:0}.container--sm{max-width:680px;margin-inline:auto}.container--md{max-width:1100px;margin-inline:auto}.container--full{max-width:100%}.page-header{display:flex;justify-content:space-between;align-items:flex-end;margin-bottom:var(--gap-xl);padding-bottom:var(--gap-lg);border-bottom:1px solid hsl(var(--border))}.page-header h1{font-size:var(--font-size-2xl);font-weight:700;letter-spacing:-.025em;line-height:1.2;color:hsl(var(--foreground))}.page-header .breadcrumb{font-size:var(--font-size-sm);color:hsl(var(--muted-foreground));margin-top:2px}.header-controls{display:flex;gap:var(--gap-sm);align-items:center}.cards-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:var(--gap-md);margin-bottom:var(--gap-xl)}.summary-card{background:hsl(var(--card));border:none;border-radius:var(--radius);padding:var(--gap-lg);box-shadow:#00000014 0 0 0 1px;transition:box-shadow var(--transition-fast)}.summary-card__label{font-size:var(--font-size-sm);font-weight:500;color:hsl(var(--muted-foreground));display:flex;align-items:center;gap:var(--gap-sm)}.summary-card__value{font-size:var(--font-size-3xl);font-weight:700;letter-spacing:-.025em;margin-top:var(--gap-xs);line-height:1.1;color:hsl(var(--foreground))}.summary-card__subtitle{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));margin-top:var(--gap-sm)}.trend{display:inline-flex;align-items:center;gap:2px;font-size:var(--font-size-xs);font-weight:500;padding:2px 6px;border-radius:calc(var(--radius) - 4px);line-height:1.4}.trend--up{color:hsl(var(--success));background:hsl(var(--success) / .1)}.trend--down{color:hsl(var(--destructive));background:hsl(var(--destructive) / .1)}.panel{background:hsl(var(--card));border:none;border-radius:var(--radius);padding:var(--gap-lg);margin-bottom:var(--gap-lg);box-shadow:#00000014 0 0 0 1px}.panel__title{font-size:var(--font-size-sm);font-weight:600;color:hsl(var(--foreground));margin-bottom:var(--gap-lg)}.chart-card{background:hsl(var(--card));border:none;border-radius:var(--radius);margin-bottom:var(--gap-lg);box-shadow:#00000014 0 0 0 1px;animation:fadeInUp .3s ease-out both}.chart-card__header{display:flex;align-items:flex-end;border-bottom:1px solid hsl(var(--border))}.chart-card__stat{display:flex;flex-direction:column;gap:2px;padding-right:var(--gap-xl);border-right:1px solid hsl(var(--border))}.chart-card__stat:last-of-type{border-right:1px solid hsl(var(--border))}.chart-card__label{font-size:var(--font-size-sm);font-weight:500;color:hsl(var(--muted-foreground))}.chart-card__value{font-size:var(--font-size-2xl);font-weight:700;letter-spacing:-.025em;line-height:1.1;color:hsl(var(--foreground))}.chart-card__value-row{display:flex;align-items:baseline;gap:var(--gap-sm)}.chart-card__controls{margin-left:auto;display:flex;align-items:center}.chart-card__body{padding:var(--gap-md) var(--gap-lg) var(--gap-lg)}.panel__header{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--gap-lg)}.panel__tabs{display:inline-flex;height:2.25rem;align-items:center;border-radius:var(--radius);background:hsl(var(--muted));padding:3px;gap:1px}.panel__tab{display:inline-flex;align-items:center;justify-content:center;white-space:nowrap;padding:0 14px;height:100%;font-size:var(--font-size-sm);font-family:var(--font-family);font-weight:500;color:hsl(var(--muted-foreground));background:transparent;border:none;border-radius:calc(var(--radius) - 2px);cursor:pointer;transition:all var(--transition-fast)}.panel__tab:hover{color:hsl(var(--foreground))}.panel__tab--active{background:hsl(var(--background));color:hsl(var(--foreground));box-shadow:0 1px 2px #0000000f;font-weight:600}.two-col{display:grid;grid-template-columns:1fr 1fr;gap:var(--gap-lg);margin-bottom:var(--gap-lg)}.data-table{width:100%;border-collapse:collapse;font-size:var(--font-size-sm)}.data-table th{text-align:left;font-size:var(--font-size-xs);font-weight:500;color:hsl(var(--muted-foreground));padding:12px var(--gap-md);border-bottom:1px solid hsl(var(--border));height:40px}.data-table td{padding:12px var(--gap-md);border-bottom:1px solid hsl(var(--border));color:hsl(var(--foreground))}.data-table tbody tr{transition:background var(--transition-fast)}.data-table tbody tr:hover{background:hsl(var(--muted) / .5)}.data-table tr:last-child td{border-bottom:none}.status-badge{display:inline-flex;align-items:center;padding:2px 8px;border-radius:9999px;font-size:var(--font-size-xs);font-weight:500}.status-badge--ok{background:hsl(var(--success) / .1);color:hsl(var(--success))}.status-badge--retry{background:hsl(var(--chart-5) / .15);color:hsl(var(--chart-5))}.status-badge--error{background:hsl(var(--destructive) / .1);color:hsl(var(--destructive))}.security-event{display:flex;align-items:center;gap:var(--gap-md);padding:12px var(--gap-md);border-bottom:1px solid hsl(var(--border));transition:background var(--transition-fast);border-radius:calc(var(--radius) - 2px)}.security-event:last-child{border-bottom:none}.security-event:hover{background:hsl(var(--muted) / .5)}.security-event__dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.security-event__dot--critical{background:hsl(var(--destructive))}.security-event__dot--warning{background:hsl(var(--chart-5))}.security-event__dot--info{background:hsl(var(--chart-2))}.security-event__desc{flex:1;font-size:var(--font-size-sm);color:hsl(var(--foreground))}.security-event__badge{font-size:var(--font-size-xs);padding:2px 8px;border-radius:9999px;background:hsl(var(--muted));color:hsl(var(--muted-foreground));text-transform:capitalize}.security-event__time{font-size:var(--font-size-xs);font-family:var(--font-mono);color:hsl(var(--muted-foreground));white-space:nowrap}.feed-item{display:flex;align-items:center;gap:var(--gap-md);padding:10px 0;border-bottom:1px solid hsl(var(--border));transition:background var(--transition-fast)}.feed-item:hover{background:hsl(var(--muted) / .5);margin:0 calc(var(--gap-md) * -1);padding-left:var(--gap-md);padding-right:var(--gap-md);border-radius:calc(var(--radius) - 2px)}.feed-item:last-child{border-bottom:none}.feed-item__time{font-size:var(--font-size-xs);font-family:var(--font-mono);color:hsl(var(--muted-foreground));white-space:nowrap}.feed-item__desc{flex:1;font-size:var(--font-size-sm);color:hsl(var(--foreground))}.feed-item__meta{font-size:var(--font-size-xs);color:hsl(var(--muted-foreground))}.model-bar{display:flex;align-items:center;gap:var(--gap-md);margin-bottom:12px;padding:6px 0}.model-bar__name{width:160px;font-size:var(--font-size-sm);font-family:var(--font-mono);color:hsl(var(--foreground));white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.model-bar__track{flex:1;height:6px;background:hsl(var(--muted));border-radius:9999px;overflow:hidden}.model-bar__fill{height:100%;border-radius:9999px;transition:width .5s cubic-bezier(.4,0,.2,1);background:hsl(var(--chart-1))!important}.model-bar__pct{width:48px;text-align:right;font-size:var(--font-size-sm);font-weight:600;color:hsl(var(--foreground))!important}.empty-state{text-align:center;padding:var(--gap-2xl) var(--gap-lg);color:hsl(var(--muted-foreground))}.empty-state__title{font-size:var(--font-size-lg);font-weight:500;margin-bottom:var(--gap-sm);color:hsl(var(--foreground))}.select{display:inline-flex;align-items:center;height:2.25rem;background:hsl(var(--background));color:hsl(var(--foreground));border:1px solid hsl(var(--input));border-radius:var(--radius);padding:0 2rem 0 .75rem;font-size:var(--font-size-sm);font-family:var(--font-family);cursor:pointer;transition:border-color var(--transition-fast),box-shadow var(--transition-fast);appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right .5rem center}.select:focus-visible{outline:none;border-color:hsl(var(--ring));box-shadow:0 0 0 2px hsl(var(--ring) / .2)}.select option{background:hsl(var(--popover));color:hsl(var(--popover-foreground))}.btn{display:inline-flex;align-items:center;justify-content:center;height:2.25rem;padding:0 1rem;border-radius:var(--radius);font-size:var(--font-size-sm);font-weight:500;font-family:var(--font-family);cursor:pointer;border:none;transition:all var(--transition-fast)}.btn--primary{background:hsl(var(--primary));color:hsl(var(--primary-foreground))}.btn--primary:hover{background:hsl(var(--primary) / .9)}.btn--ghost{background:transparent;color:hsl(var(--foreground))}.btn--ghost:hover{background:hsl(var(--accent));color:hsl(var(--accent-foreground))}.btn--outline{background:hsl(var(--background));color:hsl(var(--foreground));border:1px solid hsl(var(--input))}.btn--outline:hover{background:hsl(var(--accent));color:hsl(var(--accent-foreground))}.btn--sm{height:2rem;padding:0 .75rem;font-size:var(--font-size-xs)}.btn:focus-visible{outline:2px solid hsl(var(--ring));outline-offset:2px}.btn:disabled{opacity:.5;cursor:not-allowed}.sidebar{width:var(--sidebar-width);height:calc(100vh - var(--header-height));position:fixed;top:var(--header-height);left:0;background:hsl(var(--sidebar-background));border-right:1px solid hsl(var(--sidebar-border));padding:var(--gap-lg) 0 0 0;display:flex;flex-direction:column;z-index:10;overflow-y:auto}.sidebar__logo{padding:0 var(--gap-lg);margin-bottom:var(--gap-xl);font-size:var(--font-size-lg);font-weight:700;letter-spacing:-.025em;display:flex;align-items:center;gap:var(--gap-sm);color:hsl(var(--sidebar-foreground))}.sidebar__logo-dot{width:8px;height:8px;border-radius:50%;background:hsl(var(--success))}.sidebar__section-label{padding:var(--gap-md) var(--gap-lg) var(--gap-xs);font-size:var(--font-size-xs);font-weight:500;color:hsl(var(--muted-foreground));text-transform:uppercase;letter-spacing:.05em}.sidebar__link{display:flex;align-items:center;gap:var(--gap-sm);padding:6px var(--gap-lg);margin:1px .5rem;font-size:var(--font-size-sm);color:hsl(var(--sidebar-foreground));text-decoration:none;border-radius:var(--radius);transition:all var(--transition-fast)}.sidebar__link:hover{background:hsl(var(--sidebar-accent));color:hsl(var(--sidebar-accent-foreground))}.sidebar__link.active{background:hsl(var(--sidebar-accent));color:hsl(var(--sidebar-primary));font-weight:500}.sidebar__spacer{flex:1}.sidebar__feedback{display:block;padding:var(--gap-md) var(--gap-lg);border-top:1px solid hsl(var(--sidebar-border));text-decoration:none;color:hsl(var(--sidebar-foreground));transition:background var(--transition-fast);cursor:pointer}.sidebar__feedback:hover{background:hsl(var(--sidebar-accent))}.sidebar__feedback-title{display:flex;align-items:center;gap:var(--gap-sm);font-size:var(--font-size-sm);font-weight:500}.sidebar__feedback-hint{margin-top:var(--gap-xs);font-size:var(--font-size-xs);color:hsl(var(--muted-foreground));line-height:1.4}.sidebar__footer{margin-top:auto;padding:var(--gap-md) var(--gap-lg);border-top:1px solid hsl(var(--sidebar-border))}.theme-toggle{display:flex;align-items:center;gap:var(--gap-sm);padding:6px 12px;border-radius:var(--radius);background:transparent;border:1px solid hsl(var(--border));color:hsl(var(--muted-foreground));font-size:var(--font-size-sm);font-family:var(--font-family);cursor:pointer;transition:all var(--transition-fast);width:100%}.theme-toggle:hover{background:hsl(var(--accent));color:hsl(var(--accent-foreground))}.theme-toggle__icon{font-size:14px;line-height:1;width:18px;text-align:center}.u-wrap{font-family:var(--font-family)!important}.u-legend{font-size:var(--font-size-xs)!important;font-family:var(--font-family)!important;color:hsl(var(--muted-foreground))!important;display:grid!important;grid-template-columns:2fr 1fr 1fr!important;width:100%!important;padding:var(--gap-sm) 0 0!important}.u-legend>tbody,.u-legend>thead{display:contents!important}.u-legend .u-series{display:flex!important;align-items:center!important;gap:4px!important;overflow:hidden!important;white-space:nowrap!important;min-width:0!important;padding:2px 0!important}.u-legend .u-series:first-child{justify-content:flex-start!important}.u-legend .u-series:not(:first-child){justify-content:flex-start!important;padding-left:var(--gap-sm)!important}.u-legend .u-value{font-family:var(--font-mono)!important;font-variant-numeric:tabular-nums!important;min-width:60px!important;display:inline-block!important;text-align:right!important}.u-legend .u-marker{border-radius:50%!important}.u-cursor-x,.u-cursor-y{border-color:hsl(var(--border))!important}.chart-tooltip{position:absolute;background:hsl(var(--popover));border:1px solid hsl(var(--border));border-radius:var(--radius);padding:8px 12px;font-size:var(--font-size-xs);color:hsl(var(--popover-foreground));pointer-events:none;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;z-index:100;white-space:nowrap}.expandable-card{position:relative;margin-bottom:var(--gap-lg);cursor:pointer}.expandable-card .panel{max-height:320px;overflow:hidden}.expandable-card__content{overflow:hidden}.expandable-card__fade{position:absolute;bottom:0;left:0;right:0;height:64px;background:linear-gradient(transparent,hsl(var(--card)) 70%);border-radius:0 0 var(--radius) var(--radius);display:flex;align-items:flex-end;justify-content:center;padding-bottom:12px;opacity:0;transition:opacity var(--transition-base)}.expandable-card:hover .expandable-card__fade{opacity:1}.expandable-card__btn{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;font-size:var(--font-size-xs);font-family:var(--font-family);font-weight:500;color:hsl(var(--foreground));background:hsl(var(--background));border:1px solid hsl(var(--border));border-radius:var(--radius);cursor:pointer;box-shadow:0 1px 3px #0000001a;transition:all var(--transition-fast)}.expandable-card__btn:hover{background:hsl(var(--accent))}.modal-backdrop{position:fixed;inset:0;z-index:50;background:#00000080;display:flex;align-items:center;justify-content:center;animation:fadeIn .15s ease-out}.modal{background:hsl(var(--background));border:none;border-radius:var(--radius);width:90%;max-width:680px;max-height:80vh;display:flex;flex-direction:column;box-shadow:#00000014 0 0 0 1px,0 25px 50px -12px #00000040;animation:fadeInUp .2s ease-out}.modal__header{display:flex;align-items:center;justify-content:space-between;padding:var(--gap-lg);border-bottom:1px solid hsl(var(--border));flex-shrink:0}.modal__title{font-size:var(--font-size-lg);font-weight:600;color:hsl(var(--foreground))}.modal__close{display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;border-radius:var(--radius);border:none;background:transparent;color:hsl(var(--muted-foreground));cursor:pointer;transition:all var(--transition-fast)}.modal__close:hover{background:hsl(var(--muted));color:hsl(var(--foreground))}.modal__body{padding:var(--gap-md) var(--gap-lg);overflow-y:auto;flex:1;min-height:0}.modal__footer{display:flex;justify-content:center;padding:var(--gap-md) var(--gap-lg);border-top:1px solid hsl(var(--border));flex-shrink:0}.modal__footer .btn{min-width:120px}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes fadeInUp{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.cards-grid>*{animation:fadeInUp .3s ease-out both}.cards-grid>*:nth-child(1){animation-delay:0ms}.cards-grid>*:nth-child(2){animation-delay:50ms}.cards-grid>*:nth-child(3){animation-delay:.1s}.cards-grid>*:nth-child(4){animation-delay:.15s}.panel{animation:fadeInUp .3s ease-out both}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:hsl(var(--border));border-radius:3px}::-webkit-scrollbar-thumb:hover{background:hsl(var(--muted-foreground) / .3)}@media(max-width:1024px){.main-content{padding:var(--gap-lg) var(--gap-md) var(--gap-xl)}.two-col{grid-template-columns:1fr}.cards-grid{grid-template-columns:repeat(2,1fr)}.summary-card__value{font-size:var(--font-size-2xl)}}@media(max-width:768px){.main-content{margin-left:0;padding:var(--gap-md)}.sidebar{display:none}.cards-grid{grid-template-columns:1fr 1fr}.summary-card__value{font-size:var(--font-size-xl)}.page-header{flex-direction:column;align-items:flex-start;gap:var(--gap-md)}.container--sm,.container--md{max-width:100%}}@media(max-width:480px){.cards-grid{grid-template-columns:1fr}}
package/public/index.html CHANGED
@@ -26,8 +26,8 @@
26
26
  />
27
27
  <meta name="twitter:image" content="https://app.manifest.build/og-image.png" />
28
28
  <script src="/theme-init.js"></script>
29
- <script type="module" crossorigin src="/assets/index-BJopyxrs.js"></script>
30
- <link rel="stylesheet" crossorigin href="/assets/index-D7RNuteK.css">
29
+ <script type="module" crossorigin src="/assets/index-BesDnSGH.js"></script>
30
+ <link rel="stylesheet" crossorigin href="/assets/index-BSZYJ1K1.css">
31
31
  </head>
32
32
  <body>
33
33
  <div id="root"></div>