@bibobonking/opensol 3.0.3 → 3.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/build.yml +60 -8
- package/CHANGELOG.md +21 -0
- package/README.md +2 -2
- package/desktop/README.md +39 -0
- package/desktop/loading/index.html +36 -0
- package/desktop/src-tauri/Cargo.lock +4301 -0
- package/desktop/src-tauri/Cargo.toml +23 -0
- package/desktop/src-tauri/binaries/.gitkeep +0 -0
- package/desktop/src-tauri/build.rs +3 -0
- package/desktop/src-tauri/capabilities/default.json +7 -0
- package/desktop/src-tauri/icons/128x128.png +0 -0
- package/desktop/src-tauri/icons/128x128@2x.png +0 -0
- package/desktop/src-tauri/icons/32x32.png +0 -0
- package/desktop/src-tauri/icons/64x64.png +0 -0
- package/desktop/src-tauri/icons/Square107x107Logo.png +0 -0
- package/desktop/src-tauri/icons/Square142x142Logo.png +0 -0
- package/desktop/src-tauri/icons/Square150x150Logo.png +0 -0
- package/desktop/src-tauri/icons/Square284x284Logo.png +0 -0
- package/desktop/src-tauri/icons/Square30x30Logo.png +0 -0
- package/desktop/src-tauri/icons/Square310x310Logo.png +0 -0
- package/desktop/src-tauri/icons/Square44x44Logo.png +0 -0
- package/desktop/src-tauri/icons/Square71x71Logo.png +0 -0
- package/desktop/src-tauri/icons/Square89x89Logo.png +0 -0
- package/desktop/src-tauri/icons/StoreLogo.png +0 -0
- package/desktop/src-tauri/icons/icon.icns +0 -0
- package/desktop/src-tauri/icons/icon.ico +0 -0
- package/desktop/src-tauri/icons/icon.png +0 -0
- package/desktop/src-tauri/src/lib.rs +210 -0
- package/desktop/src-tauri/src/main.rs +6 -0
- package/desktop/src-tauri/tauri.conf.json +48 -0
- package/dist/assets/index-CeN54A2N.css +1 -0
- package/dist/assets/index-fhIO9a7_.js +318 -0
- package/dist/index.html +4 -4
- package/index.html +2 -2
- package/package.json +2 -1
- package/server/README.md +2 -2
- package/server/daemon.mjs +138 -2
- package/server/lib/mcp-oauth.mjs +219 -0
- package/server/lib/mcp-oauth.test.mjs +175 -0
- package/server/lib/mcp.mjs +899 -0
- package/server/lib/mcp.test.mjs +46 -0
- package/server/lib/store.mjs +22 -0
- package/server/lib/tools.mjs +59 -1
- package/src/App.tsx +2 -0
- package/src/agent/tools.ts +6 -5
- package/src/components/CommandPalette.tsx +14 -1
- package/src/components/Composer.tsx +22 -38
- package/src/components/DiffView.tsx +98 -0
- package/src/components/Logo.tsx +1 -1
- package/src/components/McpPanel.tsx +687 -0
- package/src/components/MessageItem.tsx +62 -13
- package/src/components/ModelDeck.tsx +661 -0
- package/src/components/SessionsTab.tsx +206 -0
- package/src/components/SettingsModal.tsx +146 -71
- package/src/components/Sidebar.tsx +79 -24
- package/src/components/Splash.tsx +1 -1
- package/src/components/ToolCallCard.tsx +29 -7
- package/src/components/WorkspacePanel.tsx +16 -1
- package/src/core/kernel.ts +2 -0
- package/src/core/mcp-tools.ts +63 -0
- package/src/core/plugins/tools/fs.ts +24 -3
- package/src/core/services/agent-loop.ts +3 -1
- package/src/core/services/approval.ts +2 -1
- package/src/core/services/titles.ts +135 -0
- package/src/core/services/tools.ts +11 -8
- package/src/core/types.ts +4 -0
- package/src/data/providers.ts +1 -1
- package/src/index.css +97 -1
- package/src/lib/daemon.ts +38 -0
- package/src/lib/diff.ts +62 -0
- package/src/lib/mcp-config.test.mjs +47 -0
- package/src/lib/mcp-config.ts +203 -0
- package/src/lib/permissions.ts +6 -6
- package/src/store/chats.ts +9 -1
- package/src/store/mcp.ts +94 -0
- package/src/store/settings.ts +10 -7
- package/src/store/ui.ts +17 -0
- package/src/store/workspace.ts +26 -0
- package/src/types.ts +63 -2
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/assets/index-BmN7pBji.css +0 -1
- package/dist/assets/index-DgNDjkOz.js +0 -301
- package/src/components/ModelPicker.tsx +0 -487
package/src/store/mcp.ts
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { create } from 'zustand'
|
|
2
|
+
import type { McpServer, McpTool, McpToolName } from '../types'
|
|
3
|
+
import { mcpAction, mcpAuthorize, mcpList, mcpLogout, 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
|
+
/** Opens the provider's consent page; resolves once the popup was opened. */
|
|
14
|
+
authorize: (id: string) => Promise<void>
|
|
15
|
+
logout: (id: string) => Promise<void>
|
|
16
|
+
lookup: (fn: string) => { server: McpServer; tool: McpTool } | null
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
let pollTimer: number | undefined
|
|
20
|
+
|
|
21
|
+
export const useMcp = create<McpState>()((set, get) => {
|
|
22
|
+
const apply = (servers: McpServer[]) => {
|
|
23
|
+
set({ servers, loaded: true, loading: false, error: '' })
|
|
24
|
+
if (pollTimer !== undefined) window.clearTimeout(pollTimer)
|
|
25
|
+
pollTimer = undefined
|
|
26
|
+
// Servers that are still starting (npx may download packages) are polled until they settle.
|
|
27
|
+
if (servers.some((server) => server.status === 'connecting')) {
|
|
28
|
+
pollTimer = window.setTimeout(() => void get().load(), 1200)
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
servers: [],
|
|
33
|
+
loaded: false,
|
|
34
|
+
loading: false,
|
|
35
|
+
error: '',
|
|
36
|
+
load: async () => {
|
|
37
|
+
set({ loading: true })
|
|
38
|
+
try {
|
|
39
|
+
apply((await mcpList()).servers)
|
|
40
|
+
} catch (error) {
|
|
41
|
+
set({ loading: false, loaded: true, error: error instanceof Error ? error.message : 'Could not load MCP servers.' })
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
save: async (servers) => {
|
|
45
|
+
const result = await mcpSave(servers)
|
|
46
|
+
apply(result.servers)
|
|
47
|
+
},
|
|
48
|
+
act: async (id, action) => {
|
|
49
|
+
// Show "connecting" at once; the daemon answers when the handshake finishes.
|
|
50
|
+
if (action !== 'disconnect') {
|
|
51
|
+
set((state) => ({
|
|
52
|
+
servers: state.servers.map((server) => (server.id === id ? { ...server, status: 'connecting', error: '' } : server)),
|
|
53
|
+
}))
|
|
54
|
+
}
|
|
55
|
+
const result = await mcpAction(id, action)
|
|
56
|
+
apply(result.servers)
|
|
57
|
+
},
|
|
58
|
+
authorize: async (id) => {
|
|
59
|
+
const { url } = await mcpAuthorize(id)
|
|
60
|
+
const popup = window.open(url, 'opensol-mcp-oauth', 'popup=yes,width=520,height=720')
|
|
61
|
+
if (!popup) throw new Error('The browser blocked the sign-in window. Allow pop-ups for OpenSol and try again.')
|
|
62
|
+
// The callback page also broadcasts; polling covers browsers that drop BroadcastChannel.
|
|
63
|
+
const started = Date.now()
|
|
64
|
+
const watch = window.setInterval(() => {
|
|
65
|
+
void get().load()
|
|
66
|
+
const server = get().servers.find((item) => item.id === id)
|
|
67
|
+
if (popup.closed || server?.oauth?.authorized || Date.now() - started > 5 * 60_000) {
|
|
68
|
+
window.clearInterval(watch)
|
|
69
|
+
void get().load()
|
|
70
|
+
}
|
|
71
|
+
}, 1500)
|
|
72
|
+
},
|
|
73
|
+
logout: async (id) => {
|
|
74
|
+
apply((await mcpLogout(id)).servers)
|
|
75
|
+
},
|
|
76
|
+
lookup: (fn) => {
|
|
77
|
+
for (const server of get().servers) {
|
|
78
|
+
const tool = server.tools.find((entry) => entry.fn === fn)
|
|
79
|
+
if (tool) return { server, tool }
|
|
80
|
+
}
|
|
81
|
+
return null
|
|
82
|
+
},
|
|
83
|
+
}
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
export function isMcpToolName(name: string): name is McpToolName {
|
|
87
|
+
return name.startsWith('mcp__')
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
try {
|
|
91
|
+
new BroadcastChannel('opensol-mcp-oauth').onmessage = () => void useMcp.getState().load()
|
|
92
|
+
} catch {
|
|
93
|
+
// BroadcastChannel is optional; the authorize poll still refreshes the list.
|
|
94
|
+
}
|
package/src/store/settings.ts
CHANGED
|
@@ -10,7 +10,7 @@ import type {
|
|
|
10
10
|
SecretEntry,
|
|
11
11
|
SecretsSummary,
|
|
12
12
|
Skill,
|
|
13
|
-
|
|
13
|
+
BuiltinToolName,
|
|
14
14
|
ToolSetting,
|
|
15
15
|
} from '../types'
|
|
16
16
|
import { BUILTIN_SKILLS } from '../data/skills'
|
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
import { defaultEffort, normalizeEffort } from '../lib/reasoning'
|
|
26
26
|
import { normalizeTheme } from '../lib/themes'
|
|
27
27
|
|
|
28
|
-
export const DEFAULT_SYSTEM_PROMPT = `You are OpenSol, a senior web engineer and coding agent built by
|
|
28
|
+
export const DEFAULT_SYSTEM_PROMPT = `You are OpenSol, a senior web engineer and coding agent built by OpenSoftX.
|
|
29
29
|
|
|
30
30
|
You work directly in the user's open folder through a local daemon. The shell, file, git, search and deploy tools are real. Never describe tool output you did not receive.
|
|
31
31
|
|
|
@@ -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<
|
|
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:
|
|
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<
|
|
116
|
-
const merged = {} as Record<
|
|
117
|
-
for (const key of Object.keys(DEFAULT_TOOLS) as
|
|
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) => {
|
|
@@ -43,6 +55,8 @@ interface UiState {
|
|
|
43
55
|
setMobileSidebarOpen: (open: boolean) => void
|
|
44
56
|
workspaceOpen: boolean
|
|
45
57
|
setWorkspaceOpen: (open: boolean) => void
|
|
58
|
+
mcpOpen: boolean
|
|
59
|
+
setMcpOpen: (open: boolean) => void
|
|
46
60
|
settingsOpen: boolean
|
|
47
61
|
settingsTab:
|
|
48
62
|
| 'general'
|
|
@@ -51,6 +65,7 @@ interface UiState {
|
|
|
51
65
|
| 'search'
|
|
52
66
|
| 'skills'
|
|
53
67
|
| 'plugins'
|
|
68
|
+
| 'mcp'
|
|
54
69
|
| 'deploy'
|
|
55
70
|
| 'appearance'
|
|
56
71
|
| 'about'
|
|
@@ -98,6 +113,8 @@ export const useUi = create<UiState>()((set, get) => ({
|
|
|
98
113
|
setMobileSidebarOpen: (open) => set({ mobileSidebarOpen: open }),
|
|
99
114
|
workspaceOpen: false,
|
|
100
115
|
setWorkspaceOpen: (open) => set({ workspaceOpen: open }),
|
|
116
|
+
mcpOpen: false,
|
|
117
|
+
setMcpOpen: (open) => set({ mcpOpen: open, ...(open ? { mobileSidebarOpen: false, settingsOpen: false } : {}) }),
|
|
101
118
|
settingsOpen: false,
|
|
102
119
|
settingsTab: 'general',
|
|
103
120
|
openSettings: (tab = 'general') => set({ settingsOpen: true, settingsTab: tab, mobileSidebarOpen: false }),
|
package/src/store/workspace.ts
CHANGED
|
@@ -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
|
|
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<
|
|
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,51 @@ 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' | 'needs_auth' | 'error'
|
|
235
|
+
|
|
236
|
+
export type McpTransport = 'stdio' | 'http' | 'sse'
|
|
237
|
+
|
|
238
|
+
export interface McpOAuth {
|
|
239
|
+
enabled: boolean
|
|
240
|
+
clientId: string
|
|
241
|
+
/** Masked by the daemon; send the mask back to keep the stored secret. */
|
|
242
|
+
clientSecret: string
|
|
243
|
+
scope: string
|
|
244
|
+
authorized: boolean
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
export interface McpTool {
|
|
248
|
+
name: string
|
|
249
|
+
fn: McpToolName
|
|
250
|
+
description: string
|
|
251
|
+
inputSchema: Record<string, unknown>
|
|
252
|
+
readOnly: boolean
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
export interface McpServer {
|
|
256
|
+
id: string
|
|
257
|
+
name: string
|
|
258
|
+
transport: McpTransport
|
|
259
|
+
enabled: boolean
|
|
260
|
+
approval: 'auto' | 'ask'
|
|
261
|
+
disabledTools: string[]
|
|
262
|
+
status: McpStatus
|
|
263
|
+
error: string
|
|
264
|
+
serverInfo: { name?: string; version?: string } | null
|
|
265
|
+
connectedAt: number | null
|
|
266
|
+
tools: McpTool[]
|
|
267
|
+
command?: string
|
|
268
|
+
args?: string[]
|
|
269
|
+
env?: Record<string, string>
|
|
270
|
+
url?: string
|
|
271
|
+
headers?: Record<string, string>
|
|
272
|
+
oauth?: McpOAuth | null
|
|
212
273
|
}
|
|
213
274
|
|
|
214
275
|
export interface Usage {
|
package/tsconfig.tsbuildinfo
CHANGED
|
@@ -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/
|
|
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/McpPanel.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/mcp-config.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}
|