@auto-ai/agent 2.1.140 → 2.1.144
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/404/index.html +1 -1
- package/dist/404.html +1 -1
- package/dist/_next/static/chunks/{cfe5b3f488f0424e.js → 056e4297589bc43b.js} +1 -1
- package/dist/_next/static/chunks/5cf497c406a233ac.js +1 -0
- package/dist/_next/static/chunks/{f88c07614ca15868.js → 5f6769a92729c6c3.js} +1 -1
- package/dist/_next/static/chunks/{690434349e97572c.js → 7f52fbd725b13904.js} +1 -1
- package/dist/_next/static/chunks/efccabfd66006aa3.css +1 -0
- package/dist/_next/static/chunks/f4d92f64a8396e2a.js +1 -0
- package/dist/index.html +2 -2
- package/dist/index.txt +6 -6
- package/dist/manage/about/index.html +2 -2
- package/dist/manage/about/index.txt +9 -9
- package/dist/manage/env/index.html +2 -2
- package/dist/manage/env/index.txt +11 -11
- package/dist/manage/general/index.html +2 -2
- package/dist/manage/general/index.txt +9 -9
- package/dist/manage/index.html +2 -2
- package/dist/manage/index.txt +6 -6
- package/dist/manage/mcp/index.html +2 -2
- package/dist/manage/mcp/index.txt +9 -9
- package/dist/manage/permissions/index.html +2 -2
- package/dist/manage/permissions/index.txt +9 -9
- package/dist/manage/skills/index.html +2 -2
- package/dist/manage/skills/index.txt +9 -9
- package/dist/manage/task/index.html +2 -2
- package/dist/manage/task/index.txt +9 -9
- package/dist/manage/teams/index.html +2 -2
- package/dist/manage/teams/index.txt +9 -9
- package/dist/manage/tools/index.html +2 -2
- package/dist/manage/tools/index.txt +9 -9
- package/package.json +6 -6
- package/skills-runtime/deploy-test-env/SKILL.md +47 -0
- package/skills-runtime/deploy-test-env/reference.md +71 -0
- package/skills-runtime/dev-task-flow/SKILL.md +43 -0
- package/skills-runtime/dev-task-flow/reference.md +158 -0
- package/skills-runtime/self-test-flow/SKILL.md +40 -0
- package/skills-runtime/self-test-flow/reference.md +56 -0
- package/skills-runtime/workflow-hub/SKILL.md +75 -0
- package/skills-runtime/workflow-hub/reference.md +66 -0
- package/dist/_next/static/chunks/35dbce6fecd1f0ea.css +0 -1
- package/dist/_next/static/chunks/68142a0bc2fa2b35.js +0 -1
- package/dist/_next/static/chunks/e0e34f74c79fccad.js +0 -1
- /package/dist/_next/static/{sZI1x1K1_Y629iT34mJPT → 41UsqzDUVGwIGhXrtlVS9}/_buildManifest.js +0 -0
- /package/dist/_next/static/{sZI1x1K1_Y629iT34mJPT → 41UsqzDUVGwIGhXrtlVS9}/_clientMiddlewareManifest.json +0 -0
- /package/dist/_next/static/{sZI1x1K1_Y629iT34mJPT → 41UsqzDUVGwIGhXrtlVS9}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# dev-task-flow — reference
|
|
2
|
+
|
|
3
|
+
## Scope
|
|
4
|
+
- 适用于日常功能开发与接口实现,不替代「提交代码 / 部署测试环境」流程(**deploy-test-env**)。
|
|
5
|
+
- 本技能默认包含:技术文档、代码实现、自测、自测报告检查、开发报告。
|
|
6
|
+
- 若用户明确要求跳过某阶段,按用户要求执行并在结果中注明风险。
|
|
7
|
+
|
|
8
|
+
## Hard Rules
|
|
9
|
+
- 按顺序执行,失败即停:前置阶段未完成,不进入下一阶段。
|
|
10
|
+
- 不使用破坏性 git 命令;不改动与当前需求无关的文件。
|
|
11
|
+
- 启动服务前先检查已有终端,避免重复拉起进程。
|
|
12
|
+
- 每个实现步骤都要有可验证结果(日志、响应、数据库查询结果等)。
|
|
13
|
+
- 不提交敏感文件(如 `.env`、`*.pem`、`*.key`、`credentials.json`)。
|
|
14
|
+
- Request 结构强约束:所有 HTTP 接口请求结构必须继承 `BaseHttpRequest`(查询类可在其上扩展 `BaseHttpListRequest` 能力),禁止手写散乱字段解析。
|
|
15
|
+
- 查询接口强约束:凡是 Query/List 类接口,必须严格按「1.1 查询类接口实现模板」编码,不得跳步或替换实现范式。
|
|
16
|
+
- 禁止绕开模板:不允许「手工解析 filter + 直接查库 + 手工拼装返回」替代统一查询模板,除非用户明确批准偏离模板。
|
|
17
|
+
- 若发现历史代码未按模板实现:本次改动范围内需优先重构到模板形态,再继续新增需求。
|
|
18
|
+
- 文件拆分强约束:新增独立功能域(如 license、billing、audit)时,必须新建独立 service 文件(如 `license_service.go`),禁止继续堆叠到已有大文件(如 `tenant_service.go`),除非用户明确要求复用原文件。
|
|
19
|
+
- 路由注解同步强约束:新建 service 文件后,必须同步更新注解收集逻辑(如 `go:embed` + `ExtractRouteAnnotationsFromString`)确保新增接口被自动注册;未完成注册校验不得进入下一阶段。
|
|
20
|
+
- 文档策略:默认按用户诉求执行,**非明确要求不强制产出文档文件**;当任务或用户要求文档时,需在仓库中落盘并给出路径。
|
|
21
|
+
- 完成态闸门:默认以「需求梳理 + 代码实现 + 编译检查」为完成条件;若任务包含文档交付,再将文档作为强制项。
|
|
22
|
+
|
|
23
|
+
## Preflight Checklist(执行前自检)
|
|
24
|
+
- 是否已在内部记录当前技能(可选 `[SKILL:dev-task-flow]` 标记):是/否。
|
|
25
|
+
- 是否匹配「开发/实现/完善接口或模块」任务:是/否。
|
|
26
|
+
- 是否按 Workflow 顺序执行:是/否。
|
|
27
|
+
- 若包含 Query/List 接口:是否满足「1.1 模板强约束」(参数处理、SQL查询、数据渲染三段完整且可验证):是/否。
|
|
28
|
+
|
|
29
|
+
## Workflow(详细)
|
|
30
|
+
|
|
31
|
+
### 1)梳理需求(按需输出技术方案)
|
|
32
|
+
- 将需求拆成:输入、处理、输出、边界条件、错误场景。
|
|
33
|
+
- 当任务明确要求文档时,技术文档分两部分:
|
|
34
|
+
- **设计文档**:设计思路、数据库设计、流程图。
|
|
35
|
+
- **接口文档**:接口路径/方法、请求参数、响应结构、错误码、示例。
|
|
36
|
+
- 文档落地要求(按需):
|
|
37
|
+
- 按当前项目规划选择实现模板(见下文 1.1 / 1.2 / 1.3)。
|
|
38
|
+
|
|
39
|
+
#### 1.1 查询类接口实现模板
|
|
40
|
+
- 参考项目:`code/host/sdmgrvirus`(按项目现有结构对齐)。
|
|
41
|
+
- 固定步骤:
|
|
42
|
+
1. 参数处理(必填校验、类型转换、默认值、分页排序)。
|
|
43
|
+
2. SQL 编写查询(过滤条件、分页、排序、总数统计)。
|
|
44
|
+
3. 返回数据渲染(字段映射、脱敏/格式化、统一响应结构)。
|
|
45
|
+
- Request 模板(强制):
|
|
46
|
+
1. 定义请求结构时必须以 `BaseHttpRequest` 为基类。
|
|
47
|
+
2. Query/List 请求必须具备统一过滤能力(`filter/search/date`、分页、排序),不得绕过基类能力。
|
|
48
|
+
3. 业务字段只允许作为基类扩展字段追加,不允许替代基类字段。
|
|
49
|
+
- 代码模板(可直接复用):
|
|
50
|
+
```go
|
|
51
|
+
type QueryXXXRequest struct {
|
|
52
|
+
query.BaseHttpListRequest
|
|
53
|
+
// 业务扩展字段(按需)
|
|
54
|
+
Pcid string `json:"pcid" form:"pcid"`
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// @route GET /module/xxx/query
|
|
58
|
+
func (s XxxService) QueryXXX(req *QueryXXXRequest) (any, error) {
|
|
59
|
+
if req == nil {
|
|
60
|
+
return []map[string]any{}, nil
|
|
61
|
+
}
|
|
62
|
+
if strings.TrimSpace(req.Pcid) == "" {
|
|
63
|
+
return common.Response{Errno: 1, Errmsg: "pcid不能为空", Timestamp: time.Now().Unix()}, nil
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
req.SetDbType(query.DB_TYPE_MYSQL)
|
|
67
|
+
req.BaseFilter("tid", query.EQFilter("tid"))
|
|
68
|
+
req.BaseFilter("tids", query.INFilter("tid"))
|
|
69
|
+
req.Operator(query.EQUAL, "saas", "model_name")
|
|
70
|
+
|
|
71
|
+
rows, err := req.Query("select tid,data from settings", "")
|
|
72
|
+
if err != nil {
|
|
73
|
+
return nil, err
|
|
74
|
+
}
|
|
75
|
+
return rows, nil
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
- 严格落地要求:
|
|
79
|
+
1. 过滤条件必须优先接入项目统一过滤器机制(如 `BaseHttpListRequest`、`BaseFilter`、`INFilter`、`EQFilter`)。
|
|
80
|
+
2. 查询执行与渲染加工必须解耦:先得到标准查询结果,再做字段映射/补充。
|
|
81
|
+
3. 默认要求可分页且可统计总数;若业务明确不需要总数,需在实现说明中写明理由。
|
|
82
|
+
4. 返回格式与错误处理必须复用项目统一响应风格,禁止自定义散乱结构。
|
|
83
|
+
- 反例(禁止):
|
|
84
|
+
- 仅通过 `json.Unmarshal(req.Filter)` 手工取 `tids` 后直接 `db.Table(...).Find(...)`,且未接入统一过滤器。
|
|
85
|
+
- 在单个方法中混合参数解析、过滤组装、SQL 执行、复杂渲染且无模板分层。
|
|
86
|
+
|
|
87
|
+
#### 1.2 POST 表单提交类接口实现模板
|
|
88
|
+
- 固定步骤:
|
|
89
|
+
1. 参数绑定与校验(必填、长度、枚举、格式)。
|
|
90
|
+
2. 业务处理(去重/幂等、状态流转、事务边界)。
|
|
91
|
+
3. 数据写入(MySQL/ClickHouse 或其他存储)。
|
|
92
|
+
4. 返回提交结果(成功标识、主键/业务 ID、失败原因)。
|
|
93
|
+
- Request 模板(强制):
|
|
94
|
+
1. POST 请求结构必须继承 `BaseHttpRequest`。
|
|
95
|
+
2. 参数校验必须在 Service 入口统一进行,不允许在多处重复解析 `map[string]any`。
|
|
96
|
+
3. 校验失败统一走项目响应结构,不允许返回非标准错误体。
|
|
97
|
+
- 代码模板(可直接复用):
|
|
98
|
+
```go
|
|
99
|
+
type SubmitXXXRequest struct {
|
|
100
|
+
query.BaseHttpRequest
|
|
101
|
+
Tid string `json:"tid" form:"tid"`
|
|
102
|
+
Pcid string `json:"pcid" form:"pcid"`
|
|
103
|
+
AuthorizeTimestamp int64 `json:"authorize_timestamp" form:"authorize_timestamp"`
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// @route POST /module/xxx/submit
|
|
107
|
+
func (s XxxService) SubmitXXX(req *SubmitXXXRequest) (any, error) {
|
|
108
|
+
tid := strings.TrimSpace(req.Tid)
|
|
109
|
+
pcid := strings.TrimSpace(req.Pcid)
|
|
110
|
+
if tid == "" {
|
|
111
|
+
return common.Response{Errno: 1, Errmsg: "tid不能为空", Timestamp: time.Now().Unix()}, nil
|
|
112
|
+
}
|
|
113
|
+
if pcid == "" {
|
|
114
|
+
return common.Response{Errno: 1, Errmsg: "pcid不能为空", Timestamp: time.Now().Unix()}, nil
|
|
115
|
+
}
|
|
116
|
+
if req.AuthorizeTimestamp <= 0 {
|
|
117
|
+
return common.Response{Errno: 1, Errmsg: "authorize_timestamp不能为空", Timestamp: time.Now().Unix()}, nil
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// 业务处理 + 落库
|
|
121
|
+
return common.SuccessResponse("success", nil), nil
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
#### 1.3 客户端上报类 workflow 实现模板
|
|
126
|
+
- 固定步骤:
|
|
127
|
+
1. 定义上报消息结构与校验规则。
|
|
128
|
+
2. 接入上报入口(通常 NSQ/消息队列)并消费处理。
|
|
129
|
+
3. 数据清洗与标准化(时间、字段、枚举映射)。
|
|
130
|
+
4. 落库(常见为 ClickHouse,也可按现有链路写入 MySQL/CH)。
|
|
131
|
+
5. 提供查询/校验路径(HTTP 查询接口或 DB 校验语句)。
|
|
132
|
+
|
|
133
|
+
### 2)开始编写代码和检查
|
|
134
|
+
- 按第 1 步确定的模板编码,优先复用项目现有模式与公共组件。
|
|
135
|
+
- 对新增功能域先做文件边界决策:优先新建独立 service 文件并控制单文件复杂度,避免无边界扩展历史文件。
|
|
136
|
+
- 编码后至少完成编译检查(保证改动范围可编译)。
|
|
137
|
+
- 对关键分支补充必要的错误处理与日志,保证问题可定位。
|
|
138
|
+
- 检查点:参数校验完整、SQL 条件正确、返回字段与接口文档一致。
|
|
139
|
+
|
|
140
|
+
### 3)检查编译错误和review代码
|
|
141
|
+
- go build ./...。
|
|
142
|
+
- Lint检查。
|
|
143
|
+
|
|
144
|
+
## Output Contract
|
|
145
|
+
- 每个阶段输出 `PASS` 或 `FAIL`。
|
|
146
|
+
- 若 `FAIL`,必须包含:
|
|
147
|
+
- 失败步骤
|
|
148
|
+
- 关键错误现象
|
|
149
|
+
- 已确认原因/待确认点
|
|
150
|
+
- 下一步动作
|
|
151
|
+
- 全部成功时,至少输出:
|
|
152
|
+
- 实现模板类型(查询类 / POST / 客户端上报)
|
|
153
|
+
- 已完成文档列表(如本次任务要求:设计文档、接口文档、测试文档、开发报告)
|
|
154
|
+
- 自测结论摘要
|
|
155
|
+
- 交付清单强制项(缺一不可):
|
|
156
|
+
- 代码改动文件路径
|
|
157
|
+
- 编译/测试结果
|
|
158
|
+
- 若任务要求文档:对应文档文件路径
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: self-test-flow
|
|
3
|
+
description: 当用户输入「自测」「自测流程」或要求按联调方式验证模块时使用。梳理接口、写测试步骤文档、启进程、按 CRUD 等步骤执行并校验(NSQ/HTTP、MySQL/ClickHouse),输出带模拟数据与校验过程的测试报告。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Self-Test Flow(自测流程)
|
|
7
|
+
|
|
8
|
+
## Activation
|
|
9
|
+
- 用户消息含「自测」「自测流程」,或明确要求按联调/接口方式验证模块时应用本技能。
|
|
10
|
+
- **命中词(任一)**:自测 / 自测流程 / 联调验证 / 接口联调 / 验证模块。
|
|
11
|
+
- **排除词(任一)**:提交代码(且无联调诉求)。
|
|
12
|
+
- **冲突降级**:若同条消息含开发诉求,入口由 `workflow-hub` 先分配到 `dev-task-flow`,本技能作为其阶段 3 子流程执行;若含 GeeLib 闭环语义,先进入 `geelib-task-flow`。
|
|
13
|
+
- 激活后首行输出:`[SKILL:self-test-flow]`。
|
|
14
|
+
|
|
15
|
+
## 门禁
|
|
16
|
+
- **失败即停**:本步未 PASS 则不得将依赖其结果的后继标为 PASS(除非用户要求继续探测)。
|
|
17
|
+
- **非单元测试**:不默认编写或修改 `*_test.go`;不未经用户同意改业务代码。
|
|
18
|
+
- **环境不可达则停**:中间件/网络阻塞时说明原因,不空转。
|
|
19
|
+
- **每步必校验**:HTTP/NSQ 执行后须含落库一致性校验证据,否则该步 **FAIL**。
|
|
20
|
+
- **启动前**:检查已有终端,避免重复拉起相同服务。
|
|
21
|
+
|
|
22
|
+
## 阶段(顺序执行)
|
|
23
|
+
|
|
24
|
+
| 阶段 | 内容 | 通过条件 |
|
|
25
|
+
|------|------|----------|
|
|
26
|
+
| 1 | 梳理接口/Topic,写可执行测试文档 | 文档含 CRUD 顺序与存储类型(MySQL/CH/缓存) |
|
|
27
|
+
| 2 | 启动进程与依赖 | 端口与配置与文档一致,有记录 |
|
|
28
|
+
| 3 | 按文档逐步执行 | HTTP/NSQ 操作与文档一致 |
|
|
29
|
+
| 4 | 每步即时校验 | 状态码/响应/库表与模拟数据一致;有查询依据 |
|
|
30
|
+
| 5 | 输出测试报告 | 逐步 PASS/FAIL + 总览 |
|
|
31
|
+
|
|
32
|
+
## 输出约定
|
|
33
|
+
- 每大步 `PASS` / `FAIL`;`PASS` 须含库表校验证据。
|
|
34
|
+
- **步骤写法、NSQ/HTTP 细则、报告结构**:同目录 **`reference.md`**。
|
|
35
|
+
|
|
36
|
+
## 执行回执(每次进入本技能都要输出)
|
|
37
|
+
- `已命中技能`:self-test-flow
|
|
38
|
+
- `命中关键词`:列出触发词
|
|
39
|
+
- `已加载文档`:`.cursor/skills/self-test-flow/SKILL.md`、`.cursor/skills/self-test-flow/reference.md`
|
|
40
|
+
- `阶段状态`:阶段 1/2/3/4/5 的已完成、进行中、待执行
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# self-test-flow — reference
|
|
2
|
+
|
|
3
|
+
## Scope
|
|
4
|
+
- 面向接口与数据链路的联调自测(非替代 `go test ./...` 单元测试)。
|
|
5
|
+
- 不默认编写或修改 `*_test.go`;不未经用户同意改动业务代码。
|
|
6
|
+
- 依赖不可达(中间件/库/网络)或环境阻塞时停止并说明原因,不空转等待。
|
|
7
|
+
|
|
8
|
+
## Hard Rules(展开)
|
|
9
|
+
- 失败即停:某步骤校验不通过则记录现象,不强行执行后续依赖该结果的步骤(除非用户要求继续探测)。
|
|
10
|
+
- 启动进程前检查已有终端,避免重复拉起相同服务。
|
|
11
|
+
- 模拟数据需可复现:记录 topic/URL、请求体、关键 header、时间范围等。
|
|
12
|
+
- 区分数据入口:**NSQ 消费**(客户端上报类 → 常落 ClickHouse);**HTTP**(多为查 MySQL/ClickHouse,或写 MySQL/ClickHouse)。步骤设计须与真实路径一致。
|
|
13
|
+
- 每步完成后必须做**结果校验**(HTTP 响应、DB/CH 查询行数与字段、NSQ 消费日志或下游表数据等)。
|
|
14
|
+
- 每个接口或 NSQ 消息执行后,必须做**数据库一致性校验**(MySQL/ClickHouse 至少其一,按真实落库路径选择),并与该步模拟数据逐字段比对;未完成该校验或比对不一致,**该步骤一律判定 FAIL**。
|
|
15
|
+
|
|
16
|
+
## Workflow(详细)
|
|
17
|
+
|
|
18
|
+
### 1)梳理接口测试方式
|
|
19
|
+
- 列出本次要测的接口或消息:HTTP 路径与方法、NSQ topic(及期望消费者)。
|
|
20
|
+
- 将测试文档写为可执行步骤列表;默认按**整套 CRUD 逻辑**组织,例如:
|
|
21
|
+
1. 插入/创建数据
|
|
22
|
+
2. 查询验证
|
|
23
|
+
3. 修改/更新
|
|
24
|
+
4. 再次查询验证
|
|
25
|
+
5. 删除(若适用)
|
|
26
|
+
6. 最终状态校验
|
|
27
|
+
- 文档中注明每步对应的存储:**MySQL / ClickHouse / 仅缓存**等,便于选对校验方式。
|
|
28
|
+
|
|
29
|
+
### 2)启动进程
|
|
30
|
+
- 按项目约定启动被测服务(及依赖:NSQ、MySQL、ClickHouse 等);确认监听端口与配置与测试文档一致。
|
|
31
|
+
- 记录启动命令与关键配置来源(如配置文件路径、环境变量名,不写敏感值)。
|
|
32
|
+
|
|
33
|
+
### 3)开始测试
|
|
34
|
+
- 严格按步骤顺序操作:发 HTTP、或向 NSQ 生产消息、或调用既有工具脚本。
|
|
35
|
+
- **NSQ 路径**:模拟客户端上报 payload → 等待消费完成(合理超时 + 重试快照)→ 再查 ClickHouse(或文档指定的落库)。
|
|
36
|
+
- **HTTP 路径**:模拟查询/写入请求;若接口写 MySQL 或 ClickHouse,后续步骤用查询接口或直接查库校验(以项目可接受方式为准)。
|
|
37
|
+
|
|
38
|
+
### 4)每步校验
|
|
39
|
+
- 每步结束后立即校验:**状态码/错误码、响应体关键字段、数据库或 ClickHouse 中记录是否与输入一致**(含时间字段、枚举、关联 ID)。
|
|
40
|
+
- 记录**本步输入(模拟数据)**与**校验依据**(例如执行的 SQL/CH 查询条件、期望行数或字段快照)。
|
|
41
|
+
- 强制要求:无论 HTTP 还是 NSQ,均需提供可复现的 SQL/CH 查询语句(或等价查询条件)与查询结果摘要,证明落库数据与模拟数据一致后方可标记 PASS。
|
|
42
|
+
- 若与预期不符:保留请求/消息原文、响应或查询结果摘要、相关日志片段(脱敏)。
|
|
43
|
+
|
|
44
|
+
### 5)输出测试报告
|
|
45
|
+
- 使用结构化小节,**逐步**对应测试文档,每步至少包含:
|
|
46
|
+
- **步骤编号与名称**
|
|
47
|
+
- **模拟数据**(完整可复现:URL、方法、body、topic、消息体等)
|
|
48
|
+
- **执行结果**(成功/失败)
|
|
49
|
+
- **校验过程**(查了哪里、期望什么、实际什么)
|
|
50
|
+
- **结论**(PASS / FAIL)
|
|
51
|
+
- 文末给出**总览**:通过步骤数/总步骤数、未通过项与阻塞原因、建议下一步(修代码/补数据/改配置)。
|
|
52
|
+
|
|
53
|
+
## Output Contract
|
|
54
|
+
- 每个大步骤汇报 `PASS` 或 `FAIL`;`FAIL` 须含:操作内容、错误现象、与预期差异、建议定位方向。
|
|
55
|
+
- `PASS` 前置条件:必须包含数据库一致性校验证据(查询条件/SQL、关键结果、与模拟数据逐字段对照结论);缺一不可。
|
|
56
|
+
- 完整成功时额外给出:服务启动确认、测试覆盖的接口/Topic 列表、报告已按上节结构输出。
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: workflow-hub
|
|
3
|
+
description: >-
|
|
4
|
+
GeeLib任务管理,当用户要求执行GeeLib时使用此技能并按照调度顺序完成任务。
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Workflow Hub(技能调度)
|
|
8
|
+
|
|
9
|
+
## Activation
|
|
10
|
+
- 用户问「技能顺序」「先走哪个 SKILL」「流程编排」「多文件 SKILL 怎么用」时应用本技能。
|
|
11
|
+
- 用户消息命中 GeeLib 语义(`GeeLib` / `geelib.qihoo.net` / `matterType` / `subId` / 拉任务 / 改状态)时,**默认先进入本技能做分派与门禁检查**。
|
|
12
|
+
- 可在内部回执使用标记:`[SKILL:workflow-hub]`,不强制对用户输出首行标记。
|
|
13
|
+
|
|
14
|
+
## 门禁(先于一切)
|
|
15
|
+
- **入口强约束**:命中任一子流程前,必须先 `Read` 目标技能的 `SKILL.md`;若该技能存在同目录 `reference.md`,也必须 `Read` 后再进入执行。
|
|
16
|
+
- **单技能内**:遵守该技能 `SKILL.md` 中的阶段顺序与 PASS/FAIL;不得跳过未声明可跳过的阶段。
|
|
17
|
+
|
|
18
|
+
## 调度顺序(唯一规则 A)
|
|
19
|
+
|
|
20
|
+
**执行顺序原则(有代码交付时)**:先 **开发(dev-task-flow)** → 再 **联调自测(self-test-flow)** → 再 **提交与部署(deploy-test-env)** → 最后 **GeeLib 收尾**。不得在开发未完成、自测证据未齐套前进入 **deploy-test-env**。
|
|
21
|
+
|
|
22
|
+
| 规则 | 命中关键词(任一) | 技能链(按顺序) |
|
|
23
|
+
|------|--------------------|--------------------|
|
|
24
|
+
| A | GeeLib / geelib.qihoo.net / matterType / subId / 拉任务 / 改状态 / 开发功能 / 实现接口 / 修 bug / 完善模块 / 自测 / 自测流程 / 联调验证 | **workflow-hub(GeeLib阶段)** →(若含开发)**dev-task-flow** → **self-test-flow** → **deploy-test-env** → **workflow-hub(GeeLib收尾)** |
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
**嵌套规则(必读)**
|
|
28
|
+
- **dev-task-flow** 阶段 3:必须按 **self-test-flow** 的 `SKILL.md` + `reference.md` 执行(非 `go test ./...`)。
|
|
29
|
+
- **deploy-test-env**:进入执行前须 `Read` **deploy-test-env/SKILL.md** 与 **deploy-test-env/reference.md**。流程为审阅 → 同步 →(用户要求时 `go test`)→ 提交 → 推送同名分支 → `local_build.sh`;其中 `go test` 与 **self-test-flow** 的联调自测并列、互不替代。
|
|
30
|
+
- **GeeLib 阶段遇到本仓库改代码**:在未 `Read` **dev-task-flow/SKILL.md** 与 `reference.md` 前禁止编码;开发段按 dev-task-flow 全流程执行。
|
|
31
|
+
- **零代码任务**:无开发段时,在 GeeLib 阶段与交付对齐后仍须执行 **deploy-test-env**(若无代码可提交则阶段 4 跳过提交,继续推送与构建验证)。
|
|
32
|
+
|
|
33
|
+
## GeeLib MCP 优先策略(必读)
|
|
34
|
+
|
|
35
|
+
**所有涉及任务信息的读写操作,必须优先使用 `user-geelib` MCP,禁止默认走浏览器。**
|
|
36
|
+
|
|
37
|
+
| 操作类型 | 优先方案 | 降级方案(仅当 MCP 不可用时) |
|
|
38
|
+
|---------|---------|--------------------------|
|
|
39
|
+
| 查询工作项列表 | `list_matters` | 浏览器导航 |
|
|
40
|
+
| 查询工作项详情 | `get_matter_detail` | 浏览器导航 |
|
|
41
|
+
| 查询工作项类型 | `list_matter_types` | 浏览器导航 |
|
|
42
|
+
| 查询状态列表 | `list_matter_statuses` | 浏览器导航 |
|
|
43
|
+
| 更新状态/备注 | `update_matter` | 浏览器点击操作 |
|
|
44
|
+
| 添加评论 | `add_comment` | 浏览器填写表单 |
|
|
45
|
+
| 查询项目信息 | `get_project_detail` | 浏览器导航 |
|
|
46
|
+
| 查询项目成员 | `list_project_members` | 浏览器导航 |
|
|
47
|
+
|
|
48
|
+
降级条件:MCP 工具调用返回非 2000 错误码,且重试一次仍失败,才可切换到浏览器 MCP。
|
|
49
|
+
|
|
50
|
+
## GeeLib 阶段
|
|
51
|
+
- **阶段 1 验证可访问**:调用 `get_user_info` 确认 MCP 已鉴权、会话有效。如果返回非 2000,立即停止并提示用户检查 GeeLib MCP 配置。
|
|
52
|
+
- **阶段 2 选取任务**:用 `list_matters` + `list_matter_types` 获取工作项列表,分析任务类型;需求开发类任务先用 `get_matter_detail` 读取描述与接口文档。
|
|
53
|
+
- **阶段 3 读取详情**:用 `get_matter_detail` 记录标题、描述、当前状态;将交付范围和用户对齐一句。
|
|
54
|
+
- **阶段 4 本仓库执行**:开发类强制切 `dev-task-flow`;零代码任务可直接执行。
|
|
55
|
+
- **阶段 5 回写 GeeLib 状态**:用 `update_matter` 更新状态与备注,用 `add_comment` 写交付说明;调用后再次 `get_matter_detail` 确认保存成功。
|
|
56
|
+
- **阶段 6 收尾回复**:输出任务标识、交付内容、GeeLib 最终状态、提交信息(若有)。
|
|
57
|
+
|
|
58
|
+
## GeeLib 门禁
|
|
59
|
+
- `user-geelib` MCP 自带鉴权 Token,无需浏览器登录;但仍需确保 VPN 可访问 GeeLib 服务。
|
|
60
|
+
- 不把 Cookie/Token/密码写入仓库或代码。
|
|
61
|
+
- 涉及代码改动时,未完成 `self-test-flow` 完整证据(启动记录 + 步骤执行 + 存储侧校验),禁止回写「已完成/关闭」。
|
|
62
|
+
- 仅当用户在当前对话明确要求"跳过自测/仅编译验证"时,允许回写完成态;必须在 GeeLib 备注与回复中记录风险。
|
|
63
|
+
|
|
64
|
+
## 输出约定
|
|
65
|
+
- 每次调度必须包含以下回执字段(可用编号):
|
|
66
|
+
1) `已命中规则`:A
|
|
67
|
+
2) `命中关键词`:列出触发词
|
|
68
|
+
3) `已加载技能`:列出已 `Read` 的路径(至少 `SKILL.md`;若存在 `reference.md` 也列出)
|
|
69
|
+
4) `当前技能链`:按执行顺序展示
|
|
70
|
+
5) `当前阶段`:已完成 / 进行中 / 待执行
|
|
71
|
+
- 用表格或编号列出「当前对话应激活的技能链」与「已完成/待完成阶段」。
|
|
72
|
+
- 指向路径使用仓库内相对根路径:`.cursor/skills/<skill-name>/SKILL.md` 与 `reference.md`。
|
|
73
|
+
|
|
74
|
+
## 延伸阅读
|
|
75
|
+
- 完整决策树、与其他文档关系:**同目录 `reference.md`**。
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# workflow-hub — reference
|
|
2
|
+
|
|
3
|
+
## 技能目录与文件角色
|
|
4
|
+
|
|
5
|
+
| 技能目录 | SKILL.md | reference.md |
|
|
6
|
+
|----------|----------|--------------|
|
|
7
|
+
| workflow-hub | 调度顺序与门禁总览 | 本文档(补充说明) |
|
|
8
|
+
| geelib-task-flow | 兼容入口(已并入 workflow-hub) | 迁移说明(指向 workflow-hub) |
|
|
9
|
+
| dev-task-flow | 开发四阶段与完成态闸门 | 硬规则全文、Query/POST/上报模板、Preflight |
|
|
10
|
+
| self-test-flow | 自测五阶段与输出闸门 | 联调步骤、校验、报告结构细则 |
|
|
11
|
+
| deploy-test-env | 提交与测试环境部署:审阅→同步→单测(按需)→提交→push 同名分支→local_build.sh | 命令细节、与 self-test 区分说明 |
|
|
12
|
+
|
|
13
|
+
## 决策树(简版)
|
|
14
|
+
|
|
15
|
+
**说明**:下列 1~4 步用于**单意图**下「先进入哪个技能」的分派;若用户**同时**要开发与部署,**实际执行顺序**以 **workflow-hub/SKILL.md** 技能链为准:**开发 → 联调自测 → 提交部署**,不得颠倒。
|
|
16
|
+
|
|
17
|
+
1. 用户消息是否包含 GeeLib / geelib URL / matterType / subId?
|
|
18
|
+
- 是 → 从 **workflow-hub(GeeLib阶段)** 开始;若**同条消息**还包含「提交代码 / 部署测试环境 / 发测试」等(与 **deploy-test-env** 激活词一致),在完成 **self-test-flow**(或零代码场景下与交付对齐)后**追加** **deploy-test-env**,再回到 **workflow-hub(GeeLib收尾)**。
|
|
19
|
+
- 否 → 2。
|
|
20
|
+
|
|
21
|
+
2. 是否明确要求「提交代码」或「更新/部署测试环境」等(且无 GeeLib 闭环)?
|
|
22
|
+
- 是 → **deploy-test-env**。
|
|
23
|
+
- 否 → 3。
|
|
24
|
+
|
|
25
|
+
3. 是否「自测」「自测流程」或纯联调验证(用户未要求同时开发新功能)?
|
|
26
|
+
- 是 → **self-test-flow**。
|
|
27
|
+
- 否 → 4。
|
|
28
|
+
|
|
29
|
+
4. 是否开发/实现/修接口或模块?
|
|
30
|
+
- 是 → **dev-task-flow**(其阶段 3 再拉 **self-test-flow**)。
|
|
31
|
+
- 否 → 按用户具体指令处理,或请用户澄清场景。
|
|
32
|
+
|
|
33
|
+
## 触发稳定性建议(workflow-hub 配套)
|
|
34
|
+
|
|
35
|
+
- 采用“**优先级首个命中**”策略,避免同条消息触发多个入口导致摇摆。
|
|
36
|
+
- 为每条规则维护「命中词 / 排除词 / 降级关系」三元组;新增技能时先补这三项再上线。
|
|
37
|
+
- workflow-hub 同时承载 GeeLib 闭环步骤;其余开发/自测/提交步骤下沉到子技能。
|
|
38
|
+
- 每次分派输出回执:命中规则、命中词、已加载技能路径、当前链路、阶段状态。
|
|
39
|
+
|
|
40
|
+
## 回归样例(建议每次改 hub 后跑一遍)
|
|
41
|
+
|
|
42
|
+
| 输入示例 | 期望命中 | 期望技能链 |
|
|
43
|
+
|----------|----------|------------|
|
|
44
|
+
| 部署测试环境 / 更新测试环境 / 提交代码 | B | deploy-test-env |
|
|
45
|
+
| 帮我实现一个接口并自测 | C | dev-task-flow -> self-test-flow |
|
|
46
|
+
| 我只想做联调自测,不改代码 | D | self-test-flow |
|
|
47
|
+
| 打开 geelib.qihoo.net 拉一个 matterType 任务 | A | workflow-hub(GeeLib阶段) |
|
|
48
|
+
| 从 GeeLib 拉任务,修 bug 后回写状态 | A | workflow-hub(GeeLib阶段) -> dev-task-flow -> self-test-flow -> workflow-hub(GeeLib收尾) |
|
|
49
|
+
| GeeLib 闭环且同轮要求部署测试环境 / 提交代码 | A | workflow-hub(GeeLib阶段) -> dev-task-flow -> self-test-flow -> deploy-test-env -> workflow-hub(GeeLib收尾) |
|
|
50
|
+
| 我想优化下流程(未说明具体任务) | E | 先澄清,再分派 |
|
|
51
|
+
|
|
52
|
+
## 与 deploy-test-env 的关系
|
|
53
|
+
|
|
54
|
+
- **deploy-test-env**:审阅 → `fetch`/`pull` → 用户要求时 `go test` → 提交 → 推送 `origin` 同名分支 → `local_build.sh`(镜像构建与推送);细则见 **deploy-test-env/SKILL.md**。
|
|
55
|
+
- **deploy-test-env** 内的 `go test` 与 **self-test-flow** 联调报告分离;要联调证据时走 **self-test-flow**。
|
|
56
|
+
- **dev-task-flow** 完成态不要求必须先走 **deploy-test-env**;用户单说「提交代码」或「部署测试环境」时走 **deploy-test-env**。**GeeLib 规则 A** 且同轮含提交/部署诉求时,在 **self-test-flow** 之后串联 **deploy-test-env** 再 GeeLib 收尾。
|
|
57
|
+
|
|
58
|
+
## GeeLib 执行位置
|
|
59
|
+
|
|
60
|
+
- GeeLib 浏览器操作(拉任务/读详情/改状态)统一在 **workflow-hub** 内执行。
|
|
61
|
+
- 从需求梳理/编码开始切到 **dev-task-flow**;联调自测走 **self-test-flow**。
|
|
62
|
+
- 完成后回到 **workflow-hub** 做 GeeLib 收尾回写;若用户还要求提交/部署测试环境,则在收尾前按上节串联 **deploy-test-env**。
|
|
63
|
+
|
|
64
|
+
## 维护说明
|
|
65
|
+
|
|
66
|
+
- 新增技能时:在本 reference 的表格与决策树中增加一行;在 **workflow-hub/SKILL.md** 的调度表中增加对应行或脚注。
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
*,:before,:after{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 transparent;--tw-ring-shadow:0 0 transparent;--tw-shadow:0 0 transparent;--tw-shadow-colored:0 0 transparent;--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:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 transparent;--tw-ring-shadow:0 0 transparent;--tw-shadow:0 0 transparent;--tw-shadow-colored:0 0 transparent;--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: }.theme{--font-heading:var(--font-display);--font-sans:var(--font-body);--font-mono:var(--font-mono)}:root{--background:#fff;--foreground:#0a0a0a;--card:#fff;--card-foreground:#0a0a0a;--popover:#fff;--popover-foreground:#0a0a0a;--primary:#171717;--primary-foreground:#fafafa;--secondary:#f5f5f5;--secondary-foreground:#171717;--muted:#f5f5f5;--muted-foreground:#737373;--accent:#f5f5f5;--accent-foreground:#171717;--destructive:#e40014;--destructive-foreground:#fafafa;--border:#e5e5e5;--input:#e5e5e5;--ring:#a1a1a1;--chart-1:#d4d4d4;--chart-2:#737373;--chart-3:#525252;--chart-4:#404040;--chart-5:#262626;--radius:.625rem;--sidebar:#fafafa;--sidebar-foreground:#0a0a0a;--sidebar-primary:#171717;--sidebar-primary-foreground:#fafafa;--sidebar-accent:#f5f5f5;--sidebar-accent-foreground:#171717;--sidebar-border:#e5e5e5;--sidebar-ring:#a1a1a1}@supports (color:color(display-p3 0 0 0)){:root{--background:color(display-p3 1 1 1);--foreground:color(display-p3 .0393882 .0393882 .0393882);--card:color(display-p3 1 1 1);--card-foreground:color(display-p3 .0393882 .0393882 .0393882);--popover:color(display-p3 1 1 1);--popover-foreground:color(display-p3 .0393882 .0393882 .0393882);--primary:color(display-p3 .0905274 .0905274 .0905274);--primary-foreground:color(display-p3 .980256 .980256 .980256);--secondary:color(display-p3 .960587 .960587 .960587);--secondary-foreground:color(display-p3 .0905274 .0905274 .0905274);--muted:color(display-p3 .960587 .960587 .960587);--muted-foreground:color(display-p3 .451519 .451519 .451519);--accent:color(display-p3 .960587 .960587 .960587);--accent-foreground:color(display-p3 .0905274 .0905274 .0905274);--destructive:color(display-p3 .830323 .140383 .133196);--destructive-foreground:color(display-p3 .980256 .980256 .980256);--border:color(display-p3 .898161 .898161 .898161);--input:color(display-p3 .898161 .898161 .898161);--ring:color(display-p3 .630163 .630163 .630163);--chart-1:color(display-p3 .831444 .831444 .831444);--chart-2:color(display-p3 .451519 .451519 .451519);--chart-3:color(display-p3 .321993 .321993 .321993);--chart-4:color(display-p3 .250471 .250471 .250471);--chart-5:color(display-p3 .149382 .149382 .149382);--sidebar:color(display-p3 .980256 .980256 .980256);--sidebar-foreground:color(display-p3 .0393882 .0393882 .0393882);--sidebar-primary:color(display-p3 .0905274 .0905274 .0905274);--sidebar-primary-foreground:color(display-p3 .980256 .980256 .980256);--sidebar-accent:color(display-p3 .960587 .960587 .960587);--sidebar-accent-foreground:color(display-p3 .0905274 .0905274 .0905274);--sidebar-border:color(display-p3 .898161 .898161 .898161);--sidebar-ring:color(display-p3 .630163 .630163 .630163)}}@supports (color:lab(0% 0 0)){:root{--background:lab(100% 0 0);--foreground:lab(2.75381% 0 0);--card:lab(100% 0 0);--card-foreground:lab(2.75381% 0 0);--popover:lab(100% 0 0);--popover-foreground:lab(2.75381% 0 0);--primary:lab(7.78201% -.0000149012 0);--primary-foreground:lab(98.26% 0 0);--secondary:lab(96.52% -.0000298023 .0000119209);--secondary-foreground:lab(7.78201% -.0000149012 0);--muted:lab(96.52% -.0000298023 .0000119209);--muted-foreground:lab(48.496% 0 0);--accent:lab(96.52% -.0000298023 .0000119209);--accent-foreground:lab(7.78201% -.0000149012 0);--destructive:lab(48.4493% 77.4328 61.5452);--destructive-foreground:lab(98.26% 0 0);--border:lab(90.952% 0 -.0000119209);--input:lab(90.952% 0 -.0000119209);--ring:lab(66.128% -.0000298023 .0000119209);--chart-1:lab(84.92% 0 -.0000119209);--chart-2:lab(48.496% 0 0);--chart-3:lab(34.924% 0 0);--chart-4:lab(27.036% 0 0);--chart-5:lab(15.204% 0 -.00000596046);--sidebar:lab(98.26% 0 0);--sidebar-foreground:lab(2.75381% 0 0);--sidebar-primary:lab(7.78201% -.0000149012 0);--sidebar-primary-foreground:lab(98.26% 0 0);--sidebar-accent:lab(96.52% -.0000298023 .0000119209);--sidebar-accent-foreground:lab(7.78201% -.0000149012 0);--sidebar-border:lab(90.952% 0 -.0000119209);--sidebar-ring:lab(66.128% -.0000298023 .0000119209)}}.dark{--background:#0a0a0a;--foreground:#fafafa;--card:#171717;--card-foreground:#fafafa;--popover:#171717;--popover-foreground:#fafafa;--primary:#e5e5e5;--primary-foreground:#171717;--secondary:#262626;--secondary-foreground:#fafafa;--muted:#262626;--muted-foreground:#a1a1a1;--accent:#00c37b;--accent-foreground:#fafafa;--destructive:#ff6568;--destructive-foreground:#fafafa;--border:rgba(255,255,255,.1);--input:rgba(255,255,255,.15);--ring:#737373;--chart-1:#d4d4d4;--chart-2:#737373;--chart-3:#525252;--chart-4:#404040;--chart-5:#262626;--sidebar:#171717;--sidebar-foreground:#fafafa;--sidebar-primary:#1447e6;--sidebar-primary-foreground:#fafafa;--sidebar-accent:#262626;--sidebar-accent-foreground:#fafafa;--sidebar-border:rgba(255,255,255,.1);--sidebar-ring:#737373}@supports (color:color(display-p3 0 0 0)){.dark{--background:color(display-p3 .0393882 .0393882 .0393882);--foreground:color(display-p3 .980256 .980256 .980256);--card:color(display-p3 .0905274 .0905274 .0905274);--card-foreground:color(display-p3 .980256 .980256 .980256);--popover:color(display-p3 .0905274 .0905274 .0905274);--popover-foreground:color(display-p3 .980256 .980256 .980256);--primary:color(display-p3 .898161 .898161 .898161);--primary-foreground:color(display-p3 .0905274 .0905274 .0905274);--secondary:color(display-p3 .149382 .149382 .149382);--secondary-foreground:color(display-p3 .980256 .980256 .980256);--muted:color(display-p3 .149382 .149382 .149382);--muted-foreground:color(display-p3 .630163 .630163 .630163);--accent:color(display-p3 .339841 .754462 .503519);--accent-foreground:color(display-p3 .980256 .980256 .980256);--destructive:color(display-p3 .933534 .431676 .423491);--destructive-foreground:color(display-p3 .980256 .980256 .980256);--border:color(display-p3 1 1 1/.1);--input:color(display-p3 1 1 1/.15);--ring:color(display-p3 .451519 .451519 .451519);--chart-1:color(display-p3 .831444 .831444 .831444);--chart-2:color(display-p3 .451519 .451519 .451519);--chart-3:color(display-p3 .321993 .321993 .321993);--chart-4:color(display-p3 .250471 .250471 .250471);--chart-5:color(display-p3 .149382 .149382 .149382);--sidebar:color(display-p3 .0905274 .0905274 .0905274);--sidebar-foreground:color(display-p3 .980256 .980256 .980256);--sidebar-primary:color(display-p3 .1379 .274983 .867624);--sidebar-primary-foreground:color(display-p3 .980256 .980256 .980256);--sidebar-accent:color(display-p3 .149382 .149382 .149382);--sidebar-accent-foreground:color(display-p3 .980256 .980256 .980256);--sidebar-border:color(display-p3 1 1 1/.1);--sidebar-ring:color(display-p3 .451519 .451519 .451519)}}@supports (color:lab(0% 0 0)){.dark{--background:lab(2.75381% 0 0);--foreground:lab(98.26% 0 0);--card:lab(7.78201% -.0000149012 0);--card-foreground:lab(98.26% 0 0);--popover:lab(7.78201% -.0000149012 0);--popover-foreground:lab(98.26% 0 0);--primary:lab(90.952% 0 -.0000119209);--primary-foreground:lab(7.78201% -.0000149012 0);--secondary:lab(15.204% 0 -.00000596046);--secondary-foreground:lab(98.26% 0 0);--muted:lab(15.204% 0 -.00000596046);--muted-foreground:lab(66.128% -.0000298023 .0000119209);--accent:lab(69.7395% -56.1647 24.7025);--accent-foreground:lab(98.26% 0 0);--destructive:lab(63.7053% 60.745 31.3109);--destructive-foreground:lab(98.26% 0 0);--border:lab(100% 0 0/.1);--input:lab(100% 0 0/.15);--ring:lab(48.496% 0 0);--chart-1:lab(84.92% 0 -.0000119209);--chart-2:lab(48.496% 0 0);--chart-3:lab(34.924% 0 0);--chart-4:lab(27.036% 0 0);--chart-5:lab(15.204% 0 -.00000596046);--sidebar:lab(7.78201% -.0000149012 0);--sidebar-foreground:lab(98.26% 0 0);--sidebar-primary:lab(36.9089% 35.0961 -85.6872);--sidebar-primary-foreground:lab(98.26% 0 0);--sidebar-accent:lab(15.204% 0 -.00000596046);--sidebar-accent-foreground:lab(98.26% 0 0);--sidebar-border:lab(100% 0 0/.1);--sidebar-ring:lab(48.496% 0 0)}}*{border-color:var(--border)}body{background-color:var(--background);color:var(--foreground)}html{font-family:var(--font-body),ui-sans-serif,system-ui,sans-serif}.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}}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;bottom:0;left:0;right:0}.inset-x-0{left:0;right:0}.-left-\[22px\]{left:-22px}.-left-\[24px\]{left:-24px}.-left-\[39px\]{left:-39px}.-left-\[40px\]{left:-40px}.-top-0\.5{top:-.125rem}.bottom-1{bottom:.25rem}.bottom-2{bottom:.5rem}.bottom-full{bottom:100%}.left-0{left:0}.left-2{left:.5rem}.left-2\.5{left:.625rem}.right-2{right:.5rem}.top-0{top:0}.top-0\.5{top:.125rem}.top-1{top:.25rem}.top-1\/2{top:50%}.top-2{top:.5rem}.top-6{top:1.5rem}.isolate{isolation:isolate}.z-10{z-index:10}.z-50{z-index:50}.z-\[10000\]{z-index:10000}.z-\[10001\]{z-index:10001}.z-\[10050\]{z-index:10050}.z-\[100\]{z-index:100}.z-\[1\]{z-index:1}.m-0{margin:0}.m-3{margin:.75rem}.m-\[\.15rem_\.35rem_0\]{margin:.15rem .35rem 0}.m-\[\.35rem_\.35rem_0\]{margin:.35rem .35rem 0}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.mx-0{margin-left:0;margin-right:0}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.\!mr-1{margin-right:.25rem!important}.\!mt-\[1\.25rem\]{margin-top:1.25rem!important}.mb-0{margin-bottom:0}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-\[-2px\]{margin-bottom:-2px}.ml-0\.5{margin-left:.125rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mr-4{margin-right:1rem}.mr-\[12px\]{margin-right:12px}.mr-\[16px\]{margin-right:16px}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-\[0\.75rem\]{margin-top:.75rem}.mt-auto{margin-top:auto}.box-border{box-sizing:border-box}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.\!block{display:block!important}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.\!size-3\.5{width:.875rem!important;height:.875rem!important}.\!size-4{width:1rem!important;height:1rem!important}.size-1{width:.25rem;height:.25rem}.size-1\.5{width:.375rem;height:.375rem}.size-10{width:2.5rem;height:2.5rem}.size-2{width:.5rem;height:.5rem}.size-3{width:.75rem;height:.75rem}.size-3\.5{width:.875rem;height:.875rem}.size-4{width:1rem;height:1rem}.size-5{width:1.25rem;height:1.25rem}.size-6{width:1.5rem;height:1.5rem}.size-7{width:1.75rem;height:1.75rem}.size-8{width:2rem;height:2rem}.size-9{width:2.25rem;height:2.25rem}.size-full{width:100%;height:100%}.\!h-7{height:1.75rem!important}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.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-\[14px\]{height:14px}.h-\[calc\(100\%-2px\)\]{height:calc(100% - 2px)}.h-\[min\(68vh\,520px\)\]{height:min(68vh,520px)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-dvh{height:100dvh}.h-full{height:100%}.h-px{height:1px}.max-h-0{max-height:0}.max-h-40{max-height:10rem}.max-h-48{max-height:12rem}.max-h-96{max-height:24rem}.max-h-\[2000px\]{max-height:2000px}.max-h-\[225px\]{max-height:225px}.max-h-\[240px\]{max-height:240px}.max-h-\[300px\]{max-height:300px}.max-h-\[6000px\]{max-height:6000px}.max-h-\[92vh\]{max-height:92vh}.max-h-\[calc\(100vh-16px\)\]{max-height:calc(100vh - 16px)}.max-h-\[min\(50vh\,22rem\)\]{max-height:min(50vh,22rem)}.max-h-\[min\(50vh\,360px\)\]{max-height:min(50vh,360px)}.max-h-\[min\(68vh\,640px\)\]{max-height:min(68vh,640px)}.max-h-dvh{max-height:100dvh}.\!min-h-0{min-height:0!important}.\!min-h-\[--min-h\]{min-height:var(--min-h)!important}.min-h-0{min-height:0}.min-h-20{min-height:5rem}.min-h-5{min-height:1.25rem}.min-h-7{min-height:1.75rem}.min-h-9{min-height:2.25rem}.min-h-\[110px\]{min-height:110px}.min-h-\[120px\]{min-height:120px}.min-h-\[124px\]{min-height:124px}.min-h-\[180px\]{min-height:180px}.min-h-\[200px\]{min-height:200px}.min-h-\[220px\]{min-height:220px}.min-h-\[240px\]{min-height:240px}.min-h-\[320px\]{min-height:320px}.min-h-\[40vh\]{min-height:40vh}.min-h-\[420px\]{min-height:420px}.min-h-\[80px\]{min-height:80px}.min-h-\[88px\]{min-height:88px}.\!w-7{width:1.75rem!important}.\!w-\[520px\]{width:520px!important}.\!w-fit{width:-moz-fit-content!important;width:fit-content!important}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[100px\]{width:100px}.w-\[102px\]{width:102px}.w-\[104px\]{width:104px}.w-\[112px\]{width:112px}.w-\[116px\]{width:116px}.w-\[128px\]{width:128px}.w-\[140px\]{width:140px}.w-\[14px\]{width:14px}.w-\[160px\]{width:160px}.w-\[168px\]{width:168px}.w-\[172px\]{width:172px}.w-\[180px\]{width:180px}.w-\[220px\]{width:220px}.w-\[260px\]{width:260px}.w-\[72px\]{width:72px}.w-\[96px\]{width:96px}.w-auto{width:auto}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-max{width:max-content}.w-px{width:1px}.\!min-w-0{min-width:0!important}.min-w-0{min-width:0}.min-w-24{min-width:6rem}.min-w-32{min-width:8rem}.min-w-9{min-width:2.25rem}.min-w-\[120px\]{min-width:120px}.min-w-\[140px\]{min-width:140px}.min-w-\[148px\]{min-width:148px}.min-w-\[172px\]{min-width:172px}.min-w-\[200px\]{min-width:200px}.min-w-\[220px\]{min-width:220px}.min-w-\[6\.5rem\]{min-width:6.5rem}.min-w-\[88px\]{min-width:88px}.min-w-\[8rem\]{min-width:8rem}.min-w-\[96px\]{min-width:96px}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.\!max-w-\[400px\]{max-width:400px!important}.max-w-36{max-width:9rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-\[240px\]{max-width:240px}.max-w-\[300px\]{max-width:300px}.max-w-\[460px\]{max-width:460px}.max-w-\[480px\]{max-width:480px}.max-w-\[520px\]{max-width:520px}.max-w-\[560px\]{max-width:560px}.max-w-\[720px\]{max-width:720px}.max-w-\[760px\]{max-width:760px}.max-w-\[840px\]{max-width:840px}.max-w-\[920px\]{max-width:920px}.max-w-\[min\(100\%\,280px\)\]{max-width:min(100%,280px)}.max-w-\[min\(100vw-24px\,260px\)\]{max-width:min(100vw - 24px,260px)}.max-w-\[min\(100vw-32px\,320px\)\]{max-width:min(100vw - 32px,320px)}.max-w-\[min\(360px\,90vw\)\]{max-width:min(360px,90vw)}.max-w-\[min\(540px\,100\%\)\]{max-width:min(540px,100%)}.max-w-full{max-width:100%}.max-w-none{max-width:none}.max-w-xs{max-width:20rem}.\!flex-none{flex:none!important}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.border-collapse{border-collapse:collapse}.-translate-y-1\/2{--tw-translate-y:-50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(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))skewX(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))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.animate-\[backdropIn_0\.2s_ease-out\]{animation:.2s ease-out backdropIn}.animate-\[modalIn_0\.2s_ease-out\]{animation:.2s ease-out modalIn}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:1s linear infinite spin}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.resize-y{resize:vertical}.resize{resize:both}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-row{flex-direction:row}.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-start{justify-content:flex-start!important}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-\[10px\]{gap:10px}.gap-\[var\(--space-4\)\]{gap:var(--space-4)}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-4{row-gap:1rem}.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))}.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-\[var\(--ds-border\)\]>:not([hidden])~:not([hidden]){border-color:var(--ds-border)}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overscroll-contain{overscroll-behavior:contain}.overscroll-y-contain{overscroll-behavior-y:contain}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.\!rounded{border-radius:.25rem!important}.\!rounded-md{border-radius:calc(var(--radius) - 2px)!important}.\!rounded-none{border-radius:0!important}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-\[4px\]{border-radius:4px}.rounded-\[min\(var\(--radius-md\)\,10px\)\]{border-radius:min(var(--radius-md),10px)}.rounded-\[min\(var\(--radius-md\)\,12px\)\]{border-radius:min(var(--radius-md),12px)}.rounded-\[min\(var\(--radius-md\)\,14px\)\]{border-radius:min(var(--radius-md),14px)}.rounded-\[var\(--ds-radius-sm\)\]{border-radius:var(--ds-radius-sm)}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-none{border-radius:0}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:.75rem}.\!border{border-width:1px!important}.\!border-0{border-width:0!important}.border{border-width:1px}.border-0{border-width:0}.border-x-0{border-left-width:0;border-right-width:0}.border-b{border-bottom-width:1px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-t-0{border-top-width:0}.\!border-solid{border-style:solid!important}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.\!border-none{border-style:none!important}.border-none{border-style:none}.\!border-\[\#1677FF\]{--tw-border-opacity:1!important;border-color:rgba(22,119,255,var(--tw-border-opacity,1))!important}.\!border-\[\#52C51A\]{--tw-border-opacity:1!important;border-color:rgba(82,197,26,var(--tw-border-opacity,1))!important}.\!border-\[\#FAAD14\]{--tw-border-opacity:1!important;border-color:rgba(250,173,20,var(--tw-border-opacity,1))!important}.\!border-\[\#FF4D50\]{--tw-border-opacity:1!important;border-color:rgba(255,77,80,var(--tw-border-opacity,1))!important}.\!border-\[\#e5e5e5\]{--tw-border-opacity:1!important;border-color:rgba(229,229,229,var(--tw-border-opacity,1))!important}.\!border-\[var\(--border-default\)\]{border-color:var(--border-default)!important}.\!border-\[var\(--ds-accent\)\]{border-color:var(--ds-accent)!important}.border-\[\#223044\]{--tw-border-opacity:1;border-color:rgba(34,48,68,var(--tw-border-opacity,1))}.border-\[\#e2e6ee\]{--tw-border-opacity:1;border-color:rgba(226,230,238,var(--tw-border-opacity,1))}.border-\[\#e4dfc8\]{--tw-border-opacity:1;border-color:rgba(228,223,200,var(--tw-border-opacity,1))}.border-\[\#efefef\]{--tw-border-opacity:1;border-color:rgba(239,239,239,var(--tw-border-opacity,1))}.border-\[color\:var\(--ds-accent\)\]{border-color:var(--ds-accent)}.border-\[color\:var\(--ds-border\)\]{border-color:var(--ds-border)}.border-\[color\:var\(--ds-ok\)\]{border-color:var(--ds-ok)}.border-\[var\(--amber\)\]{border-color:var(--amber)}.border-\[var\(--border-subtle\)\]{border-color:var(--border-subtle)}.border-\[var\(--calendar-day-today-border\)\]{border-color:var(--calendar-day-today-border)}.border-\[var\(--ds-accent\)\]{border-color:var(--ds-accent)}.border-\[var\(--ds-border\)\]{border-color:var(--ds-border)}.border-\[var\(--ds-border\,var\(--input\)\)\]{border-color:var(--ds-border,var(--input))}.border-\[var\(--green-dark\)\]{border-color:var(--green-dark)}.border-amber-500\/40{border-color:rgba(245,158,11,.4)}.border-black\/5{border-color:rgba(0,0,0,.05)}.border-black\/\[0\.06\]{border-color:rgba(0,0,0,.06)}.border-border{border-color:var(--border)}.border-destructive{border-color:var(--destructive)}.border-emerald-500\/40{border-color:rgba(16,185,129,.4)}.border-red-200{--tw-border-opacity:1;border-color:rgba(254,202,202,var(--tw-border-opacity,1))}.border-red-500\/40{border-color:rgba(239,68,68,.4)}.border-transparent{border-color:transparent}.border-white\/5{border-color:rgba(255,255,255,.05)}.border-t-\[var\(--ds-border\)\]{border-top-color:var(--ds-border)}.\!bg-\[\#E7F4FF\]{--tw-bg-opacity:1!important;background-color:rgba(231,244,255,var(--tw-bg-opacity,1))!important}.\!bg-\[\#F6FFED\]{--tw-bg-opacity:1!important;background-color:rgba(246,255,237,var(--tw-bg-opacity,1))!important}.\!bg-\[\#FFF3F1\]{--tw-bg-opacity:1!important;background-color:rgba(255,243,241,var(--tw-bg-opacity,1))!important}.\!bg-\[\#FFFBE6\]{--tw-bg-opacity:1!important;background-color:rgba(255,251,230,var(--tw-bg-opacity,1))!important}.\!bg-\[\#fbfbfc\]{--tw-bg-opacity:1!important;background-color:rgba(251,251,252,var(--tw-bg-opacity,1))!important}.\!bg-\[var\(--green-light\)\]{background-color:var(--green-light)!important}.\!bg-transparent{background-color:transparent!important}.bg-\[\#111\]{--tw-bg-opacity:1;background-color:rgba(17,17,17,var(--tw-bg-opacity,1))}.bg-\[\#e9e9e9\]{--tw-bg-opacity:1;background-color:rgba(233,233,233,var(--tw-bg-opacity,1))}.bg-\[\#efefef\]{--tw-bg-opacity:1;background-color:rgba(239,239,239,var(--tw-bg-opacity,1))}.bg-\[\#f6f7fa\]{--tw-bg-opacity:1;background-color:rgba(246,247,250,var(--tw-bg-opacity,1))}.bg-\[\#f9f9f7\]{--tw-bg-opacity:1;background-color:rgba(249,249,247,var(--tw-bg-opacity,1))}.bg-\[\#f9f9f9\]{--tw-bg-opacity:1;background-color:rgba(249,249,249,var(--tw-bg-opacity,1))}.bg-\[\#fafafa\]{--tw-bg-opacity:1;background-color:rgba(250,250,250,var(--tw-bg-opacity,1))}.bg-\[\#fbfbfc\]{--tw-bg-opacity:1;background-color:rgba(251,251,252,var(--tw-bg-opacity,1))}.bg-\[\#fef2f2\]{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity,1))}.bg-\[\#fff\]{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity,1))}.bg-\[color-mix\(in_srgb\,var\(--blue\)_12\%\,var\(--surface-1\)\)\]{background-color:color-mix(in srgb,var(--blue)12%,var(--surface-1))}.bg-\[rgba\(120\,30\,30\,\.07\)\]{background-color:rgba(120,30,30,.07)}.bg-\[rgba\(50\,100\,180\,\.07\)\]{background-color:rgba(50,100,180,.07)}.bg-\[var\(--amber\)\]{background-color:var(--amber)}.bg-\[var\(--border-hover\)\]{background-color:var(--border-hover)}.bg-\[var\(--calendar-day-bg\)\]{background-color:var(--calendar-day-bg)}.bg-\[var\(--calendar-day-disabled-bg\)\]{background-color:var(--calendar-day-disabled-bg)}.bg-\[var\(--calendar-day-selected-bg\)\]{background-color:var(--calendar-day-selected-bg)}.bg-\[var\(--calendar-day-selected-text\)\]{background-color:var(--calendar-day-selected-text)}.bg-\[var\(--calendar-day-today-border\)\]{background-color:var(--calendar-day-today-border)}.bg-\[var\(--ds-accent\)\]{background-color:var(--ds-accent)}.bg-\[var\(--ds-bg\)\]{background-color:var(--ds-bg)}.bg-\[var\(--ds-border\)\]{background-color:var(--ds-border)}.bg-\[var\(--ds-danger\)\]{background-color:var(--ds-danger)}.bg-\[var\(--ds-item-active\)\]{background-color:var(--ds-item-active)}.bg-\[var\(--ds-item-hover\)\]{background-color:var(--ds-item-hover)}.bg-\[var\(--ds-log-bg\)\]{background-color:var(--ds-log-bg)}.bg-\[var\(--ds-main-tint\)\]{background-color:var(--ds-main-tint)}.bg-\[var\(--ds-muted\)\]{background-color:var(--ds-muted)}.bg-\[var\(--ds-ok\)\]{background-color:var(--ds-ok)}.bg-\[var\(--ds-sidebar\)\]{background-color:var(--ds-sidebar)}.bg-\[var\(--green-light\)\]{background-color:var(--green-light)}.bg-\[var\(--surface-1\)\]{background-color:var(--surface-1)}.bg-\[var\(--surface-2\)\]{background-color:var(--surface-2)}.bg-amber-500\/15{background-color:rgba(245,158,11,.15)}.bg-amber-500\/5{background-color:rgba(245,158,11,.05)}.bg-background{background-color:var(--background)}.bg-black\/45{background-color:rgba(0,0,0,.45)}.bg-black\/70{background-color:rgba(0,0,0,.7)}.bg-border{background-color:var(--border)}.bg-emerald-500\/10{background-color:rgba(16,185,129,.1)}.bg-emerald-500\/15{background-color:rgba(16,185,129,.15)}.bg-emerald-500\/5{background-color:rgba(16,185,129,.05)}.bg-gray-800{--tw-bg-opacity:1;background-color:rgba(31,41,55,var(--tw-bg-opacity,1))}.bg-input{background-color:var(--input)}.bg-popover{background-color:var(--popover)}.bg-red-50{--tw-bg-opacity:1;background-color:rgba(254,242,242,var(--tw-bg-opacity,1))}.bg-red-500\/10{background-color:rgba(239,68,68,.1)}.bg-red-500\/15{background-color:rgba(239,68,68,.15)}.bg-red-500\/5{background-color:rgba(239,68,68,.05)}.bg-secondary{background-color:var(--secondary)}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity,1))}.bg-white\/\[\.012\]{background-color:rgba(255,255,255,.01)}.object-cover{-o-object-fit:cover;object-fit:cover}.\!p-0{padding:0!important}.\!p-3{padding:.75rem!important}.p-0{padding:0}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-\[\.45rem_\.75rem\]{padding:.45rem .75rem}.p-\[1rem_\.75rem\]{padding:1rem .75rem}.p-\[24px\]{padding:24px}.p-\[var\(--space-1\)\]{padding:var(--space-1)}.\!px-0{padding-left:0!important;padding-right:0!important}.\!px-1{padding-left:.25rem!important;padding-right:.25rem!important}.\!px-4{padding-left:1rem!important;padding-right:1rem!important}.\!px-5{padding-left:1.25rem!important;padding-right:1.25rem!important}.\!py-0{padding-top:0!important;padding-bottom:0!important}.\!py-3{padding-top:.75rem!important;padding-bottom:.75rem!important}.\!py-3\.5{padding-top:.875rem!important;padding-bottom:.875rem!important}.\!py-4{padding-top:1rem!important;padding-bottom:1rem!important}.px-0{padding-left:0;padding-right:0}.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-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-\[24px\]{padding-left:24px;padding-right:24px}.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-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-\[\.85rem\]{padding-top:.85rem;padding-bottom:.85rem}.\!pl-0{padding-left:0!important}.\!pl-\[16px\]{padding-left:16px!important}.\!pr-0{padding-right:0!important}.\!pr-\[16px\]{padding-right:16px!important}.\!pt-2{padding-top:.5rem!important}.pb-1{padding-bottom:.25rem}.pb-2{padding-bottom:.5rem}.pb-2\.5{padding-bottom:.625rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-\[1px\]{padding-bottom:1px}.pb-\[var\(--space-4\)\]{padding-bottom:var(--space-4)}.pl-1{padding-left:.25rem}.pl-1\.5{padding-left:.375rem}.pl-2{padding-left:.5rem}.pl-4{padding-left:1rem}.pl-6{padding-left:1.5rem}.pl-8{padding-left:2rem}.pl-9{padding-left:2.25rem}.pl-\[0\]{padding-left:0}.pr-1{padding-right:.25rem}.pr-3{padding-right:.75rem}.pr-8{padding-right:2rem}.pr-\[0\]{padding-right:0}.pt-1{padding-top:.25rem}.pt-1\.5{padding-top:.375rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-middle{vertical-align:middle}.font-mono{font-family:var(--font-mono),ui-monospace,monospace}.font-sans{font-family:var(--font-body),ui-sans-serif,system-ui,sans-serif}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[0\.78rem\]{font-size:.78rem}.text-\[0\.8rem\]{font-size:.8rem}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[14px\]{font-size:14px}.text-\[9\.5px\]{font-size:9.5px}.text-base{font-size:var(--text-base);line-height:1.5}.text-lg{font-size:var(--text-lg);line-height:1.4}.text-sm{font-size:var(--text-sm);line-height:1.4}.text-xs{font-size:var(--text-xs);line-height:1.4}.\!font-normal{font-weight:400!important}.font-\[600\]{font-weight:600}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal)var(--tw-slashed-zero)var(--tw-numeric-figure)var(--tw-numeric-spacing)var(--tw-numeric-fraction)}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-\[1\.5\]{line-height:1.5}.leading-\[1\.6\]{line-height:1.6}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-wide{letter-spacing:.025em}.tracking-widest{letter-spacing:.1em}.\!text-\[\#1677FF\]{--tw-text-opacity:1!important;color:rgba(22,119,255,var(--tw-text-opacity,1))!important}.\!text-\[\#1C1E1F\]{--tw-text-opacity:1!important;color:rgba(28,30,31,var(--tw-text-opacity,1))!important}.\!text-\[\#52C51A\]{--tw-text-opacity:1!important;color:rgba(82,197,26,var(--tw-text-opacity,1))!important}.\!text-\[\#6e6e6e\]{--tw-text-opacity:1!important;color:rgba(110,110,110,var(--tw-text-opacity,1))!important}.\!text-\[\#A32D2D\]{--tw-text-opacity:1!important;color:rgba(163,45,45,var(--tw-text-opacity,1))!important}.\!text-\[\#FAAD14\]{--tw-text-opacity:1!important;color:rgba(250,173,20,var(--tw-text-opacity,1))!important}.\!text-\[\#FF4D50\]{--tw-text-opacity:1!important;color:rgba(255,77,80,var(--tw-text-opacity,1))!important}.\!text-\[\#e6e6e6\]{--tw-text-opacity:1!important;color:rgba(230,230,230,var(--tw-text-opacity,1))!important}.\!text-\[var\(--ds-text\)\]{color:var(--ds-text)!important}.\!text-zinc-500{--tw-text-opacity:1!important;color:rgba(113,113,122,var(--tw-text-opacity,1))!important}.text-\[\#252e3e\]{--tw-text-opacity:1;color:rgba(37,46,62,var(--tw-text-opacity,1))}.text-\[\#2e5a38\]{--tw-text-opacity:1;color:rgba(46,90,56,var(--tw-text-opacity,1))}.text-\[\#303a4a\]{--tw-text-opacity:1;color:rgba(48,58,74,var(--tw-text-opacity,1))}.text-\[\#343d52\]{--tw-text-opacity:1;color:rgba(52,61,82,var(--tw-text-opacity,1))}.text-\[\#353f52\]{--tw-text-opacity:1;color:rgba(53,63,82,var(--tw-text-opacity,1))}.text-\[\#3B6D11\]{--tw-text-opacity:1;color:rgba(59,109,17,var(--tw-text-opacity,1))}.text-\[\#4d80c4\]{--tw-text-opacity:1;color:rgba(77,128,196,var(--tw-text-opacity,1))}.text-\[\#535353\]{--tw-text-opacity:1;color:rgba(83,83,83,var(--tw-text-opacity,1))}.text-\[\#5a8ec4\]{--tw-text-opacity:1;color:rgba(90,142,196,var(--tw-text-opacity,1))}.text-\[\#626a77\]{--tw-text-opacity:1;color:rgba(98,106,119,var(--tw-text-opacity,1))}.text-\[\#6e2828\]{--tw-text-opacity:1;color:rgba(110,40,40,var(--tw-text-opacity,1))}.text-\[\#6e6e6e\]{--tw-text-opacity:1;color:rgba(110,110,110,var(--tw-text-opacity,1))}.text-\[\#8A8985\]{--tw-text-opacity:1;color:rgba(138,137,133,var(--tw-text-opacity,1))}.text-\[\#A32D2D\]{--tw-text-opacity:1;color:rgba(163,45,45,var(--tw-text-opacity,1))}.text-\[\#b0bac8\]{--tw-text-opacity:1;color:rgba(176,186,200,var(--tw-text-opacity,1))}.text-\[\#b4c4b9\]{--tw-text-opacity:1;color:rgba(180,196,185,var(--tw-text-opacity,1))}.text-\[var\(--amber\)\]{color:var(--amber)}.text-\[var\(--blue\)\]{color:var(--blue)}.text-\[var\(--calendar-day-disabled-text\)\]{color:var(--calendar-day-disabled-text)}.text-\[var\(--calendar-day-selected-text\)\]{color:var(--calendar-day-selected-text)}.text-\[var\(--calendar-day-text\)\]{color:var(--calendar-day-text)}.text-\[var\(--calendar-day-today-text\)\]{color:var(--calendar-day-today-text)}.text-\[var\(--ds-accent\)\]{color:var(--ds-accent)}.text-\[var\(--ds-danger\)\]{color:var(--ds-danger)}.text-\[var\(--ds-muted\)\]{color:var(--ds-muted)}.text-\[var\(--ds-ok\)\]{color:var(--ds-ok)}.text-\[var\(--ds-text\)\]{color:var(--ds-text)}.text-\[var\(--green-dark\)\]{color:var(--green-dark)}.text-\[var\(--surface-1\)\]{color:var(--surface-1)}.text-\[var\(--text-placeholder\)\]{color:var(--text-placeholder)}.text-\[var\(--text-secondary\)\]{color:var(--text-secondary)}.text-\[var\(--text-tertiary\)\]{color:var(--text-tertiary)}.text-amber-600{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity,1))}.text-destructive{color:var(--destructive)}.text-emerald-600{--tw-text-opacity:1;color:rgba(5,150,105,var(--tw-text-opacity,1))}.text-emerald-700{--tw-text-opacity:1;color:rgba(4,120,87,var(--tw-text-opacity,1))}.text-foreground{color:var(--foreground)}.text-gray-500{--tw-text-opacity:1;color:rgba(107,114,128,var(--tw-text-opacity,1))}.text-muted-foreground{color:var(--muted-foreground)}.text-orange-600{--tw-text-opacity:1;color:rgba(234,88,12,var(--tw-text-opacity,1))}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-red-500{--tw-text-opacity:1;color:rgba(239,68,68,var(--tw-text-opacity,1))}.text-red-600{--tw-text-opacity:1;color:rgba(220,38,38,var(--tw-text-opacity,1))}.text-red-700{--tw-text-opacity:1;color:rgba(185,28,28,var(--tw-text-opacity,1))}.text-secondary-foreground{color:var(--secondary-foreground)}.text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity,1))}.text-zinc-400{--tw-text-opacity:1;color:rgba(161,161,170,var(--tw-text-opacity,1))}.text-zinc-500{--tw-text-opacity:1;color:rgba(113,113,122,var(--tw-text-opacity,1))}.text-zinc-700{--tw-text-opacity:1;color:rgba(63,63,70,var(--tw-text-opacity,1))}.text-zinc-900{--tw-text-opacity:1;color:rgba(24,24,27,var(--tw-text-opacity,1))}.underline{-webkit-text-decoration-line:underline;text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.\!shadow-none{--tw-shadow:0 0 transparent!important;--tw-shadow-colored:0 0 transparent!important;box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)!important}.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 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 transparent;--tw-shadow-colored:0 0 transparent;box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),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 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.shadow-\[var\(--shadow-float\)\]{--tw-shadow-color:var(--shadow-float);--tw-shadow:var(--tw-shadow-colored)}.shadow-\[var\(--shadow-lg\)\]{--tw-shadow-color:var(--shadow-lg);--tw-shadow:var(--tw-shadow-colored)}.shadow-\[var\(--shadow-md\)\]{--tw-shadow-color:var(--shadow-md);--tw-shadow:var(--tw-shadow-colored)}.shadow-\[var\(--shadow-sm\)\]{--tw-shadow-color:var(--shadow-sm);--tw-shadow:var(--tw-shadow-colored)}.outline{outline-style:solid}.ring-0{--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(0px + 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 transparent)}.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)}.transition{transition-property:color,background-color,border-color,-webkit-text-decoration-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter,backdrop-filter;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-\[border-color\,background-color\]{transition-property:border-color,background-color;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-\[border-color\,box-shadow\,background-color\]{transition-property:border-color,box-shadow,background-color;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-\[border-color\,box-shadow\]{transition-property:border-color,box-shadow;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-\[color\,box-shadow\,border-color\,background-color\]{transition-property:color,box-shadow,border-color,background-color;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-\[color\,box-shadow\,border-color\]{transition-property:color,box-shadow,border-color;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-all{transition-property:all;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-property:color,background-color,border-color,-webkit-text-decoration-color,text-decoration-color,fill,stroke;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-property:opacity;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-transform{transition-property:transform;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-100{transition-duration:.1s}.duration-150{transition-duration:.15s}.duration-300{transition-duration:.3s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.will-change-transform{will-change:transform}[data-slot=dropdown-menu-positioner]{border-radius:var(--radius);box-shadow:var(--shadow-float);overflow:visible}.ds-soft-shadow{box-shadow:var(--shadow-sm)}.ds-soft-shadow:hover,.ds-soft-shadow:focus-within{box-shadow:var(--shadow-composer)}.calendar-root.rdp-root{--rdp-accent-color:var(--calendar-day-selected-bg);--rdp-accent-background-color:var(--calendar-day-hover-bg);--rdp-day-height:36px;--rdp-day-width:36px;--rdp-day_button-border-radius:6px;--rdp-day_button-height:36px;--rdp-day_button-width:36px;--rdp-day_button-border:1px solid transparent;--rdp-selected-border:1px solid transparent;--rdp-today-color:var(--calendar-day-today-text);--rdp-disabled-opacity:1;--rdp-outside-opacity:1;--rdp-nav_button-height:2rem;--rdp-nav_button-width:2rem}.calendar-root .rdp-selected .rdp-day_button{background-color:var(--calendar-day-selected-bg);color:var(--calendar-day-selected-text);border-color:transparent}.calendar-root .rdp-today:not(.rdp-selected) .rdp-day_button{color:var(--calendar-day-today-text);border-color:var(--calendar-day-today-border)}.calendar-root .rdp-disabled .rdp-day_button{background-color:var(--calendar-day-disabled-bg);color:var(--calendar-day-disabled-text);opacity:1}:root{--font-body:"DM Sans","PingFang SC","Microsoft YaHei",sans-serif;--font-sans:var(--font-body);--font-anthropic-sans:"Anthropic Sans",system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;--font-anthropic-serif:"Anthropic Serif",Georgia,"Arial Hebrew","Noto Sans Hebrew","Times New Roman",Times,"Hiragino Sans","Yu Gothic",Meiryo,"Noto Sans CJK JP","PingFang TC","Microsoft JhengHei","Noto Sans CJK TC","PingFang SC","Microsoft YaHei","Noto Sans CJK SC","Apple SD Gothic Neo","Malgun Gothic","Noto Sans CJK KR",serif;--font-anthropic-mono:"Anthropic Mono",ui-monospace,monospace;--font-open-dyslexic:"OpenDyslexic","Comic Sans MS",ui-serif,serif;--accent:#1db887}.outline-none{outline-offset:0;outline:none}p,h1,h2,h3,h4,h5,h6{margin:0;padding:0}ul,li{margin:0;padding:0;list-style:none}[data-slot=tabs-list][data-variant=line] [data-slot=tabs-trigger][data-state=active],[data-slot=tabs-list][data-variant=line] [data-slot=tabs-trigger][data-active]:not([data-active=false]),[data-slot=tabs-list][data-variant=line] [data-slot=tabs-trigger][aria-selected=true]{color:var(--ds-main,#1db887);border-bottom:2px solid var(--ds-main,#1db887)}.placeholder\:text-\[var\(--text-placeholder\)\]::placeholder{color:var(--text-placeholder)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.first\:pt-0:first-child{padding-top:0}.hover\:\!border-\[\#e5e5e5\]:hover{--tw-border-opacity:1!important;border-color:rgba(229,229,229,var(--tw-border-opacity,1))!important}.hover\:\!border-\[var\(--ds-accent\)\]:hover{border-color:var(--ds-accent)!important}.hover\:border-\[color\:var\(--ds-accent\)\]:hover{border-color:var(--ds-accent)}.hover\:border-\[color\:var\(--ds-border-hover\)\]:hover{border-color:var(--ds-border-hover)}.hover\:border-\[var\(--border-hover\)\]:hover{border-color:var(--border-hover)}.hover\:border-\[var\(--calendar-day-today-border\)\]:hover{border-color:var(--calendar-day-today-border)}.hover\:border-\[var\(--ds-accent-hover\)\]:hover{border-color:var(--ds-accent-hover)}.hover\:border-\[var\(--ds-border-hover\)\]:hover{border-color:var(--ds-border-hover)}.hover\:\!bg-\[var\(--ds-item-hover\)\]:hover{background-color:var(--ds-item-hover)!important}.hover\:\!bg-\[var\(--green-light\)\]:hover{background-color:var(--green-light)!important}.hover\:\!bg-transparent:hover{background-color:transparent!important}.hover\:bg-\[\#333\]:hover{--tw-bg-opacity:1;background-color:rgba(51,51,51,var(--tw-bg-opacity,1))}.hover\:bg-\[\#fff1f1\]:hover{--tw-bg-opacity:1;background-color:rgba(255,241,241,var(--tw-bg-opacity,1))}.hover\:bg-\[var\(--calendar-day-disabled-bg\)\]:hover{background-color:var(--calendar-day-disabled-bg)}.hover\:bg-\[var\(--calendar-day-hover-bg\)\]:hover{background-color:var(--calendar-day-hover-bg)}.hover\:bg-\[var\(--calendar-day-selected-bg\)\]:hover{background-color:var(--calendar-day-selected-bg)}.hover\:bg-\[var\(--ds-accent-hover\)\]:hover{background-color:var(--ds-accent-hover)}.hover\:bg-\[var\(--ds-item-active\)\]:hover{background-color:var(--ds-item-active)}.hover\:bg-\[var\(--ds-item-bg-hover\)\]:hover{background-color:var(--ds-item-bg-hover)}.hover\:bg-\[var\(--ds-item-hover\)\]:hover{background-color:var(--ds-item-hover)}.hover\:bg-\[var\(--ds-main-tint\)\]:hover{background-color:var(--ds-main-tint)}.hover\:bg-\[var\(--green-light\)\]:hover{background-color:var(--green-light)}.hover\:bg-\[var\(--surface-1\)\]:hover{background-color:var(--surface-1)}.hover\:bg-\[var\(--surface-2\)\]:hover{background-color:var(--surface-2)}.hover\:bg-\[var\(--surface-3\)\]:hover{background-color:var(--surface-3)}.hover\:bg-muted:hover{background-color:var(--muted)}.hover\:bg-transparent:hover{background-color:transparent}.hover\:bg-white\/70:hover{background-color:rgba(255,255,255,.7)}.hover\:\!text-\[\#cfcfcf\]:hover{--tw-text-opacity:1!important;color:rgba(207,207,207,var(--tw-text-opacity,1))!important}.hover\:text-\[\#343d52\]:hover{--tw-text-opacity:1;color:rgba(52,61,82,var(--tw-text-opacity,1))}.hover\:text-\[color\:var\(--ds-accent\)\]:hover{color:var(--ds-accent)}.hover\:text-\[var\(--calendar-day-disabled-text\)\]:hover{color:var(--calendar-day-disabled-text)}.hover\:text-\[var\(--calendar-day-hover-text\)\]:hover{color:var(--calendar-day-hover-text)}.hover\:text-\[var\(--calendar-day-selected-text\)\]:hover{color:var(--calendar-day-selected-text)}.hover\:text-\[var\(--ds-accent\)\]:hover{color:var(--ds-accent)}.hover\:text-\[var\(--ds-accent-hover\)\]:hover{color:var(--ds-accent-hover)}.hover\:text-\[var\(--ds-text\)\]:hover{color:var(--ds-text)}.hover\:text-\[var\(--surface-1\)\]:hover{color:var(--surface-1)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:text-red-800:hover{--tw-text-opacity:1;color:rgba(153,27,27,var(--tw-text-opacity,1))}.hover\:text-zinc-600:hover{--tw-text-opacity:1;color:rgba(82,82,91,var(--tw-text-opacity,1))}.hover\:text-zinc-700:hover{--tw-text-opacity:1;color:rgba(63,63,70,var(--tw-text-opacity,1))}.hover\:text-zinc-900:hover{--tw-text-opacity:1;color:rgba(24,24,27,var(--tw-text-opacity,1))}.hover\:underline:hover{-webkit-text-decoration-line:underline;text-decoration-line:underline}.hover\:shadow-\[0_2px_12px_rgba\(0\,0\,0\,0\.06\)\]:hover{--tw-shadow:0 2px 12px rgba(0,0,0,.06);--tw-shadow-colored:0 2px 12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.hover\:shadow-\[var\(--shadow-sm\)\]:hover{--tw-shadow-color:var(--shadow-sm);--tw-shadow:var(--tw-shadow-colored)}.focus\:bg-\[\#fff1f1\]:focus{--tw-bg-opacity:1;background-color:rgba(255,241,241,var(--tw-bg-opacity,1))}.focus\:bg-\[var\(--ds-item-hover\)\]:focus{background-color:var(--ds-item-hover)}.focus\:bg-\[var\(--surface-2\)\]:focus{background-color:var(--surface-2)}.focus\:bg-accent:focus{background-color:var(--accent)}.focus\:text-\[var\(--ds-text\)\]:focus{color:var(--ds-text)}.focus\:text-accent-foreground:focus{color:var(--accent-foreground)}.focus\:outline-none:focus{outline-offset:2px;outline:2px solid transparent}.focus-visible\:border-0:focus-visible{border-width:0}.focus-visible\:\!border-\[\#e5e5e5\]:focus-visible{--tw-border-opacity:1!important;border-color:rgba(229,229,229,var(--tw-border-opacity,1))!important}.focus-visible\:border-\[var\(--amber\)\]:focus-visible{border-color:var(--amber)}.focus-visible\:border-\[var\(--border-focus\)\]:focus-visible{border-color:var(--border-focus)}.focus-visible\:border-\[var\(--green-dark\)\]:focus-visible{border-color:var(--green-dark)}.focus-visible\:border-destructive:focus-visible{border-color:var(--destructive)}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:outline-none:focus-visible{outline-offset:2px;outline:2px solid transparent}.focus-visible\:ring-0:focus-visible{--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(0px + 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 transparent)}.focus-visible\:ring-1:focus-visible{--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 transparent)}.focus-visible\:ring-2:focus-visible{--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 transparent)}.focus-visible\:ring-\[3px\]:focus-visible{--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(3px + 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 transparent)}.focus-visible\:ring-\[var\(--ds-accent\)\]:focus-visible{--tw-ring-color:var(--ds-accent)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color:var(--ring)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px}.focus-visible\:\[box-shadow\:0_0_0_2px_rgba\(220\,38\,38\,0\.18\)\]:focus-visible{box-shadow:0 0 0 2px rgba(220,38,38,.18)}.focus-visible\:\[box-shadow\:0_0_0_2px_rgba\(255\,181\,71\,0\.25\)\]:focus-visible{box-shadow:0 0 0 2px rgba(255,181,71,.25)}.focus-visible\:\[box-shadow\:var\(--ring-focus-sm\)\]:focus-visible{box-shadow:var(--ring-focus-sm)}.read-only\:focus-visible\:border-border:focus-visible:-moz-read-only{border-color:var(--border)}.read-only\:focus-visible\:border-border:focus-visible:read-only{border-color:var(--border)}.read-only\:focus-visible\:\[box-shadow\:none\]:focus-visible:-moz-read-only{box-shadow:none}.read-only\:focus-visible\:\[box-shadow\:none\]:focus-visible:read-only{box-shadow:none}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:text-\[var\(--ds-muted\)\]:disabled{color:var(--ds-muted)}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.disabled\:hover\:border-\[var\(--ds-border\,var\(--input\)\)\]:hover:disabled{border-color:var(--ds-border,var(--input))}.disabled\:hover\:bg-transparent:hover:disabled{background-color:transparent}.disabled\:focus-visible\:border-\[var\(--ds-border\,var\(--input\)\)\]:focus-visible:disabled{border-color:var(--ds-border,var(--input))}.disabled\:focus-visible\:border-border:focus-visible:disabled{border-color:var(--border)}.disabled\:focus-visible\:\[box-shadow\:none\]:focus-visible:disabled{box-shadow:none}.group:focus-within .group-focus-within\:pointer-events-auto{pointer-events:auto}.group:focus-within .group-focus-within\:visible{visibility:visible}.group:focus-within .group-focus-within\:opacity-100{opacity:1}.group:hover .group-hover\:pointer-events-auto{pointer-events:auto}.group:hover .group-hover\:visible{visibility:visible}.group:hover .group-hover\:opacity-100{opacity:1}.group\/dropdown-menu-item:focus .group-focus\/dropdown-menu-item\:text-accent-foreground{color:var(--accent-foreground)}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-70{opacity:.7}.has-\[\:disabled\]\:cursor-not-allowed:has(:disabled){cursor:not-allowed}.has-\[\:focus-visible\]\:border-\[var\(--border-focus\)\]:has(:focus-visible){border-color:var(--border-focus)}.has-\[\:disabled\]\:opacity-50:has(:disabled){opacity:.5}.has-\[\:focus-visible\]\:\[box-shadow\:var\(--ring-focus-sm\)\]:has(:focus-visible){box-shadow:var(--ring-focus-sm)}.group\/table-row:has(td:hover) .group-has-\[td\:hover\]\/table-row\:\!bg-\[var\(--ds-item-hover\)\]{background-color:var(--ds-item-hover)!important}.aria-expanded\:border-\[var\(--ds-accent-hover\)\][aria-expanded=true]{border-color:var(--ds-accent-hover)}.aria-expanded\:bg-\[var\(--surface-1\)\][aria-expanded=true]{background-color:var(--surface-1)}.aria-expanded\:bg-muted[aria-expanded=true]{background-color:var(--muted)}.aria-expanded\:bg-secondary[aria-expanded=true]{background-color:var(--secondary)}.aria-expanded\:text-\[var\(--ds-accent-hover\)\][aria-expanded=true]{color:var(--ds-accent-hover)}.aria-expanded\:text-foreground[aria-expanded=true]{color:var(--foreground)}.aria-expanded\:text-secondary-foreground[aria-expanded=true]{color:var(--secondary-foreground)}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[size\=default\]\:size-4[data-size=default]{width:1rem;height:1rem}.data-\[size\=sm\]\:size-3\.5[data-size=sm]{width:.875rem;height:.875rem}.data-\[size\=default\]\:h-9[data-size=default]{height:2.25rem}.data-\[size\=lg\]\:h-10[data-size=lg]{height:2.5rem}.data-\[size\=sm\]\:h-7[data-size=sm]{height:1.75rem}.data-\[checked\]\:translate-x-4[data-checked]{--tw-translate-x:1rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.data-\[unchecked\]\:translate-x-0\.5[data-unchecked]{--tw-translate-x:.125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y))rotate(var(--tw-rotate))skewX(var(--tw-skew-x))skewY(var(--tw-skew-y))scaleX(var(--tw-scale-x))scaleY(var(--tw-scale-y))}.data-\[checked\]\:border-\[var\(--ds-accent\)\][data-checked]{border-color:var(--ds-accent)}.data-\[popup-open\]\:border-\[var\(--border-focus\)\][data-popup-open],.data-\[state\=open\]\:border-\[var\(--border-focus\)\][data-state=open]{border-color:var(--border-focus)}.data-\[checked\]\:bg-\[var\(--ds-accent\)\][data-checked]{background-color:var(--ds-accent)}.data-\[checked\]\:bg-primary[data-checked]{background-color:var(--primary)}.data-\[checked\]\:bg-primary-foreground[data-checked]{background-color:var(--primary-foreground)}.data-\[checked\]\:bg-white[data-checked]{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity,1))}.data-\[state\=checked\]\:bg-\[var\(--ds-item-active\)\][data-state=checked]{background-color:var(--ds-item-active)}.data-\[active\]\:font-medium[data-active]{font-weight:500}.data-\[active\]\:text-\[var\(--ds-accent\)\][data-active]{color:var(--ds-accent)}.data-\[variant\=destructive\]\:text-destructive[data-variant=destructive]{color:var(--destructive)}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[popup-open\]\:\[box-shadow\:var\(--ring-focus-sm\)\][data-popup-open],.data-\[state\=open\]\:\[box-shadow\:var\(--ring-focus-sm\)\][data-state=open]{box-shadow:var(--ring-focus-sm)}.data-\[active\]\:after\:absolute[data-active]:after{content:var(--tw-content);position:absolute}.data-\[active\]\:after\:bottom-\[-1px\][data-active]:after{content:var(--tw-content);bottom:-1px}.data-\[active\]\:after\:left-0[data-active]:after{content:var(--tw-content);left:0}.data-\[active\]\:after\:right-0[data-active]:after{content:var(--tw-content);right:0}.data-\[active\]\:after\:h-\[2px\][data-active]:after{content:var(--tw-content);height:2px}.data-\[active\]\:after\:bg-\[var\(--ds-accent\)\][data-active]:after{content:var(--tw-content);background-color:var(--ds-accent)}.data-\[active\]\:after\:content-\[\"\"\][data-active]:after{--tw-content:"";content:var(--tw-content)}.data-\[variant\=destructive\]\:focus\:text-destructive:focus[data-variant=destructive]{color:var(--destructive)}.group\/tabs-list[data-variant=pill] .group-data-\[variant\=pill\]\/tabs-list\:mb-0{margin-bottom:0}.group\/tabs-list[data-variant=pill] .group-data-\[variant\=pill\]\/tabs-list\:mr-0{margin-right:0}.group\/tabs-list[data-variant=default] .group-data-\[variant\=default\]\/tabs-list\:h-8{height:2rem}.group\/tabs-list[data-variant=pill] .group-data-\[variant\=pill\]\/tabs-list\:h-9{height:2.25rem}.group\/tabs-list[data-variant=pill] .group-data-\[variant\=pill\]\/tabs-list\:rounded-full{border-radius:9999px}.group\/tabs-list[data-variant=pill] .group-data-\[variant\=pill\]\/tabs-list\:px-5{padding-left:1.25rem;padding-right:1.25rem}.group\/tabs-list[data-variant=pill] .group-data-\[variant\=pill\]\/tabs-list\:pb-0{padding-bottom:0}.group\/tabs-list[data-variant=pill] .group-data-\[variant\=pill\]\/tabs-list\:text-sm{font-size:var(--text-sm);line-height:1.4}.group\/tabs-list[data-variant=pill] .group-data-\[variant\=pill\]\/tabs-list\:font-semibold{font-weight:600}.group\/tabs-list[data-variant=pill] .group-data-\[variant\=pill\]\/tabs-list\:text-\[\#828282\]{--tw-text-opacity:1;color:rgba(130,130,130,var(--tw-text-opacity,1))}.group\/tabs-list[data-variant=pill] .group-data-\[variant\=pill\]\/tabs-list\:data-\[active\]\:bg-\[\#fff\][data-active]{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity,1))}.group\/tabs-list[data-variant=pill] .group-data-\[variant\=pill\]\/tabs-list\:data-\[active\]\:font-bold[data-active]{font-weight:700}.group\/tabs-list[data-variant=pill] .group-data-\[variant\=pill\]\/tabs-list\:data-\[active\]\:text-\[\#333333\][data-active]{--tw-text-opacity:1;color:rgba(51,51,51,var(--tw-text-opacity,1))}.group\/tabs-list[data-variant=pill] .group-data-\[variant\=pill\]\/tabs-list\:data-\[active\]\:shadow-\[0_2px_10px_rgba\(15\,23\,42\,0\.08\)\][data-active]{--tw-shadow:0 2px 10px rgba(15,23,42,.08);--tw-shadow-colored:0 2px 10px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 transparent),var(--tw-ring-shadow,0 0 transparent),var(--tw-shadow)}.group\/tabs-list[data-variant=pill] .group-data-\[variant\=pill\]\/tabs-list\:data-\[active\]\:after\:\[content\:none\][data-active]:after{content:none}@media (min-width:640px){.sm\:col-span-2{grid-column:span 2/span 2}.sm\:inline{display:inline}.sm\:w-\[220px\]{width:220px}.sm\:shrink-0{flex-shrink:0}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-start{align-items:flex-start}.sm\:pl-2\.5{padding-left:.625rem}.sm\:pr-2\.5{padding-right:.625rem}}@media (min-width:768px){.md\:w-\[300px\]{width:300px}.md\:flex-row{flex-direction:row}.md\:border-b-0{border-bottom-width:0}.md\:border-r{border-right-width:1px}}@media (min-width:1024px){.lg\:flex-row{flex-direction:row}.lg\:flex-nowrap{flex-wrap:nowrap}.lg\:items-center{align-items:center}.lg\:justify-between{justify-content:space-between}.lg\:gap-6{gap:1.5rem}}@media (prefers-color-scheme:dark){.dark\:border-input{border-color:var(--input)}}.\[\&\>td\]\:transition-colors>td{transition-property:color,background-color,border-color,-webkit-text-decoration-color,text-decoration-color,fill,stroke;transition-duration:.15s;transition-timing-function:cubic-bezier(.4,0,.2,1)}.data-\[state\=selected\]\:\[\&\>td\]\:\!bg-\[var\(--ds-item-active\)\]>td[data-state=selected]{background-color:var(--ds-item-active)!important}.\[\&_\[data-slot\=tooltip\]\]\:flex [data-slot=tooltip]{display:flex}.\[\&_\[data-slot\=tooltip\]\]\:w-full [data-slot=tooltip]{width:100%}.\[\&_\[data-slot\=tooltip\]\]\:min-w-0 [data-slot=tooltip]{min-width:0}.\[\&_\[data-slot\=tooltip\]\]\:max-w-full [data-slot=tooltip]{max-width:100%}.\[\&_path\]\:\!fill-none path{fill:none!important}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:1rem;height:1rem}.\[\&_svg\:not\(\[fill\=none\]\)_path\]\:fill-current svg:not([fill=none]) path{fill:currentColor}.\[\&_svg\[fill\=none\]_path\]\:fill-none svg[fill=none] path{fill:none}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-5 svg{width:1.25rem;height:1.25rem}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\]\:stroke-current svg{stroke:currentColor}.\[\&_svg\]\:align-middle svg{vertical-align:middle}.\[\&_svg\]\:\!text-red-600 svg{--tw-text-opacity:1!important;color:rgba(220,38,38,var(--tw-text-opacity,1))!important}.hover\:\[\&_svg\]\:\!text-red-800 svg:hover{--tw-text-opacity:1!important;color:rgba(153,27,27,var(--tw-text-opacity,1))!important}.\[\&_svg_path\]\:\!fill-current svg path{fill:currentColor!important}.\[\&_tr\:last-child\]\:border-b-0 tr:last-child,.\[\&_tr\:last-child_td\]\:border-b-0 tr:last-child td{border-bottom-width:0}.\[\&_tr\]\:table tr{display:table}.\[\&_tr\]\:w-full tr{width:100%}.\[\&_tr\]\:table-fixed tr{table-layout:fixed}.\[\&_tr\]\:border-b tr{border-bottom-width:1px}
|