clitrigger 0.1.11 → 0.1.12

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 (101) hide show
  1. package/README.md +24 -21
  2. package/README_KR.md +25 -22
  3. package/dist/client/assets/index-CcsvxPmx.css +1 -0
  4. package/dist/client/assets/index-qSpSlrcM.js +606 -0
  5. package/dist/client/index.html +2 -2
  6. package/dist/server/data/cli-models-registry.json +12 -1
  7. package/dist/server/db/queries.d.ts +46 -5
  8. package/dist/server/db/queries.d.ts.map +1 -1
  9. package/dist/server/db/queries.js +138 -9
  10. package/dist/server/db/queries.js.map +1 -1
  11. package/dist/server/db/schema.d.ts.map +1 -1
  12. package/dist/server/db/schema.js +35 -0
  13. package/dist/server/db/schema.js.map +1 -1
  14. package/dist/server/index.d.ts.map +1 -1
  15. package/dist/server/index.js +4 -0
  16. package/dist/server/index.js.map +1 -1
  17. package/dist/server/lib/git.d.ts +1 -0
  18. package/dist/server/lib/git.d.ts.map +1 -1
  19. package/dist/server/lib/git.js +11 -0
  20. package/dist/server/lib/git.js.map +1 -1
  21. package/dist/server/plugins/harness/adapters/claude.d.ts +3 -0
  22. package/dist/server/plugins/harness/adapters/claude.d.ts.map +1 -0
  23. package/dist/server/plugins/harness/adapters/claude.js +98 -0
  24. package/dist/server/plugins/harness/adapters/claude.js.map +1 -0
  25. package/dist/server/plugins/harness/adapters/codex.d.ts +3 -0
  26. package/dist/server/plugins/harness/adapters/codex.d.ts.map +1 -0
  27. package/dist/server/plugins/harness/adapters/codex.js +136 -0
  28. package/dist/server/plugins/harness/adapters/codex.js.map +1 -0
  29. package/dist/server/plugins/harness/adapters/gemini.d.ts +3 -0
  30. package/dist/server/plugins/harness/adapters/gemini.d.ts.map +1 -0
  31. package/dist/server/plugins/harness/adapters/gemini.js +118 -0
  32. package/dist/server/plugins/harness/adapters/gemini.js.map +1 -0
  33. package/dist/server/plugins/harness/index.d.ts +3 -0
  34. package/dist/server/plugins/harness/index.d.ts.map +1 -0
  35. package/dist/server/plugins/harness/index.js +13 -0
  36. package/dist/server/plugins/harness/index.js.map +1 -0
  37. package/dist/server/plugins/harness/io.d.ts +12 -0
  38. package/dist/server/plugins/harness/io.d.ts.map +1 -0
  39. package/dist/server/plugins/harness/io.js +94 -0
  40. package/dist/server/plugins/harness/io.js.map +1 -0
  41. package/dist/server/plugins/harness/router.d.ts +4 -0
  42. package/dist/server/plugins/harness/router.d.ts.map +1 -0
  43. package/dist/server/plugins/harness/router.js +206 -0
  44. package/dist/server/plugins/harness/router.js.map +1 -0
  45. package/dist/server/plugins/harness/types.d.ts +40 -0
  46. package/dist/server/plugins/harness/types.d.ts.map +1 -0
  47. package/dist/server/plugins/harness/types.js +2 -0
  48. package/dist/server/plugins/harness/types.js.map +1 -0
  49. package/dist/server/routes/discussions.d.ts.map +1 -1
  50. package/dist/server/routes/discussions.js +116 -6
  51. package/dist/server/routes/discussions.js.map +1 -1
  52. package/dist/server/routes/logs.d.ts.map +1 -1
  53. package/dist/server/routes/logs.js +16 -5
  54. package/dist/server/routes/logs.js.map +1 -1
  55. package/dist/server/routes/memory.d.ts +3 -0
  56. package/dist/server/routes/memory.d.ts.map +1 -0
  57. package/dist/server/routes/memory.js +259 -0
  58. package/dist/server/routes/memory.js.map +1 -0
  59. package/dist/server/routes/projects.d.ts.map +1 -1
  60. package/dist/server/routes/projects.js +11 -2
  61. package/dist/server/routes/projects.js.map +1 -1
  62. package/dist/server/routes/review.d.ts.map +1 -1
  63. package/dist/server/routes/review.js +152 -1
  64. package/dist/server/routes/review.js.map +1 -1
  65. package/dist/server/routes/todos.d.ts.map +1 -1
  66. package/dist/server/routes/todos.js +17 -3
  67. package/dist/server/routes/todos.js.map +1 -1
  68. package/dist/server/services/discussion-extractor.d.ts +7 -0
  69. package/dist/server/services/discussion-extractor.d.ts.map +1 -0
  70. package/dist/server/services/discussion-extractor.js +167 -0
  71. package/dist/server/services/discussion-extractor.js.map +1 -0
  72. package/dist/server/services/discussion-orchestrator.d.ts.map +1 -1
  73. package/dist/server/services/discussion-orchestrator.js +16 -1
  74. package/dist/server/services/discussion-orchestrator.js.map +1 -1
  75. package/dist/server/services/log-streamer.d.ts +20 -0
  76. package/dist/server/services/log-streamer.d.ts.map +1 -1
  77. package/dist/server/services/log-streamer.js +81 -3
  78. package/dist/server/services/log-streamer.js.map +1 -1
  79. package/dist/server/services/memory-inject-hook.d.ts +9 -0
  80. package/dist/server/services/memory-inject-hook.d.ts.map +1 -0
  81. package/dist/server/services/memory-inject-hook.js +17 -0
  82. package/dist/server/services/memory-inject-hook.js.map +1 -0
  83. package/dist/server/services/memory-injector.d.ts +15 -0
  84. package/dist/server/services/memory-injector.d.ts.map +1 -0
  85. package/dist/server/services/memory-injector.js +77 -0
  86. package/dist/server/services/memory-injector.js.map +1 -0
  87. package/dist/server/services/model-sync.js +1 -1
  88. package/dist/server/services/orchestrator.d.ts.map +1 -1
  89. package/dist/server/services/orchestrator.js +27 -0
  90. package/dist/server/services/orchestrator.js.map +1 -1
  91. package/dist/server/services/pty-output-filter.d.ts +12 -0
  92. package/dist/server/services/pty-output-filter.d.ts.map +1 -1
  93. package/dist/server/services/pty-output-filter.js +94 -1
  94. package/dist/server/services/pty-output-filter.js.map +1 -1
  95. package/dist/server/services/review-capture.d.ts +5 -3
  96. package/dist/server/services/review-capture.d.ts.map +1 -1
  97. package/dist/server/services/review-capture.js +29 -7
  98. package/dist/server/services/review-capture.js.map +1 -1
  99. package/package.json +3 -1
  100. package/dist/client/assets/index-D4Xur2yY.css +0 -1
  101. package/dist/client/assets/index-Dz1uDy_d.js +0 -567
package/README.md CHANGED
@@ -104,14 +104,28 @@ Every feature — Planner, Scheduler, worktree isolation, rate-limit auto-recove
104
104
 
105
105
  ## Features
106
106
 
107
- ### Parallel Worktree Execution
107
+ ### Plugin System (Harness, Jira, GitHub, Notion, gstack)
108
+ The **Harness** panel edits Claude / Gemini / Codex user config (settings, memory files, MCP servers) right in the browser — atomic writes with deep-merge preserve untouched fields, and a Codex `trustLevelMissing` warning surfaces when a project isn't trusted. Jira, GitHub, Notion integrations and gstack skill injection ship alongside as self-contained plugins. Two plugin categories — `external-service` (REST proxy + UI panel) and `execution-hook` (pre-execution hook into the orchestrator). Adding a new integration needs only a manifest and `registerPlugin()` call — no core code changes.
109
+
110
+ ### Long-term Memory Graph
111
+ A per-project knowledge graph (nodes + typed edges) that you curate once and selectively inject into TODO and discussion prompts. Stop pasting the same domain context every run. Toggle between List and Graph views (`@xyflow/react` + dagre auto-layout, drag-to-connect edges, cycle guards on `precedes`/`refines`), pick `None` / `All` / `Selected` per task, preview the exact `<long_term_memory>` block before sending. CLI-agnostic — Claude, Gemini, and Codex all see identical context with no adapter changes.
112
+
113
+ ### Planner
114
+ A lightweight task planner separate from TODOs — capture ideas, attach images, tag with colors, sort by any column. Convert any planner item into a TODO or a schedule in one click. Markdown export/import (status sections + GFM checkboxes + HTML-comment metadata) lets you move plans across machines or share via GitHub / Obsidian / any plain Markdown viewer. Drop a `.md` file onto the planner card to import.
115
+
116
+ <div align="center">
117
+ <img src="https://raw.githubusercontent.com/HyperAITeam/CLITrigger/main/docs/images/screenshot-planer.png" alt="Planner — Lightweight task management" width="800">
118
+ <p><em>Inline editing, color-coded tags, image attachments, and one-click conversion to TODOs or schedules</em></p>
119
+ </div>
120
+
121
+ ### Parallel Worktree Execution (Tasks)
108
122
  Each TODO automatically gets its own git worktree. Claude / Gemini / Codex CLIs execute simultaneously in parallel. Dependency chains let you automatically trigger follow-up tasks and branch merges once prerequisites complete. Per-project worktree toggle plus per-TODO tri-state override (inherit / force-worktree / force-main) give you fine-grained control — main-branch tasks are automatically serialized to avoid conflicts. Drag-and-drop reordering and an iOS-style stack mode keep long task lists manageable.
109
123
 
110
- ### Morning Review Queue
111
- A single cross-project triage screen for the "delegate overnight, review next morning" loop. Aggregates every recent TODO across all your projects into a card stack with project label, last-assistant summary, token totals, diff stats, and a server-classified risk badge (low / medium / high based on status and diff size). Keyboard-only operation: `j`/`k` to navigate, `Enter` for the embedded log viewer, `m` to merge, `d` to discard, `Esc` to close — N todos become O(N) keypresses. Time-window selector (12h / 24h / 7d), filter chips (All / Risky / Quick wins / Failed), and a sticky token ribbon with CLI breakdown.
124
+ ### Interactive Sessions
125
+ Long-lived interactive CLI sessions as first-class entities bring up a Claude / Gemini / Codex session in an embedded terminal, with optional worktree isolation per session. PTY output is filtered for spinner noise and classified into assistant / tool-use blocks so the Chat-mode log viewer stays readable.
112
126
 
113
127
  ### Multi-Agent Discussion
