@bibobonking/opensol 3.0.3 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/.github/workflows/build.yml +60 -8
  2. package/CHANGELOG.md +18 -0
  3. package/desktop/README.md +39 -0
  4. package/desktop/loading/index.html +36 -0
  5. package/desktop/src-tauri/Cargo.lock +4301 -0
  6. package/desktop/src-tauri/Cargo.toml +23 -0
  7. package/desktop/src-tauri/binaries/.gitkeep +0 -0
  8. package/desktop/src-tauri/build.rs +3 -0
  9. package/desktop/src-tauri/capabilities/default.json +7 -0
  10. package/desktop/src-tauri/icons/128x128.png +0 -0
  11. package/desktop/src-tauri/icons/128x128@2x.png +0 -0
  12. package/desktop/src-tauri/icons/32x32.png +0 -0
  13. package/desktop/src-tauri/icons/64x64.png +0 -0
  14. package/desktop/src-tauri/icons/Square107x107Logo.png +0 -0
  15. package/desktop/src-tauri/icons/Square142x142Logo.png +0 -0
  16. package/desktop/src-tauri/icons/Square150x150Logo.png +0 -0
  17. package/desktop/src-tauri/icons/Square284x284Logo.png +0 -0
  18. package/desktop/src-tauri/icons/Square30x30Logo.png +0 -0
  19. package/desktop/src-tauri/icons/Square310x310Logo.png +0 -0
  20. package/desktop/src-tauri/icons/Square44x44Logo.png +0 -0
  21. package/desktop/src-tauri/icons/Square71x71Logo.png +0 -0
  22. package/desktop/src-tauri/icons/Square89x89Logo.png +0 -0
  23. package/desktop/src-tauri/icons/StoreLogo.png +0 -0
  24. package/desktop/src-tauri/icons/icon.icns +0 -0
  25. package/desktop/src-tauri/icons/icon.ico +0 -0
  26. package/desktop/src-tauri/icons/icon.png +0 -0
  27. package/desktop/src-tauri/src/lib.rs +210 -0
  28. package/desktop/src-tauri/src/main.rs +6 -0
  29. package/desktop/src-tauri/tauri.conf.json +48 -0
  30. package/dist/assets/index-DdI1_iPD.css +1 -0
  31. package/dist/assets/index-egG5Bgfo.js +312 -0
  32. package/dist/index.html +2 -2
  33. package/package.json +2 -1
  34. package/server/daemon.mjs +64 -2
  35. package/server/lib/mcp.mjs +532 -0
  36. package/server/lib/mcp.test.mjs +46 -0
  37. package/server/lib/store.mjs +22 -0
  38. package/server/lib/tools.mjs +59 -1
  39. package/src/agent/tools.ts +6 -5
  40. package/src/components/Composer.tsx +22 -38
  41. package/src/components/DiffView.tsx +98 -0
  42. package/src/components/McpTab.tsx +337 -0
  43. package/src/components/MessageItem.tsx +62 -13
  44. package/src/components/ModelDeck.tsx +652 -0
  45. package/src/components/SessionsTab.tsx +206 -0
  46. package/src/components/SettingsModal.tsx +106 -69
  47. package/src/components/Sidebar.tsx +78 -24
  48. package/src/components/ToolCallCard.tsx +29 -7
  49. package/src/components/WorkspacePanel.tsx +16 -1
  50. package/src/core/kernel.ts +2 -0
  51. package/src/core/mcp-tools.ts +63 -0
  52. package/src/core/plugins/tools/fs.ts +24 -3
  53. package/src/core/services/agent-loop.ts +3 -1
  54. package/src/core/services/approval.ts +2 -1
  55. package/src/core/services/titles.ts +135 -0
  56. package/src/core/services/tools.ts +11 -8
  57. package/src/core/types.ts +4 -0
  58. package/src/index.css +97 -1
  59. package/src/lib/daemon.ts +29 -0
  60. package/src/lib/diff.ts +62 -0
  61. package/src/lib/permissions.ts +6 -6
  62. package/src/store/chats.ts +9 -1
  63. package/src/store/mcp.ts +67 -0
  64. package/src/store/settings.ts +9 -6
  65. package/src/store/ui.ts +13 -0
  66. package/src/store/workspace.ts +26 -0
  67. package/src/types.ts +51 -2
  68. package/tsconfig.tsbuildinfo +1 -1
  69. package/dist/assets/index-BmN7pBji.css +0 -1
  70. package/dist/assets/index-DgNDjkOz.js +0 -301
  71. package/src/components/ModelPicker.tsx +0 -487
