codesesh 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  FileSystemSessionSource,
4
- createRegisteredAgents
5
- } from "./chunk-BIXOP5QX.js";
4
+ attachMissingProjectIdentities,
5
+ createRegisteredAgents,
6
+ ensureSessionTagsSync,
7
+ matchesScanWindow
8
+ } from "./chunk-GCOAE7KI.js";
6
9
 
7
10
  // src/scan-refresh-worker.ts
8
11
  import { parentPort, workerData } from "worker_threads";
@@ -34,9 +37,14 @@ function sourceFingerprintMatches(source, cachedSession, cached) {
34
37
  function sourcePathFromMeta(meta) {
35
38
  return typeof meta?.sourcePath === "string" ? meta.sourcePath : null;
36
39
  }
37
- function syncAgentSources(agent, cachedSessions, cachedMeta) {
40
+ function wasEnumeratedThisPass(cached, windowOptions) {
41
+ if (windowOptions?.from == null && windowOptions?.to == null) return true;
42
+ const mtimeMs = cached?.sourceMtimeMs;
43
+ return typeof mtimeMs !== "number" || matchesScanWindow(mtimeMs, windowOptions);
44
+ }
45
+ function syncAgentSources(agent, cachedSessions, cachedMeta, windowOptions) {
38
46
  const sessionMap = new Map(cachedSessions.map((session) => [session.id, session]));
39
- const sourceRefs = agent.listSessionSources();
47
+ const sourceRefs = agent.listSessionSources(windowOptions);
40
48
  const currentIds = new Set(sourceRefs.map((source) => source.sessionId));
41
49
  const changedIds = /* @__PURE__ */ new Set();
42
50
  for (const source of sourceRefs) {
@@ -54,13 +62,27 @@ function syncAgentSources(agent, cachedSessions, cachedMeta) {
54
62
  }
55
63
  }
56
64
  for (const session of cachedSessions) {
57
- if (!currentIds.has(session.id)) {
58
- sessionMap.delete(session.id);
59
- changedIds.add(session.id);
60
- }
65
+ if (currentIds.has(session.id)) continue;
66
+ if (!wasEnumeratedThisPass(cachedMeta[session.id], windowOptions)) continue;
67
+ sessionMap.delete(session.id);
68
+ changedIds.add(session.id);
61
69
  }
62
70
  return { sessions: [...sessionMap.values()], changedIds: [...changedIds] };
63
71
  }
72
+ var TAG_SETTLE_MS = 6e4;
73
+ function isSettled(session, now) {
74
+ return now - (session.time_updated ?? session.time_created) >= TAG_SETTLE_MS;
75
+ }
76
+ function finalizeSessions(agent, sessions) {
77
+ const withIdentity = attachMissingProjectIdentities(sessions);
78
+ const now = Date.now();
79
+ const settled = withIdentity.filter((session) => isSettled(session, now));
80
+ if (settled.length === 0) return withIdentity;
81
+ const taggedById = new Map(
82
+ ensureSessionTagsSync(agent, settled).sessions.map((session) => [session.id, session])
83
+ );
84
+ return withIdentity.map((session) => taggedById.get(session.id) ?? session);
85
+ }
64
86
  var data = workerData;
65
87
  var startedAt = performance.now();
66
88
  async function run() {
@@ -75,7 +97,7 @@ async function run() {
75
97
  if (!isAvailable) {
76
98
  sessions = [];
77
99
  } else if (data.sourceSync && agent instanceof FileSystemSessionSource) {
78
- const result = syncAgentSources(agent, data.previousSessions, data.meta);
100
+ const result = syncAgentSources(agent, data.previousSessions, data.meta, data.scanOptions);
79
101
  sessions = result.sessions;
80
102
  changedIds = result.changedIds;
81
103
  } else if (data.changedIds) {
@@ -93,6 +115,7 @@ async function run() {
93
115
  })
94
116
  );
95
117
  }
118
+ sessions = finalizeSessions(agent, sessions);
96
119
  parentPort?.postMessage({
97
120
  type: "done",
98
121
  sessions,
@@ -110,4 +133,7 @@ try {
110
133
  durationMs: performance.now() - startedAt
111
134
  });
112
135
  }
136
+ export {
137
+ finalizeSessions
138
+ };
113
139
  //# sourceMappingURL=scan-refresh-worker.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/scan-refresh-worker.ts"],"sourcesContent":["import { parentPort, workerData } from \"node:worker_threads\";\nimport {\n createRegisteredAgents,\n FileSystemSessionSource,\n type AgentScanProgress,\n type ScanOptions,\n type SessionCacheMeta,\n type SessionHead,\n type SessionSourceRef,\n} from \"@codesesh/core\";\n\nexport type ScanRefreshWorkerMessage =\n | {\n type: \"progress\";\n progress: AgentScanProgress;\n }\n | {\n type: \"done\";\n sessions: SessionHead[];\n meta: Record<string, SessionCacheMeta>;\n changedIds?: string[];\n durationMs: number;\n }\n | {\n type: \"error\";\n error: string;\n durationMs: number;\n };\n\ninterface ScanRefreshWorkerData {\n agentName: string;\n previousSessions: SessionHead[];\n changedIds: string[] | null;\n sourceSync?: boolean;\n scanOptions: Pick<ScanOptions, \"from\" | \"to\" | \"fast\">;\n meta: Record<string, SessionCacheMeta>;\n}\n\nfunction serializeMeta(agent: {\n getSessionMetaMap: () => Map<string, SessionCacheMeta>;\n}): Record<string, SessionCacheMeta> {\n const metaMap = agent.getSessionMetaMap();\n const meta: Record<string, SessionCacheMeta> = {};\n for (const [id, data] of metaMap.entries()) {\n meta[id] = { id, ...(data as Record<string, unknown>) } as SessionCacheMeta;\n }\n return meta;\n}\n\nfunction sourceFingerprintFromMeta(meta: SessionCacheMeta | undefined): string | null {\n return typeof meta?.sourceFingerprint === \"string\" ? meta.sourceFingerprint : null;\n}\n\nfunction parseSourceFingerprint(fingerprint: string): unknown[] | null {\n try {\n const parsed = JSON.parse(fingerprint);\n return Array.isArray(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Compare a live source fingerprint against the cached meta. A direct string\n * match is the fast path; the fallback tolerates older cache entries written by\n * a different fingerprint format as long as the underlying mtime (array slot 2)\n * is unchanged, so a fingerprint-format bump does not force a full rescan.\n */\nfunction sourceFingerprintMatches(\n source: SessionSourceRef,\n cachedSession: SessionHead,\n cached: SessionCacheMeta | undefined,\n): boolean {\n if (sourceFingerprintFromMeta(cached) === source.fingerprint) return true;\n\n const current = parseSourceFingerprint(source.fingerprint);\n if (!current || current.length < 5) return false;\n\n return (\n typeof cached?.sourceMtimeMs === \"number\" &&\n cached.sourceMtimeMs === current[2] &&\n (current[4] == null || cachedSession.title === current[4])\n );\n}\n\nfunction sourcePathFromMeta(meta: SessionCacheMeta | undefined): string | null {\n return typeof meta?.sourcePath === \"string\" ? meta.sourcePath : null;\n}\n\n/**\n * Source-level incremental sync, mirroring FileSystemSessionSource.incrementalScan.\n * Kept standalone because the worker cannot share the agent's live metaMap with\n * the main thread — it receives cached meta via workerData instead.\n */\nfunction syncAgentSources(\n agent: FileSystemSessionSource,\n cachedSessions: SessionHead[],\n cachedMeta: Record<string, SessionCacheMeta>,\n): { sessions: SessionHead[]; changedIds: string[] } {\n const sessionMap = new Map(cachedSessions.map((session) => [session.id, session]));\n const sourceRefs = agent.listSessionSources();\n const currentIds = new Set(sourceRefs.map((source) => source.sessionId));\n const changedIds = new Set<string>();\n\n for (const source of sourceRefs) {\n const cachedSession = sessionMap.get(source.sessionId);\n const cached = cachedMeta[source.sessionId];\n const sameSource = sourcePathFromMeta(cached) === source.sourcePath;\n const sameFingerprint =\n cachedSession && sourceFingerprintMatches(source, cachedSession, cached);\n if (cachedSession && sameSource && sameFingerprint) continue;\n\n const next = agent.scanSessionSource(source.sourcePath);\n changedIds.add(source.sessionId);\n if (next) {\n sessionMap.set(next.id, next);\n } else {\n sessionMap.delete(source.sessionId);\n }\n }\n\n for (const session of cachedSessions) {\n if (!currentIds.has(session.id)) {\n sessionMap.delete(session.id);\n changedIds.add(session.id);\n }\n }\n\n return { sessions: [...sessionMap.values()], changedIds: [...changedIds] };\n}\n\nconst data = workerData as ScanRefreshWorkerData;\nconst startedAt = performance.now();\n\nasync function run(): Promise<void> {\n const agent = createRegisteredAgents().find((item) => item.name === data.agentName);\n if (!agent) {\n throw new Error(`Unknown agent: ${data.agentName}`);\n }\n\n agent.setSessionMetaMap(new Map(Object.entries(data.meta)));\n\n const isAvailable = agent.isAvailable();\n let sessions: SessionHead[];\n let changedIds: string[] | undefined;\n\n if (!isAvailable) {\n sessions = [];\n } else if (data.sourceSync && agent instanceof FileSystemSessionSource) {\n const result = syncAgentSources(agent, data.previousSessions, data.meta);\n sessions = result.sessions;\n changedIds = result.changedIds;\n } else if (data.changedIds) {\n sessions = await Promise.resolve(agent.incrementalScan(data.previousSessions, data.changedIds));\n } else {\n sessions = await Promise.resolve(\n agent.scan({\n ...data.scanOptions,\n onProgress: (progress) => {\n parentPort?.postMessage({\n type: \"progress\",\n progress,\n } satisfies ScanRefreshWorkerMessage);\n },\n }),\n );\n }\n\n parentPort?.postMessage({\n type: \"done\",\n sessions,\n meta: serializeMeta(agent),\n changedIds,\n durationMs: performance.now() - startedAt,\n } satisfies ScanRefreshWorkerMessage);\n}\n\ntry {\n await run();\n} catch (error) {\n parentPort?.postMessage({\n type: \"error\",\n error: error instanceof Error ? error.message : String(error),\n durationMs: performance.now() - startedAt,\n } satisfies ScanRefreshWorkerMessage);\n}\n"],"mappings":"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","names":["data"]}
1
+ {"version":3,"sources":["../src/scan-refresh-worker.ts"],"sourcesContent":["import { parentPort, workerData } from \"node:worker_threads\";\nimport {\n attachMissingProjectIdentities,\n createRegisteredAgents,\n ensureSessionTagsSync,\n FileSystemSessionSource,\n matchesScanWindow,\n type AgentScanProgress,\n type BaseAgent,\n type ScanOptions,\n type SessionCacheMeta,\n type SessionHead,\n type SessionSourceRef,\n} from \"@codesesh/core\";\n\nexport type ScanRefreshWorkerMessage =\n | {\n type: \"progress\";\n progress: AgentScanProgress;\n }\n | {\n type: \"done\";\n sessions: SessionHead[];\n meta: Record<string, SessionCacheMeta>;\n changedIds?: string[];\n durationMs: number;\n }\n | {\n type: \"error\";\n error: string;\n durationMs: number;\n };\n\ninterface ScanRefreshWorkerData {\n agentName: string;\n previousSessions: SessionHead[];\n changedIds: string[] | null;\n sourceSync?: boolean;\n scanOptions: Pick<ScanOptions, \"from\" | \"to\" | \"fast\">;\n meta: Record<string, SessionCacheMeta>;\n}\n\nfunction serializeMeta(agent: {\n getSessionMetaMap: () => Map<string, SessionCacheMeta>;\n}): Record<string, SessionCacheMeta> {\n const metaMap = agent.getSessionMetaMap();\n const meta: Record<string, SessionCacheMeta> = {};\n for (const [id, data] of metaMap.entries()) {\n meta[id] = { id, ...(data as Record<string, unknown>) } as SessionCacheMeta;\n }\n return meta;\n}\n\nfunction sourceFingerprintFromMeta(meta: SessionCacheMeta | undefined): string | null {\n return typeof meta?.sourceFingerprint === \"string\" ? meta.sourceFingerprint : null;\n}\n\nfunction parseSourceFingerprint(fingerprint: string): unknown[] | null {\n try {\n const parsed = JSON.parse(fingerprint);\n return Array.isArray(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Compare a live source fingerprint against the cached meta. A direct string\n * match is the fast path; the fallback tolerates older cache entries written by\n * a different fingerprint format as long as the underlying mtime (array slot 2)\n * is unchanged, so a fingerprint-format bump does not force a full rescan.\n */\nfunction sourceFingerprintMatches(\n source: SessionSourceRef,\n cachedSession: SessionHead,\n cached: SessionCacheMeta | undefined,\n): boolean {\n if (sourceFingerprintFromMeta(cached) === source.fingerprint) return true;\n\n const current = parseSourceFingerprint(source.fingerprint);\n if (!current || current.length < 5) return false;\n\n return (\n typeof cached?.sourceMtimeMs === \"number\" &&\n cached.sourceMtimeMs === current[2] &&\n (current[4] == null || cachedSession.title === current[4])\n );\n}\n\nfunction sourcePathFromMeta(meta: SessionCacheMeta | undefined): string | null {\n return typeof meta?.sourcePath === \"string\" ? meta.sourcePath : null;\n}\n\n/**\n * A cached session outside the current scan window was never enumerated this\n * pass, so its absence from sourceRefs doesn't mean it was deleted on disk —\n * treat it as still present. Sessions with no recorded mtime predate this\n * field; keep them too rather than risk a false-positive removal.\n */\nfunction wasEnumeratedThisPass(\n cached: SessionCacheMeta | undefined,\n windowOptions: Pick<ScanOptions, \"from\" | \"to\"> | undefined,\n): boolean {\n if (windowOptions?.from == null && windowOptions?.to == null) return true;\n const mtimeMs = cached?.sourceMtimeMs;\n return typeof mtimeMs !== \"number\" || matchesScanWindow(mtimeMs, windowOptions);\n}\n\n/**\n * Source-level incremental sync, mirroring FileSystemSessionSource.incrementalScan.\n * Kept standalone because the worker cannot share the agent's live metaMap with\n * the main thread — it receives cached meta via workerData instead.\n */\nfunction syncAgentSources(\n agent: FileSystemSessionSource,\n cachedSessions: SessionHead[],\n cachedMeta: Record<string, SessionCacheMeta>,\n windowOptions?: Pick<ScanOptions, \"from\" | \"to\">,\n): { sessions: SessionHead[]; changedIds: string[] } {\n const sessionMap = new Map(cachedSessions.map((session) => [session.id, session]));\n const sourceRefs = agent.listSessionSources(windowOptions);\n const currentIds = new Set(sourceRefs.map((source) => source.sessionId));\n const changedIds = new Set<string>();\n\n for (const source of sourceRefs) {\n const cachedSession = sessionMap.get(source.sessionId);\n const cached = cachedMeta[source.sessionId];\n const sameSource = sourcePathFromMeta(cached) === source.sourcePath;\n const sameFingerprint =\n cachedSession && sourceFingerprintMatches(source, cachedSession, cached);\n if (cachedSession && sameSource && sameFingerprint) continue;\n\n const next = agent.scanSessionSource(source.sourcePath);\n changedIds.add(source.sessionId);\n if (next) {\n sessionMap.set(next.id, next);\n } else {\n sessionMap.delete(source.sessionId);\n }\n }\n\n for (const session of cachedSessions) {\n if (currentIds.has(session.id)) continue;\n if (!wasEnumeratedThisPass(cachedMeta[session.id], windowOptions)) continue;\n sessionMap.delete(session.id);\n changedIds.add(session.id);\n }\n\n return { sessions: [...sessionMap.values()], changedIds: [...changedIds] };\n}\n\n/**\n * A session still receiving writes will be stale again within seconds, so\n * recomputing its tags every refresh cycle is wasted work — wait for it to\n * settle before paying the getSessionData() parse cost.\n */\nconst TAG_SETTLE_MS = 60_000;\n\nfunction isSettled(session: SessionHead, now: number): boolean {\n return now - (session.time_updated ?? session.time_created) >= TAG_SETTLE_MS;\n}\n\n/**\n * Runs identity resolution (spawns git) and stale smart-tag reclassification\n * on the worker thread, off the server's main event loop.\n */\nexport function finalizeSessions(agent: BaseAgent, sessions: SessionHead[]): SessionHead[] {\n const withIdentity = attachMissingProjectIdentities(sessions);\n\n const now = Date.now();\n const settled = withIdentity.filter((session) => isSettled(session, now));\n if (settled.length === 0) return withIdentity;\n\n const taggedById = new Map(\n ensureSessionTagsSync(agent, settled).sessions.map((session) => [session.id, session]),\n );\n return withIdentity.map((session) => taggedById.get(session.id) ?? session);\n}\n\nconst data = workerData as ScanRefreshWorkerData;\nconst startedAt = performance.now();\n\nasync function run(): Promise<void> {\n const agent = createRegisteredAgents().find((item) => item.name === data.agentName);\n if (!agent) {\n throw new Error(`Unknown agent: ${data.agentName}`);\n }\n\n agent.setSessionMetaMap(new Map(Object.entries(data.meta)));\n\n const isAvailable = agent.isAvailable();\n let sessions: SessionHead[];\n let changedIds: string[] | undefined;\n\n if (!isAvailable) {\n sessions = [];\n } else if (data.sourceSync && agent instanceof FileSystemSessionSource) {\n const result = syncAgentSources(agent, data.previousSessions, data.meta, data.scanOptions);\n sessions = result.sessions;\n changedIds = result.changedIds;\n } else if (data.changedIds) {\n sessions = await Promise.resolve(agent.incrementalScan(data.previousSessions, data.changedIds));\n } else {\n sessions = await Promise.resolve(\n agent.scan({\n ...data.scanOptions,\n onProgress: (progress) => {\n parentPort?.postMessage({\n type: \"progress\",\n progress,\n } satisfies ScanRefreshWorkerMessage);\n },\n }),\n );\n }\n\n sessions = finalizeSessions(agent, sessions);\n\n parentPort?.postMessage({\n type: \"done\",\n sessions,\n meta: serializeMeta(agent),\n changedIds,\n durationMs: performance.now() - startedAt,\n } satisfies ScanRefreshWorkerMessage);\n}\n\ntry {\n await run();\n} catch (error) {\n parentPort?.postMessage({\n type: \"error\",\n error: error instanceof Error ? error.message : String(error),\n durationMs: performance.now() - startedAt,\n } satisfies ScanRefreshWorkerMessage);\n}\n"],"mappings":"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","names":["data"]}
@@ -1,16 +1,21 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  createRegisteredAgents,
4
+ getCachePath2,
4
5
  markAgentCacheInitialized,
5
6
  saveCachedSessionChanges,
6
7
  saveCachedSessions,
8
+ setFtsIntegrityCheckedPath,
7
9
  syncSessionSearchIndex,
8
10
  syncSessionSearchIndexChanges
9
- } from "./chunk-BIXOP5QX.js";
11
+ } from "./chunk-GCOAE7KI.js";
10
12
 