114
- AI agents with different roles — architect, developer, reviewer — debate in rounds before implementation. The resulting design is far more robust than a single AI working in isolation. Agents flagged as **Implementers** (`can_implement`) can commit code during their regular turns, while a final implementation round stitches everything together. Auto-implement triggers the code-writing round automatically on consensus.
128
+ AI agents with different roles — architect, developer, reviewer — debate in rounds before implementation. The resulting design is far more robust than a single AI working in isolation. Agents flagged as **Implementers** (`can_implement`) can commit code during their regular turns, while a final implementation round stitches everything together. Auto-implement triggers the code-writing round automatically on consensus. Or hit **Send to Planner** on a finished discussion to have the transcript distilled into curated planner items via a one-shot LLM extraction — review and edit before persisting.
115
129
 
116
130
  <div align="center">
117
131
  <img src="https://raw.githubusercontent.com/HyperAITeam/CLITrigger/main/docs/images/screenshot-discussions.png" alt="Discussions — Multi-agent debate" width="800">
@@ -126,12 +140,12 @@ Schedule tasks for off-peak hours to avoid rate limits. Supports recurring cron
126
140
  <p><em>Cron-based recurring and one-time scheduled task execution</em></p>
127
141
  </div>
128
142
 
129
- ### Planner
130
- A lightweight task planner separate from TODOs capture ideas, attach images, tag with colors, sort by any column. Convert any planner item into a TODO or a schedule in one click. Markdown export/import (status sections + GFM checkboxes + HTML-comment metadata) lets you move plans across machines or share via GitHub / Obsidian / any plain Markdown viewer. Drop a `.md` file onto the planner card to import.
143
+ ### Built-in Git Client
144
+ A full Git client lives inside the web UI with a Fork/SourceTree-style layout a workspace menu switches between **File Status** (staged/unstaged file lists, working-tree diff viewer, commit message + push toggle, Cmd/Ctrl+Enter to commit) and **History** (commit graph, action toolbar, worktree list, VS Code-style branch context menu with checkout / merge / rebase / fetch / pull / push / rename / delete, and a commit detail panel with file-level diff viewer). Every split is user-resizable and persisted to localStorage. Non-ASCII filenames (Korean, CJK, emoji) render correctly in diff and status output.
131
145
 
132
146
  <div align="center">
133
- <img src="https://raw.githubusercontent.com/HyperAITeam/CLITrigger/main/docs/images/screenshot-planer.png" alt="PlannerLightweight task management" width="800">
134
- <p><em>Inline editing, color-coded tags, image attachments, and one-click conversion to TODOs or schedules</em></p>
147
+ <img src="https://raw.githubusercontent.com/HyperAITeam/CLITrigger/main/docs/images/screenshot-git.png" alt="GitBuilt-in client" width="800">
148
+ <p><em>Commit graph, branch actions, file diffs all in the browser</em></p>
135
149
  </div>
136
150
 
137
151
  ### Analytics
@@ -142,16 +156,8 @@ Per-project cost and execution stats powered by Recharts — stacked bar chart b
142
156
  <p><em>Cost and token usage broken down by CLI, status, and over time</em></p>
143
157
  </div>
144
158
 
145
- ### Built-in Git Client
146
- A full Git client lives inside the web UI with a Fork/SourceTree-style layout a workspace menu switches between **File Status** (staged/unstaged file lists, working-tree diff viewer, commit message + push toggle, Cmd/Ctrl+Enter to commit) and **History** (commit graph, action toolbar, worktree list, VS Code-style branch context menu with checkout / merge / rebase / fetch / pull / push / rename / delete, and a commit detail panel with file-level diff viewer). Every split is user-resizable and persisted to localStorage. Non-ASCII filenames (Korean, CJK, emoji) render correctly in diff and status output.
147
-
148
- <div align="center">
149
- <img src="https://raw.githubusercontent.com/HyperAITeam/CLITrigger/main/docs/images/screenshot-git.png" alt="Git — Built-in client" width="800">
150
- <p><em>Commit graph, branch actions, file diffs — all in the browser</em></p>
151
- </div>
152
-
153
- ### Interactive Sessions
154
- Long-lived interactive CLI sessions as first-class entities — bring up a Claude / Gemini / Codex session in an embedded terminal, with optional worktree isolation per session. PTY output is filtered for spinner noise and classified into assistant / tool-use blocks so the Chat-mode log viewer stays readable.
159
+ ### Morning Review Queue
160
+ A single cross-project triage screen for the "delegate overnight, review next morning" loop. Aggregates every recent TODO across all your projects into a card stack with project label, last-assistant summary, token totals, diff stats, and a server-classified risk badge (low / medium / high based on status and diff size). Keyboard-only operation: `j`/`k` to navigate, `Enter` for the embedded log viewer, `Space` / `→` to expand changed files and diffs inline, `m` to merge, `d` to discard, `Esc` to close N todos become O(N) keypresses. Time-window selector (12h / 24h / 7d), filter chips (All / Risky / Quick wins / Failed), and a sticky token ribbon with CLI breakdown. Inline diffs survive worktree cleanup by falling back through branch ref `master`/`main`.
155
161
 
156
162
  ### Live Logs (Chat & Raw)
157
163
  WebSocket-based real-time log streaming with two view modes — Chat mode renders assistant messages as markdown with collapsible tool-use rows; Raw mode is a flat terminal view. Multi-round continue reuses the same worktree via the CLI's native `--continue` flag.
@@ -159,9 +165,6 @@ WebSocket-based real-time log streaming with two view modes — Chat mode render
159
165
  ### Multi-CLI & Sandbox Mode
160
166
  Select Claude / Gemini / Codex per project, per TODO, or per discussion agent. Strict sandbox mode restricts CLI file access to the worktree directory using each CLI's native sandboxing (Claude settings.json, Codex `--full-auto`, Gemini prompt-level restriction).
161
167
 
162
- ### Plugin System
163
- Jira, GitHub, Notion integrations and gstack skill injection ship as self-contained plugins. Two plugin categories — `external-service` (REST proxy + UI panel) and `execution-hook` (pre-execution hook into the orchestrator). Adding a new integration needs only a manifest and `registerPlugin()` call — no core code changes.
164
-
165
168
  ### Remote Access
166
169
  Access and control from anywhere via Cloudflare Tunnel. Browser notifications alert you when tasks or discussions complete, so you can walk away and come back.
167
170
 
package/README_KR.md CHANGED
@@ -104,14 +104,28 @@ CLITrigger의 모든 기능 — Planner, Scheduler, 워크트리 격리, 한도
104
104
 
105
105
  ## 주요 기능
106
106
 
107
- ### 병렬 Worktree 실행
107
+ ### 플러그인 시스템 (Harness · Jira · GitHub · Notion · gstack)
108
+ **Harness** 패널에서는 Claude / Gemini / Codex의 사용자 설정(settings, 메모리 파일, MCP 서버)을 IDE를 열지 않고 브라우저에서 바로 편집한다 — atomic write + deep-merge로 손대지 않은 필드는 그대로 유지하고, 프로젝트가 trusted 목록에 없으면 Codex `trustLevelMissing` 경고가 노출된다. Jira, GitHub, Notion 연동과 gstack 스킬 주입도 동일하게 자가 완결형 플러그인으로 함께 제공된다. `external-service`(REST 프록시 + 패널 탭)와 `execution-hook`(오케스트레이터 사전 실행 훅) 두 카테고리를 지원한다. 새 통합을 추가하려면 매니페스트와 `registerPlugin()` 호출만 있으면 되고, 코어 코드를 건드릴 필요가 없다.
109
+
110
+ ### 장기 메모리 그래프 (Long-term Memory)
111
+ 프로젝트별로 한 번 정리해 두면 TODO와 토론 프롬프트에 골라 주입할 수 있는 노드+엣지 지식 그래프. 매번 같은 도메인 컨텍스트를 붙여넣을 필요가 없다. List / Graph 뷰 토글(`@xyflow/react` + dagre 자동 레이아웃, drag-to-connect 엣지, `precedes`/`refines` 관계는 cycle 차단), todo마다 `None` / `All` / `Selected` 모드 선택, 전송 전 `<long_term_memory>` 블록 미리보기까지. CLI-agnostic — Claude / Gemini / Codex 모두 동일한 컨텍스트를 받으며 어댑터 변경이 필요 없다.
112
+
113
+ ### Planner (플래너)
114
+ TODO와는 별개인 경량 작업 플래너 — 아이디어를 빠르게 적고, 이미지를 첨부하고, 색상 태그로 분류하고, 열 단위로 정렬할 수 있다. 플래너 항목을 한 번의 클릭으로 TODO나 예약 스케줄로 변환할 수 있다. Markdown Export / Import (status 섹션 + GFM 체크박스 + HTML 주석 메타데이터)로 다른 머신에 옮기거나 GitHub / Obsidian / 어떤 Markdown 뷰어에서도 그대로 열어볼 수 있고, `.md` 파일을 카드에 드래그하면 바로 Import된다.
115
+
116
+ <div align="center">
117
+ <img src="https://raw.githubusercontent.com/HyperAITeam/CLITrigger/main/docs/images/screenshot-planer.png" alt="Planner — 경량 작업 관리" width="800">
118
+ <p><em>인라인 편집, 컬러 태그, 이미지 첨부, 원클릭 TODO/스케줄 변환</em></p>
119
+ </div>
120
+
121
+ ### 병렬 Worktree 실행 (자동 작업)
108
122
  TODO를 작성하면 각 작업마다 격리된 git worktree가 자동 생성된다. Claude / Gemini / Codex CLI가 동시에 병렬로 실행되며, 의존성 체인을 설정하면 선행 작업 완료 후 자동으로 후속 작업이 실행되고 브랜치 병합까지 처리된다. 프로젝트별 워크트리 토글에 더해 TODO별 3단계 오버라이드(상속 / 강제 워크트리 / 강제 메인)로 세밀한 제어가 가능하고, 메인 브랜치 작업은 자동 직렬화되어 충돌을 막는다. 드래그 앤 드롭으로 순서를 바꾸고, iOS 스타일 스택 모드로 긴 목록도 깔끔하게 관리할 수 있다.
109
123
 
110
- ### Morning Review Queue (아침 리뷰 큐)
111
- "밤새 위임하고 아침에 리뷰" 루프를 위한 크로스-프로젝트 단일 트리아주 화면. 모든 프로젝트의 최근 TODO를 카드 스택으로 모아 프로젝트 라벨, 마지막 어시스턴트 한 줄 요약, 토큰 합계, diff 통계, 서버 분류 risk 배지(low / medium / high 상태와 diff 크기 기반)를 한눈에 보여준다. 키보드 전용 조작: `j`/`k`로 이동, `Enter`로 임베드 로그 뷰어 열기, `m` 머지, `d` discard, `Esc`로 닫기 — N개 todo가 O(N) 키 입력으로 끝난다. 시간 윈도우(12h / 24h / 7d), 필터 칩(All / Risky / Quick wins / Failed), CLI별 분해가 표시되는 sticky 토큰 리본까지.
124
+ ### 인터랙티브 세션 (Sessions)
125
+ 생애주기의 인터랙티브 CLI 세션을 1급 엔티티로 관리 Claude / Gemini / Codex 세션을 내장 터미널로 띄우고, 세션별로 워크트리 격리 여부를 선택할 있다. PTY 출력에서 스피너 노이즈를 걸러내고 assistant / tool-use 블록으로 분류해, Chat 모드 로그 뷰어에서도 깔끔하게 읽힌다.
112
126
 