package/src/lib/daemon.ts CHANGED
@@ -7,6 +7,7 @@ import type {
7
7
  DeployProviderId,
8
8
  DeployRequest,
9
9
  DeployResult,
10
+ McpServer,
10
11
  ModelInfo,
11
12
  ProviderId,
12
13
  ProviderStatus,
@@ -274,6 +275,34 @@ export function forgetWorkspace(): Promise<WorkspaceInfo> {
274
275
  return api('/api/workspaces', { method: 'DELETE' })
275
276
  }
276
277
 
278
+ /** Remove one folder from the saved list. The folder stays on disk. */
279
+ export function removeWorkspaceFromList(path: string): Promise<WorkspaceInfo> {
280
+ return api(`/api/workspaces?path=${encodeURIComponent(path)}`, { method: 'DELETE' })
281
+ }
282
+
283
+ export type McpServerInput = Partial<McpServer> & { name: string }
284
+
285
+ export function mcpList(): Promise<{ servers: McpServer[] }> {
286
+ return api('/api/mcp')
287
+ }
288
+
289
+ export function mcpSave(servers: McpServerInput[]): Promise<{ servers: McpServer[] }> {
290
+ return api('/api/mcp', { method: 'PUT', body: JSON.stringify({ servers }) })
291
+ }
292
+
293
+ export function mcpAction(id: string, action: 'connect' | 'disconnect' | 'refresh'): Promise<{ servers: McpServer[] }> {
294
+ return api(`/api/mcp/${encodeURIComponent(id)}/${action}`, { method: 'POST', body: '{}' })
295
+ }
296
+
297
+ export function mcpCall(
298
+ server: string,
299
+ tool: string,
300
+ args: Record<string, unknown>,
301
+ signal?: AbortSignal,
302
+ ): Promise<{ result: { text: string; isError: boolean } }> {
303
+ return api('/api/mcp/call', { method: 'POST', body: JSON.stringify({ server, tool, args }), signal })
304
+ }
305
+
277
306
  export function browseFolders(path: string) {
278
307
  return api<{ path: string; parent: string; home: string; entries: Array<{ name: string; path: string }> }>(
279
308
  `/api/workspaces/browse?path=${encodeURIComponent(path)}`,
@@ -0,0 +1,62 @@
1
+ export interface DiffOp {
2
+ type: 'ctx' | 'add' | 'del'
3
+ text: string
4
+ }
5
+
6
+ /** Line diff via LCS on the changed middle; common head and tail are trimmed first. */
7
+ export function diffLines(before: string, after: string): DiffOp[] {
8
+ const a = before === '' ? [] : before.split('\n')
9
+ const b = after === '' ? [] : after.split('\n')
10
+ let start = 0
11
+ while (start < a.length && start < b.length && a[start] === b[start]) start += 1
12
+ let endA = a.length
13
+ let endB = b.length
14
+ while (endA > start && endB > start && a[endA - 1] === b[endB - 1]) {
15
+ endA -= 1
16
+ endB -= 1
17
+ }
18
+ const x = a.slice(start, endA)
19
+ const y = b.slice(start, endB)
20
+ const ops: DiffOp[] = a.slice(0, start).map((text) => ({ type: 'ctx', text }))
21
+
22
+ if (x.length * y.length > 2_000_000) {
23
+ x.forEach((text) => ops.push({ type: 'del', text }))
24
+ y.forEach((text) => ops.push({ type: 'add', text }))
25
+ } else {
26
+ const table: Uint32Array[] = Array.from({ length: x.length + 1 }, () => new Uint32Array(y.length + 1))
27
+ for (let i = x.length - 1; i >= 0; i -= 1) {
28
+ for (let j = y.length - 1; j >= 0; j -= 1) {
29
+ table[i][j] = x[i] === y[j] ? table[i + 1][j + 1] + 1 : Math.max(table[i + 1][j], table[i][j + 1])
30
+ }
31
+ }
32
+ let i = 0
33
+ let j = 0
34
+ while (i < x.length && j < y.length) {
35
+ if (x[i] === y[j]) {
36
+ ops.push({ type: 'ctx', text: x[i] })
37
+ i += 1
38
+ j += 1
39
+ } else if (table[i + 1][j] >= table[i][j + 1]) {
40
+ ops.push({ type: 'del', text: x[i] })
41
+ i += 1
42
+ } else {
43
+ ops.push({ type: 'add', text: y[j] })
44
+ j += 1
45
+ }
46
+ }
47
+ while (i < x.length) ops.push({ type: 'del', text: x[i++] })
48
+ while (j < y.length) ops.push({ type: 'add', text: y[j++] })
49
+ }
50
+ a.slice(endA).forEach((text) => ops.push({ type: 'ctx', text }))
51
+ return ops
52
+ }
53
+
54
+ export function diffStats(ops: DiffOp[]) {
55
+ let added = 0
56
+ let removed = 0
57
+ for (const op of ops) {
58
+ if (op.type === 'add') added += 1
59
+ else if (op.type === 'del') removed += 1
60
+ }
61
+ return { added, removed }
62
+ }
@@ -1,4 +1,4 @@
1
- import type { AppSettings, ToolName, ToolSetting } from '../types'
1
+ import type { AppSettings, BuiltinToolName, ToolSetting } from '../types'
2
2
 
3
3
  export type PermissionMode = 'ask' | 'accept-edits' | 'full'
4
4
 
@@ -20,8 +20,8 @@ export const PERMISSION_MODES: Array<{ value: PermissionMode; label: string; des
20
20
  },
21
21
  ]
22
22
 
23
- const WRITE_TOOLS: ToolName[] = ['write_file', 'edit_file', 'rewrite_file']
24
- const GUARDED_TOOLS: ToolName[] = ['shell', 'git', 'subagent']
23
+ const WRITE_TOOLS: BuiltinToolName[] = ['write_file', 'edit_file', 'rewrite_file']
24
+ const GUARDED_TOOLS: BuiltinToolName[] = ['shell', 'git', 'subagent']
25
25
 
26
26
  export function permissionMode(tools: AppSettings['tools']): PermissionMode {
27
27
  const writesAuto = WRITE_TOOLS.every((tool) => tools[tool]?.approval === 'auto')
@@ -34,9 +34,9 @@ export function permissionMode(tools: AppSettings['tools']): PermissionMode {
34
34
  export function permissionTools(
35
35
  tools: AppSettings['tools'],
36
36
  mode: PermissionMode,
37
- ): Record<ToolName, ToolSetting> {
38
- const next = {} as Record<ToolName, ToolSetting>
39
- for (const key of Object.keys(tools) as ToolName[]) {
37
+ ): Record<BuiltinToolName, ToolSetting> {
38
+ const next = {} as Record<BuiltinToolName, ToolSetting>
39
+ for (const key of Object.keys(tools) as BuiltinToolName[]) {
40
40
  const mutating = WRITE_TOOLS.includes(key) || GUARDED_TOOLS.includes(key)
41
41
  const approval: ToolSetting['approval'] =
42
42
  mode === 'full'
@@ -1,6 +1,7 @@
1
1
  import { create } from 'zustand'
2
2
  import type { AgentMode, ChatSession, Message, ProviderId } from '../types'
3
3
  import { csrfToken, saveChats } from '../lib/daemon'
4
+ import { useWorkspace } from './workspace'
4
5
 
5
6
  function createId(prefix: string) {
6
7
  const raw =
@@ -46,6 +47,11 @@ function normalizeSession(session: ChatSession): ChatSession {
46
47
  createdAt: typeof session.createdAt === 'number' ? session.createdAt : Date.now(),
47
48
  updatedAt: typeof session.updatedAt === 'number' ? session.updatedAt : Date.now(),
48
49
  mode: session.mode === 'plan' ? 'plan' : session.mode === 'build' ? 'build' : undefined,
50
+ workspace: typeof session.workspace === 'string' ? session.workspace : undefined,
51
+ titleSource:
52
+ session.titleSource === 'ai' || session.titleSource === 'user' || session.titleSource === 'auto'
53
+ ? session.titleSource
54
+ : undefined,
49
55
  }
50
56
  }
51
57
 
@@ -110,6 +116,8 @@ export const useChats = create<ChatsState>()((set, get) => ({
110
116
  provider,
111
117
  model,
112
118
  mode,
119
+ workspace: useWorkspace.getState().info.root || undefined,
120
+ titleSource: 'auto',
113
121
  }
114
122
  set((state) => ({ sessions: [session, ...state.sessions], activeId: id }))
115
123
  return id
@@ -155,7 +163,7 @@ export const useChats = create<ChatsState>()((set, get) => ({
155
163
  renameSession: (sessionId, title) => {
156
164
  const clean = title.trim()
157
165
  if (!clean) return
158
- get().updateSession(sessionId, { title: clean })
166
+ get().updateSession(sessionId, { title: clean, titleSource: 'user' })
159
167
  },
160
168
  deleteSession: (sessionId) => {
161
169
  set((state) => {
@@ -0,0 +1,67 @@
1
+ import { create } from 'zustand'
2
+ import type { McpServer, McpTool, McpToolName } from '../types'
3
+ import { mcpAction, mcpList, mcpSave, type McpServerInput } from '../lib/daemon'
4
+
5
+ interface McpState {
6
+ servers: McpServer[]
7
+ loaded: boolean
8
+ loading: boolean
9
+ error: string
10
+ load: () => Promise<void>
11
+ save: (servers: McpServerInput[]) => Promise<void>
12
+ act: (id: string, action: 'connect' | 'disconnect' | 'refresh') => Promise<void>
13
+ lookup: (fn: string) => { server: McpServer; tool: McpTool } | null
14
+ }
15
+
16
+ let pollTimer: number | undefined
17
+
18
+ export const useMcp = create<McpState>()((set, get) => {
19
+ const apply = (servers: McpServer[]) => {
20
+ set({ servers, loaded: true, loading: false, error: '' })
21
+ if (pollTimer !== undefined) window.clearTimeout(pollTimer)
22
+ pollTimer = undefined
23
+ // Servers that are still starting (npx may download packages) are polled until they settle.
24
+ if (servers.some((server) => server.status === 'connecting')) {
25
+ pollTimer = window.setTimeout(() => void get().load(), 1200)
26
+ }
27
+ }
28
+ return {
29
+ servers: [],
30
+ loaded: false,
31
+ loading: false,
32
+ error: '',
33
+ load: async () => {
34
+ set({ loading: true })
35
+ try {
36
+ apply((await mcpList()).servers)
37
+ } catch (error) {
38
+ set({ loading: false, loaded: true, error: error instanceof Error ? error.message : 'Could not load MCP servers.' })
39
+ }
40
+ },
41
+ save: async (servers) => {
42
+ const result = await mcpSave(servers)
43
+ apply(result.servers)
44
+ },
45
+ act: async (id, action) => {
46
+ // Show "connecting" at once; the daemon answers when the handshake finishes.
47
+ if (action !== 'disconnect') {
48
+ set((state) => ({
49
+ servers: state.servers.map((server) => (server.id === id ? { ...server, status: 'connecting', error: '' } : server)),
50
+ }))
51
+ }
52
+ const result = await mcpAction(id, action)
53
+ apply(result.servers)
54
+ },
55
+ lookup: (fn) => {
56
+ for (const server of get().servers) {
57
+ const tool = server.tools.find((entry) => entry.fn === fn)
58
+ if (tool) return { server, tool }
59
+ }
60
+ return null
61
+ },
62
+ }
63
+ })
64
+
65
+ export function isMcpToolName(name: string): name is McpToolName {
66
+ return name.startsWith('mcp__')
67
+ }
@@ -10,7 +10,7 @@ import type {
10
10
  SecretEntry,
11
11
  SecretsSummary,
12
12
  Skill,
13
- ToolName,
13
+ BuiltinToolName,
14
14
  ToolSetting,
15
15
  } from '../types'
16
16
  import { BUILTIN_SKILLS } from '../data/skills'
@@ -47,7 +47,7 @@ Working loop:
47
47
 
48
48
  Never claim a check passed without running it. Ask only when a decision is genuinely ambiguous or destructive. Answer in the user's language. Cite web sources as links, and only when you actually read them.`
49
49
 
50
- const DEFAULT_TOOLS: Record<ToolName, ToolSetting> = {
50
+ const DEFAULT_TOOLS: Record<BuiltinToolName, ToolSetting> = {
51
51
  shell: { enabled: true, approval: 'ask' },
52
52
  read_file: { enabled: true, approval: 'auto' },
53
53
  list_files: { enabled: true, approval: 'auto' },
@@ -79,6 +79,7 @@ const DEFAULTS: AppSettings = {
79
79
  chatFontSize: 15,
80
80
  workDetail: 'detailed',
81
81
  autoCollapseWork: true,
82
+ aiSessionTitles: true,
82
83
  }
83
84
 
84
85
  const EFFORTS = new Set<Effort>(['none', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max'])
@@ -99,7 +100,7 @@ interface SettingsStore extends AppSettings {
99
100
  saveSearchKey: (apiKey: string) => Promise<void>
100
101
  saveDeployCredentials: (provider: DeployProviderId, fields: Record<string, string>) => Promise<void>
101
102
  refreshProviders: () => Promise<void>
102
- updateTool: (tool: ToolName, patch: Partial<ToolSetting>) => void
103
+ updateTool: (tool: BuiltinToolName, patch: Partial<ToolSetting>) => void
103
104
  addSkill: (skill: Skill) => void
104
105
  updateSkill: (id: string, patch: Partial<Skill>) => void
105
106
  removeSkill: (id: string) => void
@@ -112,9 +113,9 @@ function notify(message: string, tone: 'info' | 'success' | 'error' = 'error') {
112
113
  window.dispatchEvent(new CustomEvent('maxcode:notice', { detail: { message, tone } }))
113
114
  }
114
115
 
115
- function mergeTools(saved?: Partial<Record<ToolName, Partial<ToolSetting>>>) {
116
- const merged = {} as Record<ToolName, ToolSetting>
117
- for (const key of Object.keys(DEFAULT_TOOLS) as ToolName[]) {
116
+ function mergeTools(saved?: Partial<Record<BuiltinToolName, Partial<ToolSetting>>>) {
117
+ const merged = {} as Record<BuiltinToolName, ToolSetting>
118
+ for (const key of Object.keys(DEFAULT_TOOLS) as BuiltinToolName[]) {
118
119
  merged[key] = { ...DEFAULT_TOOLS[key], ...(saved?.[key] ?? {}) }
119
120
  }
120
121
  return merged
@@ -191,6 +192,7 @@ function buildSettings(persisted?: Partial<AppSettings>): AppSettings {
191
192
  : DEFAULTS.chatFontSize,
192
193
  workDetail: saved.workDetail === 'concise' ? 'concise' : 'detailed',
193
194
  autoCollapseWork: saved.autoCollapseWork !== false,
195
+ aiSessionTitles: saved.aiSessionTitles !== false,
194
196
  }
195
197
  }
196
198
 
@@ -219,6 +221,7 @@ function persistedPatch(patch: Partial<AppSettings>): Partial<AppSettings> {
219
221
  'chatFontSize',
220
222
  'workDetail',
221
223
  'autoCollapseWork',
224
+ 'aiSessionTitles',
222
225
  ]
223
226
  for (const key of keys) {
224
227
  if (key in patch) out[key] = patch[key]
package/src/store/ui.ts CHANGED
@@ -3,9 +3,21 @@ import { create } from 'zustand'
3
3
  interface RuntimeState {
4
4
  streaming: Record<string, boolean>
5
5
  setStreaming: (sessionId: string, active: boolean) => void
6
+ /** Sessions whose title the AI is writing right now. */
7
+ titling: Record<string, boolean>
8
+ setTitling: (sessionId: string, active: boolean) => void
6
9
  }
7
10
 
8
11
  export const useRuntime = create<RuntimeState>()((set) => ({
12
+ titling: {},
13
+ setTitling: (sessionId, active) =>
14
+ set((state) => {
15
+ if (Boolean(state.titling[sessionId]) === active) return state
16
+ const titling = { ...state.titling }
17
+ if (active) titling[sessionId] = true
18
+ else delete titling[sessionId]
19
+ return { titling }
20
+ }),
9
21
  streaming: {},
10
22
  setStreaming: (sessionId, active) =>
11
23
  set((state) => {
@@ -51,6 +63,7 @@ interface UiState {
51
63
  | 'search'
52
64
  | 'skills'
53
65
  | 'plugins'
66
+ | 'mcp'
54
67
  | 'deploy'
55
68
  | 'appearance'
56
69
  | 'about'
@@ -5,6 +5,7 @@ import {
5
5
  createWorkspaceEntry,
6
6
  deleteWorkspaceEntry,
7
7
  forgetWorkspace as forgetWorkspaceInDaemon,
8
+ removeWorkspaceFromList,
8
9
  getProjectInstructions,
9
10
  getWorkspaceTree,
10
11
  gitSummary as fetchGitSummary,
@@ -68,6 +69,7 @@ interface WorkspaceStore {
68
69
  deleteEntry: (path: string) => Promise<void>
69
70
  addWorkspace: (path: string) => Promise<void>
70
71
  forgetWorkspace: () => Promise<void>
72
+ removeWorkspace: (path: string) => Promise<void>
71
73
  loadGit: () => Promise<void>
72
74
  setActiveFile: (path: string | null) => void
73
75
  }
@@ -274,6 +276,30 @@ export const useWorkspace = create<WorkspaceStore>()((set, get) => ({
274
276
  })
275
277
  },
276
278
 
279
+ removeWorkspace: async (path) => {
280
+ const wasActive = get().info.root === path
281
+ if (wasActive && get().dirty) {
282
+ const saved = await get().saveFile()
283
+ if (!saved) return
284
+ }
285
+ const info = await removeWorkspaceFromList(path)
286
+ if (!wasActive) {
287
+ set({ info })
288
+ return
289
+ }
290
+ set({
291
+ info,
292
+ root: '',
293
+ entries: [],
294
+ activeFile: null,
295
+ file: null,
296
+ content: '',
297
+ dirty: false,
298
+ git: EMPTY_GIT,
299
+ instructions: { file: '', content: '', truncated: false },
300
+ })
301
+ },
302
+
277
303
  loadGit: async () => {
278
304
  if (!get().info.available) return
279
305
  set({ gitLoading: true })
package/src/types.ts CHANGED
@@ -87,7 +87,7 @@ export interface SecretsSummary {
87
87
 
88
88
  export type AgentMode = 'build' | 'plan'
89
89
 
90
- export type ToolName =
90
+ export type BuiltinToolName =
91
91
  | 'shell'
92
92
  | 'read_file'
93
93
  | 'list_files'
@@ -100,6 +100,11 @@ export type ToolName =
100
100
  | 'git'
101
101
  | 'subagent'
102
102
 
103
+ /** MCP tools are exposed to the model as mcp__<server>__<tool>. */
104
+ export type McpToolName = `mcp__${string}`
105
+
106
+ export type ToolName = BuiltinToolName | McpToolName
107
+
103
108
  export interface ToolSetting {
104
109
  enabled: boolean
105
110
  approval: 'auto' | 'ask'
@@ -126,7 +131,7 @@ export interface AppSettings {
126
131
  systemPrompt: string
127
132
  providers: Record<string, ProviderCredentials>
128
133
  searchProvider: SearchProvider
129
- tools: Record<ToolName, ToolSetting>
134
+ tools: Record<BuiltinToolName, ToolSetting>
130
135
  skills: Skill[]
131
136
  theme: ThemeId
132
137
  showTokenEstimate: boolean
@@ -134,6 +139,8 @@ export interface AppSettings {
134
139
  chatFontSize: number
135
140
  workDetail: 'concise' | 'detailed'
136
141
  autoCollapseWork: boolean
142
+ /** Let the model name a session after its first answer. */
143
+ aiSessionTitles: boolean
137
144
  }
138
145
 
139
146
  export interface Attachment {
@@ -187,6 +194,14 @@ export interface AssistantMessage {
187
194
  round: number
188
195
  }
189
196
 
197
+ /** Line-level change report for a file edit: +added, −removed and where it started (1-based). */
198
+ export interface FileDiff {
199
+ added: number
200
+ removed: number
201
+ line?: number
202
+ column?: number
203
+ }
204
+
190
205
  export interface ToolMessage {
191
206
  id: string
192
207
  role: 'tool'
@@ -194,6 +209,7 @@ export interface ToolMessage {
194
209
  status: ToolRunStatus
195
210
  result?: string
196
211
  durationMs?: number
212
+ diff?: FileDiff
197
213
  createdAt: number
198
214
  round: number
199
215
  }
@@ -209,6 +225,39 @@ export interface ChatSession {
209
225
  provider?: ProviderId
210
226
  model?: string
211
227
  mode?: AgentMode
228
+ /** Workspace folder the session was started in. */
229
+ workspace?: string
230
+ /** Who last set the title; only 'auto' titles may be replaced by the AI. */
231
+ titleSource?: 'auto' | 'ai' | 'user'
232
+ }
233
+
234
+ export type McpStatus = 'disabled' | 'disconnected' | 'connecting' | 'connected' | 'error'
235
+
236
+ export interface McpTool {
237
+ name: string
238
+ fn: McpToolName
239
+ description: string
240
+ inputSchema: Record<string, unknown>
241
+ readOnly: boolean
242
+ }
243
+
244
+ export interface McpServer {
245
+ id: string
246
+ name: string
247
+ transport: 'stdio' | 'http'
248
+ enabled: boolean
249
+ approval: 'auto' | 'ask'
250
+ disabledTools: string[]
251
+ status: McpStatus
252
+ error: string
253
+ serverInfo: { name?: string; version?: string } | null
254
+ connectedAt: number | null
255
+ tools: McpTool[]
256
+ command?: string
257
+ args?: string[]
258
+ env?: Record<string, string>
259
+ url?: string
260
+ headers?: Record<string, string>
212
261
  }
213
262
 
214
263
  export interface Usage {
@@ -1 +1 @@
1
- {"root":["./src/App.tsx","./src/main.tsx","./src/types.ts","./src/vite-env.d.ts","./src/agent/approval.ts","./src/agent/compact.ts","./src/agent/index.ts","./src/agent/model.ts","./src/agent/prompt.ts","./src/agent/queue.ts","./src/agent/subagent.ts","./src/agent/tools.ts","./src/agent/adapters/anthropic.ts","./src/agent/adapters/gemini.ts","./src/agent/adapters/openai-responses.ts","./src/agent/adapters/openai.ts","./src/agent/adapters/shared.ts","./src/components/ChatView.tsx","./src/components/CommandPalette.tsx","./src/components/Composer.tsx","./src/components/ContextBar.tsx","./src/components/DeployModal.tsx","./src/components/ErrorBoundary.tsx","./src/components/HomeDashboard.tsx","./src/components/Logo.tsx","./src/components/Markdown.tsx","./src/components/MessageItem.tsx","./src/components/ModelPicker.tsx","./src/components/PixleSol.tsx","./src/components/PluginBuilder.tsx","./src/components/PluginManager.tsx","./src/components/PreviewPane.tsx","./src/components/SettingsModal.tsx","./src/components/Sidebar.tsx","./src/components/Splash.tsx","./src/components/ToolCallCard.tsx","./src/components/TopBar.tsx","./src/components/TrajectoryView.tsx","./src/components/WorkspacePanel.tsx","./src/components/ui.tsx","./src/core/kernel.ts","./src/core/types.ts","./src/core/plugins/tools/fs.ts","./src/core/plugins/tools/git.ts","./src/core/plugins/tools/grep.ts","./src/core/plugins/tools/shell.ts","./src/core/plugins/tools/subagent.ts","./src/core/plugins/tools/web.ts","./src/core/services/agent-loop.ts","./src/core/services/approval.ts","./src/core/services/compaction.ts","./src/core/services/llm.ts","./src/core/services/sessions.ts","./src/core/services/subagents.ts","./src/core/services/system-prompt.ts","./src/core/services/tools.ts","./src/core/services/ui.ts","./src/data/providers.ts","./src/data/skills.ts","./src/lib/boot.ts","./src/lib/context.ts","./src/lib/conversation.ts","./src/lib/daemon.ts","./src/lib/hooks.ts","./src/lib/permissions.ts","./src/lib/pixlesol.ts","./src/lib/plugin-folder.ts","./src/lib/reasoning.ts","./src/lib/sse.ts","./src/lib/themes.ts","./src/lib/usage.ts","./src/lib/utils.ts","./src/plugins/api.ts","./src/plugins/bridge.d.mts","./src/plugins/index.ts","./src/plugins/preview.ts","./src/plugins/runtime.ts","./src/plugins/types.ts","./src/store/chats.ts","./src/store/models.ts","./src/store/settings.ts","./src/store/ui.ts","./src/store/workspace.ts"],"version":"5.9.3"}
1
+ {"root":["./src/App.tsx","./src/main.tsx","./src/types.ts","./src/vite-env.d.ts","./src/agent/approval.ts","./src/agent/compact.ts","./src/agent/index.ts","./src/agent/model.ts","./src/agent/prompt.ts","./src/agent/queue.ts","./src/agent/subagent.ts","./src/agent/tools.ts","./src/agent/adapters/anthropic.ts","./src/agent/adapters/gemini.ts","./src/agent/adapters/openai-responses.ts","./src/agent/adapters/openai.ts","./src/agent/adapters/shared.ts","./src/components/ChatView.tsx","./src/components/CommandPalette.tsx","./src/components/Composer.tsx","./src/components/ContextBar.tsx","./src/components/DeployModal.tsx","./src/components/DiffView.tsx","./src/components/ErrorBoundary.tsx","./src/components/HomeDashboard.tsx","./src/components/Logo.tsx","./src/components/Markdown.tsx","./src/components/McpTab.tsx","./src/components/MessageItem.tsx","./src/components/ModelDeck.tsx","./src/components/PixleSol.tsx","./src/components/PluginBuilder.tsx","./src/components/PluginManager.tsx","./src/components/PreviewPane.tsx","./src/components/SessionsTab.tsx","./src/components/SettingsModal.tsx","./src/components/Sidebar.tsx","./src/components/Splash.tsx","./src/components/ToolCallCard.tsx","./src/components/TopBar.tsx","./src/components/TrajectoryView.tsx","./src/components/WorkspacePanel.tsx","./src/components/ui.tsx","./src/core/kernel.ts","./src/core/mcp-tools.ts","./src/core/types.ts","./src/core/plugins/tools/fs.ts","./src/core/plugins/tools/git.ts","./src/core/plugins/tools/grep.ts","./src/core/plugins/tools/shell.ts","./src/core/plugins/tools/subagent.ts","./src/core/plugins/tools/web.ts","./src/core/services/agent-loop.ts","./src/core/services/approval.ts","./src/core/services/compaction.ts","./src/core/services/llm.ts","./src/core/services/sessions.ts","./src/core/services/subagents.ts","./src/core/services/system-prompt.ts","./src/core/services/titles.ts","./src/core/services/tools.ts","./src/core/services/ui.ts","./src/data/providers.ts","./src/data/skills.ts","./src/lib/boot.ts","./src/lib/context.ts","./src/lib/conversation.ts","./src/lib/daemon.ts","./src/lib/diff.ts","./src/lib/hooks.ts","./src/lib/permissions.ts","./src/lib/pixlesol.ts","./src/lib/plugin-folder.ts","./src/lib/reasoning.ts","./src/lib/sse.ts","./src/lib/themes.ts","./src/lib/usage.ts","./src/lib/utils.ts","./src/plugins/api.ts","./src/plugins/bridge.d.mts","./src/plugins/index.ts","./src/plugins/preview.ts","./src/plugins/runtime.ts","./src/plugins/types.ts","./src/store/chats.ts","./src/store/mcp.ts","./src/store/models.ts","./src/store/settings.ts","./src/store/ui.ts","./src/store/workspace.ts"],"version":"5.9.3"}
@@ -1 +0,0 @@
1
- *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Geist,Inter,system-ui,-apple-system,Segoe UI,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}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;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:Geist Mono,JetBrains Mono,ui-monospace,SFMono-Regular,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root,[data-theme=light]{--canvas: 248 248 246;--panel: 255 255 255;--raised: 240 240 237;--line: 232 232 228;--ink: 23 23 21;--muted: 98 98 93;--faint: 148 148 141;--accent: 217 119 6;--accent-soft: 254 244 224;--on-accent: 255 255 255;--success: 22 128 74;--warning: 180 100 8;--danger: 207 56 48;--syn-keyword: 124 58 237;--syn-string: 21 128 61;--syn-number: 194 85 8;--syn-title: 37 99 235;--syn-attr: 14 116 144;--chat-font-size: 15px;color-scheme:light}[data-theme=dark]{--canvas: 15 15 14;--panel: 20 20 19;--raised: 33 33 31;--line: 42 42 39;--ink: 237 237 233;--muted: 160 160 153;--faint: 112 112 106;--accent: 245 158 11;--accent-soft: 46 34 12;--on-accent: 26 17 3;--success: 74 205 130;--warning: 245 180 70;--danger: 248 113 104;--syn-keyword: 196 160 255;--syn-string: 130 218 160;--syn-number: 244 184 110;--syn-title: 140 184 255;--syn-attr: 120 214 226;--chat-font-size: 15px;color-scheme:dark}[data-theme=night-owl]{--canvas: 1 17 30;--panel: 1 22 39;--raised: 11 38 60;--line: 22 55 82;--ink: 214 222 235;--muted: 141 168 197;--faint: 95 122 153;--accent: 130 170 255;--accent-soft: 16 48 77;--on-accent: 1 22 39;--success: 34 210 156;--warning: 236 196 141;--danger: 239 83 80;--syn-keyword: 197 147 249;--syn-string: 144 209 148;--syn-number: 247 190 116;--syn-title: 130 170 255;--syn-attr: 33 193 220;color-scheme:dark}[data-theme=claude-code]{--canvas: 30 29 27;--panel: 38 37 34;--raised: 49 48 44;--line: 62 61 56;--ink: 232 230 224;--muted: 175 171 162;--faint: 129 126 118;--accent: 217 119 87;--accent-soft: 62 45 38;--on-accent: 28 22 18;--success: 143 191 140;--warning: 222 178 112;--danger: 224 122 112;--syn-keyword: 213 145 122;--syn-string: 143 187 137;--syn-number: 221 176 116;--syn-title: 158 184 222;--syn-attr: 135 189 191;color-scheme:dark}[data-theme=flame]{--canvas: 16 11 8;--panel: 22 15 11;--raised: 36 25 18;--line: 56 38 27;--ink: 250 238 224;--muted: 190 160 138;--faint: 134 106 88;--accent: 255 138 30;--accent-soft: 58 32 14;--on-accent: 26 12 4;--success: 146 206 138;--warning: 250 200 100;--danger: 255 106 92;--syn-keyword: 255 150 90;--syn-string: 170 210 138;--syn-number: 250 194 108;--syn-title: 250 176 128;--syn-attr: 168 200 224;color-scheme:dark}*{border-color:rgb(var(--line))}html,body,#root{height:100%}body{--tw-bg-opacity: 1;background-color:rgb(var(--panel) / var(--tw-bg-opacity, 1));font-family:Geist,Inter,system-ui,-apple-system,Segoe UI,sans-serif;--tw-text-opacity: 1;color:rgb(var(--ink) / var(--tw-text-opacity, 1));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-feature-settings:"ss01" 1,"cv11" 1;letter-spacing:-.003em;text-rendering:optimizeLegibility;overscroll-behavior:none}::-moz-selection{background:rgb(var(--accent) / .22)}::selection{background:rgb(var(--accent) / .22)}:focus-visible{outline:2px solid rgb(var(--accent) / .6);outline-offset:2px;border-radius:6px}button,input,textarea,select{font:inherit}button:not(:disabled){cursor:pointer}input::-moz-placeholder,textarea::-moz-placeholder{color:rgb(var(--faint))}input::placeholder,textarea::placeholder{color:rgb(var(--faint))}.icon-button{display:inline-flex;height:2rem;width:2rem;flex-shrink:0;align-items:center;justify-content:center;border-radius:.5rem;--tw-text-opacity: 1;color:rgb(var(--muted) / var(--tw-text-opacity, 1));transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s;transition-timing-function:cubic-bezier(.16,1,.3,1)}.icon-button:hover{--tw-bg-opacity: 1;background-color:rgb(var(--raised) / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(var(--ink) / var(--tw-text-opacity, 1))}.icon-button:active{--tw-scale-x: .9;--tw-scale-y: .9;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.icon-button:disabled{pointer-events:none;opacity:.4}.chip{display:inline-flex;height:2rem;align-items:center;gap:.375rem;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(var(--line) / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(var(--panel) / var(--tw-bg-opacity, 1));padding-left:.75rem;padding-right:.75rem;font-size:12.5px;font-weight:500;--tw-text-opacity: 1;color:rgb(var(--muted) / var(--tw-text-opacity, 1));transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.chip:hover{border-color:rgb(var(--faint) / .4);background-color:rgb(var(--raised) / .6);--tw-text-opacity: 1;color:rgb(var(--ink) / var(--tw-text-opacity, 1))}.chip:active{--tw-scale-x: .97;--tw-scale-y: .97;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.chip-active{border-color:rgb(var(--accent) / .3);--tw-bg-opacity: 1;background-color:rgb(var(--accent-soft) / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(var(--accent) / var(--tw-text-opacity, 1))}.chip-active:hover{border-color:rgb(var(--accent) / .5);--tw-text-opacity: 1;color:rgb(var(--accent) / var(--tw-text-opacity, 1))}.eyebrow{font-size:10.5px;font-weight:500;text-transform:uppercase;letter-spacing:.14em;--tw-text-opacity: 1;color:rgb(var(--faint) / var(--tw-text-opacity, 1))}.sidebar-item{position:relative;display:flex;height:2rem;width:100%;align-items:center;gap:.625rem;border-radius:.5rem;padding-left:.625rem;padding-right:.625rem;text-align:left;font-size:13px;--tw-text-opacity: 1;color:rgb(var(--muted) / var(--tw-text-opacity, 1));transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.sidebar-item:hover{background-color:rgb(var(--raised) / .8);--tw-text-opacity: 1;color:rgb(var(--ink) / var(--tw-text-opacity, 1))}.sidebar-item-active{--tw-bg-opacity: 1;background-color:rgb(var(--raised) / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(var(--ink) / var(--tw-text-opacity, 1))}.sidebar-item-active:hover{--tw-bg-opacity: 1;background-color:rgb(var(--raised) / var(--tw-bg-opacity, 1))}.sidebar-item-active:before{content:"";position:absolute;left:0;top:8px;bottom:8px;width:2px;border-radius:2px;background:rgb(var(--accent));animation:scalein .3s cubic-bezier(.16,1,.3,1) both}.nav-item{display:flex;height:2rem;width:100%;align-items:center;gap:.625rem;border-radius:.5rem;padding-left:.625rem;padding-right:.625rem;text-align:left;font-size:13px;--tw-text-opacity: 1;color:rgb(var(--muted) / var(--tw-text-opacity, 1));transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.nav-item:hover{background-color:rgb(var(--raised) / .8);--tw-text-opacity: 1;color:rgb(var(--ink) / var(--tw-text-opacity, 1))}.nav-item:active{--tw-scale-x: .99;--tw-scale-y: .99;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.surface-lift{background:rgb(var(--panel))}.chat-text{font-size:var(--chat-font-size, 15px)}.settings-row{display:flex;flex-direction:column;gap:.5rem;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(var(--line) / var(--tw-border-opacity, 1));padding-top:1rem;padding-bottom:1rem}.settings-row:last-child{border-bottom-width:0px}@media(min-width:640px){.settings-row{flex-direction:row;align-items:center;justify-content:space-between;gap:1.5rem}}.settings-label{font-size:13px;font-weight:500;--tw-text-opacity: 1;color:rgb(var(--ink) / var(--tw-text-opacity, 1))}.settings-hint{margin-top:.125rem;font-size:12px;line-height:1.625;--tw-text-opacity: 1;color:rgb(var(--muted) / var(--tw-text-opacity, 1))}.settings-select{height:2.25rem;flex-shrink:0;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(var(--line) / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(var(--panel) / var(--tw-bg-opacity, 1));padding-left:.625rem;padding-right:.625rem;font-size:12.5px;--tw-text-opacity: 1;color:rgb(var(--ink) / var(--tw-text-opacity, 1));outline:2px solid transparent;outline-offset:2px;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.settings-select:focus{border-color:rgb(var(--accent) / .6)}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.inset-y-0{top:0;bottom:0}.-right-1\.5{right:-.375rem}.-top-1\.5{top:-.375rem}.-top-\[34px\]{top:-34px}.bottom-3{bottom:.75rem}.bottom-4{bottom:1rem}.bottom-56{bottom:14rem}.bottom-\[calc\(100\%\+8px\)\]{bottom:calc(100% + 8px)}.left-0{left:0}.left-1\/2{left:50%}.left-2{left:.5rem}.left-2\.5{left:.625rem}.left-\[13px\]{left:13px}.right-0{right:0}.right-1{right:.25rem}.right-1\.5{right:.375rem}.right-4{right:1rem}.top-1\/2{top:50%}.top-3{top:.75rem}.top-\[1px\]{top:1px}.isolate{isolation:isolate}.-z-10{z-index:-10}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.z-\[100\]{z-index:100}.z-\[60\]{z-index:60}.z-\[70\]{z-index:70}.z-\[80\]{z-index:80}.z-\[90\]{z-index:90}.m-auto{margin:auto}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.-mr-1{margin-right:-.25rem}.-mt-1{margin-top:-.25rem}.-mt-2{margin-top:-.5rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-2\.5{margin-bottom:.625rem}.mb-3{margin-bottom:.75rem}.mb-5{margin-bottom:1.25rem}.ml-2{margin-left:.5rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-3{margin-right:.75rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-10{margin-top:2.5rem}.mt-12{margin-top:3rem}.mt-2{margin-top:.5rem}.mt-2\.5{margin-top:.625rem}.mt-3{margin-top:.75rem}.mt-3\.5{margin-top:.875rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-9{margin-top:2.25rem}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.line-clamp-4{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:4}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-52{height:13rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[11px\]{height:11px}.h-\[16px\]{height:16px}.h-\[18px\]{height:18px}.h-\[22px\]{height:22px}.h-\[2px\]{height:2px}.h-\[420px\]{height:420px}.h-\[92dvh\]{height:92dvh}.h-dvh{height:100dvh}.h-full{height:100%}.max-h-24{max-height:6rem}.max-h-40{max-height:10rem}.max-h-44{max-height:11rem}.max-h-48{max-height:12rem}.max-h-52{max-height:13rem}.max-h-72{max-height:18rem}.max-h-\[32dvh\]{max-height:32dvh}.max-h-\[92dvh\]{max-height:92dvh}.max-h-\[min\(72dvh\,560px\)\]{max-height:min(72dvh,560px)}.min-h-0{min-height:0px}.min-h-\[180px\]{min-height:180px}.min-h-\[220px\]{min-height:220px}.min-h-\[22px\]{min-height:22px}.min-h-\[28px\]{min-height:28px}.min-h-\[320px\]{min-height:320px}.min-h-\[92px\]{min-height:92px}.min-h-full{min-height:100%}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[11px\]{width:11px}.w-\[16px\]{width:16px}.w-\[184px\]{width:184px}.w-\[18px\]{width:18px}.w-\[200px\]{width:200px}.w-\[264px\]{width:264px}.w-\[290px\]{width:290px}.w-\[38px\]{width:38px}.w-\[84px\]{width:84px}.w-\[min\(92vw\,440px\)\]{width:min(92vw,440px)}.w-\[min\(94vw\,360px\)\]{width:min(94vw,360px)}.w-\[min\(96vw\,440px\)\]{width:min(96vw,440px)}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.w-px{width:1px}.min-w-0{min-width:0px}.max-w-\[120px\]{max-width:120px}.max-w-\[140px\]{max-width:140px}.max-w-\[170px\]{max-width:170px}.max-w-\[180px\]{max-width:180px}.max-w-\[190px\]{max-width:190px}.max-w-\[220px\]{max-width:220px}.max-w-\[230px\]{max-width:230px}.max-w-\[260px\]{max-width:260px}.max-w-\[280px\]{max-width:280px}.max-w-\[300px\]{max-width:300px}.max-w-\[400px\]{max-width:400px}.max-w-\[460px\]{max-width:460px}.max-w-\[520px\]{max-width:520px}.max-w-\[560px\]{max-width:560px}.max-w-\[620px\]{max-width:620px}.max-w-\[720px\]{max-width:720px}.max-w-\[760px\]{max-width:760px}.max-w-\[800px\]{max-width:800px}.max-w-\[88\%\]{max-width:88%}.max-w-full{max-width:100%}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-full{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[19px\]{--tw-translate-x: 19px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[3px\]{--tw-translate-x: 3px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes blurin{0%{opacity:0;filter:blur(8px);transform:translateY(6px)}to{opacity:1;filter:blur(0);transform:translateY(0)}}.animate-blurin{animation:blurin .7s cubic-bezier(.16,1,.3,1) both}.animate-bob{animation:bob 1.6s ease-in-out infinite}@keyframes bob{0%,to{transform:translateY(0)}50%{transform:translateY(-2px)}}.animate-bob-fast{animation:bob .8s ease-in-out infinite}@keyframes bounce{0%,to{transform:translateY(-25%);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;animation-timing-function:cubic-bezier(0,0,.2,1)}}.animate-bounce{animation:bounce 1s infinite}@keyframes breathe{0%,to{transform:scale(1);opacity:1}50%{transform:scale(.8);opacity:.6}}.animate-breathe{animation:breathe 1.6s ease-in-out infinite}@keyframes fade{0%{opacity:0}to{opacity:1}}.animate-fade{animation:fade .25s ease-out both}.animate-float{animation:float 2.4s ease-in-out infinite}@keyframes float{0%,to{transform:translateY(0)}50%{transform:translateY(-3px)}}.animate-float-slow{animation:float 3.4s ease-in-out infinite}@keyframes ping{75%,to{transform:scale(2);opacity:0}0%{transform:scale(1);opacity:.5}80%,to{transform:scale(2.2);opacity:0}}.animate-ping{animation:ping 1.8s cubic-bezier(0,0,.2,1) infinite}@keyframes pop{0%,to{transform:scale(1)}50%{transform:scale(1.1)}}.animate-pop{animation:pop 1.4s ease-in-out infinite}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes rise{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.animate-rise{animation:rise .6s cubic-bezier(.16,1,.3,1) both}@keyframes scalein{0%{opacity:0;transform:scale(.96)}to{opacity:1;transform:scale(1)}}.animate-scalein{animation:scalein .28s cubic-bezier(.16,1,.3,1) both}@keyframes shake{0%,to{transform:translate(0)}25%{transform:translate(-1.5px)}75%{transform:translate(1.5px)}}.animate-shake{animation:shake .35s ease-in-out infinite}@keyframes slideleft{0%{opacity:0;transform:translate(-10px)}to{opacity:1;transform:translate(0)}}.animate-slideleft{animation:slideleft .4s cubic-bezier(.16,1,.3,1) both}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.animate-spin-slow{animation:spinslow 18s linear infinite}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.resize-y{resize:vertical}.resize{resize:both}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-rows-7{grid-template-rows:repeat(7,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-3\.5{gap:.875rem}.gap-4{gap:1rem}.gap-\[3px\]{gap:3px}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.625rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.self-start{align-self:flex-start}.self-center{align-self:center}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-\[2px\]{border-radius:2px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.rounded-t-2xl{border-top-left-radius:1rem;border-top-right-radius:1rem}.rounded-br-md{border-bottom-right-radius:.375rem}.border{border-width:1px}.border-0{border-width:0px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-accent{--tw-border-opacity: 1;border-color:rgb(var(--accent) / var(--tw-border-opacity, 1))}.border-accent\/30{border-color:rgb(var(--accent) / .3)}.border-accent\/35{border-color:rgb(var(--accent) / .35)}.border-accent\/40{border-color:rgb(var(--accent) / .4)}.border-accent\/45{border-color:rgb(var(--accent) / .45)}.border-accent\/50{border-color:rgb(var(--accent) / .5)}.border-accent\/60{border-color:rgb(var(--accent) / .6)}.border-current{border-color:currentColor}.border-danger\/20{border-color:rgb(var(--danger) / .2)}.border-danger\/25{border-color:rgb(var(--danger) / .25)}.border-line{--tw-border-opacity: 1;border-color:rgb(var(--line) / var(--tw-border-opacity, 1))}.border-line\/60{border-color:rgb(var(--line) / .6)}.border-line\/70{border-color:rgb(var(--line) / .7)}.border-line\/80{border-color:rgb(var(--line) / .8)}.border-success\/25{border-color:rgb(var(--success) / .25)}.border-transparent{border-color:transparent}.border-warning\/25{border-color:rgb(var(--warning) / .25)}.border-warning\/30{border-color:rgb(var(--warning) / .3)}.border-warning\/40{border-color:rgb(var(--warning) / .4)}.border-t-transparent{border-top-color:transparent}.bg-\[\#011627\]{--tw-bg-opacity: 1;background-color:rgb(1 22 39 / var(--tw-bg-opacity, 1))}.bg-\[\#09090b\]{--tw-bg-opacity: 1;background-color:rgb(9 9 11 / var(--tw-bg-opacity, 1))}.bg-\[\#130d0c\]{--tw-bg-opacity: 1;background-color:rgb(19 13 12 / var(--tw-bg-opacity, 1))}.bg-\[\#1a3e5a\]{--tw-bg-opacity: 1;background-color:rgb(26 62 90 / var(--tw-bg-opacity, 1))}.bg-\[\#262624\]{--tw-bg-opacity: 1;background-color:rgb(38 38 36 / var(--tw-bg-opacity, 1))}.bg-\[\#2a2a31\]{--tw-bg-opacity: 1;background-color:rgb(42 42 49 / var(--tw-bg-opacity, 1))}.bg-\[\#3e2621\]{--tw-bg-opacity: 1;background-color:rgb(62 38 33 / var(--tw-bg-opacity, 1))}.bg-\[\#42423e\]{--tw-bg-opacity: 1;background-color:rgb(66 66 62 / var(--tw-bg-opacity, 1))}.bg-\[\#8a8a92\]{--tw-bg-opacity: 1;background-color:rgb(138 138 146 / var(--tw-bg-opacity, 1))}.bg-\[\#e2e2e5\]{--tw-bg-opacity: 1;background-color:rgb(226 226 229 / var(--tw-bg-opacity, 1))}.bg-\[\#fcfcfc\]{--tw-bg-opacity: 1;background-color:rgb(252 252 252 / var(--tw-bg-opacity, 1))}.bg-accent{--tw-bg-opacity: 1;background-color:rgb(var(--accent) / var(--tw-bg-opacity, 1))}.bg-accent-soft{--tw-bg-opacity: 1;background-color:rgb(var(--accent-soft) / var(--tw-bg-opacity, 1))}.bg-accent-soft\/20{background-color:rgb(var(--accent-soft) / .2)}.bg-accent-soft\/40{background-color:rgb(var(--accent-soft) / .4)}.bg-accent-soft\/45{background-color:rgb(var(--accent-soft) / .45)}.bg-accent\/10{background-color:rgb(var(--accent) / .1)}.bg-accent\/20{background-color:rgb(var(--accent) / .2)}.bg-accent\/35{background-color:rgb(var(--accent) / .35)}.bg-accent\/55{background-color:rgb(var(--accent) / .55)}.bg-accent\/70{background-color:rgb(var(--accent) / .7)}.bg-accent\/80{background-color:rgb(var(--accent) / .8)}.bg-black\/30{background-color:#0000004d}.bg-black\/35{background-color:#00000059}.bg-canvas{--tw-bg-opacity: 1;background-color:rgb(var(--canvas) / var(--tw-bg-opacity, 1))}.bg-canvas\/40{background-color:rgb(var(--canvas) / .4)}.bg-canvas\/95{background-color:rgb(var(--canvas) / .95)}.bg-current{background-color:currentColor}.bg-danger{--tw-bg-opacity: 1;background-color:rgb(var(--danger) / var(--tw-bg-opacity, 1))}.bg-danger\/10{background-color:rgb(var(--danger) / .1)}.bg-danger\/\[0\.02\]{background-color:rgb(var(--danger) / .02)}.bg-danger\/\[0\.045\]{background-color:rgb(var(--danger) / .045)}.bg-danger\/\[0\.04\]{background-color:rgb(var(--danger) / .04)}.bg-danger\/\[0\.05\]{background-color:rgb(var(--danger) / .05)}.bg-faint{--tw-bg-opacity: 1;background-color:rgb(var(--faint) / var(--tw-bg-opacity, 1))}.bg-ink{--tw-bg-opacity: 1;background-color:rgb(var(--ink) / var(--tw-bg-opacity, 1))}.bg-ink\/20{background-color:rgb(var(--ink) / .2)}.bg-line{--tw-bg-opacity: 1;background-color:rgb(var(--line) / var(--tw-bg-opacity, 1))}.bg-panel{--tw-bg-opacity: 1;background-color:rgb(var(--panel) / var(--tw-bg-opacity, 1))}.bg-panel\/60{background-color:rgb(var(--panel) / .6)}.bg-panel\/80{background-color:rgb(var(--panel) / .8)}.bg-panel\/95{background-color:rgb(var(--panel) / .95)}.bg-raised{--tw-bg-opacity: 1;background-color:rgb(var(--raised) / var(--tw-bg-opacity, 1))}.bg-raised\/20{background-color:rgb(var(--raised) / .2)}.bg-raised\/25{background-color:rgb(var(--raised) / .25)}.bg-raised\/30{background-color:rgb(var(--raised) / .3)}.bg-raised\/40{background-color:rgb(var(--raised) / .4)}.bg-raised\/50{background-color:rgb(var(--raised) / .5)}.bg-raised\/60{background-color:rgb(var(--raised) / .6)}.bg-raised\/70{background-color:rgb(var(--raised) / .7)}.bg-raised\/80{background-color:rgb(var(--raised) / .8)}.bg-success{--tw-bg-opacity: 1;background-color:rgb(var(--success) / var(--tw-bg-opacity, 1))}.bg-success\/\[0\.045\]{background-color:rgb(var(--success) / .045)}.bg-success\/\[0\.04\]{background-color:rgb(var(--success) / .04)}.bg-transparent{background-color:transparent}.bg-warning{--tw-bg-opacity: 1;background-color:rgb(var(--warning) / var(--tw-bg-opacity, 1))}.bg-warning\/10{background-color:rgb(var(--warning) / .1)}.bg-warning\/\[0\.045\]{background-color:rgb(var(--warning) / .045)}.bg-warning\/\[0\.04\]{background-color:rgb(var(--warning) / .04)}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.from-\[\#fcfcfc\]{--tw-gradient-from: #fcfcfc var(--tw-gradient-from-position);--tw-gradient-to: rgb(252 252 252 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-accent-soft{--tw-gradient-from: rgb(var(--accent-soft) / 1) var(--tw-gradient-from-position);--tw-gradient-to: rgb(var(--accent-soft) / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-\[\#09090b\]{--tw-gradient-to: #09090b var(--tw-gradient-to-position)}.to-panel{--tw-gradient-to: rgb(var(--panel) / 1) var(--tw-gradient-to-position)}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-3\.5{padding:.875rem}.p-5{padding:1.25rem}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-7{padding-top:1.75rem;padding-bottom:1.75rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-\[3px\]{padding-top:3px;padding-bottom:3px}.py-px{padding-top:1px;padding-bottom:1px}.pb-1{padding-bottom:.25rem}.pb-1\.5{padding-bottom:.375rem}.pb-12{padding-bottom:3rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-7{padding-left:1.75rem}.pl-9{padding-left:2.25rem}.pl-\[18px\]{padding-left:18px}.pl-\[19px\]{padding-left:19px}.pl-\[34px\]{padding-left:34px}.pr-1{padding-right:.25rem}.pr-1\.5{padding-right:.375rem}.pr-2{padding-right:.5rem}.pr-2\.5{padding-right:.625rem}.pr-8{padding-right:2rem}.pr-9{padding-right:2.25rem}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-1\.5{padding-top:.375rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-5{padding-top:1.25rem}.pt-7{padding-top:1.75rem}.pt-8{padding-top:2rem}.pt-\[10vh\]{padding-top:10vh}.text-left{text-align:left}.text-center{text-align:center}.font-display{font-family:Geist,Inter,system-ui,-apple-system,sans-serif}.font-mono{font-family:Geist Mono,JetBrains Mono,ui-monospace,SFMono-Regular,monospace}.font-sans{font-family:Geist,Inter,system-ui,-apple-system,Segoe UI,sans-serif}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[12px\]{font-size:12px}.text-\[13\.5px\]{font-size:13.5px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[15\.5px\]{font-size:15.5px}.text-\[15px\]{font-size:15px}.text-\[16px\]{font-size:16px}.text-\[18px\]{font-size:18px}.text-\[19px\]{font-size:19px}.text-\[20px\]{font-size:20px}.text-\[26px\]{font-size:26px}.text-\[28px\]{font-size:28px}.text-\[8\.5px\]{font-size:8.5px}.text-\[8px\]{font-size:8px}.text-\[9\.5px\]{font-size:9.5px}.text-\[9px\]{font-size:9px}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.normal-case{text-transform:none}.italic{font-style:italic}.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)}.leading-\[1\.65\]{line-height:1.65}.leading-\[1\.6\]{line-height:1.6}.leading-\[1\.75\]{line-height:1.75}.leading-\[1\.7\]{line-height:1.7}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.tracking-\[-0\.01em\]{letter-spacing:-.01em}.tracking-\[-0\.025em\]{letter-spacing:-.025em}.tracking-\[-0\.02em\]{letter-spacing:-.02em}.tracking-\[-0\.035em\]{letter-spacing:-.035em}.tracking-\[-0\.03em\]{letter-spacing:-.03em}.tracking-\[-0\.04em\]{letter-spacing:-.04em}.tracking-\[0\.01em\]{letter-spacing:.01em}.tracking-\[0\.08em\]{letter-spacing:.08em}.tracking-\[0\.12em\]{letter-spacing:.12em}.tracking-\[0\.13em\]{letter-spacing:.13em}.tracking-\[0\.14em\]{letter-spacing:.14em}.tracking-\[0\.1em\]{letter-spacing:.1em}.tracking-\[0\.22em\]{letter-spacing:.22em}.tracking-normal{letter-spacing:0em}.text-accent{--tw-text-opacity: 1;color:rgb(var(--accent) / var(--tw-text-opacity, 1))}.text-accent\/80{color:rgb(var(--accent) / .8)}.text-current{color:currentColor}.text-danger{--tw-text-opacity: 1;color:rgb(var(--danger) / var(--tw-text-opacity, 1))}.text-faint{--tw-text-opacity: 1;color:rgb(var(--faint) / var(--tw-text-opacity, 1))}.text-faint\/50{color:rgb(var(--faint) / .5)}.text-faint\/80{color:rgb(var(--faint) / .8)}.text-ink{--tw-text-opacity: 1;color:rgb(var(--ink) / var(--tw-text-opacity, 1))}.text-ink\/80{color:rgb(var(--ink) / .8)}.text-line{--tw-text-opacity: 1;color:rgb(var(--line) / var(--tw-text-opacity, 1))}.text-muted{--tw-text-opacity: 1;color:rgb(var(--muted) / var(--tw-text-opacity, 1))}.text-on-accent{--tw-text-opacity: 1;color:rgb(var(--on-accent) / var(--tw-text-opacity, 1))}.text-panel{--tw-text-opacity: 1;color:rgb(var(--panel) / var(--tw-text-opacity, 1))}.text-success{--tw-text-opacity: 1;color:rgb(var(--success) / var(--tw-text-opacity, 1))}.text-warning{--tw-text-opacity: 1;color:rgb(var(--warning) / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.decoration-ink\/30{text-decoration-color:rgb(var(--ink) / .3)}.underline-offset-\[3px\]{text-underline-offset:3px}.accent-\[rgb\(var\(--accent\)\)\]{accent-color:rgb(var(--accent))}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-45{opacity:.45}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow-\[0_1px_2px_rgba\(20\,22\,30\,0\.08\)\]{--tw-shadow: 0 1px 2px rgba(20,22,30,.08);--tw-shadow-colored: 0 1px 2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-composer{--tw-shadow: 0 1px 2px rgba(0,0,0,.04), 0 8px 28px -12px rgba(0,0,0,.12);--tw-shadow-colored: 0 1px 2px var(--tw-shadow-color), 0 8px 28px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-float{--tw-shadow: 0 24px 64px -20px rgba(0,0,0,.28), 0 0 0 1px rgb(var(--line));--tw-shadow-colored: 0 24px 64px -20px var(--tw-shadow-color), 0 0 0 1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-pill{--tw-shadow: 0 1px 2px rgba(0,0,0,.06);--tw-shadow-colored: 0 1px 2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-4{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-accent\/10{--tw-ring-color: rgb(var(--accent) / .1)}.ring-accent\/\[0\.03\]{--tw-ring-color: rgb(var(--accent) / .03)}.blur{--tw-blur: blur(8px);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)}.blur-2xl{--tw-blur: blur(40px);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)}.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-\[1px\]{--tw-backdrop-blur: blur(1px);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-blur-\[2px\]{--tw-backdrop-blur: blur(2px);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-blur-\[3px\]{--tw-backdrop-blur: blur(3px);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-blur-sm{--tw-backdrop-blur: blur(4px);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-blur-xl{--tw-backdrop-blur: blur(24px);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{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\]{transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.ease-out{transition-timing-function:cubic-bezier(.16,1,.3,1)}.ease-spring{transition-timing-function:cubic-bezier(.34,1.56,.64,1)}.\[animation-delay\:0\.8s\]{animation-delay:.8s}.\[animation-delay\:1\.2s\]{animation-delay:1.2s}.\[animation-delay\:120ms\]{animation-delay:.12s}.\[animation-delay\:160ms\]{animation-delay:.16s}.\[animation-delay\:1s\]{animation-delay:1s}.\[animation-delay\:320ms\]{animation-delay:.32s}.\[animation-delay\:420ms\]{animation-delay:.42s}.md{font-family:Geist,Inter,system-ui,-apple-system,Segoe UI,sans-serif;line-height:1.72;--tw-text-opacity: 1;color:rgb(var(--ink) / var(--tw-text-opacity, 1));font-size:var(--chat-font-size, 15px);font-feature-settings:"kern" 1,"liga" 1;word-break:break-word}.md p,.md li{text-wrap:pretty}.md h1,.md h2,.md h3,.md h4{text-wrap:balance}.md>:first-child{margin-top:0}.md>:last-child{margin-bottom:0}.md p{margin:.7em 0}.md h1,.md h2,.md h3,.md h4{font-weight:600;letter-spacing:-.02em;--tw-text-opacity: 1;color:rgb(var(--ink) / var(--tw-text-opacity, 1));margin:1.4em 0 .55em;line-height:1.3}.md h1,.md h2{font-weight:600}.md h1{font-size:1.45em}.md h2{font-size:1.22em}.md h3{font-weight:600;font-size:1.08em}.md h4{font-weight:600;font-size:1em}.md ul,.md ol{margin:.65em 0;padding-left:1.35em}.md ul{list-style:disc}.md ol{list-style:decimal}.md li{margin:.28em 0}.md li>p{margin:.25em 0}.md li::marker{color:rgb(var(--faint))}.md a{--tw-text-opacity: 1;color:rgb(var(--accent) / var(--tw-text-opacity, 1));text-decoration-line:underline;text-decoration-color:rgb(var(--accent) / .3);text-underline-offset:2px;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.md a:hover{text-decoration-color:rgb(var(--accent) / 1)}.md strong{font-weight:600;--tw-text-opacity: 1;color:rgb(var(--ink) / var(--tw-text-opacity, 1))}.md code{border-radius:5px;--tw-bg-opacity: 1;background-color:rgb(var(--raised) / var(--tw-bg-opacity, 1));padding:.12em .36em;font-family:Geist Mono,JetBrains Mono,ui-monospace,SFMono-Regular,monospace;font-size:.845em;--tw-text-opacity: 1;color:rgb(var(--ink) / var(--tw-text-opacity, 1))}.md pre code{background:transparent;padding:0;border-radius:0;font-size:inherit;color:inherit}.md blockquote{margin:.9em 0;border-left:2px solid rgb(var(--accent) / .35);padding:.15em 0 .15em .9em;color:rgb(var(--muted))}.md hr{margin:1.5em 0;border:0;border-top:1px solid rgb(var(--line))}.md table{margin:1em 0;width:100%;border-collapse:collapse;font-size:.9em}.md th,.md td{border:1px solid rgb(var(--line));padding:.45em .7em;text-align:left;vertical-align:top}.md th{background-color:rgb(var(--raised) / .7);font-weight:500}.md input[type=checkbox]{margin-right:.4em;accent-color:rgb(var(--accent))}.md img{max-width:100%;border-radius:10px;border:1px solid rgb(var(--line))}.code-shell{margin-top:1rem;margin-bottom:1rem;overflow:hidden;border-radius:.75rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(var(--line) / var(--tw-border-opacity, 1));background:rgb(var(--canvas))}.code-head{display:flex;height:2.25rem;align-items:center;justify-content:space-between;border-bottom-width:1px;border-color:rgb(var(--line) / .7);background-color:rgb(var(--raised) / .4);padding-left:.75rem;padding-right:.75rem}.code-lang{font-family:Geist Mono,JetBrains Mono,ui-monospace,SFMono-Regular,monospace;font-size:10.5px;letter-spacing:.025em;--tw-text-opacity: 1;color:rgb(var(--faint) / var(--tw-text-opacity, 1))}.code-pre{overflow-x:auto;padding:.875rem;font-family:Geist Mono,JetBrains Mono,ui-monospace,SFMono-Regular,monospace;font-size:12.5px;line-height:1.7;-moz-tab-size:2;-o-tab-size:2;tab-size:2}.code-pre code{background:transparent!important;padding:0!important;font-size:inherit!important;white-space:pre}.hljs{color:rgb(var(--ink));background:transparent}.hljs-comment,.hljs-quote{color:rgb(var(--faint));font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-literal,.hljs-type{color:rgb(var(--syn-keyword))}.hljs-string,.hljs-regexp,.hljs-addition{color:rgb(var(--syn-string))}.hljs-number,.hljs-symbol,.hljs-bullet{color:rgb(var(--syn-number))}.hljs-title,.hljs-section,.hljs-name,.hljs-selector-id,.hljs-selector-class{color:rgb(var(--syn-title))}.hljs-attr,.hljs-attribute,.hljs-variable,.hljs-template-variable,.hljs-property{color:rgb(var(--syn-attr))}.hljs-built_in,.hljs-class .hljs-title{color:rgb(var(--syn-title))}.hljs-meta,.hljs-deletion{color:rgb(var(--danger))}.thin-scroll{scrollbar-width:thin;scrollbar-color:rgb(var(--line)) transparent}.thin-scroll::-webkit-scrollbar{width:10px;height:10px}.thin-scroll::-webkit-scrollbar-track{background:transparent}.thin-scroll::-webkit-scrollbar-thumb{border:3px solid transparent;border-radius:999px;background-clip:content-box;background-color:rgb(var(--line))}.thin-scroll::-webkit-scrollbar-thumb:hover{background-color:rgb(var(--faint) / .6)}.hero-wash{background:radial-gradient(60% 50% at 50% 0%,rgb(var(--accent) / .07),transparent 70%)}.bg-dots{background-image:radial-gradient(rgb(var(--faint) / .28) 1px,transparent 1px);background-size:24px 24px;-webkit-mask-image:radial-gradient(70% 60% at 50% 30%,#000 10%,transparent 75%);mask-image:radial-gradient(70% 60% at 50% 30%,#000 10%,transparent 75%)}.ambient-blob{position:absolute;border-radius:9999px;filter:blur(64px);opacity:.35;pointer-events:none}.card-lift{transition:transform .3s cubic-bezier(.16,1,.3,1),box-shadow .3s ease,border-color .2s ease,background-color .2s ease}.card-lift:hover{transform:translateY(-2px);box-shadow:0 14px 32px -20px #0000004d;border-color:rgb(var(--faint) / .4)}@keyframes glow-pulse{0%,to{box-shadow:0 0 rgb(var(--accent) / .2)}50%{box-shadow:0 0 0 7px rgb(var(--accent) / 0)}}.composer-glow{animation:glow-pulse 1.9s ease-out infinite}.composer-shadow{box-shadow:0 1px 2px #0000000a,0 10px 30px -14px #00000024;transition:box-shadow .25s ease,border-color .25s ease}.composer-shadow:focus-within{border-color:rgb(var(--accent) / .45);box-shadow:0 0 0 4px rgb(var(--accent) / .08),0 12px 34px -14px #0000002e}.dark .composer-shadow{box-shadow:0 1px 1px #0006,0 16px 40px -16px #000000b3}.dark .composer-shadow:focus-within{box-shadow:0 0 0 4px rgb(var(--accent) / .1),0 16px 40px -16px #000000b3}.dark .card-lift:hover{box-shadow:0 14px 32px -18px #000c}.modal-panel{animation:modal-in .28s cubic-bezier(.16,1,.3,1) backwards}.modal-scrim{animation:fade .2s ease-out both}@keyframes modal-in{0%{opacity:0;transform:translateY(10px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.stagger>*{animation:rise .6s cubic-bezier(.16,1,.3,1) both}.stagger>*:nth-child(1){animation-delay:40ms}.stagger>*:nth-child(2){animation-delay:.11s}.stagger>*:nth-child(3){animation-delay:.18s}.stagger>*:nth-child(4){animation-delay:.25s}.stagger>*:nth-child(5){animation-delay:.32s}.stagger>*:nth-child(6){animation-delay:.39s}.text-solar{background:linear-gradient(100deg,rgb(var(--ink)) 20%,rgb(var(--accent)) 120%);-webkit-background-clip:text;background-clip:text;color:transparent}.loading-bar{position:relative;overflow:hidden;background:rgb(var(--line))}.loading-bar:after{content:"";position:absolute;inset:0;width:40%;border-radius:inherit;background:linear-gradient(90deg,transparent,rgb(var(--accent)),transparent);animation:sweep 1.4s cubic-bezier(.65,0,.35,1) infinite}.splash{position:fixed;inset:0;z-index:200;display:flex;align-items:center;justify-content:center;background:rgb(var(--panel));transition:opacity .5s ease,transform .5s cubic-bezier(.16,1,.3,1),filter .5s ease}.splash.is-leaving{opacity:0;transform:scale(1.03);filter:blur(6px);pointer-events:none}.splash-sun .ray{stroke-dasharray:8;stroke-dashoffset:8;animation:draw .5s cubic-bezier(.16,1,.3,1) forwards}.splash-sun .core{transform-origin:32px 32px;animation:core-in .7s cubic-bezier(.34,1.56,.64,1) both}.splash-sun .rays{transform-origin:32px 32px;animation:spinslow 14s linear infinite}.splash-word span{display:inline-block;opacity:0;animation:blurin .7s cubic-bezier(.16,1,.3,1) forwards}@keyframes draw{to{stroke-dashoffset:0}}@keyframes core-in{0%{transform:scale(0);opacity:0}to{transform:scale(1);opacity:1}}@keyframes spinslow{to{transform:rotate(360deg)}}.md.is-streaming>:last-child:after{content:"";display:inline-block;width:7px;height:1.05em;margin-left:2px;border-radius:2px;vertical-align:-.16em;background:rgb(var(--accent));animation:caret 1.1s ease-in-out infinite}@keyframes caret{0%,to{opacity:1}50%{opacity:.15}}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition-duration:.01ms!important}}.pxs-a{animation:px-a 1s steps(1) infinite}.pxs-b{animation:px-b 1s steps(1) infinite}@keyframes px-a{0%,to{opacity:1}50%{opacity:.25}}@keyframes px-b{0%,to{opacity:.25}50%{opacity:1}}.text-shimmer{background:linear-gradient(90deg,rgb(var(--muted)),rgb(var(--ink)) 45%,rgb(var(--accent)),rgb(var(--ink)) 55%,rgb(var(--muted)));background-size:250% 100%;-webkit-background-clip:text;background-clip:text;color:transparent;animation:shimmer 2.2s linear infinite}.pxs-blink,.pxs-scan{transform-box:fill-box;transform-origin:center}.pxs-blink{animation:px-blink 4.2s steps(1) infinite}.pxs-scan{animation:px-scan 1.2s steps(1) infinite}@keyframes px-blink{0%,94%,to{transform:scaleY(1)}96%{transform:scaleY(.2)}}@keyframes px-scan{0%,to{transform:translate(-1px)}33%{transform:translate(0)}66%{transform:translate(1px)}}.placeholder\:text-faint::-moz-placeholder{--tw-text-opacity: 1;color:rgb(var(--faint) / var(--tw-text-opacity, 1))}.placeholder\:text-faint::placeholder{--tw-text-opacity: 1;color:rgb(var(--faint) / var(--tw-text-opacity, 1))}.placeholder\:text-muted::-moz-placeholder{--tw-text-opacity: 1;color:rgb(var(--muted) / var(--tw-text-opacity, 1))}.placeholder\:text-muted::placeholder{--tw-text-opacity: 1;color:rgb(var(--muted) / var(--tw-text-opacity, 1))}.last\:border-b-0:last-child{border-bottom-width:0px}.hover\:border-accent\/40:hover{border-color:rgb(var(--accent) / .4)}.hover\:border-accent\/50:hover{border-color:rgb(var(--accent) / .5)}.hover\:border-faint\/50:hover{border-color:rgb(var(--faint) / .5)}.hover\:border-warning\/30:hover{border-color:rgb(var(--warning) / .3)}.hover\:bg-accent\/90:hover{background-color:rgb(var(--accent) / .9)}.hover\:bg-danger\/90:hover{background-color:rgb(var(--danger) / .9)}.hover\:bg-danger\/\[0\.06\]:hover{background-color:rgb(var(--danger) / .06)}.hover\:bg-panel:hover{--tw-bg-opacity: 1;background-color:rgb(var(--panel) / var(--tw-bg-opacity, 1))}.hover\:bg-raised:hover{--tw-bg-opacity: 1;background-color:rgb(var(--raised) / var(--tw-bg-opacity, 1))}.hover\:bg-raised\/40:hover{background-color:rgb(var(--raised) / .4)}.hover\:bg-raised\/50:hover{background-color:rgb(var(--raised) / .5)}.hover\:bg-raised\/60:hover{background-color:rgb(var(--raised) / .6)}.hover\:bg-raised\/80:hover{background-color:rgb(var(--raised) / .8)}.hover\:text-danger:hover{--tw-text-opacity: 1;color:rgb(var(--danger) / var(--tw-text-opacity, 1))}.hover\:text-ink:hover{--tw-text-opacity: 1;color:rgb(var(--ink) / var(--tw-text-opacity, 1))}.hover\:text-muted:hover{--tw-text-opacity: 1;color:rgb(var(--muted) / var(--tw-text-opacity, 1))}.hover\:text-warning:hover{--tw-text-opacity: 1;color:rgb(var(--warning) / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-ink:hover{text-decoration-color:rgb(var(--ink) / 1)}.hover\:opacity-85:hover{opacity:.85}.hover\:shadow-composer:hover{--tw-shadow: 0 1px 2px rgba(0,0,0,.04), 0 8px 28px -12px rgba(0,0,0,.12);--tw-shadow-colored: 0 1px 2px var(--tw-shadow-color), 0 8px 28px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:brightness-110:hover{--tw-brightness: brightness(1.1);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)}.focus\:border-accent\/50:focus{border-color:rgb(var(--accent) / .5)}.focus\:border-line:focus{--tw-border-opacity: 1;border-color:rgb(var(--line) / var(--tw-border-opacity, 1))}.focus\:bg-panel:focus{--tw-bg-opacity: 1;background-color:rgb(var(--panel) / var(--tw-bg-opacity, 1))}.focus\:opacity-100:focus{opacity:1}.focus-visible\:opacity-100:focus-visible{opacity:1}.active\:scale-95:active{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.active\:scale-\[0\.985\]:active{--tw-scale-x: .985;--tw-scale-y: .985;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-35:disabled{opacity:.35}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-45:disabled{opacity:.45}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.group\/advanced[open] .group-open\/advanced\:rotate-180,.group\/skill[open] .group-open\/skill\:rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:block{display:block}.group:hover .group-hover\:flex{display:flex}.group\/item:hover .group-hover\/item\:hidden{display:none}.group\/logo:hover .group-hover\/logo\:rotate-90,.group\/new:hover .group-hover\/new\:rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group\/starter:hover .group-hover\/starter\:bg-accent-soft{--tw-bg-opacity: 1;background-color:rgb(var(--accent-soft) / var(--tw-bg-opacity, 1))}.group\/row:hover .group-hover\/row\:text-ink{--tw-text-opacity: 1;color:rgb(var(--ink) / var(--tw-text-opacity, 1))}.group\/starter:hover .group-hover\/starter\:text-accent{--tw-text-opacity: 1;color:rgb(var(--accent) / var(--tw-text-opacity, 1))}.group\/task:hover .group-hover\/task\:text-ink,.group\/think:hover .group-hover\/think\:text-ink{--tw-text-opacity: 1;color:rgb(var(--ink) / var(--tw-text-opacity, 1))}.group\/item:hover .group-hover\/item\:opacity-100,.group\/user:hover .group-hover\/user\:opacity-100{opacity:1}.dark\:bg-black\/45:is(.dark *){background-color:#00000073}.dark\:bg-black\/60:is(.dark *){background-color:#0009}@media(min-width:640px){.sm\:bottom-48{bottom:12rem}.sm\:ml-auto{margin-left:auto}.sm\:block{display:block}.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:inline-flex{display:inline-flex}.sm\:hidden{display:none}.sm\:h-\[min\(88dvh\,780px\)\]{height:min(88dvh,780px)}.sm\:h-\[min\(90dvh\,760px\)\]{height:min(90dvh,760px)}.sm\:max-h-\[86dvh\]{max-height:86dvh}.sm\:w-\[180px\]{width:180px}.sm\:w-\[210px\]{width:210px}.sm\:w-\[360px\]{width:360px}.sm\:w-\[420px\]{width:420px}.sm\:w-\[min\(760px\,94vw\)\]{width:min(760px,94vw)}.sm\:w-\[min\(920px\,94vw\)\]{width:min(920px,94vw)}.sm\:w-\[min\(96vw\,620px\)\]{width:min(96vw,620px)}.sm\:w-\[min\(980px\,94vw\)\]{width:min(980px,94vw)}.sm\:max-w-\[260px\]{max-width:260px}.sm\:max-w-\[82\%\]{max-width:82%}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}.sm\:self-auto{align-self:auto}.sm\:rounded-xl{border-radius:.75rem}.sm\:p-5{padding:1.25rem}.sm\:p-6{padding:1.5rem}.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:px-5{padding-left:1.25rem;padding-right:1.25rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:px-7{padding-left:1.75rem;padding-right:1.75rem}.sm\:pb-4{padding-bottom:1rem}.sm\:pl-0{padding-left:0}.sm\:pt-10{padding-top:2.5rem}.sm\:pt-\[14vh\]{padding-top:14vh}.sm\:text-\[34px\]{font-size:34px}}@media(min-width:768px){.md\:inline{display:inline}.md\:inline-flex{display:inline-flex}}@media(min-width:1024px){.lg\:static{position:static}.lg\:z-auto{z-index:auto}.lg\:my-1\.5{margin-top:.375rem;margin-bottom:.375rem}.lg\:mr-1\.5{margin-right:.375rem}.lg\:inline-flex{display:inline-flex}.lg\:hidden{display:none}.lg\:translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lg\:grid-cols-\[minmax\(0\,380px\)_minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,380px) minmax(0,1fr)}.lg\:overflow-hidden{overflow:hidden}.lg\:rounded-xl{border-radius:.75rem}.lg\:border{border-width:1px}.lg\:border-b-0{border-bottom-width:0px}.lg\:border-r{border-right-width:1px}.lg\:border-line{--tw-border-opacity: 1;border-color:rgb(var(--line) / var(--tw-border-opacity, 1))}.lg\:shadow-none{--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.lg\:shadow-pill{--tw-shadow: 0 1px 2px rgba(0,0,0,.06);--tw-shadow-colored: 0 1px 2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}}@media(min-width:1280px){.xl\:static{position:static}.xl\:z-auto{z-index:auto}.xl\:hidden{display:none}.xl\:max-h-\[38\%\]{max-height:38%}.xl\:w-\[390px\]{width:390px}.xl\:w-\[560px\]{width:560px}.xl\:shadow-none{--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}}.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker{display:none}