11
13
  // src/search-index-worker.ts
12
14
  import { parentPort, workerData } from "worker_threads";
13
15
  var data = workerData;
16
+ if (data.skipFtsIntegrityCheck) {
17
+ setFtsIntegrityCheckedPath(getCachePath2());
18
+ }
14
19
  var startedAt = performance.now();
15
20
  var agents = createRegisteredAgents();
16
21
  var jobs = data.jobs ?? data.agentNames.map(
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/search-index-worker.ts"],"sourcesContent":["import { parentPort, workerData } from \"node:worker_threads\";\nimport {\n createRegisteredAgents,\n markAgentCacheInitialized,\n saveCachedSessionChanges,\n saveCachedSessions,\n syncSessionSearchIndex,\n syncSessionSearchIndexChanges,\n type SearchIndexSyncResult,\n type SearchIndexSyncOptions,\n type SessionCacheMeta,\n type SessionHeadChange,\n type SessionHead,\n} from \"@codesesh/core\";\n\nexport type SearchIndexWorkerMessage =\n | {\n type: \"sync-result\";\n context: string;\n result: SearchIndexSyncResult | null;\n }\n | {\n type: \"done\";\n context: string;\n durationMs: number;\n sessions: number;\n };\n\nexport type SearchIndexWorkerJob =\n | {\n kind: \"full\";\n context: string;\n agentName: string;\n sessions: SessionHead[];\n meta: Record<string, SessionCacheMeta>;\n saveCache?: boolean;\n searchIndexOptions?: SearchIndexSyncOptions;\n }\n | {\n kind: \"changes\";\n context: string;\n agentName: string;\n changes: SessionHeadChange[];\n removedSessionIds: string[];\n meta: Record<string, SessionCacheMeta>;\n searchIndexOptions?: SearchIndexSyncOptions;\n };\n\ninterface SearchIndexWorkerData {\n jobs?: SearchIndexWorkerJob[];\n context: string;\n agentNames: string[];\n sessionsByAgent: Record<string, SessionHead[]>;\n metaByAgent: Record<string, Record<string, SessionCacheMeta>>;\n}\n\nconst data = workerData as SearchIndexWorkerData;\nconst startedAt = performance.now();\nconst agents = createRegisteredAgents();\nconst jobs =\n data.jobs ??\n data.agentNames.map(\n (agentName): SearchIndexWorkerJob => ({\n kind: \"full\",\n context: data.context,\n agentName,\n sessions: data.sessionsByAgent[agentName] ?? [],\n meta: data.metaByAgent[agentName] ?? {},\n }),\n );\n\nfor (const job of jobs) {\n const agent = agents.find((item) => item.name === job.agentName);\n if (!agent) continue;\n\n if (agent.setSessionMetaMap) {\n agent.setSessionMetaMap(new Map(Object.entries(job.meta)));\n }\n\n let result: SearchIndexSyncResult | null;\n if (job.kind === \"changes\") {\n saveCachedSessionChanges(job.agentName, job.changes, job.removedSessionIds, job.meta);\n result = syncSessionSearchIndexChanges(\n job.agentName,\n job.changes,\n job.removedSessionIds,\n (sessionId) => agent.getSessionData(sessionId),\n job.searchIndexOptions,\n );\n } else {\n if (job.saveCache) {\n saveCachedSessions(job.agentName, job.sessions, job.meta);\n }\n result = syncSessionSearchIndex(\n job.agentName,\n job.sessions,\n (sessionId) => agent.getSessionData(sessionId),\n job.searchIndexOptions,\n );\n if (job.saveCache && result?.skipped === 0) {\n markAgentCacheInitialized(job.agentName);\n }\n }\n parentPort?.postMessage({\n type: \"sync-result\",\n context: job.context,\n result,\n } satisfies SearchIndexWorkerMessage);\n}\n\nparentPort?.postMessage({\n type: \"done\",\n context: data.context,\n durationMs: performance.now() - startedAt,\n sessions: jobs.reduce(\n (total, job) => total + (job.kind === \"full\" ? job.sessions.length : job.changes.length),\n 0,\n ),\n} satisfies SearchIndexWorkerMessage);\n"],"mappings":";;;;;;;;;;;AAAA,SAAS,YAAY,kBAAkB;AAwDvC,IAAM,OAAO;AACb,IAAM,YAAY,YAAY,IAAI;AAClC,IAAM,SAAS,uBAAuB;AACtC,IAAM,OACJ,KAAK,QACL,KAAK,WAAW;AAAA,EACd,CAAC,eAAqC;AAAA,IACpC,MAAM;AAAA,IACN,SAAS,KAAK;AAAA,IACd;AAAA,IACA,UAAU,KAAK,gBAAgB,SAAS,KAAK,CAAC;AAAA,IAC9C,MAAM,KAAK,YAAY,SAAS,KAAK,CAAC;AAAA,EACxC;AACF;AAEF,WAAW,OAAO,MAAM;AACtB,QAAM,QAAQ,OAAO,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,SAAS;AAC/D,MAAI,CAAC,MAAO;AAEZ,MAAI,MAAM,mBAAmB;AAC3B,UAAM,kBAAkB,IAAI,IAAI,OAAO,QAAQ,IAAI,IAAI,CAAC,CAAC;AAAA,EAC3D;AAEA,MAAI;AACJ,MAAI,IAAI,SAAS,WAAW;AAC1B,6BAAyB,IAAI,WAAW,IAAI,SAAS,IAAI,mBAAmB,IAAI,IAAI;AACpF,aAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,CAAC,cAAc,MAAM,eAAe,SAAS;AAAA,MAC7C,IAAI;AAAA,IACN;AAAA,EACF,OAAO;AACL,QAAI,IAAI,WAAW;AACjB,yBAAmB,IAAI,WAAW,IAAI,UAAU,IAAI,IAAI;AAAA,IAC1D;AACA,aAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,CAAC,cAAc,MAAM,eAAe,SAAS;AAAA,MAC7C,IAAI;AAAA,IACN;AACA,QAAI,IAAI,aAAa,QAAQ,YAAY,GAAG;AAC1C,gCAA0B,IAAI,SAAS;AAAA,IACzC;AAAA,EACF;AACA,cAAY,YAAY;AAAA,IACtB,MAAM;AAAA,IACN,SAAS,IAAI;AAAA,IACb;AAAA,EACF,CAAoC;AACtC;AAEA,YAAY,YAAY;AAAA,EACtB,MAAM;AAAA,EACN,SAAS,KAAK;AAAA,EACd,YAAY,YAAY,IAAI,IAAI;AAAA,EAChC,UAAU,KAAK;AAAA,IACb,CAAC,OAAO,QAAQ,SAAS,IAAI,SAAS,SAAS,IAAI,SAAS,SAAS,IAAI,QAAQ;AAAA,IACjF;AAAA,EACF;AACF,CAAoC;","names":[]}
1
+ {"version":3,"sources":["../src/search-index-worker.ts"],"sourcesContent":["import { parentPort, workerData } from \"node:worker_threads\";\nimport {\n createRegisteredAgents,\n getCachePath,\n markAgentCacheInitialized,\n saveCachedSessionChanges,\n saveCachedSessions,\n setFtsIntegrityCheckedPath,\n syncSessionSearchIndex,\n syncSessionSearchIndexChanges,\n type SearchIndexSyncResult,\n type SearchIndexSyncOptions,\n type SessionCacheMeta,\n type SessionHeadChange,\n type SessionHead,\n} from \"@codesesh/core\";\n\nexport type SearchIndexWorkerMessage =\n | {\n type: \"sync-result\";\n context: string;\n result: SearchIndexSyncResult | null;\n }\n | {\n type: \"done\";\n context: string;\n durationMs: number;\n sessions: number;\n };\n\nexport type SearchIndexWorkerJob =\n | {\n kind: \"full\";\n context: string;\n agentName: string;\n sessions: SessionHead[];\n meta: Record<string, SessionCacheMeta>;\n saveCache?: boolean;\n searchIndexOptions?: SearchIndexSyncOptions;\n }\n | {\n kind: \"changes\";\n context: string;\n agentName: string;\n changes: SessionHeadChange[];\n removedSessionIds: string[];\n meta: Record<string, SessionCacheMeta>;\n searchIndexOptions?: SearchIndexSyncOptions;\n };\n\ninterface SearchIndexWorkerData {\n jobs?: SearchIndexWorkerJob[];\n context: string;\n agentNames: string[];\n sessionsByAgent: Record<string, SessionHead[]>;\n metaByAgent: Record<string, Record<string, SessionCacheMeta>>;\n /** Set once this process has already run the FTS integrity check in an earlier batch. */\n skipFtsIntegrityCheck?: boolean;\n}\n\nconst data = workerData as SearchIndexWorkerData;\nif (data.skipFtsIntegrityCheck) {\n setFtsIntegrityCheckedPath(getCachePath());\n}\nconst startedAt = performance.now();\nconst agents = createRegisteredAgents();\nconst jobs =\n data.jobs ??\n data.agentNames.map(\n (agentName): SearchIndexWorkerJob => ({\n kind: \"full\",\n context: data.context,\n agentName,\n sessions: data.sessionsByAgent[agentName] ?? [],\n meta: data.metaByAgent[agentName] ?? {},\n }),\n );\n\nfor (const job of jobs) {\n const agent = agents.find((item) => item.name === job.agentName);\n if (!agent) continue;\n\n if (agent.setSessionMetaMap) {\n agent.setSessionMetaMap(new Map(Object.entries(job.meta)));\n }\n\n let result: SearchIndexSyncResult | null;\n if (job.kind === \"changes\") {\n saveCachedSessionChanges(job.agentName, job.changes, job.removedSessionIds, job.meta);\n result = syncSessionSearchIndexChanges(\n job.agentName,\n job.changes,\n job.removedSessionIds,\n (sessionId) => agent.getSessionData(sessionId),\n job.searchIndexOptions,\n );\n } else {\n if (job.saveCache) {\n saveCachedSessions(job.agentName, job.sessions, job.meta);\n }\n result = syncSessionSearchIndex(\n job.agentName,\n job.sessions,\n (sessionId) => agent.getSessionData(sessionId),\n job.searchIndexOptions,\n );\n if (job.saveCache && result?.skipped === 0) {\n markAgentCacheInitialized(job.agentName);\n }\n }\n parentPort?.postMessage({\n type: \"sync-result\",\n context: job.context,\n result,\n } satisfies SearchIndexWorkerMessage);\n}\n\nparentPort?.postMessage({\n type: \"done\",\n context: data.context,\n durationMs: performance.now() - startedAt,\n sessions: jobs.reduce(\n (total, job) => total + (job.kind === \"full\" ? job.sessions.length : job.changes.length),\n 0,\n ),\n} satisfies SearchIndexWorkerMessage);\n"],"mappings":";;;;;;;;;;;;;AAAA,SAAS,YAAY,kBAAkB;AA4DvC,IAAM,OAAO;AACb,IAAI,KAAK,uBAAuB;AAC9B,6BAA2B,cAAa,CAAC;AAC3C;AACA,IAAM,YAAY,YAAY,IAAI;AAClC,IAAM,SAAS,uBAAuB;AACtC,IAAM,OACJ,KAAK,QACL,KAAK,WAAW;AAAA,EACd,CAAC,eAAqC;AAAA,IACpC,MAAM;AAAA,IACN,SAAS,KAAK;AAAA,IACd;AAAA,IACA,UAAU,KAAK,gBAAgB,SAAS,KAAK,CAAC;AAAA,IAC9C,MAAM,KAAK,YAAY,SAAS,KAAK,CAAC;AAAA,EACxC;AACF;AAEF,WAAW,OAAO,MAAM;AACtB,QAAM,QAAQ,OAAO,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI,SAAS;AAC/D,MAAI,CAAC,MAAO;AAEZ,MAAI,MAAM,mBAAmB;AAC3B,UAAM,kBAAkB,IAAI,IAAI,OAAO,QAAQ,IAAI,IAAI,CAAC,CAAC;AAAA,EAC3D;AAEA,MAAI;AACJ,MAAI,IAAI,SAAS,WAAW;AAC1B,6BAAyB,IAAI,WAAW,IAAI,SAAS,IAAI,mBAAmB,IAAI,IAAI;AACpF,aAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,CAAC,cAAc,MAAM,eAAe,SAAS;AAAA,MAC7C,IAAI;AAAA,IACN;AAAA,EACF,OAAO;AACL,QAAI,IAAI,WAAW;AACjB,yBAAmB,IAAI,WAAW,IAAI,UAAU,IAAI,IAAI;AAAA,IAC1D;AACA,aAAS;AAAA,MACP,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,CAAC,cAAc,MAAM,eAAe,SAAS;AAAA,MAC7C,IAAI;AAAA,IACN;AACA,QAAI,IAAI,aAAa,QAAQ,YAAY,GAAG;AAC1C,gCAA0B,IAAI,SAAS;AAAA,IACzC;AAAA,EACF;AACA,cAAY,YAAY;AAAA,IACtB,MAAM;AAAA,IACN,SAAS,IAAI;AAAA,IACb;AAAA,EACF,CAAoC;AACtC;AAEA,YAAY,YAAY;AAAA,EACtB,MAAM;AAAA,EACN,SAAS,KAAK;AAAA,EACd,YAAY,YAAY,IAAI,IAAI;AAAA,EAChC,UAAU,KAAK;AAAA,IACb,CAAC,OAAO,QAAQ,SAAS,IAAI,SAAS,SAAS,IAAI,SAAS,SAAS,IAAI,QAAQ;AAAA,IACjF;AAAA,EACF;AACF,CAAoC;","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  classifySessionTags,
4
4
  createRegisteredAgents,
5
5
  getSmartTagSourceTimestamp
6
- } from "./chunk-BIXOP5QX.js";
6
+ } from "./chunk-GCOAE7KI.js";
7
7
 