113
127
  ### 다중 AI 토론 (Discussion)
114
- 아키텍트, 개발자, 리뷰어 등 역할이 다른 AI 에이전트들이 라운드 방식으로 토론한 뒤, 합의된 내용을 바탕으로 자동 구현까지 이어진다. 단일 AI의 판단보다 훨씬 검증된 설계 결과물이 나온다. **구현자(Implementer, `can_implement`)** 로 표시된 에이전트는 일반 턴에서도 코드를 커밋할 수 있고, 마지막 구현 라운드가 남은 작업을 정리해 마무리한다. 자동 구현(Auto-implement) 옵션을 켜면 토론 완료 즉시 코드 작성 라운드가 자동 실행된다.
128
+ 아키텍트, 개발자, 리뷰어 등 역할이 다른 AI 에이전트들이 라운드 방식으로 토론한 뒤, 합의된 내용을 바탕으로 자동 구현까지 이어진다. 단일 AI의 판단보다 훨씬 검증된 설계 결과물이 나온다. **구현자(Implementer, `can_implement`)** 로 표시된 에이전트는 일반 턴에서도 코드를 커밋할 수 있고, 마지막 구현 라운드가 남은 작업을 정리해 마무리한다. 자동 구현(Auto-implement) 옵션을 켜면 토론 완료 즉시 코드 작성 라운드가 자동 실행된다. 완료된 토론에서 **Send to Planner** 버튼을 누르면 트랜스크립트를 한방 LLM 호출로 추출해 액션 아이템을 Planner로 영속한다 — 저장 전 항목별 편집 가능.
115
129
 
116
130
  <div align="center">
117
131
  <img src="https://raw.githubusercontent.com/HyperAITeam/CLITrigger/main/docs/images/screenshot-discussions.png" alt="Discussions — 다중 AI 토론" width="800">
@@ -126,15 +140,15 @@ TODO를 작성하면 각 작업마다 격리된 git worktree가 자동 생성된
126
140
  <p><em>cron 기반 반복·일회성 예약 실행 설정 화면</em></p>
127
141
  </div>
128
142
 
129
- ### Planner (플래너)
130
- TODO와는 별개인 경량 작업 플래너아이디어를 빠르게 적고, 이미지를 첨부하고, 색상 태그로 분류하고, 단위로 정렬할 있다. 플래너 항목을 번의 클릭으로 TODO나 예약 스케줄로 변환할 있다. Markdown Export / Import (status 섹션 + GFM 체크박스 + HTML 주석 메타데이터)로 다른 머신에 옮기거나 GitHub / Obsidian / 어떤 Markdown 뷰어에서도 그대로 열어볼 수 있고, `.md` 파일을 카드에 드래그하면 바로 Import된다.
143
+ ### 내장 Git 클라이언트
144
+ UI 안에 Fork/SourceTree 스타일 풀 Git 클라이언트가 내장되어 있다 워크스페이스 메뉴로 **File Status** 뷰(staged/unstaged 파일 리스트, working tree diff 뷰어, 커밋 메시지 + push 토글, Cmd/Ctrl+Enter 커밋)와 **History** 뷰(커밋 그래프, 액션 툴바, 워크트리 목록, VS Code 스타일 브랜치 컨텍스트 메뉴: 체크아웃 / 머지 / 리베이스 / 페치 / / 푸시 / 이름 변경 / 삭제, 파일 단위 diff 뷰어가 붙은 커밋 상세 패널)를 전환한다. 모든 분할 영역은 사용자가 직접 비율을 조절할 수 있고, 비율은 localStorage에 영속된다. 한글·CJK·이모지 등 비-ASCII 파일명도 diff / status 출력에 제대로 표시된다.
131
145
 
132
146
  <div align="center">
133
- <img src="https://raw.githubusercontent.com/HyperAITeam/CLITrigger/main/docs/images/screenshot-planer.png" alt="Planner경량 작업 관리" width="800">
134
- <p><em>인라인 편집, 컬러 태그, 이미지 첨부, 원클릭 TODO/스케줄 변환</em></p>
147
+ <img src="https://raw.githubusercontent.com/HyperAITeam/CLITrigger/main/docs/images/screenshot-git.png" alt="Git내장 클라이언트" width="800">
148
+ <p><em>커밋 그래프, 브랜치 작업, 파일 diff까지 브라우저 안에서</em></p>
135
149
  </div>
136
150
 
137
- ### Analytics (분석)
151
+ ### Analytics (통계)
138
152
  프로젝트별 비용·실행 통계를 Recharts 기반 차트로 시각화 — CLI 도구별 누적 막대, 상태별 도넛, 시간에 따른 비용/토큰 라인 차트를 제공한다. DB에 비정규화된 비용 컬럼을 두어 긴 실행 이력에서도 집계가 빠르다.
139
153
 
140
154
  <div align="center">
@@ -142,16 +156,8 @@ TODO와는 별개인 경량 작업 플래너 — 아이디어를 빠르게 적
142
156
  <p><em>CLI·상태·시간 축으로 나눠 보는 비용과 토큰 사용량</em></p>
143
157
  </div>
144
158
 
145
- ### 내장 Git 클라이언트
146
- UI 안에 Fork/SourceTree 스타일 Git 클라이언트가 내장되어 있다 워크스페이스 메뉴로 **File Status** 뷰(staged/unstaged 파일 리스트, working tree diff 뷰어, 커밋 메시지 + push 토글, Cmd/Ctrl+Enter 커밋)와 **History** 뷰(커밋 그래프, 액션 툴바, 워크트리 목록, VS Code 스타일 브랜치 컨텍스트 메뉴: 체크아웃 / 머지 / 리베이스 / 페치 / / 푸시 / 이름 변경 / 삭제, 파일 단위 diff 뷰어가 붙은 커밋 상세 패널) 전환한다. 모든 분할 영역은 사용자가 직접 비율을 조절할 있고, 비율은 localStorage에 영속된다. 한글·CJK·이모지 비-ASCII 파일명도 diff / status 출력에 제대로 표시된다.
147
-
148
- <div align="center">
149
- <img src="https://raw.githubusercontent.com/HyperAITeam/CLITrigger/main/docs/images/screenshot-git.png" alt="Git — 내장 클라이언트" width="800">
150
- <p><em>커밋 그래프, 브랜치 작업, 파일 diff까지 브라우저 안에서</em></p>
151
- </div>
152
-
153
- ### 인터랙티브 세션 (Sessions)
154
- 긴 생애주기의 인터랙티브 CLI 세션을 1급 엔티티로 관리 — Claude / Gemini / Codex 세션을 내장 터미널로 띄우고, 세션별로 워크트리 격리 여부를 선택할 수 있다. PTY 출력에서 스피너 노이즈를 걸러내고 assistant / tool-use 블록으로 분류해, Chat 모드 로그 뷰어에서도 깔끔하게 읽힌다.
159
+ ### Morning Review Queue (아침 리뷰 큐)
160
+ "밤새 위임하고 아침에 리뷰" 루프를 위한 크로스-프로젝트 단일 트리아주 화면. 모든 프로젝트의 최근 TODO를 카드 스택으로 모아 프로젝트 라벨, 마지막 어시스턴트 한 줄 요약, 토큰 합계, diff 통계, 서버 분류 risk 배지(low / medium / high 상태와 diff 크기 기반)를 한눈에 보여준다. 키보드 전용 조작: `j`/`k`로 이동, `Enter`로 임베드 로그 뷰어, `Space` / `→`로 변경 파일과 diff를 카드에서 바로 펼치기, `m` 머지, `d` discard, `Esc`로 닫기 N개 todo가 O(N) 입력으로 끝난다. 시간 윈도우(12h / 24h / 7d), 필터 칩(All / Risky / Quick wins / Failed), CLI별 분해가 표시되는 sticky 토큰 리본까지. 워크트리가 정리된 뒤에도 브랜치 ref `master`/`main` 폴백으로 인라인 diff를 끝까지 보여준다.
155
161
 
156
162
  ### 실시간 로그 (Chat & Raw)
157
163
  WebSocket으로 실행 로그를 실시간 스트리밍하며 두 가지 뷰를 지원한다 — Chat 모드는 assistant 메시지를 마크다운으로 렌더링하고 tool-use 행을 접을 수 있으며, Raw 모드는 플랫 터미널 뷰다. 다중 라운드 Continue는 CLI의 네이티브 `--continue` 플래그를 사용해 동일 워크트리를 재사용한다.
@@ -159,9 +165,6 @@ WebSocket으로 실행 로그를 실시간 스트리밍하며 두 가지 뷰를
159
165
  ### 멀티 CLI & 샌드박스
160
166
  Claude / Gemini / Codex CLI를 프로젝트·TODO·토론 에이전트별로 선택한다. 엄격(strict) 샌드박스 모드에서는 각 CLI의 네이티브 샌드박싱(Claude `settings.json`, Codex `--full-auto`, Gemini 프롬프트 단 제한)을 사용해 파일 접근을 워크트리 디렉토리로 제한한다.
161
167
 
162
- ### 플러그인 시스템
163
- Jira, GitHub, Notion 연동과 gstack 스킬 주입이 자가 완결형 플러그인으로 제공된다. `external-service`(REST 프록시 + 패널 탭)와 `execution-hook`(오케스트레이터 사전 실행 훅) 두 카테고리를 지원한다. 새 통합을 추가하려면 매니페스트와 `registerPlugin()` 호출만 있으면 되고, 코어 코드를 건드릴 필요가 없다.
164
-
165
168
  ### 외부 접속
166
169
  Cloudflare Tunnel로 어디서든 폰·노트북으로 제어한다. 작업이나 토론이 완료되면 브라우저 알림이 울리므로, 자리를 비워도 상태를 놓치지 않는다.
167
170
 
