software-defence-factory 0.11.2 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/docs/concepts.md +4 -2
- package/docs/interfaces.md +23 -1
- package/docs/npm.md +6 -2
- package/docs/workflows.md +7 -2
- package/factory/execution-profile.mjs +2 -1
- package/factory/issue-intake.mjs +10 -3
- package/factory/issue-lifecycle.mjs +25 -0
- package/factory/providers/github.mjs +1 -1
- package/factory/server.mjs +3 -3
- package/factory/ui/assets/index-C3F5-3e7.css +1 -0
- package/factory/ui/assets/index-QrGy_4I4.js +14 -0
- package/factory/ui/index.html +2 -2
- package/package.json +1 -1
- package/factory/ui/assets/index-BQZGHA6-.css +0 -1
- package/factory/ui/assets/index-BUCK1R7u.js +0 -13
package/README.md
CHANGED
|
@@ -45,7 +45,7 @@ The runtime supplies policy and six focused skills to its isolated jobs. `init`
|
|
|
45
45
|
|
|
46
46
|
Each result belongs to a specific candidate commit and policy. A failed check blocks delivery. Changing the candidate or check policy invalidates earlier evidence. Approval records a handoff; publishing, merging and deployment follow the application's separate authority.
|
|
47
47
|
|
|
48
|
-
The project dashboard has an **Inbox**, measured **Analytics**, **Agents**, **Skills**, **Automations**, **Definition** and **Infrastructure**. Inbox
|
|
48
|
+
The project dashboard has an **Inbox**, measured **Analytics**, **Agents**, **Skills**, **Automations**, **Definition** and **Infrastructure**. Inbox opens on a shared list/board of loaded repository issues and local work, with status, search and checkbox filters, readiness and linked execution attempts. New issue offers repository templates or a blank creation form. Create an issue on the supported repository provider, then choose Start work separately; local brief execution remains available. CLI `issue` exposes the same intake. Definition lives with settings above the theme control. The CLI reads the same definition and controller state. Agent roles use a selected harness such as Codex or Pi; a worker executes their isolated jobs on a host. See [concepts](docs/concepts.md) and [supported interfaces](docs/interfaces.md). Optional automations belong to the selected harness, which calls Factory CLI/API. Factory runs no cron scheduler. See [provider boundaries](docs/integrations.md).
|
|
49
49
|
|
|
50
50
|
The optional **defence** workflow accepts scoped incident evidence and produces a private, read-only draft. It does not monitor production or claim verified recovery. See [defence integration](docs/defence-integration.md).
|
|
51
51
|
|
package/docs/concepts.md
CHANGED
|
@@ -18,8 +18,10 @@ The CLI `definition` command and dashboard Definition page read that same catalo
|
|
|
18
18
|
| Automation | External schedule and agent context | Owned by the selected harness; calls Factory CLI/API, no Factory cron |
|
|
19
19
|
| Definition | Effective roles, workflows, skills and settings | Installed method plus private factory.json; read-only catalog |
|
|
20
20
|
|
|
21
|
-
Inbox
|
|
22
|
-
|
|
21
|
+
Inbox combines an explicitly loaded provider page with retained execution
|
|
22
|
+
history in one list/board, grouped by canonical issue identity. Off-page sources
|
|
23
|
+
remain unknown; local requests keep separate identities. New issue
|
|
24
|
+
creates a repository issue without execution; Start work admits execution
|
|
23
25
|
separately. The provider owns issue content/state; SQLite owns queue/attempts and
|
|
24
26
|
creation receipts for recovery. An unfinished local form is not a saved backlog.
|
|
25
27
|
An agent role is neither a machine nor a skill. Check is deterministic, and
|
package/docs/interfaces.md
CHANGED
|
@@ -11,7 +11,7 @@ shell endpoint or a second scheduler.
|
|
|
11
11
|
| --- | --- | --- | --- | --- |
|
|
12
12
|
| Project/queue/attempt state | `status`, `inbox --source factory` JSON | `GET /api/v1/status` | Project, tasks, details/history | Stable versioned agent result/error contract |
|
|
13
13
|
| Start local work | `issue start --file --title` or `--draft`, explicit `--workflow`, optional `--model` | `POST /api/v1/jobs` | Local execution only → review → Create & start locally | Persistent unstarted drafts and typed incident intake remain separate |
|
|
14
|
-
| Browse repository Inbox | `inbox [--page N] [--issue-state open/closed/all]` (also `issue list --source inbox`), `issue preview --url URL` via controller provider | Authenticated `GET /api/v1/issues`, `POST /api/v1/issues/preview` using shared readers |
|
|
14
|
+
| Browse repository Inbox | `inbox [--page N] [--issue-state open/closed/all]` (also `issue list --source inbox`), `issue preview --url URL` via controller provider | Authenticated `GET /api/v1/issues`, `POST /api/v1/issues/preview` using shared readers | Primary list/Board with shared status/search/workflow/model/label filters, compact Repository tools/loaded scope, item count with secondary issue/execution totals and progressive linked detail; explicit Start work for either type | Issue → execution links retained; no implicit polling |
|
|
15
15
|
| Start repository work | `issue start --url URL --workflow software/defence [--brief-file operator.md]` | `POST /api/v1/issues/start` | Issue context → explicit Start work with operator brief | Rechecks current content and active admission |
|
|
16
16
|
| Create repository issue / recovery | `issue connection`, `create --key`, `submissions`, `recover --key` | Authenticated connection, `POST /issues`, receipts and recovery | Display destination/actor, create without execution, recover uncertain result | GitHub adapter first; assignees/projects and other providers unimplemented |
|
|
17
17
|
| Repository issue templates | `issue templates`, `issue draft --template --sha --file` | Authenticated template list and draft compilation | Chooser, fields/defaults/validation, review | Supports Markdown and YAML markdown/input/textarea/dropdown/checkboxes; unsupported templates link to GitHub |
|
|
@@ -106,3 +106,25 @@ Definition exposes `configuration.issueReadinessLabels`. The optional private
|
|
|
106
106
|
config field has exactly triage/spec/ready/blocked keys with four distinct label
|
|
107
107
|
names; defaults are factory:triage/spec/ready/blocked. Configuration is validated,
|
|
108
108
|
not inferred from issue content. No browsing path changes labels or comments.
|
|
109
|
+
|
|
110
|
+
The additive `work_records` read model is returned by `GET /api/v1/issues`
|
|
111
|
+
(and CLI `inbox` / `issue list --source inbox`) alongside the existing `issues`
|
|
112
|
+
and `history` fields. `status` returns the same model for retained history without
|
|
113
|
+
fetching a provider page. Each record includes a canonical `key`, source `identity`,
|
|
114
|
+
`source_status` (`loaded`, `not_loaded`, `local`), optional source `issue`, all
|
|
115
|
+
`executions`, representative `execution_id`, actual `state`, `workflow` and `phase`.
|
|
116
|
+
Active/unresolved execution takes precedence over the latest terminal execution.
|
|
117
|
+
Without an execution, state is `not_started`, workflow/phase and execution ID are
|
|
118
|
+
null. Readiness lives on the source issue, separate from execution state. Dashboard
|
|
119
|
+
projection uses this same pure read-model function with its bounded page snapshot
|
|
120
|
+
and latest status; grouping/filtering does not admit execution. Individual
|
|
121
|
+
`#/runs/JOB_ID` links remain valid; `#/issues/KEY` opens canonical source detail.
|
|
122
|
+
|
|
123
|
+
The dashboard's Repository disclosure beside the item count holds source-state
|
|
124
|
+
selection, refresh, available previous/next page actions and Local execution
|
|
125
|
+
request. It also explains read time, remote total, the loaded search boundary
|
|
126
|
+
and separate issue/local request/execution counts. Loading and source errors
|
|
127
|
+
remain visible when it is closed. Rows and cards share compact metadata; source
|
|
128
|
+
readiness remains distinct from the runtime badge, and full assignments and
|
|
129
|
+
linked attempts remain in detail. These presentation controls do not change
|
|
130
|
+
headless records or admission semantics.
|
package/docs/npm.md
CHANGED
|
@@ -104,8 +104,8 @@ installation or retained attempt needs them.
|
|
|
104
104
|
|
|
105
105
|
## Protected evidence compatibility
|
|
106
106
|
|
|
107
|
-
Factory 0.
|
|
108
|
-
**0.8.0, 0.9.0, 0.9.1, 0.10.0, 0.11.0, 0.11.1 and 0.
|
|
107
|
+
Factory 0.12.0 recognizes version-1 execution profiles emitted by native
|
|
108
|
+
**0.8.0, 0.9.0, 0.9.1, 0.10.0, 0.11.0, 0.11.1, 0.11.2 and 0.12.0**. This is an exact allowlist in
|
|
109
109
|
`factory/execution-profile.mjs`, independent of the installed package version;
|
|
110
110
|
it is not a semver range or an automatic promise for later releases. Unknown
|
|
111
111
|
runtime strings, unknown profile formats and incomplete legacy acceptance
|
|
@@ -149,6 +149,10 @@ new acceptance. Older writers remain compatible only when their retained patch
|
|
|
149
149
|
passes the current digest and tree reconstruction checks. A digest-matching
|
|
150
150
|
malformed patch remains blocked and unchanged; follow the [recovery guidance](recovery.md#already-accepted-malformed-patches-91).
|
|
151
151
|
|
|
152
|
+
Version 0.12.0 adds the all-work Inbox read model and restores the retained
|
|
153
|
+
overview. Protected execution writers and acceptance/publication guards are
|
|
154
|
+
unchanged; the explicit compatible-writer entry preserves all checks above.
|
|
155
|
+
|
|
152
156
|
New publication still requires the current remote target to equal the original
|
|
153
157
|
accepted base; reviewed-candidate continuation preserves that baseline, while
|
|
154
158
|
target refresh remains #72. See [the verification map](https://github.com/arcitai/software-and-defence-factory/blob/main/docs/proof.md) for delivered
|
package/docs/workflows.md
CHANGED
|
@@ -24,7 +24,9 @@ kept outside those execution mounts.
|
|
|
24
24
|
|
|
25
25
|
## Start work
|
|
26
26
|
|
|
27
|
-
Inbox
|
|
27
|
+
Inbox opens on the shared list/Board of repository issues and local work, with
|
|
28
|
+
status rail and workflow/model/status/label multiselects. Never-started issues
|
|
29
|
+
have unknown workflow/model and a distinct Not started state. Choose Open, Closed or All states and use
|
|
28
30
|
Previous/Next page or Refresh issues. Search covers the loaded page and visible
|
|
29
31
|
history, not the whole repository. GitHub returns up to 50 records per page;
|
|
30
32
|
pull requests are excluded, so even a page with zero issues can have a next page.
|
|
@@ -146,4 +148,7 @@ non-issue paths are not admitted by the provider preview. Local-only records and
|
|
|
146
148
|
executions whose source is missing, closed or outside the loaded page remain in
|
|
147
149
|
Local and other execution history. Removing local execution history preserves
|
|
148
150
|
private evidence and never deletes a provider issue; unresolved delivery guards
|
|
149
|
-
still apply. The
|
|
151
|
+
still apply. The primary list/board includes all these records; no separate
|
|
152
|
+
Execution history tab is needed. Its count line distinguishes issue identities
|
|
153
|
+
and individual executions. Open a record for progressive context and every
|
|
154
|
+
linked attempt; close/Escape returns to the preserved filters, view and scroll.
|
|
@@ -9,12 +9,13 @@ import { expectedWebStories, webPolicyHash } from './web-verification.mjs';
|
|
|
9
9
|
// Audited v1 protected evidence writers: 0.8.0 (380f749), 0.9.0 (cdaadef),
|
|
10
10
|
// 0.9.1, 0.10.0, 0.11.0 and 0.11.1 (unchanged protected evidence writers),
|
|
11
11
|
// 0.11.2 (exact patch bytes and pre-acceptance reconstruction; same v1 schema).
|
|
12
|
+
// 0.12.0 restores the Inbox read model/presentation; protected writers and guards are unchanged.
|
|
12
13
|
// Older writers still require exact patch/tree reconstruction before publication.
|
|
13
14
|
// Deliberately independent of VERSION: a release bump is not
|
|
14
15
|
// evidence compatibility. Re-audit this list for every trust-relevant writer,
|
|
15
16
|
// isolation or validation change; remove versions whose guarantees no longer
|
|
16
17
|
// satisfy current policy. See docs/npm.md. This predicate alone grants no trust.
|
|
17
|
-
const SUPPORTED_EXECUTION_RUNTIMES_V1 = new Set(['0.8.0', '0.9.0', '0.9.1', '0.10.0', '0.11.0', '0.11.1', '0.11.2']);
|
|
18
|
+
const SUPPORTED_EXECUTION_RUNTIMES_V1 = new Set(['0.8.0', '0.9.0', '0.9.1', '0.10.0', '0.11.0', '0.11.1', '0.11.2', '0.12.0']);
|
|
18
19
|
|
|
19
20
|
export function isSupportedExecutionProfile(profile) {
|
|
20
21
|
return profile?.version === 1 && SUPPORTED_EXECUTION_RUNTIMES_V1.has(profile.runtimeVersion);
|
package/factory/issue-intake.mjs
CHANGED
|
@@ -24,6 +24,13 @@ function issueLabels(labels = []) {
|
|
|
24
24
|
return labels.map(label => ({name:label.name, color:/^[a-f0-9]{6}$/i.test(label.color || '') ? label.color.toLowerCase() : null}));
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
+
function issueMetadata(issue) {
|
|
28
|
+
const date = value => typeof value === 'string' && Number.isFinite(Date.parse(value)) ? value : null;
|
|
29
|
+
const author = issue.user?.login || issue.author?.login;
|
|
30
|
+
return { author: typeof author === 'string' ? author : null,
|
|
31
|
+
created_at: date(issue.created_at || issue.createdAt), updated_at: date(issue.updated_at || issue.updatedAt) };
|
|
32
|
+
}
|
|
33
|
+
|
|
27
34
|
export async function listIssues(repo, page = 1, read = githubRead, state = 'open') {
|
|
28
35
|
if (!Number.isSafeInteger(page) || page < 1 || page > 10000) throw new Error('Issue page must be an integer between 1 and 10000.');
|
|
29
36
|
if (!['open', 'closed', 'all'].includes(state)) throw new Error('Issue state must be open, closed or all.');
|
|
@@ -35,7 +42,7 @@ export async function listIssues(repo, page = 1, read = githubRead, state = 'ope
|
|
|
35
42
|
const issues = result.filter(issue => !issue.pull_request).map(issue => {
|
|
36
43
|
validateIssueURL(repository, issue.html_url);
|
|
37
44
|
if (!Number.isSafeInteger(issue.number) || !issue.html_url.endsWith(`/issues/${issue.number}`) || typeof issue.title !== 'string' || !issue.title.trim()) throw new Error('GitHub returned an unexpected issue.');
|
|
38
|
-
return { number: issue.number, title: issue.title, url: issue.html_url, state: issue.state || 'unknown', labels: issueLabels(issue.labels) };
|
|
45
|
+
return { ...issueMetadata(issue), number: issue.number, title: issue.title, url: issue.html_url, state: issue.state || 'unknown', labels: issueLabels(issue.labels) };
|
|
39
46
|
});
|
|
40
47
|
return { repository, issues, next_page: result.length === 50 && page < 10000 ? page + 1 : null };
|
|
41
48
|
}
|
|
@@ -46,7 +53,7 @@ export function validateIssueURL(repoURL, value) {
|
|
|
46
53
|
if (!repoURL || identity.repository !== repoURL.toLowerCase()) throw new Error('Issue does not belong to this project’s configured GitHub origin.');
|
|
47
54
|
return identity.url;
|
|
48
55
|
}
|
|
49
|
-
export async function readIssue(repo, url, read = url => githubRead(['issue', 'view', url, '--json', 'title,body,url,labels,state'])) {
|
|
56
|
+
export async function readIssue(repo, url, read = url => githubRead(['issue', 'view', url, '--json', 'title,body,url,labels,state,author,createdAt,updatedAt'])) {
|
|
50
57
|
const repoURL = readProjectLinks(repo)?.repository;
|
|
51
58
|
url = validateIssueURL(repoURL, url);
|
|
52
59
|
const issue = await read(url);
|
|
@@ -55,5 +62,5 @@ export async function readIssue(repo, url, read = url => githubRead(['issue', 'v
|
|
|
55
62
|
const spec = `Issue: ${issue.url}\n${issue.title}\n\n${issue.body}`;
|
|
56
63
|
if (Buffer.byteLength(spec) > 240000) throw new Error('Issue exceeds the 240 KB task limit. Use a bounded task file instead.');
|
|
57
64
|
const labels = issueLabels(issue.labels);
|
|
58
|
-
return { title: issue.title, url, number: canonicalIssue(url).number, state: issue.state?.toLowerCase() || 'unknown', body: issue.body, spec, labels, recommendation: recommendWork({ spec, labels: labels.map(label => label.name) }) };
|
|
65
|
+
return { ...issueMetadata(issue), title: issue.title, url, number: canonicalIssue(url).number, state: issue.state?.toLowerCase() || 'unknown', body: issue.body, spec, labels, recommendation: recommendWork({ spec, labels: labels.map(label => label.name) }) };
|
|
59
66
|
}
|
|
@@ -57,3 +57,28 @@ export function backlogHistory(jobs, issues) {
|
|
|
57
57
|
}
|
|
58
58
|
return [...grouped.values()];
|
|
59
59
|
}
|
|
60
|
+
|
|
61
|
+
// Canonical all-work read model, shared by headless readers and the dashboard.
|
|
62
|
+
// A source page is a bounded snapshot, never evidence that other sources closed.
|
|
63
|
+
export function workRecords(jobs = [], issues = []) {
|
|
64
|
+
const sources = new Map(issues.map(issue => [issue.identity.key, issue]));
|
|
65
|
+
const histories = backlogHistory(jobs, []);
|
|
66
|
+
const rows = new Map(histories.map(row => [row.key, row]));
|
|
67
|
+
for (const [key, issue] of sources) rows.set(key, {
|
|
68
|
+
...issue, key, ...executionAssociation(jobs, issue.identity),
|
|
69
|
+
});
|
|
70
|
+
return [...rows.values()].map(row => {
|
|
71
|
+
const issue = sources.get(row.key) || null;
|
|
72
|
+
const execution = row.active_execution || row.latest_execution || row.executions[0] || null;
|
|
73
|
+
return {
|
|
74
|
+
key: row.key, identity: row.identity, title: issue?.title || row.title,
|
|
75
|
+
url: row.url, source_status: issue ? 'loaded' : row.identity ? 'not_loaded' : 'local',
|
|
76
|
+
issue, executions: row.executions, active_execution: row.active_execution || null,
|
|
77
|
+
latest_execution: row.latest_execution || execution,
|
|
78
|
+
execution_id: execution?.id || null,
|
|
79
|
+
state: execution?.state || 'not_started',
|
|
80
|
+
workflow: execution?.workflow || null,
|
|
81
|
+
phase: execution?.phase || null,
|
|
82
|
+
};
|
|
83
|
+
});
|
|
84
|
+
}
|
|
@@ -38,7 +38,7 @@ export function githubIssueProvider(repo, { read = githubRead, write = githubWri
|
|
|
38
38
|
id: 'github', label: 'GitHub', repository, supported: true,
|
|
39
39
|
capabilities: { issues: true, templates: true, create: true },
|
|
40
40
|
list: (page, state) => listIssues(repo, page, read, state),
|
|
41
|
-
preview: url => readIssue(repo, url, value => read(['issue', 'view', value, '--json', 'title,body,url,labels,state'])),
|
|
41
|
+
preview: url => readIssue(repo, url, value => read(['issue', 'view', value, '--json', 'title,body,url,labels,state,author,createdAt,updatedAt'])),
|
|
42
42
|
templates: () => readTemplates(repo, read),
|
|
43
43
|
draft: input => draftFromTemplate(repo, input, read),
|
|
44
44
|
async context() {
|
package/factory/server.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { associateIssue, backlogHistory, readinessMapping } from './issue-lifecycle.mjs';
|
|
1
|
+
import { associateIssue, backlogHistory, readinessMapping, workRecords } from './issue-lifecycle.mjs';
|
|
2
2
|
import { harnessOf } from './lib.mjs';
|
|
3
3
|
import http from 'node:http';
|
|
4
4
|
import { createHash, randomBytes, timingSafeEqual } from 'node:crypto';
|
|
@@ -88,7 +88,7 @@ export function createController(state, adapter = executors(state), integrations
|
|
|
88
88
|
delivery_removal_blocked: Boolean(job.delivery && !['published', 'abandoned'].includes(job.delivery.state)),
|
|
89
89
|
delivery_status: delivery.summary(job), runs: job.runs.map(attempt => attemptPresentation({ ...attempt,
|
|
90
90
|
outcome: attempt.outcome || (attempt.state === 'succeeded' ? 'complete' : undefined) }, adapter.usage?.(job, attempt))) }));
|
|
91
|
-
return send(200, { version: 1, runtime_version: VERSION, maintenance: queue.maintenance, workflows: Object.keys(definitions.workflows), commands: [], triggers: [], jobs, issue_history: backlogHistory(jobs, []), csrf_token: csrf,
|
|
91
|
+
return send(200, { version: 1, runtime_version: VERSION, maintenance: queue.maintenance, workflows: Object.keys(definitions.workflows), commands: [], triggers: [], jobs, issue_history: backlogHistory(jobs, []), work_records: workRecords(jobs, []), csrf_token: csrf,
|
|
92
92
|
infrastructure: { host, controller: { connected: !queue.closing }, workers: [{ id: 'local-executor', name: 'Local worker', host: host.hostname, connected: !queue.closing }] },
|
|
93
93
|
automations: [], automation_control: definitions.automations, issue_provider: providerInfo(provider),
|
|
94
94
|
delivery_configuration: deliveryProviderInfo(configAt(state), deliveryAdapter),
|
|
@@ -106,7 +106,7 @@ export function createController(state, adapter = executors(state), integrations
|
|
|
106
106
|
const result = provider.supported ? await provider.list(page, state) : {repository:provider.repository, issues:[],next_page:null};
|
|
107
107
|
const jobs = queue.all(), issues = result.issues.map(issue => associateIssue(issue, jobs, readinessMapping(config.issueReadinessLabels)));
|
|
108
108
|
return send(200, { ...result, issues, provider:providerInfo(provider), page, state, loaded_count:issues.length, total:null,
|
|
109
|
-
history:backlogHistory(jobs, issues) });
|
|
109
|
+
history:backlogHistory(jobs, issues), work_records:workRecords(jobs, issues) });
|
|
110
110
|
}
|
|
111
111
|
catch (error) { throw new QueueError(error.message, error.status || 400); }
|
|
112
112
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/geist-latin-wght-normal-BgDaEnEv.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:root,:host{--font-sans:"Geist Variable", Geist, ui-sans-serif, system-ui, sans-serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--spacing:.25rem;--container-sm:24rem;--container-2xl:42rem;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--tracking-wider:.05em;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:"Geist Variable", Geist, ui-sans-serif, system-ui, sans-serif;--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.collapse{visibility:collapse}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.sticky{position:sticky}.top-0{top:0}.z-20{z-index:20}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.my-4{margin-block:calc(var(--spacing) * 4)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.-mb-px{margin-bottom:-1px}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.ml-auto{margin-left:auto}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-auto{height:auto}.max-h-\[60vh\]{max-height:60vh}.max-h-\[70vh\]{max-height:70vh}.min-h-24{min-height:calc(var(--spacing) * 24)}.min-h-48{min-height:calc(var(--spacing) * 48)}.min-h-screen{min-height:100vh}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-\[1500px\]{max-width:1500px}.max-w-full{max-width:100%}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:0}.flex-1{flex:1}.shrink-0{flex-shrink:0}.cursor-pointer{cursor:pointer}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\[minmax\(8rem\,1fr\)_minmax\(8rem\,1fr\)_10rem_12rem\]{grid-template-columns:minmax(8rem,1fr) minmax(8rem,1fr) 10rem 12rem}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:var(--spacing)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-border>:not(:last-child)){border-color:var(--border)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-hidden{overflow-y:hidden}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-border,.border-border\/70{border-color:var(--border)}@supports (color:color-mix(in lab, red, red)){.border-border\/70{border-color:color-mix(in oklab, var(--border) 70%, transparent)}}.border-danger\/35{border-color:var(--danger)}@supports (color:color-mix(in lab, red, red)){.border-danger\/35{border-color:color-mix(in oklab, var(--danger) 35%, transparent)}}.border-primary,.border-primary\/25{border-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.border-primary\/25{border-color:color-mix(in oklab, var(--primary) 25%, transparent)}}.border-transparent{border-color:#0000}.bg-background{background-color:var(--background)}.bg-danger\/10{background-color:var(--danger)}@supports (color:color-mix(in lab, red, red)){.bg-danger\/10{background-color:color-mix(in oklab, var(--danger) 10%, transparent)}}.bg-muted\/20{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/20{background-color:color-mix(in oklab, var(--muted) 20%, transparent)}}.bg-muted\/30{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/30{background-color:color-mix(in oklab, var(--muted) 30%, transparent)}}.bg-muted\/35{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/35{background-color:color-mix(in oklab, var(--muted) 35%, transparent)}}.bg-muted\/40{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/40{background-color:color-mix(in oklab, var(--muted) 40%, transparent)}}.bg-primary,.bg-primary\/5{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/5{background-color:color-mix(in oklab, var(--primary) 5%, transparent)}}.bg-sidebar{background-color:var(--sidebar)}.bg-surface{background-color:var(--surface)}.bg-transparent{background-color:#0000}.object-contain{object-fit:contain}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-8{padding:calc(var(--spacing) * 8)}.p-12{padding:calc(var(--spacing) * 12)}.px-0{padding-inline:0}.px-1{padding-inline:var(--spacing)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-14{padding-block:calc(var(--spacing) * 14)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:Geist Variable,Geist,ui-sans-serif,system-ui,sans-serif}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:.875rem;line-height:var(--tw-leading,1.25rem)}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:.75rem;line-height:var(--tw-leading,1rem)}.leading-5{--tw-leading:calc(var(--spacing) * 5);line-height:calc(var(--spacing) * 5)}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-danger{color:var(--danger)}.text-foreground{color:var(--foreground)}.text-muted-foreground{color:var(--muted-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-success{color:var(--success)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.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-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.outline-none{--tw-outline-style:none;outline-style:none}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}@media (hover:hover){.hover\:bg-muted:hover{background-color:var(--muted)}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}.hover\:text-danger:hover{color:var(--danger)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:decoration-2:hover{text-decoration-thickness:2px}}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-ring\/40:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-ring\/40:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 40%, transparent)}}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-ring:focus-visible{outline-color:var(--ring)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}@media (width>=40rem){.sm\:grid{display:grid}.sm\:hidden{display:none}.sm\:w-40{width:calc(var(--spacing) * 40)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-\[minmax\(8rem\,1fr\)_minmax\(8rem\,1fr\)_10rem_12rem\]{grid-template-columns:minmax(8rem,1fr) minmax(8rem,1fr) 10rem 12rem}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:items-start{align-items:flex-start}.sm\:justify-between{justify-content:space-between}.sm\:gap-4{gap:calc(var(--spacing) * 4)}.sm\:p-5{padding:calc(var(--spacing) * 5)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.sm\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.sm\:text-sm{font-size:.875rem;line-height:var(--tw-leading,1.25rem)}}@media (width>=48rem){.md\:flex{display:flex}.md\:hidden{display:none}.md\:h-screen{height:100vh}.md\:w-\[203px\]{width:203px}.md\:flex-col{flex-direction:column}.md\:items-stretch{align-items:stretch}.md\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.md\:border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.md\:px-4{padding-inline:calc(var(--spacing) * 4)}.md\:py-5{padding-block:calc(var(--spacing) * 5)}}@media (width>=64rem){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-\[minmax\(0\,1\.4fr\)_minmax\(0\,1fr\)\]{grid-template-columns:minmax(0,1.4fr) minmax(0,1fr)}.lg\:p-8{padding:calc(var(--spacing) * 8)}}}:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--background:#fff;--foreground:#0a0a0a;--surface:#fff;--sidebar:#fff;--muted:#f4f4f5;--muted-foreground:#737373;--border:#e5e5e5;--primary:#0a0a0a;--primary-foreground:#fff;--success:#15803d;--warning:#a16207;--danger:#b91c1c;--ring:#525252}.dark{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--background:#09090b;--foreground:#f5f5f5;--surface:#0f0f10;--sidebar:#09090b;--muted:#18181b;--muted-foreground:#a1a1aa;--border:#27272a;--primary:#f5f5f5;--primary-foreground:#09090b;--success:#4ade80;--warning:#fbbf24;--danger:#f87171;--ring:#a1a1aa}*{border-color:var(--border)}html{background:var(--background)}body{background:var(--background);min-width:320px;min-height:100vh;color:var(--foreground);font-family:var(--font-sans);-webkit-font-smoothing:antialiased;margin:0;font-size:14px;line-height:1.5}button,input,textarea,select{font:inherit}button,a,summary,select{-webkit-tap-highlight-color:transparent}button{cursor:pointer}button:disabled{cursor:not-allowed}::selection{background:var(--foreground)}@supports (color:color-mix(in lab, red, red)){::selection{background:color-mix(in srgb, var(--foreground) 16%, transparent)}}:focus-visible{outline:2px solid var(--ring);outline-offset:2px}.app-shell{min-height:100vh}.app-sidebar{background:var(--sidebar);border-right:1px solid var(--border);flex-direction:column;align-items:stretch;width:203px;height:100vh;padding:20px 14px 14px;display:flex;position:sticky;top:0}.brand-lockup{gap:9px;height:36px;padding:0 4px}.brand-wordmark{letter-spacing:-.025em;font-size:15px;font-weight:600}.desktop-nav{gap:2px;margin-top:30px;display:grid}.mobile-nav{display:none}.nav-item{height:36px;color:var(--muted-foreground);border-radius:6px;align-items:center;gap:10px;padding:0 10px;font-size:13px;line-height:20px;text-decoration:none;transition:background-color .15s,color .15s;display:flex;position:relative}.nav-item:hover{background:var(--muted);color:var(--foreground)}.nav-item-active{background:var(--muted);color:var(--foreground);font-weight:500}.nav-count{color:var(--muted-foreground);font-variant-numeric:tabular-nums;margin-left:auto;font-size:11px}.sidebar-bottom{border-top:1px solid var(--border);gap:4px;margin-top:auto;padding-top:12px;display:grid}.mobile-settings{border-top:1px solid var(--border);margin-top:5px;padding-top:5px}.theme-switch{text-align:left;background:0 0;border:0;width:100%}.mobile-theme{display:none}.workshop{background:var(--background);flex:1;min-width:0}.project-header{border-bottom:1px solid var(--border);background:var(--background);padding:36px 56px 22px}.project-heading{justify-content:space-between;align-items:flex-start;gap:24px;min-width:0;max-width:1500px;margin:0 auto;display:flex}.project-heading-copy{flex:1;min-width:0}.project-eyebrow{color:var(--muted-foreground);margin-bottom:5px;font-size:12px;line-height:16px;display:block}.project-header h1{overflow-wrap:anywhere;max-width:100%;color:var(--foreground);letter-spacing:-.035em;margin:0;font-size:36px;font-weight:600;line-height:40px}.project-freshness{color:var(--muted-foreground);margin-top:7px;font-size:11px;line-height:16px;display:block}.project-freshness.is-stale{color:var(--warning)}.project-new-task{flex:none;margin-top:17px;border-radius:7px!important;font-size:13px!important}.runs-page{gap:22px;max-width:1500px;margin:0 auto;padding:27px 56px 56px;display:grid}.tasks-toolbar{justify-content:space-between;align-items:flex-end;gap:24px;min-width:0;display:flex}.tasks-tools{justify-content:flex-end;align-items:center;gap:10px;min-width:0;display:flex}.task-search{border:1px solid var(--border);background:var(--surface);width:min(320px,34vw);min-width:180px;height:36px;color:var(--muted-foreground);border-radius:8px;align-items:center;gap:8px;padding:0 10px;display:flex}.task-search:focus-within{border-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.task-search:focus-within{border-color:color-mix(in srgb, var(--foreground) 45%, var(--border))}}.task-search input{width:100%;min-width:0;height:100%;color:var(--foreground);background:0 0;border:0;outline:0;padding:0;font-size:13px}.task-search input::placeholder{color:var(--muted-foreground)}.task-search input::-webkit-search-cancel-button{display:none}.clear-search{width:22px;height:22px;color:var(--muted-foreground);background:0 0;border:0;border-radius:4px;flex:none;place-items:center;display:grid}.clear-search:hover{background:var(--muted);color:var(--foreground)}.view-toggle{border:1px solid var(--border);border-radius:8px;flex:none;align-items:center;gap:2px;height:36px;padding:3px;display:flex}.view-toggle button{border-radius:5px;height:28px;padding:0 9px;font-size:12px}.view-toggle .view-active{background:var(--muted);color:var(--foreground)}.run-workspace{grid-template-columns:212px minmax(0,1fr);align-items:start;gap:48px;min-width:0;display:grid}.task-filter-rail{gap:8px;min-width:0;display:grid}.task-filter-rail>h2{color:var(--muted-foreground);letter-spacing:.04em;text-transform:uppercase;margin:0 0 2px;font-size:11px;font-weight:500;line-height:16px}.filter-card{border:1px solid var(--border);background:var(--surface);border-radius:8px;min-width:0;overflow:hidden}.filter-card-main{width:100%;color:var(--foreground);text-align:left;background:0 0;border:0;padding:10px 11px 9px;display:block}.filter-card-main:hover,.filter-card-main[aria-pressed=true]{background:var(--muted)}.filter-card-main:disabled,.filter-substate:disabled{cursor:default;opacity:.7}.filter-card-heading{justify-content:space-between;align-items:center;gap:8px;font-size:13px;font-weight:500;line-height:18px;display:flex}.filter-card-count{color:var(--foreground);font-variant-numeric:tabular-nums;font-size:13px}.filter-card-description{color:var(--muted-foreground);margin-top:2px;font-size:11px;line-height:15px;display:block}.filter-card-children{border-top:1px solid var(--border);gap:1px;padding:4px 7px 6px;display:grid}.filter-substate{min-width:0;min-height:25px;color:var(--muted-foreground);text-align:left;background:0 0;border:0;border-radius:4px;justify-content:space-between;align-items:center;gap:8px;padding:3px 5px;font-size:11px;line-height:16px;display:flex}.filter-substate:hover,.filter-substate[aria-pressed=true]{background:var(--muted);color:var(--foreground)}.filter-substate span:first-child{overflow-wrap:anywhere;min-width:0}.filter-substate span:last-child{font-variant-numeric:tabular-nums;flex:none}.filter-substate.is-subset{border-left:1px solid var(--border);margin-left:4px;padding-left:8px}.task-results{min-width:0}.task-list{border-top:1px solid var(--border);min-width:0}.task-row{border-bottom:1px solid var(--border);min-width:0}.task-row-link{min-width:0;color:var(--foreground);border-radius:4px;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:18px;padding:12px 4px 13px;text-decoration:none;display:grid}@supports (color:color-mix(in lab, red, red)){.task-row-link:hover{background:color-mix(in srgb, var(--muted) 68%, transparent)}}.task-row-content{min-width:0}.task-row-title{overflow-wrap:anywhere;margin:0;font-size:14px;font-weight:500;line-height:20px}.task-row-meta{min-width:0;color:var(--muted-foreground);flex-wrap:wrap;align-items:baseline;gap:2px 14px;margin-top:4px;font-size:11px;line-height:16px;display:flex}.task-row-meta>*{overflow-wrap:anywhere;min-width:0}.work-meta-part{align-items:baseline;display:inline-flex}.task-state{border-radius:5px;flex:none;padding:2px 8px;font-size:11px;font-weight:500;line-height:16px}.run-column{border:1px solid var(--border);background:var(--surface);border-radius:8px;min-width:0;overflow:hidden}.run-card-link{min-width:0;color:var(--foreground);padding:12px;text-decoration:none;display:block}.run-card-link:hover{background:var(--muted)}.run-card-title{overflow-wrap:anywhere;margin:0;font-size:13px;font-weight:500;line-height:19px}.run-card-meta{color:var(--muted-foreground);margin:6px 0 0;font-size:11px;line-height:16px}.run-card-status{flex-wrap:wrap;align-items:center;gap:7px;margin-top:9px;display:flex}.run-card-status>span:last-child{color:var(--muted-foreground);font-size:11px}.empty-tasks,.task-message{border:1px dashed var(--border);text-align:center;border-radius:8px;align-content:center;justify-items:center;gap:7px;min-height:230px;padding:28px 18px;display:grid}.empty-tasks h3,.task-message h3{margin:0;font-size:14px;font-weight:600;line-height:20px}.empty-tasks p,.task-message p{max-width:32rem;color:var(--muted-foreground);overflow-wrap:anywhere;margin:0;font-size:12px;line-height:18px}.empty-tasks button,.task-message button{margin-top:6px}.task-message-error{border-style:solid;border-color:var(--danger)}@supports (color:color-mix(in lab, red, red)){.task-message-error{border-color:color-mix(in srgb, var(--danger) 35%, var(--border))}}.task-message-error h3{color:var(--danger)}.stale-banner{border:1px solid var(--warning);justify-content:space-between;align-items:center;gap:14px;padding:9px 12px;display:flex}@supports (color:color-mix(in lab, red, red)){.stale-banner{border:1px solid color-mix(in srgb, var(--warning) 32%, var(--border))}}.stale-banner{color:var(--muted-foreground);border-radius:7px;font-size:12px;line-height:18px}.stale-banner strong{color:var(--warning)}.stale-banner button{flex:none}.form-error{border:1px solid var(--danger);padding:9px 12px}@supports (color:color-mix(in lab, red, red)){.form-error{border:1px solid color-mix(in srgb, var(--danger) 35%, var(--border))}}.form-error{background:var(--danger);border-radius:7px}@supports (color:color-mix(in lab, red, red)){.form-error{background:color-mix(in srgb, var(--danger) 8%, var(--background))}}.form-error{color:var(--danger);font-size:13px}.field-label{color:var(--muted-foreground);margin-bottom:5px;font-size:12px;font-weight:500;line-height:17px;display:block}.field-control{border:1px solid var(--border);background:var(--background);width:100%;min-height:36px;color:var(--foreground);border-radius:7px;outline:none;padding:7px 10px;font-size:13px;line-height:20px;transition:border-color .15s,box-shadow .15s}.field-control::placeholder{color:var(--muted-foreground);opacity:.78}.field-control:focus{border-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.field-control:focus{border-color:color-mix(in srgb, var(--foreground) 50%, var(--border))}}.field-control:focus{box-shadow:0 0 0 2px var(--foreground)}@supports (color:color-mix(in lab, red, red)){.field-control:focus{box-shadow:0 0 0 2px color-mix(in srgb, var(--foreground) 12%, transparent)}}@media (width<=1199px) and (width>=961px){.project-header,.runs-page{padding-left:38px;padding-right:38px}.run-workspace{gap:24px}}@media (width<=960px){.task-filter-rail{display:none}.run-workspace{display:block}}@media (width<=767px){.app-shell{display:block}.app-sidebar{z-index:40;border-right:0;border-bottom:1px solid var(--border);flex-direction:row;align-items:center;gap:8px;width:100%;height:56px;padding:0 12px}.brand-lockup{gap:8px}.brand-wordmark{font-size:14px;display:inline}.desktop-nav,.sidebar-bottom{display:none}.mobile-nav{margin-left:auto;display:block;position:relative}.mobile-nav summary{border:1px solid var(--border);height:36px;color:var(--foreground);cursor:pointer;border-radius:7px;align-items:center;gap:7px;padding:0 9px;font-size:12px;list-style:none;display:flex}.mobile-nav summary::-webkit-details-marker{display:none}.mobile-nav nav{z-index:50;border:1px solid var(--border);background:var(--surface);border-radius:9px;gap:3px;width:min(260px,100vw - 24px);padding:8px;display:grid;position:absolute;top:42px;right:0;box-shadow:0 12px 30px #00000024}.mobile-nav nav .nav-item{width:100%}.mobile-theme{color:var(--muted-foreground);background:0 0;border:1px solid #0000;border-radius:7px;flex:none;place-items:center;display:grid}.mobile-theme:hover{border-color:var(--border);color:var(--foreground)}.project-header{padding:25px 20px 17px}.project-heading{flex-direction:column;align-items:stretch;gap:12px}.project-header h1{letter-spacing:-.03em;font-size:30px;line-height:34px}.project-new-task{align-self:flex-start;margin-top:0}.runs-page{gap:18px;padding:21px 20px 36px}.tasks-toolbar{align-items:start;gap:14px;display:grid}.tasks-tools{flex-wrap:wrap;justify-content:space-between;gap:8px;width:100%}.task-search{width:100%;min-width:0}.view-toggle{margin-left:auto}.task-row-link{flex-direction:column;align-items:flex-start;gap:7px;padding:12px 2px;display:flex}.task-row-content{width:100%}.task-row-title{font-size:14px;line-height:20px}.task-row-meta{margin-top:4px}.task-state{align-self:flex-start}.run-column{border-radius:7px}.stale-banner{flex-direction:column;align-items:flex-start}.stale-banner button{align-self:flex-start}}@media (width<=390px){.project-header{padding-left:16px;padding-right:16px}.project-heading{flex-wrap:wrap}.project-heading-copy{width:100%}.project-header h1{font-size:28px;line-height:32px}.project-new-task{margin-top:0}.runs-page{padding-left:16px;padding-right:16px}.tasks-tools{align-items:stretch}.view-toggle{margin-left:0}.filter-control{width:100%}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important}}:root{--border:#e7e7e7;--divider:#ededed;--primary:#0077ed;--primary-foreground:#fff;--surface-subtle:#fafafa}.dark{--background:#101012;--sidebar:#101012;--surface:#101012;--surface-subtle:#141416;--border:#27272b;--divider:#242427;--primary:#0787ff;--primary-foreground:#fff}body{font-size:14px}.app-sidebar{padding:18px 12px 14px}.brand-lockup{height:30px;padding:0 8px}.brand-wordmark{color:var(--foreground);letter-spacing:-.06em;font-size:19px;font-weight:650;text-decoration:none}.brand-period{color:var(--muted-foreground)}.desktop-nav{margin-top:18px}.nav-item{gap:9px;height:32px;padding:0 8px;font-size:14px}.nav-count{font-size:12px}.project-header{border-bottom:0;padding:38px 56px 22px}.project-heading{border-bottom:1px solid var(--border);align-items:center;padding-bottom:24px}.project-context-line{flex-wrap:wrap;align-items:center;gap:12px;margin-top:10px;display:flex}.project-freshness{align-items:center;gap:5px;margin:0;font-size:11px;display:inline-flex}.freshness-dot{background:#10a880;border-radius:50%;width:5px;height:5px}.is-stale .freshness-dot{background:var(--warning)}.project-actions{flex-wrap:wrap;flex:none;justify-content:flex-end;align-items:center;gap:8px;display:flex}.repo-action{border:1px solid var(--border);height:32px;color:var(--foreground);white-space:nowrap;border-radius:6px;align-items:center;gap:6px;padding:0 10px;font-size:13px;text-decoration:none;display:inline-flex}.repo-action:hover{background:var(--muted)}.project-new-task{height:32px;margin:0;padding:0 11px;font-size:13px!important}.runs-page{gap:16px;padding-top:0}.tasks-toolbar{align-items:center;gap:18px}.task-facets{flex-wrap:wrap;align-items:center;gap:10px;min-width:0;display:flex}.task-search{width:min(320px,28vw);min-width:150px}.tasks-tools{gap:12px}.view-toggle{border:0;gap:0;padding:0}.view-toggle button{width:28px;padding:0 5px}.active-filters{color:var(--muted-foreground);justify-content:space-between;align-items:baseline;gap:10px;font-size:12px;display:flex}.active-filters span{overflow-wrap:anywhere;min-width:0}.active-filters button{color:var(--foreground);flex:none;align-items:center;gap:4px;display:flex}.synthetic-note{color:var(--muted-foreground);margin:0;font-size:12px}.run-workspace{gap:48px}.task-filter-rail{gap:16px}.all-tasks-filter{text-align:left;width:100%;color:var(--muted-foreground);justify-content:space-between;padding:0 2px;font-size:12px;display:flex}.all-tasks-filter[aria-pressed=true]{color:var(--foreground)}.tone-violet{--tone:#6e63d8}.tone-cyan{--tone:#058299}.tone-pink{--tone:#b6417a}.tone-green{--tone:#058263}.tone-amber{--tone:#a66b18}.tone-neutral{--tone:#71717a}.dark .tone-violet{--tone:#9180f4}.dark .tone-cyan{--tone:#39b4c9}.dark .tone-pink{--tone:#d768a4}.dark .tone-green{--tone:#32b991}.dark .tone-amber{--tone:#d3a357}.dark .tone-neutral{--tone:#a1a1aa}.filter-card{border-color:var(--tone)}@supports (color:color-mix(in lab, red, red)){.filter-card{border-color:color-mix(in srgb, var(--tone) 16%, var(--border))}}.filter-card{background:var(--background)}@supports (color:color-mix(in lab, red, red)){.filter-card{background:color-mix(in srgb, var(--background) 95%, var(--tone))}}.filter-card{box-shadow:0 5px 12px -7px var(--tone);border-radius:8px}@supports (color:color-mix(in lab, red, red)){.filter-card{box-shadow:0 5px 12px -7px color-mix(in srgb, var(--tone) 38%, transparent)}}.dark .filter-card{background:#0b0b0d}.filter-card-main{padding:12px 11px 10px}.filter-card-main[aria-pressed=true]{background:var(--tone)}@supports (color:color-mix(in lab, red, red)){.filter-card-main[aria-pressed=true]{background:color-mix(in srgb, var(--tone) 9%, transparent)}}.filter-card-heading{gap:6px;font-size:14px;font-weight:400}.filter-card-heading>svg{color:var(--tone);flex:none}.filter-card-heading>span:first-of-type{overflow-wrap:anywhere;flex:1;min-width:0}.filter-card-count{color:var(--tone);font-size:14px;font-weight:550}.filter-disclosure{width:100%;color:var(--muted-foreground);justify-content:space-between;align-items:center;padding:0 11px 8px;font-size:12px;display:flex}.filter-disclosure[aria-expanded=true]>svg{transform:rotate(180deg)}.filter-card-children{border:0;gap:5px;padding:0 9px 10px}.filter-card-children[hidden]{display:none}.filter-substate{border:1px solid var(--border);min-height:24px;padding:2px 5px;font-size:12px}.filter-substate[aria-pressed=true]{border-color:var(--tone)}.task-list{border:0}.task-row{border-bottom:1px solid var(--divider);grid-template-columns:24px minmax(0,1fr) auto;align-items:center;gap:12px;padding:12px 0;display:grid}.task-row:first-child{padding-top:9px}.task-row:hover{background:var(--muted)}@supports (color:color-mix(in lab, red, red)){.task-row:hover{background:color-mix(in srgb, var(--muted) 32%, transparent)}}.task-row-link{min-width:0;padding:0;display:block}.task-row-link:hover{background:0 0}.task-row-title{font-size:14px;font-weight:450;line-height:21px}.task-row-meta{flex-wrap:wrap;gap:2px 8px;margin-top:3px;font-size:12px;line-height:18px;display:flex}.task-row-meta>.work-meta-part+.work-meta-part:before{content:"·";color:var(--muted-foreground);margin-right:8px}.task-status-icon{background:var(--tone);border-radius:7px;flex:none;place-items:center;width:24px;height:24px;display:inline-grid}@supports (color:color-mix(in lab, red, red)){.task-status-icon{background:color-mix(in srgb, var(--tone) 13%, transparent)}}.task-status-icon{color:var(--tone)}.task-state{white-space:nowrap;border:1px solid var(--tone);align-items:center;gap:5px;padding:2px 6px;display:inline-flex}@supports (color:color-mix(in lab, red, red)){.task-state{border:1px solid color-mix(in srgb, var(--tone) 23%, var(--border))}}.task-state{background:var(--tone);border-radius:5px}@supports (color:color-mix(in lab, red, red)){.task-state{background:color-mix(in srgb, var(--tone) 5%, var(--background))}}.task-state{color:var(--foreground);font-size:11px;font-weight:400;line-height:16px}.state-dot{border:1px solid var(--tone);background:var(--tone);border-radius:50%;width:5px;height:5px}.row-badge-filter{text-align:left;background:0 0;border:0;padding:0}.row-badge-filter:hover .task-state{border-color:var(--tone)}.project-header-compact{padding:18px 30px 0}.project-header-compact .project-heading{padding-bottom:14px}.project-header-compact h1{letter-spacing:-.015em;font-size:15px;line-height:22px}.project-header-compact .project-context-line{gap:10px;margin-top:4px}.task-detail-layout{grid-template-columns:minmax(0,1fr) 288px;align-items:stretch;min-height:calc(100vh - 56px);display:grid}.task-detail-main{min-width:0;padding:24px 32px 56px}.detail-toolbar{color:var(--muted-foreground);justify-content:space-between;align-items:center;margin-bottom:30px;display:flex}.detail-position,.detail-toolbar-actions{align-items:center;gap:12px;font-size:12px;display:flex}.detail-position>div{gap:0;display:grid}.detail-position a,.detail-position span[aria-label]{display:flex}.detail-position span[aria-label]{opacity:.3}.detail-toolbar-actions a,.detail-toolbar-actions button{border-radius:4px;place-items:center;width:28px;height:28px;display:grid}.detail-toolbar-actions a:hover,.detail-toolbar-actions button:hover{background:var(--muted);color:var(--foreground)}.copy-status{font-size:11px}.task-detail-heading{flex-wrap:wrap;align-items:flex-start;gap:12px;margin-bottom:26px;display:flex}.task-detail-heading h2{overflow-wrap:anywhere;flex:1;min-width:0;margin:0;font-size:18px;font-weight:600;line-height:26px}.task-detail-heading>p{flex-basis:100%}.task-progress{gap:8px;margin-bottom:20px}.task-progress li{gap:8px;font-size:12px}.task-detail-main [role=tablist]{gap:22px;margin-bottom:24px}.task-detail-main [role=tab]{padding-top:8px;padding-bottom:10px;font-size:13px}.task-result{border:0;border-left:1px solid var(--border);box-shadow:none;background:0 0;border-radius:0;margin-left:11px;padding:0 0 0 20px}.task-result>h2{font-size:14px}.trusted-delivery-action{overflow-wrap:anywhere;min-width:0}.delivery-action-button{white-space:normal;overflow-wrap:anywhere;text-align:left;justify-content:flex-start;max-width:100%;height:auto;min-height:36px;line-height:20px}.task-metadata{border-left:1px solid var(--border);background:var(--surface-subtle);min-width:0;padding:24px}.task-metadata h3{align-items:center;gap:8px;margin:0 0 24px;font-size:14px;font-weight:600;display:flex}.task-metadata dl{gap:22px;display:grid}.task-metadata dt{color:var(--muted-foreground);align-items:center;gap:5px;margin-bottom:7px;font-size:12px;display:flex}.task-metadata dd{overflow-wrap:anywhere;margin:0;font-size:13px}.source-revision-sha{overflow-wrap:anywhere;word-break:break-all;font-size:11px;line-height:17px;display:block}.task-metadata .metadata-hint{color:var(--muted-foreground);margin-top:5px;font-size:11px;line-height:17px}.metadata-link{border:1px solid var(--border);border-radius:5px;align-items:center;gap:6px;padding:3px 6px;text-decoration:none;display:inline-flex}.metadata-link:hover{background:var(--muted)}.task-metadata .task-state{color:var(--tone);background:var(--tone);border-radius:20px;padding:5px 9px}@supports (color:color-mix(in lab, red, red)){.task-metadata .task-state{background:color-mix(in srgb, var(--tone) 15%, transparent)}}.workshop>.secondary-page{max-width:1500px;padding:0 56px 56px}@media (width<=1200px){.project-header,.runs-page,.workshop>.secondary-page{padding-left:36px;padding-right:36px}.project-actions{max-width:250px}.tasks-toolbar{flex-wrap:wrap}.tasks-tools{flex:1}.task-search{width:min(320px,100%)}.task-detail-layout{grid-template-columns:minmax(0,1fr) 248px}.task-detail-main{padding-left:26px;padding-right:26px}.task-metadata{padding:24px 18px}}@media (width<=900px){.run-workspace{grid-template-columns:190px minmax(0,1fr);gap:24px}.task-row{grid-template-columns:24px minmax(0,1fr);gap:9px}.row-badge-filter{grid-column:2}.task-detail-layout{grid-template-columns:minmax(0,1fr)}.task-metadata{border-left:0;border-top:1px solid var(--border)}.task-metadata dl{grid-template-columns:repeat(2,minmax(0,1fr));gap:20px}}@media (width<=767px){.app-sidebar{width:100%;height:auto;padding:10px 16px}.brand-lockup{padding:0}.project-header{padding:24px 20px 18px}.project-heading{flex-direction:column;align-items:flex-start;gap:18px;padding-bottom:20px}.project-header h1{font-size:28px;line-height:34px}.project-actions{justify-content:flex-start;gap:6px;max-width:100%}.project-new-task{margin:0}.runs-page,.workshop>.secondary-page{padding:0 20px 32px}.tasks-toolbar{flex-direction:column;align-items:stretch;gap:12px}.task-facets{gap:6px}.tasks-tools{width:100%}.task-search{flex:1;width:auto;min-width:0}.run-workspace{display:block}.task-row-title{font-size:14px}.task-row-meta{font-size:12px}.project-header-compact{padding:14px 20px 0}.project-header-compact h1{font-size:14px;line-height:20px}.project-header-compact .project-heading{flex-direction:row;align-items:center;gap:10px;padding-bottom:12px}.project-header-compact .project-actions .repo-action{gap:0;padding:0 7px;font-size:0}.project-header-compact .project-actions .repo-action>svg:last-child{display:none}.task-detail-main{padding:16px 20px 32px}.detail-toolbar{margin-bottom:24px}.task-detail-heading{gap:8px}.task-detail-heading h2{font-size:17px;line-height:24px}.task-detail-main [role=tablist]{gap:18px}.task-metadata{padding:24px 20px}}.brand-wordmark{flex-direction:column;gap:3px;font-size:23px;line-height:24px;display:flex}.brand-descriptor{letter-spacing:.14em;text-transform:uppercase;color:var(--muted-foreground);font-size:8px;font-weight:550;line-height:12px}.project-path{color:var(--muted-foreground);font-size:11px;position:relative}.project-path>button{cursor:help;align-items:center;gap:4px;display:flex}.project-path [role=tooltip]{z-index:60;border:1px solid var(--border);background:var(--surface);width:240px;max-width:calc(100vw - 48px);color:var(--foreground);overflow-wrap:anywhere;border-radius:7px;padding:12px;line-height:18px;position:absolute;top:calc(100% + 8px);left:0;box-shadow:0 8px 24px #0002}.project-path [role=tooltip][hidden]{display:none}.project-path code{font-size:11px}.repo-action.new-issue-action{border-color:var(--primary);background:var(--primary);color:var(--primary-foreground)}.facet-container{min-width:0;position:relative}.task-facet{border:1px solid var(--border);background:0 0;border-radius:7px;align-items:center;gap:6px;height:36px;padding:0 10px;font-size:13px;display:flex}.task-facet>svg{color:var(--muted-foreground);flex:none}.task-facet.is-selected{border-color:var(--muted-foreground);background:var(--muted)}.task-facet:focus-visible{outline:2px solid var(--ring);outline-offset:2px}.facet-count{background:var(--border);text-align:center;border-radius:4px;min-width:17px;padding:0 3px;font-size:10px}.facet-popover{z-index:50;border:1px solid var(--border);background:var(--surface);border-radius:9px;width:256px;max-width:calc(100vw - 40px);padding:6px;font-size:13px;position:absolute;top:calc(100% + 7px);left:0;box-shadow:0 10px 26px #0002}.facet-popover-heading{justify-content:space-between;align-items:center;padding:6px 8px 10px;font-size:12px;font-weight:550;display:flex}.facet-popover-heading button{color:var(--muted-foreground);font-weight:400}.facet-popover-heading button:disabled{opacity:.4}.facet-options{overscroll-behavior:contain;max-height:240px;overflow-y:auto}.facet-option{cursor:pointer;border-radius:4px;align-items:center;gap:9px;padding:8px;display:flex}.facet-option:hover,.facet-option:focus-within{background:var(--muted)}.facet-option span{overflow-wrap:anywhere}.facet-select-all{border-bottom:1px solid var(--border);border-radius:0;margin-bottom:4px}.facet-empty{color:var(--muted-foreground);padding:14px 8px}.active-filters{align-items:center;min-height:28px}.task-list-actions{align-items:center;gap:18px;display:flex}.task-list-actions button:disabled{opacity:.35;cursor:default}.run-workspace.is-board{display:block}.is-board .task-filter-rail{display:none}.kanban-scroll{overscroll-behavior-x:contain;scrollbar-width:auto;scrollbar-color:var(--muted-foreground) var(--muted);max-width:100%;padding-bottom:14px;overflow-x:scroll}.kanban-scroll::-webkit-scrollbar{height:11px}.kanban-scroll::-webkit-scrollbar-track{background:var(--muted);border-radius:8px}.kanban-scroll::-webkit-scrollbar-thumb{background:var(--muted-foreground);border:3px solid var(--muted);border-radius:8px}.kanban-board{grid-auto-columns:290px;grid-auto-flow:column;align-items:start;gap:16px;width:max-content;min-width:100%;display:grid}.kanban-board .run-column{min-height:360px}.workflow-page{gap:32px;display:grid}.workflow-choices{gap:8px;display:flex}.workflow-choices button{border:1px solid var(--border);border-radius:7px;align-items:center;gap:8px;padding:9px 14px;font-size:13px;display:flex}.workflow-choices button[aria-pressed=true]{background:var(--foreground);color:var(--background);border-color:var(--foreground)}.workflow-profile{background:var(--muted);color:var(--muted-foreground);overflow-wrap:anywhere;border-radius:7px;flex-wrap:wrap;align-items:center;gap:10px 18px;padding:12px 14px;font-size:12px;display:flex}.workflow-profile strong{color:var(--foreground);font-weight:500}.workflow-steps{border:1px solid var(--border);border-radius:8px}.workflow-steps>li{border-bottom:1px solid var(--border);gap:16px;padding:22px;display:flex}.workflow-steps>li:last-child{border:0}.step-number{border:1px solid var(--border);width:26px;height:26px;color:var(--muted-foreground);border-radius:50%;flex:none;place-items:center;font-size:12px;display:grid}.step-body{flex:1;min-width:0}.step-heading{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;display:flex}.step-heading h3{font-size:14px;font-weight:600}.step-body p{color:var(--muted-foreground);margin-top:7px;font-size:13px;line-height:21px}.step-skills{color:var(--muted-foreground);overflow-wrap:anywhere;align-items:baseline;gap:7px;margin-top:10px;font-size:11px;display:flex}.workflow-check{background:var(--muted);overflow-wrap:anywhere;border-radius:5px;margin-top:10px;padding:10px;font-size:12px;display:block}.skill-library{gap:10px;display:grid}.skill-card{border:1px solid var(--border);border-radius:7px}.skill-card summary{cursor:pointer;align-items:center;gap:12px;padding:16px 18px;list-style:none;display:flex}.skill-card summary:after{content:"+";color:var(--muted-foreground);margin-left:auto;font-size:18px}.skill-card[open] summary:after{content:"−"}.skill-card summary::-webkit-details-marker{display:none}.skill-card summary strong{font-size:13px;font-weight:550;display:block}.skill-card summary small{color:var(--muted-foreground);margin-top:4px;font-size:12px;display:block}.skill-instructions{border-top:1px solid var(--border);overflow-wrap:anywhere;padding:18px}.skill-instructions p,.skill-instructions small{color:var(--muted-foreground);font-size:10px}.skill-instructions pre{white-space:pre-wrap;max-height:480px;margin:16px 0;font-family:inherit;font-size:13px;line-height:22px;overflow-y:auto}.workflow-settings{border-top:1px solid var(--border)}.workflow-settings>div{border-bottom:1px solid var(--border);grid-template-columns:140px minmax(0,1fr);gap:16px;padding:14px 0;font-size:13px;display:grid}.workflow-settings dt{color:var(--muted-foreground)}.workflow-settings dd{overflow-wrap:anywhere}@media (width<=767px){.brand-wordmark{font-size:20px;line-height:22px}.brand-descriptor{font-size:7px}.task-facet{gap:4px;padding:0 7px;font-size:12px}.task-facet>svg:first-child{display:none}.facet-container:last-child .facet-popover{left:auto;right:0}.facet-container:nth-child(2) .facet-popover{left:50%;transform:translate(-50%)}.workflow-steps>li{gap:10px;padding:16px 12px}.workflow-settings>div{grid-template-columns:90px minmax(0,1fr)}.kanban-board{grid-auto-columns:min(290px,100vw - 60px)}.project-path [role=tooltip]{left:auto;right:0}}.work-dialog{color:var(--foreground);background:var(--surface);border:1px solid var(--border);border-radius:12px;width:min(660px,100vw - 32px);max-height:calc(100dvh - 40px);margin:auto;padding:0;overflow-y:auto;box-shadow:0 24px 80px #0005}.work-dialog::backdrop{-webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);background:#0008}.work-dialog-header{border-bottom:1px solid var(--border);justify-content:space-between;align-items:flex-start;gap:16px;padding:24px;display:flex}.work-dialog-header h2{font-size:20px;font-weight:600}.work-dialog-header p{color:var(--muted-foreground);overflow-wrap:anywhere;margin-top:6px;font-size:12px}.work-dialog-body{gap:20px;min-width:0;padding:24px;display:grid}.work-source{border-bottom:1px solid var(--border);gap:24px;display:flex}.work-source button{color:var(--muted-foreground);border-bottom:2px solid #0000;padding-bottom:10px;font-size:13px}.work-source button[aria-pressed=true]{color:var(--foreground);border-bottom-color:var(--foreground)}.work-brief{resize:vertical;min-height:180px;max-height:45vh}.issue-picker{gap:12px;min-width:0;display:grid}.issue-list{border:1px solid var(--border);border-radius:8px;max-height:310px;overflow-y:auto}.issue-list>p{padding:16px}.issue-choice{text-align:left;border-bottom:1px solid var(--border);align-items:center;gap:12px;width:100%;padding:14px;display:flex}.issue-choice:last-child{border-bottom:0}.issue-choice:hover,.issue-choice:focus-visible{background:var(--muted)}.issue-choice:focus-visible{outline:2px solid var(--ring);outline-offset:-2px}.issue-choice:disabled{opacity:.55}.issue-choice>svg,.issue-number{flex:none}.issue-number{color:var(--muted-foreground);font-size:12px}.issue-choice-copy{overflow-wrap:anywhere;flex:1;min-width:0}.issue-choice-copy strong{font-size:13px;font-weight:500;display:block}.issue-choice-meta{flex-wrap:wrap;align-items:center;gap:6px;margin-top:8px;display:flex}.issue-choice-meta .issue-number{margin-right:3px}.issue-open-icon{color:#3c925d;align-self:flex-start;margin-top:2px}.issue-label{border:1px solid var(--label-color);border-radius:20px;padding:1px 7px;font-size:10px;font-weight:500;line-height:17px}@supports (color:color-mix(in lab, red, red)){.issue-label{border:1px solid color-mix(in srgb, var(--label-color) 28%, transparent)}}.issue-label{color:var(--label-color);background:var(--label-color)}@supports (color:color-mix(in lab, red, red)){.issue-label{background:color-mix(in srgb, var(--label-color) 8%, var(--surface))}}.label-neutral{--label-color:#646b77}.label-red{--label-color:#af4048}.label-orange{--label-color:#9f5a2a}.label-yellow{--label-color:#846b12}.label-green{--label-color:#3d764d}.label-cyan{--label-color:#20757b}.label-blue{--label-color:#366faa}.label-purple{--label-color:#8254a8}.dark .label-neutral{--label-color:#acb2bc}.dark .label-red{--label-color:#eb969b}.dark .label-orange{--label-color:#ebb182}.dark .label-yellow{--label-color:#d7c678}.dark .label-green{--label-color:#8bc99d}.dark .label-cyan{--label-color:#80c8ce}.dark .label-blue{--label-color:#8bb4e5}.dark .label-purple{--label-color:#bea0df}.issue-search{border:1px solid var(--border);color:var(--muted-foreground);border-radius:7px;align-items:center;gap:9px;padding:10px 12px;display:flex}.issue-search:focus-within{outline:2px solid var(--ring);outline-offset:2px}.issue-search input{width:100%;min-width:0;color:var(--foreground);background:0 0;border:0;outline:0;font-size:12px}.issue-picker-actions{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.work-recommendation{background:var(--muted);border:1px solid var(--border);border-radius:8px;gap:12px;padding:16px;display:grid}.work-recommendation h3{font-size:14px;font-weight:600}.work-help{color:var(--muted-foreground);font-size:12px;line-height:20px}.work-help a{text-decoration:underline}.work-options summary{cursor:pointer;color:var(--muted-foreground);font-size:12px}.work-options-fields{gap:14px;margin-top:16px;display:grid}.work-dialog-footer{border-top:1px solid var(--border);justify-content:space-between;align-items:center;gap:24px;padding:18px 24px;display:flex}.work-dialog-footer p{color:var(--muted-foreground);max-width:320px;font-size:11px;line-height:17px}.work-dialog-footer button{flex:none}@media (width<=480px){.work-dialog-header,.work-dialog-body,.work-dialog-footer{padding:18px}.work-dialog-footer{flex-direction:column;align-items:flex-start;gap:12px}.work-dialog-footer button{align-self:flex-end}}.project-header:not(.project-header-compact),.runs-page,.inbox-page,.workshop>.secondary-page{width:calc(100% - 112px);max-width:1500px;margin-inline:auto;padding-left:0;padding-right:0}.facet-option{text-align:left;width:100%;color:inherit;font:inherit;background:0 0;border:0}.facet-option:focus-visible{outline:2px solid var(--ring);outline-offset:-2px}.facet-check{border:1px solid var(--border);border-radius:3px;flex:none;place-items:center;width:14px;height:14px;display:grid}.facet-option[aria-checked=true] .facet-check{color:var(--background);background:var(--foreground);border-color:var(--foreground)}.facet-popover-heading button[aria-disabled=true]{opacity:.4}.run-column{border:1px solid var(--border);background:var(--surface);border-radius:6px;overflow:hidden}.run-column>header{color:var(--tone);background:var(--tone)}@supports (color:color-mix(in lab, red, red)){.run-column>header{background:color-mix(in srgb, var(--tone) 7%, var(--background))}}.step-heading h2{font-size:16px;font-weight:600}.catalog-note{color:var(--muted-foreground);max-width:85ch;font-size:14px;line-height:1.65}.catalog-section-title{font-size:18px;font-weight:600}.definition-terms>summary{cursor:pointer;margin-bottom:18px;font-weight:500}.infrastructure-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:20px;display:grid}.infrastructure-card{overflow-wrap:anywhere;align-content:start;gap:18px;padding:24px;display:grid}.infrastructure-card h2{align-items:center;gap:10px;font-weight:600;display:flex}.infrastructure-card p,.infrastructure-worker small{color:var(--muted-foreground);font-size:14px}.infrastructure-worker{border-block:1px solid var(--border);justify-content:space-between;align-items:center;gap:12px;padding-block:16px;display:flex}.infrastructure-worker small{display:block}.infrastructure-card a{text-underline-offset:3px;font-size:14px;text-decoration:underline}.repo-action:disabled{opacity:.5;cursor:not-allowed}@media (width<=1150px){.project-header:not(.project-header-compact),.runs-page,.inbox-page,.workshop>.secondary-page{width:calc(100% - 72px)}}@media (width<=767px){.project-header:not(.project-header-compact),.runs-page,.inbox-page,.workshop>.secondary-page{width:calc(100% - 40px)}.infrastructure-grid{grid-template-columns:minmax(0,1fr)}}@media (width<=359px){.project-header:not(.project-header-compact),.runs-page,.inbox-page,.workshop>.secondary-page{width:calc(100% - 32px)}}.template-chooser,.issue-form-fields{gap:14px;display:grid}.template-choice{border:1px solid var(--border);border-radius:8px;overflow:hidden}.template-choice>button{text-align:left;justify-content:space-between;align-items:center;gap:16px;width:100%;padding:16px;display:flex}.template-choice>button:hover,.template-choice>button:focus-visible{background:var(--muted)}.template-choice>button>span{gap:5px;display:grid}.template-choice strong,.template-contact strong,.template-form-name{font-size:13px;font-weight:600}.template-choice span>span,.template-contact>span{color:var(--muted-foreground);font-size:12px;line-height:18px}.template-choice>strong,.template-choice>p,.template-choice>a{margin:12px 16px;display:block}.template-choice>a{font-size:12px;text-decoration:underline}.template-contact{gap:5px;padding:8px 0;display:grid}.template-note{white-space:pre-wrap;color:var(--muted-foreground);border:1px solid var(--border);border-radius:6px;padding:12px;font-size:12px;line-height:19px}.field-description{margin:4px 0 8px;display:block}.issue-form-textarea{resize:vertical;min-height:100px}.issue-form-options{gap:8px;display:grid}.issue-form-options>label{align-items:flex-start;gap:8px;font-size:12px;display:flex}.issue-form-options input{margin-top:3px}.issue-publish,.issue-created{padding:0 24px 20px}.issue-publish-actions{justify-content:flex-end;gap:12px;margin-top:16px;display:flex}.issue-receipt{border:1px solid var(--border);border-radius:8px;margin:12px 0;padding:12px}.issue-publish strong,.issue-created a{overflow-wrap:anywhere}@media (width<=480px){.issue-publish-actions{flex-direction:column}}.revision-error{overflow-wrap:anywhere}.inbox-page{min-width:0;padding-bottom:32px}.inbox-page>.runs-page{width:100%;margin-inline:0;padding-inline:0}.inbox-attempts{gap:10px;padding:10px 0;display:grid}.inbox-attempts a{font-size:13px;text-decoration:underline;display:grid}.inbox-attempts small{color:var(--muted-foreground);font-size:11px}.inbox-body{white-space:pre-wrap;overflow-wrap:anywhere;font:inherit;font-size:14px}.inbox-start{gap:16px;min-width:0;max-width:680px;display:grid}.inbox-start label{gap:6px;display:grid}.active-filters{gap:8px;position:relative}.active-filters>[role=status]{flex:1;line-height:16px}.active-filters .repository-trigger{text-align:left;border-radius:6px;justify-items:start;gap:0;min-height:44px;padding:3px 6px;display:grid}.repository-trigger:hover,.repository-trigger[aria-expanded=true]{background:var(--muted)}.repository-trigger>span:first-child{align-items:center;gap:4px;display:flex}.repository-scope{color:var(--muted-foreground);font-size:12px;line-height:16px}.repository-popover{z-index:30;background:var(--surface);border:1px solid var(--border);border-radius:8px;gap:12px;width:min(340px,100%);max-height:min(440px,65vh);padding:12px;display:grid;position:absolute;top:calc(100% + 4px);right:0;overflow-y:auto;box-shadow:0 8px 24px #0000001f}.source-controls{color:var(--muted-foreground);flex-wrap:wrap;align-items:center;gap:8px;font-size:13px;display:flex}.source-controls label{align-items:center;gap:6px;display:flex}.source-controls select{background:var(--background);max-width:100%;min-height:36px;color:var(--foreground);border:1px solid var(--border);border-radius:6px;padding:4px}.repository-popover button{white-space:normal;height:auto;min-height:36px}.source-boundary{color:var(--muted-foreground);overflow-wrap:anywhere;font-size:12px;line-height:18px}.task-row-link>.issue-choice-meta,.run-card-link>.issue-choice-meta{margin-top:5px}.facet-search{border:1px solid var(--border);background:var(--background);width:calc(100% - 16px);color:var(--foreground);border-radius:4px;margin:4px 8px;padding:6px}.issue-context{gap:16px;min-width:0;margin-bottom:24px;display:grid}.issue-context summary{cursor:pointer;margin-block:10px;font-size:14px;font-weight:500}.issue-context .form-error,.inbox-attempts a{overflow-wrap:anywhere}.issue-context .inbox-start{padding-block:12px}.issue-context .inbox-start details label{margin-top:12px}@media (width<=480px){.task-facets{position:relative}.facet-container{position:static}.task-facets .facet-container .facet-popover{left:0;right:auto;transform:none}}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}
|