8
8
  // src/smart-tag-worker.ts
9
9
  import { parentPort, workerData } from "worker_threads";
@@ -0,0 +1,2 @@
1
+ /*! tailwindcss v4.3.0 | MIT License | https://tailwindcss.com */
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-outline-style:solid}}}@layer theme{:root,:host{--font-sans:"Avenir Next", "PingFang SC", "Hiragino Sans GB", "Noto Sans SC", -apple-system, sans-serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-2xl:42rem;--container-4xl:56rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--leading-tight:1.25;--leading-relaxed:1.625;--radius-sm:calc(var(--radius) - 4px);--radius-lg:var(--radius);--radius-xl:.75rem;--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--aspect-video:16 / 9;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-border:hsl(var(--border));--color-background:hsl(var(--background));--color-foreground:hsl(var(--foreground));--color-muted:hsl(var(--muted));--color-muted-foreground:hsl(var(--muted-foreground));--color-card:hsl(var(--card));--color-card-foreground:hsl(var(--card-foreground))}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:root{--background:0 0% 100%;--foreground:0 0% 3.9%;--card:0 0% 100%;--card-foreground:0 0% 3.9%;--popover:0 0% 100%;--popover-foreground:0 0% 3.9%;--primary:0 0% 9%;--primary-foreground:0 0% 98%;--secondary:0 0% 96.1%;--secondary-foreground:0 0% 9%;--muted:0 0% 96.1%;--muted-foreground:0 0% 45.1%;--accent:0 0% 96.1%;--accent-foreground:0 0% 9%;--destructive:0 84.2% 60.2%;--destructive-foreground:0 0% 98%;--border:0 0% 89.8%;--input:0 0% 89.8%;--ring:0 0% 3.9%;--radius:.5rem;--console-bg:#f7f7f7;--console-sidebar-bg:#fbfbfb;--console-surface-muted:#f5f5f5;--console-border:#e5e5e5;--console-border-strong:#d4d4d4;--console-text:#1a1a1a;--console-muted:#666;--console-accent:#2d2d2d;--console-accent-strong:#1f1f1f;--console-thread:#e8e8e8;--console-thinking-bg:#f9f9f9;--console-thinking-border:#ebebeb;--console-success:#15803d;--console-success-bg:#dcfce7;--console-success-border:#bbf7d0;--console-warning:#b45309;--console-warning-bg:#fef3c7;--console-warning-border:#fde68a;--console-error:#b91c1c;--console-error-bg:#fee2e2;--console-error-border:#fecaca}.dark{--background:0 0% 3.9%;--foreground:0 0% 98%;--card:0 0% 3.9%;--card-foreground:0 0% 98%;--popover:0 0% 3.9%;--popover-foreground:0 0% 98%;--primary:0 0% 98%;--primary-foreground:0 0% 9%;--secondary:0 0% 14.9%;--secondary-foreground:0 0% 98%;--muted:0 0% 14.9%;--muted-foreground:0 0% 63.9%;--accent:0 0% 14.9%;--accent-foreground:0 0% 98%;--destructive:0 62.8% 30.6%;--destructive-foreground:0 0% 98%;--border:0 0% 14.9%;--input:0 0% 14.9%;--ring:0 0% 83.1%}*{border-color:var(--color-border)}body{background-color:var(--color-background);color:var(--color-foreground)}}@layer components;@layer utilities{.\@container\/card-header{container:card-header/inline-size}.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing) * 0)}.top-0{top:calc(var(--spacing) * 0)}.top-1\/2{top:50%}.right-0{right:calc(var(--spacing) * 0)}.left-0{left:calc(var(--spacing) * 0)}.left-1\/2{left:50%}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.z-\[60\]{z-index:60}.z-\[61\]{z-index:61}.z-\[62\]{z-index:62}.order-3{order:3}.col-span-2{grid-column:span 2/span 2}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.my-0\.5{margin-block:calc(var(--spacing) * .5)}.-mt-1{margin-top:calc(var(--spacing) * -1)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-auto{margin-left:auto}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:var(--aspect-video)}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-\[160px\]{width:160px;height:160px}.size-full{width:100%;height:100%}.h-1{height:calc(var(--spacing) * 1)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-4{height:calc(var(--spacing) * 4)}.h-6{height:calc(var(--spacing) * 6)}.h-9{height:calc(var(--spacing) * 9)}.h-32{height:calc(var(--spacing) * 32)}.h-\[calc\(100dvh-5\.5rem\)\]{height:calc(100dvh - 5.5rem)}.h-\[min\(560px\,calc\(100vh-410px\)\)\]{height:min(560px,100vh - 410px)}.h-full{height:100%}.h-screen{height:100vh}.max-h-\[200px\]{max-height:200px}.max-h-\[280px\]{max-height:280px}.max-h-\[420px\]{max-height:420px}.max-h-\[min\(280px\,calc\(100vh-440px\)\)\]{max-height:min(280px,100vh - 440px)}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-14{min-height:calc(var(--spacing) * 14)}.min-h-24{min-height:calc(var(--spacing) * 24)}.min-h-56{min-height:calc(var(--spacing) * 56)}.min-h-\[420px\]{min-height:420px}.min-h-full{min-height:100%}.w-0{width:calc(var(--spacing) * 0)}.w-1{width:calc(var(--spacing) * 1)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-2\/3{width:66.6667%}.w-4{width:calc(var(--spacing) * 4)}.w-5\/6{width:83.3333%}.w-5\/12{width:41.6667%}.w-6{width:calc(var(--spacing) * 6)}.w-7\/12{width:58.3333%}.w-8\/12{width:66.6667%}.w-9\/12{width:75%}.w-10{width:calc(var(--spacing) * 10)}.w-10\/12{width:83.3333%}.w-11\/12{width:91.6667%}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-20{width:calc(var(--spacing) * 20)}.w-24{width:calc(var(--spacing) * 24)}.w-32{width:calc(var(--spacing) * 32)}.w-64{width:calc(var(--spacing) * 64)}.w-\[calc\(100\%-2rem\)\]{width:calc(100% - 2rem)}.w-\[min\(90vw\,380px\)\]{width:min(90vw,380px)}.w-\[min\(92vw\,430px\)\]{width:min(92vw,430px)}.w-full{width:100%}.w-screen{width:100vw}.max-w-2xl{max-width:var(--container-2xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-\[42rem\]{max-width:42rem}.max-w-\[1440px\]{max-width:1440px}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[8rem\]{min-width:8rem}.flex-1{flex:1}.shrink-0{flex-shrink:0}.origin-center{transform-origin:50%}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.resize{resize:both}.scroll-mt-6{scroll-margin-top:calc(var(--spacing) * 6)}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.grid-rows-\[auto_auto\]{grid-template-rows:auto auto}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:calc(var(--spacing) * 1)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}.gap-\[2px\]{gap:2px}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 8) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-y-1{row-gap:calc(var(--spacing) * 1)}.self-start{align-self:flex-start}.justify-self-end{justify-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-\[2px\]{border-radius:2px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-\[1px\]{border-top-left-radius:1px;border-top-right-radius:1px}.rounded-l-sm{border-top-left-radius:var(--radius-sm);border-bottom-left-radius:var(--radius-sm)}.border{border-style:var(--tw-border-style);border-width:1px}.border-\[1\.5px\]{border-style:var(--tw-border-style);border-width:1.5px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-r-0{border-right-style:var(--tw-border-style);border-right-width:0}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-\(--color-border\){border-color:var(--color-border)}.border-\[var\(--console-accent\)\]{border-color:var(--console-accent)}.border-\[var\(--console-accent-strong\)\]{border-color:var(--console-accent-strong)}.border-\[var\(--console-border\)\]{border-color:var(--console-border)}.border-\[var\(--console-border-strong\)\]{border-color:var(--console-border-strong)}.border-\[var\(--console-error-border\)\]{border-color:var(--console-error-border)}.border-\[var\(--console-success-border\)\]{border-color:var(--console-success-border)}.border-\[var\(--console-thinking-border\)\]{border-color:var(--console-thinking-border)}.border-\[var\(--console-thread\)\]{border-color:var(--console-thread)}.border-\[var\(--console-warning-border\)\]{border-color:var(--console-warning-border)}.border-border\/50{border-color:color-mix(in srgb, hsl(var(--border)) 50%, transparent)}@supports (color:color-mix(in lab, red, red)){.border-border\/50{border-color:color-mix(in oklab, var(--color-border) 50%, transparent)}}.border-transparent{border-color:#0000}.bg-\(--color-bg\){background-color:var(--color-bg)}.bg-\[\#eff6ff\]{background-color:#eff6ff}.bg-\[\#f0fdf4\]{background-color:#f0fdf4}.bg-\[\#f3f4f6\]{background-color:#f3f4f6}.bg-\[\#f5f3ff\]{background-color:#f5f3ff}.bg-\[\#fafafa\]{background-color:#fafafa}.bg-\[\#fef2f2\]{background-color:#fef2f2}.bg-\[var\(--console-accent\)\]{background-color:var(--console-accent)}.bg-\[var\(--console-accent-strong\)\]{background-color:var(--console-accent-strong)}.bg-\[var\(--console-bg\)\]{background-color:var(--console-bg)}.bg-\[var\(--console-border\)\]{background-color:var(--console-border)}.bg-\[var\(--console-border-strong\)\]{background-color:var(--console-border-strong)}.bg-\[var\(--console-error-bg\)\]{background-color:var(--console-error-bg)}.bg-\[var\(--console-sidebar-bg\)\]{background-color:var(--console-sidebar-bg)}.bg-\[var\(--console-success-bg\)\]{background-color:var(--console-success-bg)}.bg-\[var\(--console-surface-muted\)\]{background-color:var(--console-surface-muted)}.bg-\[var\(--console-thinking-bg\)\]{background-color:var(--console-thinking-bg)}.bg-\[var\(--console-warning-bg\)\]{background-color:var(--console-warning-bg)}.bg-background{background-color:var(--color-background)}.bg-black\/20{background-color:#0003}@supports (color:color-mix(in lab, red, red)){.bg-black\/20{background-color:color-mix(in oklab, var(--color-black) 20%, transparent)}}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab, red, red)){.bg-black\/30{background-color:color-mix(in oklab, var(--color-black) 30%, transparent)}}.bg-black\/35{background-color:#00000059}@supports (color:color-mix(in lab, red, red)){.bg-black\/35{background-color:color-mix(in oklab, var(--color-black) 35%, transparent)}}.bg-card{background-color:var(--color-card)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-white\/60{background-color:#fff9}@supports (color:color-mix(in lab, red, red)){.bg-white\/60{background-color:color-mix(in oklab, var(--color-white) 60%, transparent)}}.bg-white\/70{background-color:#ffffffb3}@supports (color:color-mix(in lab, red, red)){.bg-white\/70{background-color:color-mix(in oklab, var(--color-white) 70%, transparent)}}.bg-white\/80{background-color:#fffc}@supports (color:color-mix(in lab, red, red)){.bg-white\/80{background-color:color-mix(in oklab, var(--color-white) 80%, transparent)}}.bg-white\/85{background-color:#ffffffd9}@supports (color:color-mix(in lab, red, red)){.bg-white\/85{background-color:color-mix(in oklab, var(--color-white) 85%, transparent)}}.stroke-\[3\]{stroke-width:3px}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.p-1{padding:calc(var(--spacing) * 1)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.pt-1{padding-top:calc(var(--spacing) * 1)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pr-1{padding-right:calc(var(--spacing) * 1)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-7{--tw-leading:calc(var(--spacing) * 7);line-height:calc(var(--spacing) * 7)}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.05em\]{--tw-tracking:.05em;letter-spacing:.05em}.tracking-\[0\.12em\]{--tw-tracking:.12em;letter-spacing:.12em}.tracking-\[0\.14em\]{--tw-tracking:.14em;letter-spacing:.14em}.tracking-\[0\.16em\]{--tw-tracking:.16em;letter-spacing:.16em}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[\#1d4ed8\]{color:#1d4ed8}.text-\[\#7c3aed\]{color:#7c3aed}.text-\[\#15803d\]{color:#15803d}.text-\[\#b91c1c\]{color:#b91c1c}.text-\[var\(--console-accent\)\]{color:var(--console-accent)}.text-\[var\(--console-error\)\]{color:var(--console-error)}.text-\[var\(--console-muted\)\]{color:var(--console-muted)}.text-\[var\(--console-success\)\]{color:var(--console-success)}.text-\[var\(--console-text\)\]{color:var(--console-text)}.text-\[var\(--console-warning\)\]{color:var(--console-warning)}.text-card-foreground{color:var(--color-card-foreground)}.text-foreground{color:var(--color-foreground)}.text-muted-foreground{color:var(--color-muted-foreground)}.text-transparent{color:#0000}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.opacity-0{opacity:0}.opacity-45{opacity:.45}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-100{opacity:1}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[-2px_4px_14px_rgba\(15\,23\,42\,0\.14\)\]{--tw-shadow:-2px 4px 14px var(--tw-shadow-color,#0f172a24);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[-10px_0_30px_rgba\(15\,23\,42\,0\.16\)\]{--tw-shadow:-10px 0 30px var(--tw-shadow-color,#0f172a29);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[-12px_0_32px_rgba\(15\,23\,42\,0\.18\)\]{--tw-shadow:-12px 0 32px var(--tw-shadow-color,#0f172a2e);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_1px_2px_rgba\(15\,23\,42\,0\.04\)\]{--tw-shadow:0 1px 2px var(--tw-shadow-color,#0f172a0a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[2px_2px_0_0_rgba\(15\,23\,42\,0\.05\)\]{--tw-shadow:2px 2px 0 0 var(--tw-shadow-color,#0f172a0d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.animate-in{--tw-enter-opacity:initial;--tw-enter-scale:initial;--tw-enter-rotate:initial;--tw-enter-translate-x:initial;--tw-enter-translate-y:initial;animation-name:enter;animation-duration:.15s}.outline-none{--tw-outline-style:none;outline-style:none}.\[writing-mode\:vertical-rl\]{writing-mode:vertical-rl}.duration-200{animation-duration:.2s}.duration-300{animation-duration:.3s}.fade-in{--tw-enter-opacity:0}.running{animation-play-state:running}.slide-in-from-bottom-2{--tw-enter-translate-y:.5rem}.placeholder\:text-\[var\(--console-muted\)\]::placeholder{color:var(--console-muted)}@media (hover:hover){.hover\:border-\[var\(--console-border\)\]:hover{border-color:var(--console-border)}.hover\:border-\[var\(--console-border-strong\)\]:hover{border-color:var(--console-border-strong)}.hover\:bg-\[var\(--console-surface-muted\)\]:hover{background-color:var(--console-surface-muted)}.hover\:bg-white:hover{background-color:var(--color-white)}.hover\:text-\[var\(--console-text\)\]:hover{color:var(--console-text)}.hover\:opacity-100:hover{opacity:1}}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-\[var\(--console-accent\)\]:focus-visible{outline-color:var(--console-accent)}.active\:cursor-grabbing:active{cursor:grabbing}.has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto}@media (width>=1025px){.min-\[1025px\]\:sticky{position:sticky}.min-\[1025px\]\:top-4{top:calc(var(--spacing) * 4)}.min-\[1025px\]\:block{display:block}.min-\[1025px\]\:flex{display:flex}.min-\[1025px\]\:hidden{display:none}.min-\[1025px\]\:max-h-\[calc\(100dvh-14rem\)\]{max-height:calc(100dvh - 14rem)}.min-\[1025px\]\:grid-cols-\[240px_minmax\(0\,1fr\)\]{grid-template-columns:240px minmax(0,1fr)}.min-\[1025px\]\:items-start{align-items:flex-start}.min-\[1025px\]\:overflow-y-auto{overflow-y:auto}.min-\[1025px\]\:overscroll-contain{overscroll-behavior:contain}}@media (width>=1280px){.min-\[1280px\]\:grid-cols-\[220px_minmax\(0\,1fr\)\]{grid-template-columns:220px minmax(0,1fr)}}@media (width>=40rem){.sm\:order-none{order:0}.sm\:col-span-1{grid-column:span 1/span 1}.sm\:mx-auto{margin-inline:auto}.sm\:inline{display:inline}.sm\:inline-flex{display:inline-flex}.sm\:max-w-\[560px\]{max-width:560px}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-\[auto_1fr_auto\]{grid-template-columns:auto 1fr auto}.sm\:py-0{padding-block:calc(var(--spacing) * 0)}}@media (width>=48rem){.md\:inline-flex{display:inline-flex}.md\:w-24{width:calc(var(--spacing) * 24)}.md\:w-\[560px\]{width:560px}.md\:max-w-xs{max-width:var(--container-xs)}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:items-start{align-items:flex-start}.md\:justify-between{justify-content:space-between}.md\:gap-3{gap:calc(var(--spacing) * 3)}.md\:p-6{padding:calc(var(--spacing) * 6)}.md\:px-4{padding-inline:calc(var(--spacing) * 4)}.md\:px-8{padding-inline:calc(var(--spacing) * 8)}.md\:pr-5{padding-right:calc(var(--spacing) * 5)}.md\:text-\[2rem\]{font-size:2rem}}@media (width>=64rem){.lg\:flex{display:flex}.lg\:inline-flex{display:inline-flex}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}.\[\&_\.recharts-cartesian-axis-tick_text\]\:fill-muted-foreground .recharts-cartesian-axis-tick text{fill:var(--color-muted-foreground)}.\[\&_\.recharts-cartesian-grid_line\[stroke\=\'\#ccc\'\]\]\:stroke-border\/50 .recharts-cartesian-grid line[stroke=\#ccc]{stroke:color-mix(in srgb, hsl(var(--border)) 50%, transparent)}@supports (color:color-mix(in lab, red, red)){.\[\&_\.recharts-cartesian-grid_line\[stroke\=\'\#ccc\'\]\]\:stroke-border\/50 .recharts-cartesian-grid line[stroke=\#ccc]{stroke:color-mix(in oklab, var(--color-border) 50%, transparent)}}.\[\&_\.recharts-curve\.recharts-tooltip-cursor\]\:stroke-border .recharts-curve.recharts-tooltip-cursor{stroke:var(--color-border)}.\[\&_\.recharts-dot\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-dot[stroke=\#fff]{stroke:#0000}.\[\&_\.recharts-layer\]\:outline-hidden .recharts-layer{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.\[\&_\.recharts-layer\]\:outline-hidden .recharts-layer{outline-offset:2px;outline:2px solid #0000}}.\[\&_\.recharts-polar-grid_\[stroke\=\'\#ccc\'\]\]\:stroke-border .recharts-polar-grid [stroke=\#ccc]{stroke:var(--color-border)}.\[\&_\.recharts-radial-bar-background-sector\]\:fill-muted .recharts-radial-bar-background-sector,.\[\&_\.recharts-rectangle\.recharts-tooltip-cursor\]\:fill-muted .recharts-rectangle.recharts-tooltip-cursor{fill:var(--color-muted)}.\[\&_\.recharts-reference-line_\[stroke\=\'\#ccc\'\]\]\:stroke-border .recharts-reference-line [stroke=\#ccc]{stroke:var(--color-border)}.\[\&_\.recharts-sector\]\:outline-hidden .recharts-sector{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.\[\&_\.recharts-sector\]\:outline-hidden .recharts-sector{outline-offset:2px;outline:2px solid #0000}}.\[\&_\.recharts-sector\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-sector[stroke=\#fff]{stroke:#0000}.\[\&_\.recharts-surface\]\:outline-hidden .recharts-surface{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.\[\&_\.recharts-surface\]\:outline-hidden .recharts-surface{outline-offset:2px;outline:2px solid #0000}}.\[\&_mark\]\:bg-\[var\(--console-accent\)\] mark{background-color:var(--console-accent)}.\[\&_mark\]\:px-0\.5 mark{padding-inline:calc(var(--spacing) * .5)}.\[\&_mark\]\:text-white mark{color:var(--color-white)}.\[\.border-b\]\:pb-6.border-b{padding-bottom:calc(var(--spacing) * 6)}.\[\.border-t\]\:pt-6.border-t{padding-top:calc(var(--spacing) * 6)}.\[\&\>svg\]\:h-2\.5>svg{height:calc(var(--spacing) * 2.5)}.\[\&\>svg\]\:h-3>svg{height:calc(var(--spacing) * 3)}.\[\&\>svg\]\:w-2\.5>svg{width:calc(var(--spacing) * 2.5)}.\[\&\>svg\]\:w-3>svg{width:calc(var(--spacing) * 3)}.\[\&\>svg\]\:text-muted-foreground>svg{color:var(--color-muted-foreground)}.console-ui{font-family:IBM Plex Sans,Avenir Next,PingFang SC,-apple-system,sans-serif}.console-mono{font-family:JetBrains Mono,IBM Plex Mono,SFMono-Regular,Menlo,Monaco,Consolas,monospace}.bg-grid{background-image:linear-gradient(90deg,#0000000a 1px,#0000 1px),linear-gradient(#0000000a 1px,#0000 1px);background-size:40px 40px}.shortcut-overlay[data-state=open]{animation:.2s cubic-bezier(.23,1,.32,1) shortcut-overlay-in}.shortcut-overlay[data-state=closed]{animation:.15s cubic-bezier(.23,1,.32,1) shortcut-overlay-out}.shortcut-content[data-state=open]{animation:.2s cubic-bezier(.23,1,.32,1) shortcut-content-in}.shortcut-content[data-state=closed]{animation:.15s cubic-bezier(.23,1,.32,1) shortcut-content-out}}@media (prefers-reduced-motion:reduce){.shortcut-content[data-state=open]{animation-name:shortcut-overlay-in}.shortcut-content[data-state=closed]{animation-name:shortcut-overlay-out}}.console-scrollbar::-webkit-scrollbar{width:6px;height:6px}.console-scrollbar::-webkit-scrollbar-track{background:0 0}.console-scrollbar::-webkit-scrollbar-thumb{background:#d1d5db;border-radius:2px}.console-scrollbar::-webkit-scrollbar-thumb:hover{background:#9ca3af}.console-scrollbar{scrollbar-width:thin;scrollbar-color:#d1d5db transparent}.console-markdown>*+*{margin-top:.75rem}.console-markdown{overflow-wrap:anywhere;word-break:break-word;min-width:0}.console-markdown p{margin:0}.console-markdown h1,.console-markdown h2,.console-markdown h3,.console-markdown h4,.console-markdown h5,.console-markdown h6{color:var(--console-text);margin:0;font-weight:700;line-height:1.3}.console-markdown h1{letter-spacing:-.02em;font-size:1.5rem}.console-markdown h2{letter-spacing:-.015em;font-size:1.25rem}.console-markdown h3{font-size:1.1rem}.console-markdown h4,.console-markdown h5,.console-markdown h6{font-size:1rem}.console-markdown ul,.console-markdown ol{margin:.5rem 0;padding-left:1.25rem}.console-markdown ul{list-style:outside}.console-markdown ol{list-style:decimal}.console-markdown li+li{margin-top:.25rem}.console-markdown li>p{margin:0}.console-markdown strong{font-weight:700}.console-markdown blockquote{border-left:3px solid var(--console-border-strong);color:var(--console-muted);margin:0;padding-left:.875rem}.console-markdown hr{border:0;border-top:1px solid var(--console-border);margin:1rem 0}.console-markdown a{color:#4f46e5;text-decoration:underline}.console-markdown-link{color:inherit;cursor:text;text-decoration:none}.console-markdown code{overflow-wrap:anywhere;white-space:pre-wrap;background:#f5f5f5;border:1px solid #e5e7eb;border-radius:.125rem;padding:.08rem .32rem;font-family:JetBrains Mono,IBM Plex Mono,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.8rem}.console-markdown pre{background:#fafafa;border:1px solid #e5e7eb;border-radius:.125rem;max-width:100%;margin:0;padding:.75rem;overflow-x:auto}.console-markdown pre code{overflow-wrap:normal;white-space:pre;background:0 0;border:none;padding:0}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0), var(--tw-enter-translate-y,0), 0) scale3d(var(--tw-enter-scale,1), var(--tw-enter-scale,1), var(--tw-enter-scale,1)) rotate(var(--tw-enter-rotate,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0), var(--tw-exit-translate-y,0), 0) scale3d(var(--tw-exit-scale,1), var(--tw-exit-scale,1), var(--tw-exit-scale,1)) rotate(var(--tw-exit-rotate,0))}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}@keyframes shortcut-overlay-in{0%{opacity:0}to{opacity:1}}@keyframes shortcut-overlay-out{0%{opacity:1}to{opacity:0}}@keyframes shortcut-content-in{0%{opacity:0;scale:.96}to{opacity:1;scale:1}}@keyframes shortcut-content-out{0%{opacity:1;scale:1}to{opacity:0;scale:.96}}