@@ -0,0 +1 @@
1
+ @import"https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&family=JetBrains+Mono:wght@400;500;700&display=swap";.react-flow{direction:ltr;--xy-edge-stroke-default: #b1b1b7;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #555;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(255, 255, 255, .5);--xy-minimap-background-color-default: #fff;--xy-minimap-mask-background-color-default: rgba(240, 240, 240, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #e2e2e2;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: transparent;--xy-background-pattern-dots-color-default: #91919a;--xy-background-pattern-lines-color-default: #eee;--xy-background-pattern-cross-color-default: #e2e2e2;background-color:var(--xy-background-color, var(--xy-background-color-default));--xy-node-color-default: inherit;--xy-node-border-default: 1px solid #1a192b;--xy-node-background-color-default: #fff;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #1a192b;--xy-node-border-radius-default: 3px;--xy-handle-background-color-default: #1a192b;--xy-handle-border-color-default: #fff;--xy-selection-background-color-default: rgba(0, 89, 220, .08);--xy-selection-border-default: 1px dotted rgba(0, 89, 220, .8);--xy-controls-button-background-color-default: #fefefe;--xy-controls-button-background-color-hover-default: #f4f4f4;--xy-controls-button-color-default: inherit;--xy-controls-button-color-hover-default: inherit;--xy-controls-button-border-color-default: #eee;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #ffffff;--xy-edge-label-color-default: inherit;--xy-resize-background-color-default: #3367d9}.react-flow.dark{--xy-edge-stroke-default: #3e3e3e;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #727272;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(150, 150, 150, .25);--xy-minimap-background-color-default: #141414;--xy-minimap-mask-background-color-default: rgba(60, 60, 60, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #2b2b2b;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: #141414;--xy-background-pattern-dots-color-default: #777;--xy-background-pattern-lines-color-default: #777;--xy-background-pattern-cross-color-default: #777;--xy-node-color-default: #f8f8f8;--xy-node-border-default: 1px solid #3c3c3c;--xy-node-background-color-default: #1e1e1e;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #999;--xy-handle-background-color-default: #bebebe;--xy-handle-border-color-default: #1e1e1e;--xy-selection-background-color-default: rgba(200, 200, 220, .08);--xy-selection-border-default: 1px dotted rgba(200, 200, 220, .8);--xy-controls-button-background-color-default: #2b2b2b;--xy-controls-button-background-color-hover-default: #3e3e3e;--xy-controls-button-color-default: #f8f8f8;--xy-controls-button-color-hover-default: #fff;--xy-controls-button-border-color-default: #5b5b5b;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #141414;--xy-edge-label-color-default: #f8f8f8}.react-flow__background{background-color:var(--xy-background-color-props, var(--xy-background-color, var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.react-flow__pane{z-index:1}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{overflow:visible;position:absolute;pointer-events:none}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__arrowhead polyline{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke, var(--xy-edge-stroke-default))}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}svg.react-flow__connectionline{z-index:1001;overflow:visible;position:absolute}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.react-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.react-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background-color:var(--xy-handle-background-color, var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));border-radius:100%}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;left:50%;bottom:0;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__pane.selection .react-flow__panel{pointer-events:none}.react-flow__panel{position:absolute;z-index:5;margin:15px}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.top.center,.react-flow__panel.bottom.center{left:50%;transform:translate(-15px) translate(-50%)}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.left.center,.react-flow__panel.right.center{top:50%;transform:translateY(-15px) translateY(-50%)}.react-flow__attribution{font-size:10px;background:var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));padding:2px 3px;margin:0}.react-flow__attribution a{text-decoration:none;color:#999}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;left:0;top:0}.react-flow__viewport-portal{position:absolute;width:100%;height:100%;left:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__minimap{background:var( --xy-minimap-background-color-props, var(--xy-minimap-background-color, var(--xy-minimap-background-color-default)) )}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var( --xy-minimap-mask-background-color-props, var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default)) );stroke:var( --xy-minimap-mask-stroke-color-props, var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default)) );stroke-width:var( --xy-minimap-mask-stroke-width-props, var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default)) )}.react-flow__minimap-node{fill:var( --xy-minimap-node-background-color-props, var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default)) );stroke:var( --xy-minimap-node-stroke-color-props, var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default)) );stroke-width:var( --xy-minimap-node-stroke-width-props, var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default)) )}.react-flow__background-pattern.dots{fill:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default)) )}.react-flow__background-pattern.lines{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default)) )}.react-flow__background-pattern.cross{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default)) )}.react-flow__controls{display:flex;flex-direction:column;box-shadow:var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default))}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{display:flex;justify-content:center;align-items:center;height:26px;width:26px;padding:4px;border:none;background:var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));border-bottom:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) );color:var( --xy-controls-button-color-props, var(--xy-controls-button-color, var(--xy-controls-button-color-default)) );cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__controls-button svg{width:100%;max-width:12px;max-height:12px;fill:currentColor}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{padding:10px;border-radius:var(--xy-node-border-radius, var(--xy-node-border-radius-default));width:150px;font-size:12px;color:var(--xy-node-color, var(--xy-node-color-default));text-align:center;border:var(--xy-node-border, var(--xy-node-border-default));background-color:var(--xy-node-background-color, var(--xy-node-background-color-default))}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color, var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color, var(--xy-selection-background-color-default));border:var(--xy-selection-border, var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var( --xy-controls-button-background-color-hover-props, var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default)) );color:var( --xy-controls-button-color-hover-props, var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default)) )}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__controls.horizontal .react-flow__controls-button{border-bottom:none;border-right:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) )}.react-flow__controls.horizontal .react-flow__controls-button:last-child{border-right:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{width:5px;height:5px;border:1px solid #fff;border-radius:1px;background-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));translate:-50% -50%}.react-flow__resize-control.handle.left{left:0;top:50%}.react-flow__resize-control.handle.right{left:100%;top:50%}.react-flow__resize-control.handle.top{left:50%;top:0}.react-flow__resize-control.handle.bottom{left:50%;top:100%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));border-width:0;border-style:solid}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.react-flow__resize-control.line.left{left:0;border-left-width:1px}.react-flow__resize-control.line.right{left:100%;border-right-width:1px}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.react-flow__resize-control.line.top{top:0;border-top-width:1px}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color, var(--xy-edge-label-color-default))}*,: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:Inter,system-ui,-apple-system,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:JetBrains Mono,Fira Code,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{color-scheme:light;--color-bg-primary: #F5F5F7;--color-bg-secondary: #EDEDF0;--color-bg-tertiary: #E2E2E8;--color-bg-card: #FFFFFF;--color-bg-input: #EEEEF2;--color-bg-hover: #E5E5EB;--color-bg-active: #D1D1D6;--color-text-primary: #1D1D1F;--color-text-secondary: #6E6E73;--color-text-tertiary: #7C7C82;--color-text-muted: #AEAEB2;--color-text-faint: #C7C7CC;--color-border: #D8D8DD;--color-border-strong: #C7C7CC;--color-border-muted: rgba(0, 0, 0, .1);--color-accent: #0071E3;--color-accent-light: #4DA3FF;--color-accent-dark: #0058B0;--color-accent-amber: #FF9500;--color-scrollbar: #D1D1D6;--color-scrollbar-hover: #AEAEB2;--color-selection-bg: rgba(0, 113, 227, .15);--color-selection-text: #1D1D1F;--shadow-soft: 0 1px 2px -1px rgba(0,0,0,.04), 0 2px 8px -2px rgba(0,0,0,.06), 0 0 0 1px rgba(0,0,0,.02);--shadow-card: 0 4px 6px -2px rgba(0,0,0,.05), 0 12px 24px -4px rgba(0,0,0,.08), 0 0 0 1px rgba(0,0,0,.03);--shadow-elevated: 0 8px 16px -4px rgba(0,0,0,.08), 0 24px 48px -8px rgba(0,0,0,.12), 0 0 0 1px rgba(0,0,0,.04);--shadow-accent: 0 8px 20px -4px rgba(0, 113, 227, .2), 0 4px 12px -2px rgba(0, 113, 227, .1);--color-bg-gradient: radial-gradient(ellipse 80% 50% at 50% -20%, rgba(0,113,227,.03), transparent 50%), radial-gradient(ellipse 60% 40% at 80% 50%, rgba(175,82,222,.02), transparent 50%)}[data-theme=dark]{color-scheme:dark;--color-bg-primary: #141414;--color-bg-secondary: #1A1A1A;--color-bg-tertiary: #2C2C2C;--color-bg-card: #222222;--color-bg-input: #2C2C2C;--color-bg-hover: #363636;--color-bg-active: #444444;--color-text-primary: #F0F0F0;--color-text-secondary: #A8A8A8;--color-text-tertiary: #858585;--color-text-muted: #5A5A5A;--color-text-faint: #3C3C3C;--color-border: #333333;--color-border-strong: #444444;--color-border-muted: rgba(255, 255, 255, .1);--color-accent: #4B8DFF;--color-accent-light: #7BABFF;--color-accent-dark: #3370E0;--color-accent-amber: #FF9F0A;--color-scrollbar: #3A3A3A;--color-scrollbar-hover: #555555;--color-selection-bg: rgba(75, 141, 255, .25);--color-selection-text: #EBEBEB;--shadow-soft: 0 1px 2px -1px rgba(0,0,0,.2), 0 2px 8px -2px rgba(0,0,0,.3), 0 0 0 1px rgba(255,255,255,.03);--shadow-card: 0 4px 6px -2px rgba(0,0,0,.3), 0 12px 24px -4px rgba(0,0,0,.4), 0 0 0 1px rgba(255,255,255,.04);--shadow-elevated: 0 8px 16px -4px rgba(0,0,0,.4), 0 24px 48px -8px rgba(0,0,0,.5), 0 0 0 1px rgba(255,255,255,.05);--shadow-accent: 0 8px 20px -4px rgba(75, 141, 255, .25), 0 4px 12px -2px rgba(75, 141, 255, .15);--color-bg-gradient: radial-gradient(ellipse 80% 50% at 50% -20%, rgba(75,141,255,.06), transparent 50%), radial-gradient(ellipse 60% 40% at 80% 50%, rgba(175,82,222,.04), transparent 50%)}html,body{background:var(--color-bg-gradient),var(--color-bg-primary);color:var(--color-text-primary);font-family:Inter,system-ui,-apple-system,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:15px;line-height:1.6}h1,h2,h3,h4,h5,h6{font-weight:600;letter-spacing:-.025em;color:var(--color-text-primary);line-height:1.25}p{line-height:1.625;color:var(--color-text-secondary)}.text-primary{color:var(--color-text-primary);font-weight:600}.text-secondary{color:var(--color-text-secondary);font-weight:500}.text-muted{color:var(--color-text-muted);font-weight:400}a,button,input,select,textarea,.card{transition:all .3s cubic-bezier(.4,0,.2,1)}::-moz-selection{background-color:var(--color-selection-bg);color:var(--color-selection-text)}::selection{background-color:var(--color-selection-bg);color:var(--color-selection-text)}::-webkit-scrollbar{width:5px;height:5px}::-webkit-scrollbar-track{background-color:transparent}::-webkit-scrollbar-thumb{background-color:var(--color-scrollbar);border-radius:9999px;border-width:2px;border-color:transparent;background-clip:padding-box;-webkit-transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}::-webkit-scrollbar-thumb:hover{background-color:var(--color-scrollbar-hover)}.container{width:100%}@media(min-width:640px){.container{max-width:640px}}@media(min-width:768px){.container{max-width:768px}}@media(min-width:1024px){.container{max-width:1024px}}@media(min-width:1280px){.container{max-width:1280px}}@media(min-width:1536px){.container{max-width:1536px}}.card{background-color:var(--color-bg-card);border:1px solid var(--color-border-muted);box-shadow:var(--shadow-soft),inset 0 1px #ffffff0f;position:relative;overflow:hidden;border-radius:.75rem;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.3s}.card:before{content:"";position:absolute;top:0;left:0;right:0;height:2px;background:linear-gradient(90deg,transparent 10%,rgba(0,113,227,.15) 50%,transparent 90%);z-index:1;pointer-events:none;opacity:0;transition:opacity .3s ease}.card:hover:before{opacity:1}[data-theme=dark] .card:before{background:linear-gradient(90deg,transparent 10%,rgba(75,141,255,.2) 50%,transparent 90%)}.card:hover{border-color:var(--color-border-strong);box-shadow:var(--shadow-card),inset 0 1px #ffffff14;transform:translateY(-2px)}.btn-primary{background-color:var(--color-bg-tertiary);color:var(--color-accent);border:1px solid var(--color-border);position:relative;display:inline-flex;align-items:center;justify-content:center;gap:.5rem;overflow:hidden;border-radius:.75rem;padding:.625rem 1.5rem;font-weight:600;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.3s}.btn-primary: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))}.btn-primary:disabled{cursor:not-allowed;opacity:.4}.btn-primary:hover:disabled{transform: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)}.btn-primary:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background:radial-gradient(circle,rgba(255,255,255,.25) 0%,transparent 70%);transform:scale(0);opacity:0;transition:transform .4s ease,opacity .4s ease;pointer-events:none}.btn-primary:active:not(:disabled):after{transform:scale(2);opacity:1;transition:0s}.btn-primary:hover:not(:disabled){border-color:var(--color-accent);background-color:var(--color-accent);color:#fff}.btn-secondary{background-color:var(--color-bg-tertiary);color:var(--color-text-secondary);border:1px solid var(--color-border-muted);box-shadow:0 1px 2px #0000000a,inset 0 1px #ffffff0a;display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:.75rem;padding:.625rem 1.5rem;font-weight:600;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.3s}.btn-secondary:hover{--tw-translate-y: -.125rem;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));background-color:var(--color-bg-active);color:var(--color-text-primary);--tw-shadow: var(--shadow-soft);--tw-shadow-colored: var(--shadow-soft);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.btn-secondary: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));--tw-brightness: brightness(.9);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)}.btn-secondary:disabled{cursor:not-allowed;opacity:.4}.btn-secondary:hover:disabled{transform:none}.btn-danger{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:.75rem;background-color:#ff3b301a;padding:.625rem 1.5rem;font-weight:600;--tw-text-opacity: 1;color:rgb(255 59 48 / var(--tw-text-opacity, 1));transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.3s}.btn-danger:hover{--tw-translate-y: -.125rem;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));--tw-bg-opacity: 1;background-color:rgb(255 59 48 / var(--tw-bg-opacity, 1));--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1));--tw-shadow: 0 10px 15px -3px rgba(0, 0, 0, .1), 0 4px 6px -4px rgba(0, 0, 0, .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);--tw-shadow-color: rgb(255 59 48 / .2);--tw-shadow: var(--tw-shadow-colored)}.btn-danger: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));--tw-brightness: brightness(.9);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)}.btn-danger:disabled{cursor:not-allowed;opacity:.4}.btn-danger:hover:disabled{transform:none}.btn-ghost{color:var(--color-text-tertiary);display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border-radius:.75rem;padding:.5rem .75rem;font-weight:500;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.3s}.btn-ghost:hover{--tw-translate-y: -.125rem;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));background-color:var(--color-bg-tertiary);color:var(--color-text-primary)}.btn-ghost: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));background-color:var(--color-bg-active)}.btn-ghost:disabled{cursor:not-allowed;opacity:.3}.btn-ghost:hover:disabled{transform:none}.btn-sm{gap:.375rem;border-radius:.5rem;padding:.375rem .75rem;font-size:.75rem;line-height:1rem}.input-field{background-color:var(--color-bg-input);border:1px solid var(--color-border-strong);color:var(--color-text-primary);box-shadow:inset 0 1px 2px #00000005;width:100%;border-radius:.75rem;padding:.75rem 1rem;font-size:.875rem;line-height:1.25rem;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.3s}.input-field:focus{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));outline:2px solid transparent;outline-offset:2px;--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)}@media(prefers-color-scheme:dark){.input-field:focus{background-color:#0003}}select{color-scheme:inherit}select option{background-color:var(--color-bg-card);color:var(--color-text-primary)}.input-field::-moz-placeholder{color:var(--color-text-faint)}.input-field::placeholder{color:var(--color-text-faint)}.input-field:focus{border-color:var(--color-accent);box-shadow:0 0 0 3px var(--color-selection-bg),0 0 12px -2px #0071e31a,inset 0 1px 2px #00000005;--tw-ring-color: transparent;transform:translateY(-1px)}[data-theme=dark] .input-field:focus{box-shadow:0 0 0 3px var(--color-selection-bg),0 0 12px -2px #4b8dff26,inset 0 1px 2px #0000001a}.badge{display:inline-flex;flex-shrink:0;cursor:default;align-items:center;gap:.375rem;white-space:nowrap;border-radius:9999px;padding:.25rem .625rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s;font-size:10px;line-height:1.4}.badge:hover{--tw-scale-x: 1.05;--tw-scale-y: 1.05;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))}.badge{position:relative}.badge:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:inherit;border:1px solid currentColor;opacity:.15;pointer-events:none}.panel{border-radius:.75rem;padding:1rem;border:1px solid var(--color-border)}.lang-toggle{background-color:var(--color-bg-tertiary);color:var(--color-text-tertiary)}.lang-toggle.h-screen>aside{border-right:1px solid var(--color-border)}.lang-toggle{display:flex;height:2.25rem;width:2.25rem;align-items:center;justify-content:center;border-radius:.75rem;font-weight:700;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.3s;font-size:10px;line-height:1.4}.lang-toggle:hover{--tw-translate-y: -.125rem;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));background-color:var(--color-accent);--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1));--tw-shadow: var(--shadow-accent);--tw-shadow-colored: var(--shadow-accent);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);--tw-shadow-color: var(--color-accent);--tw-shadow: var(--tw-shadow-colored)}.lang-toggle: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));--tw-brightness: brightness(.9);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)}.markdown-content{font-size:.75rem;line-height:1rem;line-height:1.625;color:var(--color-text-primary)}.markdown-content h1,.markdown-content h2,.markdown-content h3,.markdown-content h4{margin-top:.75rem;margin-bottom:.375rem;font-weight:600;color:var(--color-text-primary)}.markdown-content h1{font-size:1rem;line-height:1.5rem}.markdown-content h2{font-size:.875rem;line-height:1.25rem}.markdown-content h3{font-size:.75rem;line-height:1rem;font-weight:700}.markdown-content p{margin-bottom:.5rem}.markdown-content p:last-child{margin-bottom:0}.markdown-content ul,.markdown-content ol{margin-left:1rem;margin-bottom:.5rem}.markdown-content ul{list-style-type:disc}.markdown-content ol{list-style-type:decimal}.markdown-content li{margin-bottom:.125rem}.markdown-content code{background-color:var(--color-bg-tertiary);border-radius:.25rem;padding:.125rem .25rem;font-family:JetBrains Mono,Fira Code,monospace;font-size:.75rem;line-height:1rem}.markdown-content pre{background-color:var(--color-bg-tertiary);border:1px solid var(--color-border);margin-bottom:.5rem;overflow-x:auto;border-radius:.5rem;padding:.5rem}.markdown-content pre code{background-color:transparent;padding:0}.markdown-content table{border-color:var(--color-border-strong);margin-bottom:.5rem;width:100%;border-collapse:collapse;font-size:.75rem;line-height:1rem}.markdown-content th,.markdown-content td{border-color:var(--color-border-strong);border-width:1px;padding:.25rem .5rem;text-align:left}.markdown-content th{background-color:var(--color-bg-tertiary);font-weight:600}.markdown-content blockquote{border-left-color:var(--color-accent);color:var(--color-text-secondary);margin-bottom:.5rem;border-left-width:2px;padding-left:.75rem;font-style:italic}.markdown-content a{color:var(--color-accent);text-decoration-line:underline}.markdown-content a:hover{color:var(--color-accent-dark)}.markdown-content hr{border-color:var(--color-border);margin-top:.75rem;margin-bottom:.75rem}.markdown-content strong{font-weight:600;color:var(--color-text-primary)}.markdown-content input[type=checkbox]{margin-right:.375rem}.markdown-content-dark{font-size:.75rem;line-height:1rem;line-height:1.625;color:#d4d4d4}.markdown-content-dark h1,.markdown-content-dark h2,.markdown-content-dark h3,.markdown-content-dark h4{color:#e6e6e6;margin-top:.5rem;margin-bottom:.25rem;font-weight:600}.markdown-content-dark h1{font-size:.875rem;line-height:1.25rem}.markdown-content-dark h2,.markdown-content-dark h3{font-size:.75rem;line-height:1rem;font-weight:700}.markdown-content-dark p{margin-bottom:.375rem;line-height:1.625}.markdown-content-dark ul,.markdown-content-dark ol{margin-left:1rem;margin-bottom:.5rem}.markdown-content-dark ul{list-style-type:disc}.markdown-content-dark ol{list-style-type:decimal}.markdown-content-dark li{margin-bottom:.125rem}.markdown-content-dark code{background:#ffffff14;color:#ce9178;border-radius:.25rem;padding:.125rem .25rem;font-size:.75rem;line-height:1rem}.markdown-content-dark pre{background:#0000004d;border:1px solid #3c3c3c;margin-bottom:.5rem;overflow-x:auto;border-radius:.5rem;padding:.5rem}.markdown-content-dark pre code{background-color:transparent;padding:0}.markdown-content-dark table{border-color:#3c3c3c;margin-bottom:.5rem;width:100%;border-collapse:collapse;font-size:.75rem;line-height:1rem}.markdown-content-dark th,.markdown-content-dark td{border:1px solid #3c3c3c;padding:.25rem .5rem}.markdown-content-dark th{background:#ffffff0d}.markdown-content-dark blockquote{border-left:3px solid #b392f0;color:#8b949e;margin-top:.5rem;margin-bottom:.5rem;margin-left:0;padding-left:.75rem}.markdown-content-dark a{color:#79c0ff;text-decoration-line:underline}.markdown-content-dark a:hover{color:#a5d6ff}.markdown-content-dark strong{font-weight:600;color:#e6e6e6}.markdown-content-dark hr{border-color:#3c3c3c;margin-top:.75rem;margin-bottom:.75rem}.glass{border-width:1px;border-color:#fff3;--tw-backdrop-blur: blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);background:#ffffffb3}:is([data-theme=dark] .glass){border-color:#ffffff1a;background:color-mix(in srgb,var(--color-bg-secondary) 85%,transparent)}.glass-card{border-width:1px;--tw-shadow: 0 8px 32px 0 rgba(31, 38, 135, .1), inset 0 0 0 1px rgba(255, 255, 255, .1);--tw-shadow-colored: 0 8px 32px 0 var(--tw-shadow-color), inset 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);--tw-backdrop-blur: blur(24px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);background:color-mix(in srgb,var(--color-bg-secondary) 80%,transparent);border-color:color-mix(in srgb,var(--color-bg-tertiary) 50%,transparent)}:is([data-theme=dark] .glass-card){border-color:#ffffff1a;background:color-mix(in srgb,var(--color-bg-card) 85%,transparent)}.flex.h-screen>aside{border-right:1px solid var(--color-border)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.collapse{visibility:collapse}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.\!-bottom-1\.5{bottom:-.375rem!important}.\!-top-1\.5{top:-.375rem!important}.-right-0\.5{right:-.125rem}.-right-1\.5{right:-.375rem}.-top-0\.5{top:-.125rem}.-top-1\.5{top:-.375rem}.bottom-0{bottom:0}.bottom-1\/4{bottom:25%}.bottom-6{bottom:1.5rem}.left-0{left:0}.left-4{left:1rem}.right-0{right:0}.right-2{right:.5rem}.right-3{right:.75rem}.right-6{right:1.5rem}.top-0{top:0}.top-1\/2{top:50%}.top-1\/4{top:25%}.top-3{top:.75rem}.top-6{top:1.5rem}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-modal{z-index:100}.z-overlay{z-index:30}.z-sticky{z-index:60}.z-toast{z-index:150}.z-tooltip{z-index:200}.order-none{order:0}.-mx-4{margin-left:-1rem;margin-right:-1rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.mx-auto{margin-left:auto;margin-right:auto}.my-0\.5{margin-top:.125rem;margin-bottom:.125rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-4{margin-top:1rem;margin-bottom:1rem}.-mb-px{margin-bottom:-1px}.-ml-1{margin-left:-.25rem}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-10{margin-bottom:2.5rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-0\.5{margin-left:.125rem}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-5{margin-left:1.25rem}.ml-6{margin-left:1.5rem}.ml-8{margin-left:2rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-auto{margin-right:auto}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-auto{margin-top:auto}.line-clamp-1{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.\!block{display:block!important}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1 / 1}.\!h-3{height:.75rem!important}.h-0\.5{height:.125rem}.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-20{height:5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[600px\]{height:600px}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-32{max-height:8rem}.max-h-40{max-height:10rem}.max-h-48{max-height:12rem}.max-h-60{max-height:15rem}.max-h-64{max-height:16rem}.max-h-80{max-height:20rem}.max-h-\[85vh\]{max-height:85vh}.max-h-\[90vh\]{max-height:90vh}.min-h-0{min-height:0px}.min-h-\[100px\]{min-height:100px}.min-h-\[38px\]{min-height:38px}.min-h-\[60px\]{min-height:60px}.min-h-\[80px\]{min-height:80px}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.\!w-3{width:.75rem!important}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-1\/4{width:25%}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\/3{width:66.666667%}.w-20{width:5rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-32{width:8rem}.w-36{width:9rem}.w-4{width:1rem}.w-4\/6{width:66.666667%}.w-40{width:10rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-5\/6{width:83.333333%}.w-52{width:13rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-60{width:15rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-\[14px\]{width:14px}.w-\[160px\]{width:160px}.w-\[180px\]{width:180px}.w-\[380px\]{width:380px}.w-\[3px\]{width:3px}.w-\[420px\]{width:420px}.w-\[480px\]{width:480px}.w-auto{width:auto}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-7{min-width:1.75rem}.min-w-\[120px\]{min-width:120px}.min-w-\[14px\]{min-width:14px}.min-w-\[160px\]{min-width:160px}.min-w-\[200px\]{min-width:200px}.min-w-\[220px\]{min-width:220px}.min-w-\[240px\]{min-width:240px}.min-w-\[280px\]{min-width:280px}.min-w-\[80px\]{min-width:80px}.max-w-4xl{max-width:56rem}.max-w-\[10rem\]{max-width:10rem}.max-w-\[280px\]{max-width:280px}.max-w-\[60\%\]{max-width:60%}.max-w-\[80\%\]{max-width:80%}.max-w-\[90vw\]{max-width:90vw}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.basis-\[calc\(100\%-100px\)\]{flex-basis:calc(100% - 100px)}.-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{--tw-translate-y: -.25rem;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-8{--tw-translate-x: 2rem;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))}.scale-110{--tw-scale-x: 1.1;--tw-scale-y: 1.1;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))}.transform{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 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 fadeIn{0%{opacity:0}to{opacity:1}}.animate-fade-in{animation:fadeIn .4s cubic-bezier(.4,0,.2,1)}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes scaleIn{0%{opacity:0;transform:scale(.92)}to{opacity:1;transform:scale(1)}}.animate-scale-in{animation:scaleIn .3s cubic-bezier(.34,1.56,.64,1)}@keyframes slideInRight{0%{opacity:0;transform:translate(20px)}to{opacity:1;transform:translate(0)}}.animate-slide-in-right{animation:slideInRight .4s cubic-bezier(.4,0,.2,1)}@keyframes slideUp{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}.animate-slide-up{animation:slideUp .4s cubic-bezier(.4,0,.2,1)}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-col-resize{cursor:col-resize}.cursor-context-menu{cursor:context-menu}.cursor-grab{cursor:grab}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-row-resize{cursor:row-resize}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize-none{resize:none}.resize-y{resize:vertical}.resize{resize:both}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.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-cols-5{grid-template-columns:repeat(5,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}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0{gap:0px}.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-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-1{row-gap:.25rem}.gap-y-2{row-gap:.5rem}.-space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(-.25rem * var(--tw-space-x-reverse));margin-left:calc(-.25rem * calc(1 - var(--tw-space-x-reverse)))}.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-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * 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))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.space-y-px>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1px * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-warm-100>:not([hidden])~:not([hidden]){border-color:var(--color-bg-primary)}.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-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.\!rounded-lg{border-radius:.5rem!important}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-none{border-radius:0}.rounded-xl{border-radius:.75rem}.rounded-b-lg{border-bottom-right-radius:.5rem;border-bottom-left-radius:.5rem}.rounded-r-full{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.\!border-2{border-width:2px!important}.border{border-width:1px}.border-0{border-width:0px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-l-4{border-left-width:4px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-none{border-style:none}.\!border-warm-200{border-color:var(--color-bg-tertiary)!important}.\!border-warm-300{border-color:var(--color-border-strong)!important}.\!border-white{--tw-border-opacity: 1 !important;border-color:rgb(255 255 255 / var(--tw-border-opacity, 1))!important}.border-accent{border-color:var(--color-accent)}.border-amber-200{--tw-border-opacity: 1;border-color:rgb(253 230 138 / var(--tw-border-opacity, 1))}.border-amber-500\/30{border-color:#f59e0b4d}.border-blue-200{--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1))}.border-blue-300{--tw-border-opacity: 1;border-color:rgb(147 197 253 / var(--tw-border-opacity, 1))}.border-blue-300\/30{border-color:#93c5fd4d}.border-cyan-400{--tw-border-opacity: 1;border-color:rgb(34 211 238 / var(--tw-border-opacity, 1))}.border-emerald-200{--tw-border-opacity: 1;border-color:rgb(167 243 208 / var(--tw-border-opacity, 1))}.border-gray-700{--tw-border-opacity: 1;border-color:rgb(55 65 81 / var(--tw-border-opacity, 1))}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-red-300{--tw-border-opacity: 1;border-color:rgb(252 165 165 / var(--tw-border-opacity, 1))}.border-status-error\/20{border-color:#ff3b3033}.border-status-error\/30{border-color:#ff3b304d}.border-status-merged\/20{border-color:#af52de33}.border-status-merged\/30{border-color:#af52de4d}.border-status-success{--tw-border-opacity: 1;border-color:rgb(52 199 89 / var(--tw-border-opacity, 1))}.border-status-success\/30{border-color:#34c7594d}.border-status-warning{--tw-border-opacity: 1;border-color:rgb(255 149 0 / var(--tw-border-opacity, 1))}.border-status-warning\/20{border-color:#ff950033}.border-status-warning\/30{border-color:#ff95004d}.border-theme-border{border-color:var(--color-border)}.border-transparent{border-color:transparent}.border-warm-100{border-color:var(--color-bg-primary)}.border-warm-200{border-color:var(--color-bg-tertiary)}.border-warm-300{border-color:var(--color-border-strong)}.border-warm-50{border-color:var(--color-bg-secondary)}.border-warm-700{border-color:var(--color-text-secondary)}.border-white{--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.border-white\/80{border-color:#fffc}.border-l-accent{border-left-color:var(--color-accent)}.border-l-amber-500{--tw-border-opacity: 1;border-left-color:rgb(245 158 11 / var(--tw-border-opacity, 1))}.border-l-status-error{--tw-border-opacity: 1;border-left-color:rgb(255 59 48 / var(--tw-border-opacity, 1))}.border-l-status-merged{--tw-border-opacity: 1;border-left-color:rgb(175 82 222 / var(--tw-border-opacity, 1))}.border-l-status-running{--tw-border-opacity: 1;border-left-color:rgb(0 122 255 / var(--tw-border-opacity, 1))}.border-l-status-success{--tw-border-opacity: 1;border-left-color:rgb(52 199 89 / var(--tw-border-opacity, 1))}.border-l-status-warning{--tw-border-opacity: 1;border-left-color:rgb(255 149 0 / var(--tw-border-opacity, 1))}.border-l-warm-300{border-left-color:var(--color-border-strong)}.\!bg-accent{background-color:var(--color-accent)!important}.\!bg-amber-500{--tw-bg-opacity: 1 !important;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))!important}.\!bg-blue-500{--tw-bg-opacity: 1 !important;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))!important}.\!bg-cyan-500{--tw-bg-opacity: 1 !important;background-color:rgb(6 182 212 / var(--tw-bg-opacity, 1))!important}.\!bg-emerald-500{--tw-bg-opacity: 1 !important;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))!important}.\!bg-theme-card{background-color:var(--color-bg-card)!important}.\!bg-warm-100{background-color:var(--color-bg-primary)!important}.\!bg-warm-50{background-color:var(--color-bg-secondary)!important}.bg-\[\#1A1A1A\]{--tw-bg-opacity: 1;background-color:rgb(26 26 26 / var(--tw-bg-opacity, 1))}.bg-accent{background-color:var(--color-accent)}.bg-amber-100{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1))}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-amber-50\/50{background-color:#fffbeb80}.bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-amber-700{--tw-bg-opacity: 1;background-color:rgb(180 83 9 / var(--tw-bg-opacity, 1))}.bg-amber-800\/20{background-color:#92400e33}.bg-black\/50{background-color:#00000080}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-blue-50{--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.bg-blue-50\/50{background-color:#eff6ff80}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.bg-blue-500\/10{background-color:#3b82f61a}.bg-blue-500\/20{background-color:#3b82f633}.bg-cyan-50\/50{background-color:#ecfeff80}.bg-cyan-500\/10{background-color:#06b6d41a}.bg-emerald-50\/50{background-color:#ecfdf580}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-emerald-500\/10{background-color:#10b9811a}.bg-emerald-500\/20{background-color:#10b98133}.bg-gray-400{--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity, 1))}.bg-gray-500\/20{background-color:#6b728033}.bg-green-500\/20{background-color:#22c55e33}.bg-orange-500{--tw-bg-opacity: 1;background-color:rgb(249 115 22 / var(--tw-bg-opacity, 1))}.bg-orange-500\/20{background-color:#f9731633}.bg-pink-500{--tw-bg-opacity: 1;background-color:rgb(236 72 153 / var(--tw-bg-opacity, 1))}.bg-pink-500\/20{background-color:#ec489933}.bg-purple-100{--tw-bg-opacity: 1;background-color:rgb(243 232 255 / var(--tw-bg-opacity, 1))}.bg-purple-500{--tw-bg-opacity: 1;background-color:rgb(168 85 247 / var(--tw-bg-opacity, 1))}.bg-purple-500\/10{background-color:#a855f71a}.bg-purple-500\/20{background-color:#a855f733}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-50\/50{background-color:#fef2f280}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-red-500\/20{background-color:#ef444433}.bg-status-error{--tw-bg-opacity: 1;background-color:rgb(255 59 48 / var(--tw-bg-opacity, 1))}.bg-status-error\/10{background-color:#ff3b301a}.bg-status-error\/15{background-color:#ff3b3026}.bg-status-error\/5{background-color:#ff3b300d}.bg-status-info\/10{background-color:#8e8e931a}.bg-status-merged{--tw-bg-opacity: 1;background-color:rgb(175 82 222 / var(--tw-bg-opacity, 1))}.bg-status-merged\/10{background-color:#af52de1a}.bg-status-merged\/15{background-color:#af52de26}.bg-status-merged\/5{background-color:#af52de0d}.bg-status-running{--tw-bg-opacity: 1;background-color:rgb(0 122 255 / var(--tw-bg-opacity, 1))}.bg-status-running\/10{background-color:#007aff1a}.bg-status-success{--tw-bg-opacity: 1;background-color:rgb(52 199 89 / var(--tw-bg-opacity, 1))}.bg-status-success\/10{background-color:#34c7591a}.bg-status-success\/15{background-color:#34c75926}.bg-status-warning{--tw-bg-opacity: 1;background-color:rgb(255 149 0 / var(--tw-bg-opacity, 1))}.bg-status-warning\/10{background-color:#ff95001a}.bg-status-warning\/15{background-color:#ff950026}.bg-status-warning\/5{background-color:#ff95000d}.bg-theme-bg{background-color:var(--color-bg-primary)}.bg-theme-bg-tertiary{background-color:var(--color-bg-tertiary)}.bg-theme-card{background-color:var(--color-bg-card)}.bg-theme-hover{background-color:var(--color-bg-hover)}.bg-transparent{background-color:transparent}.bg-warm-100{background-color:var(--color-bg-primary)}.bg-warm-200{background-color:var(--color-bg-tertiary)}.bg-warm-300{background-color:var(--color-border-strong)}.bg-warm-50{background-color:var(--color-bg-secondary)}.bg-warm-700{background-color:var(--color-text-secondary)}.bg-warm-800{background-color:var(--color-text-primary)}.bg-warm-900{background-color:var(--color-selection-text)}.bg-white\/10{background-color:#ffffff1a}.bg-white\/20{background-color:#fff3}.bg-white\/70{background-color:#ffffffb3}.bg-white\/85{background-color:#ffffffd9}.bg-yellow-500{--tw-bg-opacity: 1;background-color:rgb(234 179 8 / var(--tw-bg-opacity, 1))}.bg-yellow-500\/20{background-color:#eab30833}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-10{padding:2.5rem}.p-12{padding:3rem}.p-16{padding:4rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.\!py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.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}.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-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-20{padding-top:5rem;padding-bottom:5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-0\.5{padding-bottom:.125rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-6{padding-bottom:1.5rem}.pb-px{padding-bottom:1px}.pl-1{padding-left:.25rem}.pl-12{padding-left:3rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pr-1{padding-right:.25rem}.pr-8{padding-right:2rem}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-6{padding-top:1.5rem}.pt-\[20vh\]{padding-top:20vh}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:JetBrains Mono,Fira Code,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.normal-case{text-transform:none}.italic{font-style:italic}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-accent{color:var(--color-accent)}.text-accent-dark{color:var(--color-accent-dark)}.text-amber-300{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.text-amber-500{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-amber-500\/60{color:#f59e0b99}.text-amber-500\/80{color:#f59e0bcc}.text-amber-600{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-cyan-500{--tw-text-opacity: 1;color:rgb(6 182 212 / var(--tw-text-opacity, 1))}.text-cyan-500\/60{color:#06b6d499}.text-cyan-600{--tw-text-opacity: 1;color:rgb(8 145 178 / var(--tw-text-opacity, 1))}.text-emerald-400{--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.text-emerald-500{--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity, 1))}.text-emerald-500\/70{color:#10b981b3}.text-emerald-600{--tw-text-opacity: 1;color:rgb(5 150 105 / var(--tw-text-opacity, 1))}.text-gray-100{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}.text-gray-200{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-orange-400{--tw-text-opacity: 1;color:rgb(251 146 60 / var(--tw-text-opacity, 1))}.text-orange-500{--tw-text-opacity: 1;color:rgb(249 115 22 / var(--tw-text-opacity, 1))}.text-orange-500\/60{color:#f9731699}.text-pink-400{--tw-text-opacity: 1;color:rgb(244 114 182 / var(--tw-text-opacity, 1))}.text-purple-400{--tw-text-opacity: 1;color:rgb(192 132 252 / var(--tw-text-opacity, 1))}.text-purple-500{--tw-text-opacity: 1;color:rgb(168 85 247 / var(--tw-text-opacity, 1))}.text-purple-600{--tw-text-opacity: 1;color:rgb(147 51 234 / var(--tw-text-opacity, 1))}.text-purple-700{--tw-text-opacity: 1;color:rgb(126 34 206 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-status-error{--tw-text-opacity: 1;color:rgb(255 59 48 / var(--tw-text-opacity, 1))}.text-status-error\/60{color:#ff3b3099}.text-status-info{--tw-text-opacity: 1;color:rgb(142 142 147 / var(--tw-text-opacity, 1))}.text-status-merged{--tw-text-opacity: 1;color:rgb(175 82 222 / var(--tw-text-opacity, 1))}.text-status-merged\/60{color:#af52de99}.text-status-running{--tw-text-opacity: 1;color:rgb(0 122 255 / var(--tw-text-opacity, 1))}.text-status-success{--tw-text-opacity: 1;color:rgb(52 199 89 / var(--tw-text-opacity, 1))}.text-status-success\/60{color:#34c75999}.text-status-warning{--tw-text-opacity: 1;color:rgb(255 149 0 / var(--tw-text-opacity, 1))}.text-status-warning\/60{color:#ff950099}.text-theme-accent{color:var(--color-accent)}.text-theme-muted{color:var(--color-text-muted)}.text-theme-text{color:var(--color-text-primary)}.text-theme-text-secondary{color:var(--color-text-secondary)}.text-theme-text-tertiary{color:var(--color-text-tertiary)}.text-warm-100{color:var(--color-bg-primary)}.text-warm-300{color:var(--color-border-strong)}.text-warm-400{color:var(--color-text-faint)}.text-warm-50{color:var(--color-bg-secondary)}.text-warm-500{color:var(--color-text-muted)}.text-warm-600{color:var(--color-text-tertiary)}.text-warm-700{color:var(--color-text-secondary)}.text-warm-800{color:var(--color-text-primary)}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-400{--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}.line-through{text-decoration-line:line-through}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.\!shadow-soft{--tw-shadow: var(--shadow-soft) !important;--tw-shadow-colored: var(--shadow-soft) !important;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)!important}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgba(0, 0, 0, .25);--tw-shadow-colored: 0 25px 50px -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-\[0_0_6px_rgba\(0\,0\,0\,0\.15\)\]{--tw-shadow: 0 0 6px rgba(0,0,0,.15);--tw-shadow-colored: 0 0 6px 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-card{--tw-shadow: var(--shadow-card);--tw-shadow-colored: var(--shadow-card);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-elevated{--tw-shadow: var(--shadow-elevated);--tw-shadow-colored: var(--shadow-elevated);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgba(0, 0, 0, .1), 0 2px 4px -2px rgba(0, 0, 0, .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -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 rgba(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)}.shadow-soft{--tw-shadow: var(--shadow-soft);--tw-shadow-colored: var(--shadow-soft);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgba(0, 0, 0, .1), 0 8px 10px -6px rgba(0, 0, 0, .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px 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-1{--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(1px + 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-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-accent{--tw-ring-color: var(--color-accent)}.ring-blue-400{--tw-ring-opacity: 1;--tw-ring-color: rgb(96 165 250 / var(--tw-ring-opacity, 1))}.ring-cyan-400{--tw-ring-opacity: 1;--tw-ring-color: rgb(34 211 238 / var(--tw-ring-opacity, 1))}.ring-red-300{--tw-ring-opacity: 1;--tw-ring-color: rgb(252 165 165 / var(--tw-ring-opacity, 1))}.ring-status-error\/30{--tw-ring-color: rgb(255 59 48 / .3)}.ring-status-running\/50{--tw-ring-color: rgb(0 122 255 / .5)}.ring-status-success{--tw-ring-opacity: 1;--tw-ring-color: rgb(52 199 89 / var(--tw-ring-opacity, 1))}.ring-warm-400{--tw-ring-color: var(--color-text-faint)}.ring-offset-1{--tw-ring-offset-width: 1px}.ring-offset-2{--tw-ring-offset-width: 2px}.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)}.\!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)!important}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{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-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-shadow{transition-property:box-shadow;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-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.text-2xs{font-size:10px;line-height:1.4}@keyframes toastProgress{0%{width:100%}to{width:0%}}@media(min-width:640px){.sm\:flex.h-screen>aside{border-right:1px solid var(--color-border)}}@media(min-width:768px){.md\:flex.h-screen>aside{border-right:1px solid var(--color-border)}}.placeholder\:text-warm-400::-moz-placeholder{color:var(--color-text-faint)}.placeholder\:text-warm-400::placeholder{color:var(--color-text-faint)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:left-\[2px\]:after{content:var(--tw-content);left:2px}.after\:top-\[2px\]:after{content:var(--tw-content);top:2px}.after\:h-4:after{content:var(--tw-content);height:1rem}.after\:w-4:after{content:var(--tw-content);width:1rem}.after\:rounded-full:after{content:var(--tw-content);border-radius:9999px}.after\:border:after{content:var(--tw-content);border-width:1px}.after\:border-warm-300:after{content:var(--tw-content);border-color:var(--color-border-strong)}.after\:bg-white:after{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.after\:transition-all:after{content:var(--tw-content);transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.after\:content-\[\'\'\]:after{--tw-content: "";content:var(--tw-content)}.first\:rounded-l-full:first-child{border-top-left-radius:9999px;border-bottom-left-radius:9999px}.last\:mb-0:last-child{margin-bottom:0}.last\:rounded-r-full:last-child{border-top-right-radius:9999px;border-bottom-right-radius:9999px}.hover\:-translate-y-0\.5:hover{--tw-translate-y: -.125rem;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))}.hover\:scale-105:hover{--tw-scale-x: 1.05;--tw-scale-y: 1.05;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))}.hover\:scale-110:hover{--tw-scale-x: 1.1;--tw-scale-y: 1.1;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))}.hover\:border-accent:hover{border-color:var(--color-accent)}.hover\:border-amber-300:hover{--tw-border-opacity: 1;border-color:rgb(252 211 77 / var(--tw-border-opacity, 1))}.hover\:border-red-400:hover{--tw-border-opacity: 1;border-color:rgb(248 113 113 / var(--tw-border-opacity, 1))}.hover\:border-warm-300:hover{border-color:var(--color-border-strong)}.hover\:border-warm-400:hover{border-color:var(--color-text-faint)}.hover\:border-warm-500:hover{border-color:var(--color-text-muted)}.hover\:\!bg-amber-600:hover{--tw-bg-opacity: 1 !important;background-color:rgb(217 119 6 / var(--tw-bg-opacity, 1))!important}.hover\:\!bg-blue-600:hover{--tw-bg-opacity: 1 !important;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))!important}.hover\:\!bg-emerald-600:hover{--tw-bg-opacity: 1 !important;background-color:rgb(5 150 105 / var(--tw-bg-opacity, 1))!important}.hover\:bg-accent:hover{background-color:var(--color-accent)}.hover\:bg-accent-dark:hover{background-color:var(--color-accent-dark)}.hover\:bg-amber-50:hover{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.hover\:bg-amber-500\/10:hover{background-color:#f59e0b1a}.hover\:bg-blue-100:hover{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.hover\:bg-cyan-500\/10:hover{background-color:#06b6d41a}.hover\:bg-cyan-500\/20:hover{background-color:#06b6d433}.hover\:bg-orange-500\/10:hover{background-color:#f973161a}.hover\:bg-red-100:hover{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.hover\:bg-red-50:hover{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.hover\:bg-status-error\/10:hover{background-color:#ff3b301a}.hover\:bg-status-merged\/10:hover{background-color:#af52de1a}.hover\:bg-status-merged\/25:hover{background-color:#af52de40}.hover\:bg-status-success\/10:hover{background-color:#34c7591a}.hover\:bg-status-success\/25:hover{background-color:#34c75940}.hover\:bg-status-warning\/10:hover{background-color:#ff95001a}.hover\:bg-theme-hover:hover{background-color:var(--color-bg-hover)}.hover\:bg-warm-100:hover{background-color:var(--color-bg-primary)}.hover\:bg-warm-200:hover{background-color:var(--color-bg-tertiary)}.hover\:bg-warm-50:hover{background-color:var(--color-bg-secondary)}.hover\:bg-warm-800:hover{background-color:var(--color-text-primary)}.hover\:text-accent:hover{color:var(--color-accent)}.hover\:text-accent-dark:hover{color:var(--color-accent-dark)}.hover\:text-amber-500:hover{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.hover\:text-amber-600:hover{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.hover\:text-blue-800:hover{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.hover\:text-cyan-500:hover{--tw-text-opacity: 1;color:rgb(6 182 212 / var(--tw-text-opacity, 1))}.hover\:text-orange-500:hover{--tw-text-opacity: 1;color:rgb(249 115 22 / var(--tw-text-opacity, 1))}.hover\:text-red-500:hover{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.hover\:text-red-800:hover{--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity, 1))}.hover\:text-status-error:hover{--tw-text-opacity: 1;color:rgb(255 59 48 / var(--tw-text-opacity, 1))}.hover\:text-status-merged:hover{--tw-text-opacity: 1;color:rgb(175 82 222 / var(--tw-text-opacity, 1))}.hover\:text-status-success:hover{--tw-text-opacity: 1;color:rgb(52 199 89 / var(--tw-text-opacity, 1))}.hover\:text-status-warning:hover{--tw-text-opacity: 1;color:rgb(255 149 0 / var(--tw-text-opacity, 1))}.hover\:text-theme-text:hover{color:var(--color-text-primary)}.hover\:text-warm-500:hover{color:var(--color-text-muted)}.hover\:text-warm-600:hover{color:var(--color-text-tertiary)}.hover\:text-warm-700:hover{color:var(--color-text-secondary)}.hover\:text-warm-800:hover{color:var(--color-text-primary)}.hover\:text-warm-900:hover{color:var(--color-selection-text)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-elevated:hover{--tw-shadow: var(--shadow-elevated);--tw-shadow-colored: var(--shadow-elevated);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:shadow-md:hover{--tw-shadow: 0 4px 6px -1px rgba(0, 0, 0, .1), 0 2px 4px -2px rgba(0, 0, 0, .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -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)}.hover\:ring-1:hover{--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(1px + 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)}.hover\:ring-warm-400:hover{--tw-ring-color: var(--color-text-faint)}.focus\:border-accent:focus{border-color:var(--color-accent)}.focus\:border-amber-400:focus{--tw-border-opacity: 1;border-color:rgb(251 191 36 / var(--tw-border-opacity, 1))}.focus\:border-blue-400:focus{--tw-border-opacity: 1;border-color:rgb(96 165 250 / var(--tw-border-opacity, 1))}.focus\:border-emerald-400:focus{--tw-border-opacity: 1;border-color:rgb(52 211 153 / var(--tw-border-opacity, 1))}.focus\:border-warm-300:focus{border-color:var(--color-border-strong)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--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(1px + 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)}.focus\:ring-2:focus{--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)}.focus\:ring-accent:focus{--tw-ring-color: var(--color-accent)}.focus\:ring-amber-400\/20:focus{--tw-ring-color: rgb(251 191 36 / .2)}.focus\:ring-amber-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(245 158 11 / var(--tw-ring-opacity, 1))}.focus\:ring-blue-400:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(96 165 250 / var(--tw-ring-opacity, 1))}.focus\:ring-blue-400\/20:focus{--tw-ring-color: rgb(96 165 250 / .2)}.focus\:ring-emerald-400\/20:focus{--tw-ring-color: rgb(52 211 153 / .2)}.focus\:ring-status-success:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(52 199 89 / var(--tw-ring-opacity, 1))}.focus\:ring-warm-400:focus{--tw-ring-color: var(--color-text-faint)}.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\:cursor-grabbing:active{cursor:grabbing}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.group:focus-within .group-focus-within\:text-accent{color:var(--color-accent)}.group\/dep:hover .group-hover\/dep\:opacity-100,.group:hover .group-hover\:opacity-100{opacity:1}.group:hover .group-hover\:opacity-50{opacity:.5}.peer:checked~.peer-checked\:bg-status-success{--tw-bg-opacity: 1;background-color:rgb(52 199 89 / var(--tw-bg-opacity, 1))}.peer:checked~.peer-checked\:after\:translate-x-full:after{content:var(--tw-content);--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))}.peer:checked~.peer-checked\:after\:border-white:after{content:var(--tw-content);--tw-border-opacity: 1;border-color:rgb(255 255 255 / var(--tw-border-opacity, 1))}.peer:focus~.peer-focus\:outline-none{outline:2px solid transparent;outline-offset:2px}.peer:disabled~.peer-disabled\:opacity-50{opacity:.5}@media(min-width:640px){.sm\:mx-0{margin-left:0;margin-right:0}.sm\:block{display:block}.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:h-64{height:16rem}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:gap-3{gap:.75rem}.sm\:p-4{padding:1rem}.sm\:p-6{padding:1.5rem}.sm\:px-1{padding-left:.25rem;padding-right:.25rem}.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:px-8{padding-left:2rem;padding-right:2rem}.sm\:py-2{padding-top:.5rem;padding-bottom:.5rem}.sm\:py-8{padding-top:2rem;padding-bottom:2rem}.sm\:text-xl{font-size:1.25rem;line-height:1.75rem}}@media(min-width:768px){.md\:static{position:static}.md\:z-auto{z-index:auto}.md\:ml-2{margin-left:.5rem}.md\:block{display:block}.md\:flex{display:flex}.md\:inline-flex{display:inline-flex}.md\:hidden{display:none}.md\:basis-auto{flex-basis:auto}.md\: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))}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:flex-nowrap{flex-wrap:nowrap}.md\:items-center{align-items:center}.md\:justify-between{justify-content:space-between}.md\:gap-3{gap:.75rem}.md\:px-4{padding-left:1rem;padding-right:1rem}.md\:py-3\.5{padding-top:.875rem;padding-bottom:.875rem}}@media(min-width:1024px){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:1280px){.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media(prefers-color-scheme:dark){.dark\:border-red-800{--tw-border-opacity: 1;border-color:rgb(153 27 27 / var(--tw-border-opacity, 1))}.dark\:border-warm-700{border-color:var(--color-text-secondary)}.dark\:bg-blue-900\/30{background-color:#1e3a8a4d}.dark\:bg-purple-900\/30{background-color:#581c874d}.dark\:bg-red-900\/20{background-color:#7f1d1d33}.dark\:text-blue-300{--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.dark\:text-purple-300{--tw-text-opacity: 1;color:rgb(216 180 254 / var(--tw-text-opacity, 1))}.dark\:text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.dark\:hover\:text-red-300:hover{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}}