@provos/ironcurtain 0.12.0 → 0.13.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 +14 -12
- package/dist/cli.js +6 -0
- package/dist/cli.js.map +1 -1
- package/dist/config/config-command.d.ts +33 -1
- package/dist/config/config-command.js +608 -11
- package/dist/config/config-command.js.map +1 -1
- package/dist/config/openrouter-catalog.d.ts +46 -0
- package/dist/config/openrouter-catalog.js +111 -0
- package/dist/config/openrouter-catalog.js.map +1 -0
- package/dist/config/openrouter-models-fallback.d.ts +15 -0
- package/dist/config/openrouter-models-fallback.js +49 -0
- package/dist/config/openrouter-models-fallback.js.map +1 -0
- package/dist/config/types.d.ts +8 -0
- package/dist/config/user-config.d.ts +133 -7
- package/dist/config/user-config.js +234 -5
- package/dist/config/user-config.js.map +1 -1
- package/dist/daemon/daemon-command.js.map +1 -1
- package/dist/daemon/ironcurtain-daemon.js +6 -0
- package/dist/daemon/ironcurtain-daemon.js.map +1 -1
- package/dist/docker/adapters/claude-code.js +109 -1
- package/dist/docker/adapters/claude-code.js.map +1 -1
- package/dist/docker/adapters/codex.d.ts +10 -1
- package/dist/docker/adapters/codex.js +99 -20
- package/dist/docker/adapters/codex.js.map +1 -1
- package/dist/docker/adapters/goose.js +38 -2
- package/dist/docker/adapters/goose.js.map +1 -1
- package/dist/docker/agent-adapter.d.ts +29 -5
- package/dist/docker/agent-registry.js +1 -1
- package/dist/docker/agent-registry.js.map +1 -1
- package/dist/docker/apple-container-manager.d.ts +4 -4
- package/dist/docker/apple-container-manager.js +44 -22
- package/dist/docker/apple-container-manager.js.map +1 -1
- package/dist/docker/ca.js +9 -2
- package/dist/docker/ca.js.map +1 -1
- package/dist/docker/container-lifecycle.js +9 -0
- package/dist/docker/container-lifecycle.js.map +1 -1
- package/dist/docker/docker-agent-session.d.ts +31 -0
- package/dist/docker/docker-agent-session.js +67 -6
- package/dist/docker/docker-agent-session.js.map +1 -1
- package/dist/docker/docker-infrastructure.d.ts +55 -15
- package/dist/docker/docker-infrastructure.js +261 -61
- package/dist/docker/docker-infrastructure.js.map +1 -1
- package/dist/docker/docker-manager.js +127 -0
- package/dist/docker/docker-manager.js.map +1 -1
- package/dist/docker/docker-resource-lifecycle.d.ts +71 -0
- package/dist/docker/docker-resource-lifecycle.js +454 -0
- package/dist/docker/docker-resource-lifecycle.js.map +1 -0
- package/dist/docker/gc-command.d.ts +2 -0
- package/dist/docker/gc-command.js +37 -0
- package/dist/docker/gc-command.js.map +1 -0
- package/dist/docker/mitm-proxy.d.ts +6 -4
- package/dist/docker/mitm-proxy.js +105 -17
- package/dist/docker/mitm-proxy.js.map +1 -1
- package/dist/docker/network-topology.d.ts +16 -9
- package/dist/docker/network-topology.js +17 -10
- package/dist/docker/network-topology.js.map +1 -1
- package/dist/docker/openrouter.d.ts +107 -0
- package/dist/docker/openrouter.js +236 -0
- package/dist/docker/openrouter.js.map +1 -0
- package/dist/docker/orientation.js +1 -1
- package/dist/docker/orientation.js.map +1 -1
- package/dist/docker/platform.d.ts +3 -1
- package/dist/docker/platform.js +3 -1
- package/dist/docker/platform.js.map +1 -1
- package/dist/docker/provider-config.d.ts +6 -0
- package/dist/docker/provider-config.js.map +1 -1
- package/dist/docker/pty-session.d.ts +7 -0
- package/dist/docker/pty-session.js +111 -29
- package/dist/docker/pty-session.js.map +1 -1
- package/dist/docker/pty-types.d.ts +15 -0
- package/dist/docker/pty-types.js +8 -0
- package/dist/docker/pty-types.js.map +1 -1
- package/dist/docker/sse-extractor.js +55 -5
- package/dist/docker/sse-extractor.js.map +1 -1
- package/dist/docker/stream-delay.d.ts +86 -0
- package/dist/docker/stream-delay.js +218 -0
- package/dist/docker/stream-delay.js.map +1 -0
- package/dist/docker/token-stream-types.d.ts +15 -0
- package/dist/docker/trajectory-reassembler.d.ts +2 -2
- package/dist/docker/trajectory-reassembler.js +22 -2
- package/dist/docker/trajectory-reassembler.js.map +1 -1
- package/dist/docker/trajectory-tap.js +2 -2
- package/dist/docker/trajectory-tap.js.map +1 -1
- package/dist/docker/types.d.ts +63 -5
- package/dist/doctor/checks.d.ts +3 -3
- package/dist/doctor/checks.js +28 -11
- package/dist/doctor/checks.js.map +1 -1
- package/dist/doctor/doctor-command.js +1 -1
- package/dist/doctor/doctor-command.js.map +1 -1
- package/dist/escalation/escalation-watcher.js +6 -0
- package/dist/escalation/escalation-watcher.js.map +1 -1
- package/dist/{mux → escalation}/trusted-input.d.ts +7 -4
- package/dist/{mux → escalation}/trusted-input.js +8 -5
- package/dist/escalation/trusted-input.js.map +1 -0
- package/dist/hash.js.map +1 -1
- package/dist/index.js +37 -6
- package/dist/index.js.map +1 -1
- package/dist/mux/mux-app.d.ts +7 -0
- package/dist/mux/mux-app.js +17 -16
- package/dist/mux/mux-app.js.map +1 -1
- package/dist/mux/mux-command.js +8 -3
- package/dist/mux/mux-command.js.map +1 -1
- package/dist/mux/mux-input-handler.d.ts +26 -2
- package/dist/mux/mux-input-handler.js +93 -11
- package/dist/mux/mux-input-handler.js.map +1 -1
- package/dist/mux/mux-renderer.d.ts +2 -1
- package/dist/mux/mux-renderer.js +67 -0
- package/dist/mux/mux-renderer.js.map +1 -1
- package/dist/mux/provider-profile-snapshot.d.ts +44 -0
- package/dist/mux/provider-profile-snapshot.js +56 -0
- package/dist/mux/provider-profile-snapshot.js.map +1 -0
- package/dist/mux/types.d.ts +3 -2
- package/dist/mux/types.js +6 -2
- package/dist/mux/types.js.map +1 -1
- package/dist/observe/observe-command.js.map +1 -1
- package/dist/pipeline/constitution-compiler.js.map +1 -1
- package/dist/pipeline/generate-with-repair.js.map +1 -1
- package/dist/pipeline/refresh-lists.js.map +1 -1
- package/dist/pipeline/scenario-schema-validator.js.map +1 -1
- package/dist/{mux → pty}/pty-bridge.d.ts +39 -3
- package/dist/{mux → pty}/pty-bridge.js +68 -18
- package/dist/pty/pty-bridge.js.map +1 -0
- package/dist/pty/resolve-ironcurtain-bin.d.ts +17 -0
- package/dist/pty/resolve-ironcurtain-bin.js +22 -0
- package/dist/pty/resolve-ironcurtain-bin.js.map +1 -0
- package/dist/servers/fetch-server.js +2 -0
- package/dist/servers/fetch-server.js.map +1 -1
- package/dist/session/index.d.ts +1 -1
- package/dist/session/index.js +11 -2
- package/dist/session/index.js.map +1 -1
- package/dist/session/preflight.d.ts +19 -5
- package/dist/session/preflight.js +41 -25
- package/dist/session/preflight.js.map +1 -1
- package/dist/session/resource-budget-tracker.js +8 -0
- package/dist/session/resource-budget-tracker.js.map +1 -1
- package/dist/session/session-manager.d.ts +7 -0
- package/dist/session/session-manager.js.map +1 -1
- package/dist/session/types.d.ts +14 -0
- package/dist/signal/signal-bot-daemon.d.ts +1 -0
- package/dist/signal/signal-bot-daemon.js +9 -2
- package/dist/signal/signal-bot-daemon.js.map +1 -1
- package/dist/trusted-process/mcp-error-utils.js +4 -1
- package/dist/trusted-process/mcp-error-utils.js.map +1 -1
- package/dist/trusted-process/mcp-proxy-server.js +2 -0
- package/dist/trusted-process/mcp-proxy-server.js.map +1 -1
- package/dist/trusted-process/policy-engine.js.map +1 -1
- package/dist/trusted-process/tcp-server-transport.d.ts +7 -0
- package/dist/trusted-process/tcp-server-transport.js +48 -10
- package/dist/trusted-process/tcp-server-transport.js.map +1 -1
- package/dist/utils/preflight-checks.js +1 -3
- package/dist/utils/preflight-checks.js.map +1 -1
- package/dist/utils/stdio-guard.d.ts +1 -0
- package/dist/utils/stdio-guard.js +27 -0
- package/dist/utils/stdio-guard.js.map +1 -0
- package/dist/web-ui/__tests__/config-dispatch.test.d.ts +13 -0
- package/dist/web-ui/__tests__/config-dispatch.test.js +383 -0
- package/dist/web-ui/__tests__/config-dispatch.test.js.map +1 -0
- package/dist/web-ui/__tests__/json-rpc-dispatch.test.js +6 -0
- package/dist/web-ui/__tests__/json-rpc-dispatch.test.js.map +1 -1
- package/dist/web-ui/dispatch/config-dispatch.d.ts +15 -0
- package/dist/web-ui/dispatch/config-dispatch.js +277 -0
- package/dist/web-ui/dispatch/config-dispatch.js.map +1 -0
- package/dist/web-ui/dispatch/escalation-dispatch.js +11 -2
- package/dist/web-ui/dispatch/escalation-dispatch.js.map +1 -1
- package/dist/web-ui/dispatch/pty-dispatch.d.ts +15 -0
- package/dist/web-ui/dispatch/pty-dispatch.js +66 -0
- package/dist/web-ui/dispatch/pty-dispatch.js.map +1 -0
- package/dist/web-ui/dispatch/session-dispatch.js +69 -4
- package/dist/web-ui/dispatch/session-dispatch.js.map +1 -1
- package/dist/web-ui/dispatch/types.d.ts +12 -0
- package/dist/web-ui/dispatch/types.js +38 -1
- package/dist/web-ui/dispatch/types.js.map +1 -1
- package/dist/web-ui/dispatch/workflow-dispatch.js.map +1 -1
- package/dist/web-ui/json-rpc-dispatch.js +3 -0
- package/dist/web-ui/json-rpc-dispatch.js.map +1 -1
- package/dist/web-ui/pty-session-manager.d.ts +234 -0
- package/dist/web-ui/pty-session-manager.js +599 -0
- package/dist/web-ui/pty-session-manager.js.map +1 -0
- package/dist/web-ui/web-event-bus.d.ts +9 -0
- package/dist/web-ui/web-event-bus.js.map +1 -1
- package/dist/web-ui/web-session-transport.js.map +1 -1
- package/dist/web-ui/web-ui-server.d.ts +8 -0
- package/dist/web-ui/web-ui-server.js +25 -0
- package/dist/web-ui/web-ui-server.js.map +1 -1
- package/dist/web-ui/web-ui-types.d.ts +80 -1
- package/dist/web-ui/web-ui-types.js.map +1 -1
- package/dist/web-ui-static/assets/index-CCVI4nEK.css +1 -0
- package/dist/web-ui-static/assets/index-Dm012gvY.js +114 -0
- package/dist/web-ui-static/index.html +2 -2
- package/dist/workflow/daemon-gate-commands.js +38 -42
- package/dist/workflow/daemon-gate-commands.js.map +1 -1
- package/dist/workflow/machine-builder.js.map +1 -1
- package/dist/workflow/orchestrator.js +10 -7
- package/dist/workflow/orchestrator.js.map +1 -1
- package/dist/workflow/shutdown-signals.d.ts +7 -0
- package/dist/workflow/shutdown-signals.js +40 -0
- package/dist/workflow/shutdown-signals.js.map +1 -0
- package/dist/workflow/validate.js.map +1 -1
- package/dist/workflow/workflow-command.js +10 -8
- package/dist/workflow/workflow-command.js.map +1 -1
- package/dist/workflow/workflows/evolve/README.md +66 -0
- package/dist/workflow/workflows/vuln-discovery/README.md +54 -0
- package/docker/entrypoint-claude-code.sh +22 -0
- package/package.json +31 -27
- package/src/workflow/workflows/evolve/README.md +66 -0
- package/src/workflow/workflows/vuln-discovery/README.md +54 -0
- package/dist/mux/pty-bridge.js.map +0 -1
- package/dist/mux/trusted-input.js.map +0 -1
- package/dist/web-ui-static/assets/index-BD5U6ILh.css +0 -1
- package/dist/web-ui-static/assets/index-FMsHWEfK.js +0 -79
- package/packages/web-ui/README.md +0 -113
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Evolve
|
|
2
|
+
|
|
3
|
+
A multi-round, evaluator-driven candidate search that runs a tireless AI researcher on a hard problem: each round it **samples a parent, proposes a new candidate, scores it against your evaluator, and distills a transferable lesson** — then repeats, accumulating knowledge until the round budget is spent. It's IronCurtain's packaging of the [ASI-Evolve](scripts/README.md) loop, run by a Docker-isolated `claude-code` agent.
|
|
4
|
+
|
|
5
|
+
Run it from the web UI (**Start Workflow → `evolve`**) or the CLI:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
ironcurtain workflow start evolve \
|
|
9
|
+
"Improve the linear-attention kernel scored by evaluator.py" \
|
|
10
|
+
--workspace ~/experiments/linear-attention
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## The experiment you point it at
|
|
14
|
+
|
|
15
|
+
Evolve searches over **your** problem. Point `--workspace` at an experiment directory and the `preflight` agent infers the run spec from the files it finds at the workspace root:
|
|
16
|
+
|
|
17
|
+
| File | Role |
|
|
18
|
+
| ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
|
|
19
|
+
| `input.md` / `README.md` | **Objective** — what "better" means, one line, taken faithfully from the brief |
|
|
20
|
+
| `evaluator.py` | **Scoring contract** — `python evaluator.py <code_path> <results_path>`, writing JSON metrics. This is the fitness function. |
|
|
21
|
+
| `initial_program` | _(optional)_ Seed candidate / interface contract the search must respect |
|
|
22
|
+
| `requirements.txt` / `pyproject.toml` | _(optional)_ Python deps installed into the persistent run venv |
|
|
23
|
+
| `init_cognition.py` | _(optional)_ Domain knowledge / heuristics seeded into the cognition store so the search doesn't start from zero |
|
|
24
|
+
|
|
25
|
+
If the workspace is empty, `preflight` falls back to inferring everything from the task description — useful for a quick trial, but a real experiment wants an evaluator. Experiment source files are treated as **read-only**; the run writes only to `.evolve_runs/` and `.workflow/`.
|
|
26
|
+
|
|
27
|
+
## What it does
|
|
28
|
+
|
|
29
|
+
After a one-time setup, the orchestrator drives rounds. Each round is a linear pipeline that turns sampled history into one scored, recorded candidate.
|
|
30
|
+
|
|
31
|
+
| Phase | State(s) | Role | Output |
|
|
32
|
+
| ------------ | ----------------- | -------------------------------------------------------------------------------------------------------- | ------------------------ |
|
|
33
|
+
| Setup | `provision` | Install the experiment's deps into the persistent venv (idempotent) | provisioned venv |
|
|
34
|
+
| Setup | `preflight` | Infer the run spec, initialize the run, author the cognition seed | run spec, cognition seed |
|
|
35
|
+
| Loop control | `orchestrator` | Round-boundary controller — enforce the budget and stop conditions; route continue / complete / escalate | — |
|
|
36
|
+
| Round | `sample` | Sample parent nodes (UCB1 / greedy / random / MAP-Elites) and retrieve relevant cognition | sampled parents |
|
|
37
|
+
| Round | `researcher` | Evolve one candidate from the sampled parents and retrieved lessons | candidate program |
|
|
38
|
+
| Round | `evaluate` | Run your evaluator on the candidate | JSON metrics |
|
|
39
|
+
| Round | `analyzer` | Distill the outcome into a transferable lesson for future rounds | round lesson |
|
|
40
|
+
| Round | `analysis_record` | Commit the round (candidate + score + lesson + parents) to the experiment database | recorded node |
|
|
41
|
+
| Wrap-up | `final_summary` | Summarize the best candidates and what was learned | run summary |
|
|
42
|
+
|
|
43
|
+
## Human gates
|
|
44
|
+
|
|
45
|
+
Four gates pause for your decision; each accepts **APPROVE** (continue), **FORCE_REVISION** (loop back with feedback routed into the next agent's prompt), or **ABORT**.
|
|
46
|
+
|
|
47
|
+
- **`provision_review`** — sign off on the environment setup before any candidate runs.
|
|
48
|
+
- **`preflight_review`** — sign off on the inferred run spec (objective, eval command, budget, cognition seed) before the search starts. This is the most important gate: a wrong objective or eval command wastes the whole budget.
|
|
49
|
+
- **`human_escalation`** — a round got blocked (e.g. the evaluator can't run). Redirect, retry, or stop.
|
|
50
|
+
- **`final_review`** — sign off on the run summary at the end.
|
|
51
|
+
|
|
52
|
+
## The round loop
|
|
53
|
+
|
|
54
|
+
The real budget is `run_spec.budget.max_rounds`, inferred at preflight from your experiment brief and enforced by the **orchestrator** — not the `maxRounds: 200` setting, which is only a safety backstop against a wedged pipeline. After each recorded round the orchestrator re-checks the budget and stop conditions and routes to continue, `complete`, or escalate, so the search ends cleanly instead of running forever.
|
|
55
|
+
|
|
56
|
+
## At a glance
|
|
57
|
+
|
|
58
|
+
- **Mode:** Docker (`claude-code` agent, `--network=none`, shared container)
|
|
59
|
+
- **Model:** `anthropic:claude-sonnet-4-6`
|
|
60
|
+
- **Persona:** `global` for every agent state
|
|
61
|
+
- **Input:** an experiment directory via `--workspace` (evaluator + objective; optional seed/deps/cognition)
|
|
62
|
+
- **Budget:** `max_rounds` inferred at preflight; `maxRounds: 200` is a backstop only
|
|
63
|
+
- **Run state:** `.evolve_runs/` (experiment DB, cognition store) and `.workflow/` in the workspace
|
|
64
|
+
- **Terminal states:** `done` (budget reached, approved) · `failed` (unrecoverable) · `aborted` (stopped at a gate)
|
|
65
|
+
|
|
66
|
+
> Tip: the search is only as good as `evaluator.py`. A noisy or too-lenient fitness function makes every candidate look equally good and the loop learns nothing — invest in a scorer that cleanly separates better from worse before kicking off a long run. For the framework behind the loop (cognition store, experiment database, sampling strategies) see [`scripts/README.md`](scripts/README.md).
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Vulnerability Discovery
|
|
2
|
+
|
|
3
|
+
An orchestrator-driven workflow that points a Docker-isolated `claude-code` agent at a body of code, **builds tiered instrumented harnesses, and tries to execute its way to a confirmed vulnerability** — analysis → harnessing → discovery → triage → report, with human gates whenever the machine gets stuck or finishes.
|
|
4
|
+
|
|
5
|
+
Run it from the web UI (**Start Workflow → `vuln-discovery`**) or the CLI:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
ironcurtain workflow start vuln-discovery \
|
|
9
|
+
"find a memory-corruption bug reachable from a crafted H.264 stream" \
|
|
10
|
+
--workspace ~/src/ffmpeg
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Point `--workspace` at a checkout of the code under investigation. The task description carries the **scope, vulnerability class, and threat model**; a one-liner like `"find a vulnerability in libavcodec/h264_slice.c"` is enough to start, since the agent prompts supply the methodology. Add detail to steer the hunt.
|
|
14
|
+
|
|
15
|
+
> **Requires Docker.** This workflow only runs in Docker Agent Mode (`--network=none`); there is no builtin-mode fallback. Run `ironcurtain doctor` first if you're unsure your environment is ready. For a fresh-checkout walkthrough (build, daemon, web UI, non-Anthropic models, troubleshooting) see [`docs/vuln-discovery-onboarding/README.md`](https://github.com/provos/ironcurtain/blob/master/docs/vuln-discovery-onboarding/README.md).
|
|
16
|
+
|
|
17
|
+
## What it does
|
|
18
|
+
|
|
19
|
+
The orchestrator sits at the center and decides what to do next each round, reading and updating the investigation journal. Around it, the agents move a hypothesis from structural understanding to an executed, triaged finding. All artifacts land under `.workflow/` in the workspace.
|
|
20
|
+
|
|
21
|
+
| Phase | State(s) | Role | Output |
|
|
22
|
+
| ----- | ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------- | ----------------------------------------------- |
|
|
23
|
+
| 1 | `analyze` | Code analyst — maps call chains, entry points, build system, trust boundaries | `.workflow/analysis/analysis.md` |
|
|
24
|
+
| — | `orchestrator` | Strategist — picks the next state, enforces budget, owns the journal | `.workflow/journal/journal.md` |
|
|
25
|
+
| 2 | `harness_design` → `harness_design_review` | Architect + LLM reviewer — spec an instrumented, tiered harness | `.workflow/harness_design/` |
|
|
26
|
+
| 3 | `harness_build` → `harness_validate` | Engineer + verifier — implement the harness, confirm it runs and produces coverage | `.workflow/harness_build/`, `harness_validate/` |
|
|
27
|
+
| 4 | `discover` (+ `differential_validate`) | Researcher — hypothesis-driven search using the harness; diagnose isolated-vs-live divergence | `.workflow/discoveries/findings.h*.md` |
|
|
28
|
+
| 5 | `triage` | Independent reproducer — re-prove each finding and assess severity | `.workflow/triage/triage.h*.md` |
|
|
29
|
+
| 6 | `conclude` → `review` | Report writer + LLM reviewer — assemble the final report, catch scope drift and evidence/headline contradictions | `.workflow/report/report.md` |
|
|
30
|
+
|
|
31
|
+
## Human gates
|
|
32
|
+
|
|
33
|
+
Four gates pause the run for your decision. Each presents the relevant artifacts (journal, analysis, designs, reports) and accepts **APPROVE** (continue), **FORCE_REVISION** (loop back — your feedback is routed verbatim into the next agent's prompt, so brief it like an orchestrator), or **ABORT**.
|
|
34
|
+
|
|
35
|
+
- **`human_escalation`** — the orchestrator detected a stall (same state 3+ times, contradictory results, or no clear next direction). Give it another round, redirect it, or stop.
|
|
36
|
+
- **`harness_design_escalation`** — the design-review loop rejected the design 3× in a row. Accept the design as-is, redirect, or stop.
|
|
37
|
+
- **`harness_validate_escalation`** — the validate loop rejected the build 4× in a row. Accept the harness despite validation failures, redirect, or stop.
|
|
38
|
+
- **`report_review`** — the investigation reached `complete` and the final report is ready. Approve it, send it back (your assessment overrides the agent's — e.g. dispute a "mitigated" verdict and it re-investigates at a higher tier), or discard.
|
|
39
|
+
|
|
40
|
+
## The orchestration loop
|
|
41
|
+
|
|
42
|
+
Unlike a fixed pipeline, the **orchestrator** re-routes after every round based on the journal: forward when a harness validates and findings hold, back to re-design or re-discover when they don't. The loop is bounded by `maxRounds` (**12**) and `maxSessionSeconds` (**10800** = 3 hours). When either limit or a stall is hit, control surfaces to a human gate rather than spinning — it never loops forever.
|
|
43
|
+
|
|
44
|
+
## At a glance
|
|
45
|
+
|
|
46
|
+
- **Mode:** Docker (`claude-code` agent, `--network=none`, shared container)
|
|
47
|
+
- **Model:** `anthropic:claude-opus-4-8`
|
|
48
|
+
- **Persona:** `global` for every agent state
|
|
49
|
+
- **Caps:** 12 rounds · 3-hour session budget
|
|
50
|
+
- **Skills:** `memory-safety-c-cpp`, `harness-design-fuzzing`, `vulnerability-triage` (co-packaged under `skills/`)
|
|
51
|
+
- **Artifacts:** `analysis`, `journal`, `harness_*`, `discoveries`, `triage`, `report` — all under `.workflow/`
|
|
52
|
+
- **Terminal states:** `done` (report approved) · `aborted` (stopped at a gate)
|
|
53
|
+
|
|
54
|
+
> Tip: the more precisely the task states the **threat model** (who the attacker is, how input reaches the code), the less the analyst has to guess. "Memory corruption reachable from an untrusted network packet" steers the whole run; "find bugs" does not. To run bigger targets past the default caps, copy the whole `vuln-discovery/` directory (it carries the skills it needs) into `~/.ironcurtain/workflows/` and raise the limits there.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pty-bridge.js","sourceRoot":"","sources":["../../src/mux/pty-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"trusted-input.js","sourceRoot":"","sources":["../../src/mux/trusted-input.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,aAAqB,EAAE,WAAmB;IAChF,MAAM,WAAW,GAAG,OAAO,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC;IAChE,MAAM,OAAO,GAAuB;QAClC,WAAW;QACX,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,MAAM,EAAE,mBAAmB;KAC5B,CAAC;IACF,mBAAmB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
@font-face{font-family:Orbitron;font-style:normal;font-display:swap;font-weight:700;src:url(/assets/orbitron-latin-700-normal-4jsRXGGJ.woff2) format("woff2"),url(/assets/orbitron-latin-700-normal-DmYOh-W9.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:system-ui,-apple-system,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--destructive: 0 72% 51%;--destructive-foreground: 0 0% 98%;--success-foreground: 0 0% 98%;--radius: .5rem}[data-theme=iron]{--background: 220 14% 8%;--foreground: 210 20% 92%;--card: 220 14% 10%;--card-foreground: 210 20% 92%;--primary: 38 92% 55%;--primary-foreground: 220 14% 8%;--secondary: 220 12% 16%;--secondary-foreground: 210 20% 82%;--muted: 220 12% 16%;--muted-foreground: 215 12% 52%;--accent: 220 12% 14%;--accent-foreground: 210 20% 92%;--success: 142 72% 42%;--warning: 38 92% 55%;--warning-foreground: 220 14% 8%;--border: 220 12% 18%;--ring: 38 92% 55%;--sidebar: 220 14% 6%;color-scheme:dark}[data-theme=daylight]{--background: 40 20% 97%;--foreground: 220 20% 12%;--card: 0 0% 100%;--card-foreground: 220 20% 12%;--primary: 172 66% 36%;--primary-foreground: 0 0% 100%;--secondary: 220 10% 94%;--secondary-foreground: 220 20% 30%;--muted: 220 10% 94%;--muted-foreground: 220 10% 46%;--accent: 220 10% 92%;--accent-foreground: 220 20% 12%;--success: 142 72% 36%;--warning: 38 92% 50%;--warning-foreground: 220 14% 8%;--border: 220 12% 88%;--ring: 172 66% 36%;--sidebar: 0 0% 100%;color-scheme:light}[data-theme=midnight]{--background: 228 24% 8%;--foreground: 215 20% 90%;--card: 228 22% 11%;--card-foreground: 215 20% 90%;--primary: 213 94% 58%;--primary-foreground: 0 0% 100%;--secondary: 228 18% 16%;--secondary-foreground: 215 20% 80%;--muted: 228 18% 16%;--muted-foreground: 220 14% 50%;--accent: 228 18% 14%;--accent-foreground: 215 20% 90%;--success: 142 72% 42%;--warning: 45 93% 58%;--warning-foreground: 228 24% 8%;--border: 228 16% 18%;--ring: 213 94% 58%;--sidebar: 228 24% 6%;color-scheme:dark}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-family:DM Sans,system-ui,sans-serif}code,.font-mono{font-family:JetBrains Mono,ui-monospace,monospace}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:hsl(var(--muted-foreground) / .25);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:hsl(var(--muted-foreground) / .4)}.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}}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-y-0{top:0;bottom:0}.bottom-full{bottom:100%}.left-0{left:0}.right-0{right:0}.top-0{top:0}.top-full{top:100%}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.m-0{margin:0}.-mx-6{margin-left:-1.5rem;margin-right:-1.5rem}.mx-1\.5{margin-left:.375rem;margin-right:.375rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.-mb-px{margin-bottom:-1px}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-20{margin-left:5rem}.ml-4{margin-left:1rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.table-cell{display:table-cell}.table-row{display:table-row}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-1\.5{height:.375rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-4{height:1rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-\[400px\]{height:400px}.h-full{height:100%}.h-screen{height:100vh}.max-h-32{max-height:8rem}.max-h-48{max-height:12rem}.max-h-80{max-height:20rem}.max-h-\[150px\]{max-height:150px}.max-h-\[60vh\]{max-height:60vh}.max-h-\[68vh\]{max-height:68vh}.min-h-0{min-height:0px}.min-h-\[300px\]{min-height:300px}.min-h-\[80px\]{min-height:80px}.min-h-screen{min-height:100vh}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-16{width:4rem}.w-2{width:.5rem}.w-3{width:.75rem}.w-4{width:1rem}.w-48{width:12rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[12rem\]{min-width:12rem}.min-w-\[18px\]{min-width:18px}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-\[28ch\]{max-width:28ch}.max-w-\[36ch\]{max-width:36ch}.max-w-full{max-width:100%}.max-w-sm{max-width:24rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.-translate-x-full{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-help{cursor:help}.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}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.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-px{gap:1px}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-1\.5{row-gap:.375rem}.space-x-1\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.375rem * var(--tw-space-x-reverse));margin-left:calc(.375rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.625rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-0{border-width:0px}.border-2{border-width:2px}.border-\[1\.5px\]{border-width:1.5px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-border{border-color:hsl(var(--border))}.border-border\/50{border-color:hsl(var(--border) / .5)}.border-destructive\/20{border-color:hsl(var(--destructive) / .2)}.border-destructive\/30{border-color:hsl(var(--destructive) / .3)}.border-destructive\/40{border-color:hsl(var(--destructive) / .4)}.border-destructive\/50{border-color:hsl(var(--destructive) / .5)}.border-muted-foreground\/30{border-color:hsl(var(--muted-foreground) / .3)}.border-muted-foreground\/40{border-color:hsl(var(--muted-foreground) / .4)}.border-primary{border-color:hsl(var(--primary))}.border-primary\/30{border-color:hsl(var(--primary) / .3)}.border-primary\/40{border-color:hsl(var(--primary) / .4)}.border-transparent{border-color:transparent}.border-warning\/30{border-color:hsl(var(--warning) / .3)}.border-t-current{border-top-color:currentColor}.border-t-muted-foreground{border-top-color:hsl(var(--muted-foreground))}.bg-accent{background-color:hsl(var(--accent))}.bg-accent\/20{background-color:hsl(var(--accent) / .2)}.bg-background{background-color:hsl(var(--background))}.bg-background\/95{background-color:hsl(var(--background) / .95)}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-black\/50{background-color:#00000080}.bg-black\/60{background-color:#0009}.bg-border{background-color:hsl(var(--border))}.bg-card{background-color:hsl(var(--card))}.bg-card\/50{background-color:hsl(var(--card) / .5)}.bg-card\/75{background-color:hsl(var(--card) / .75)}.bg-destructive{background-color:hsl(var(--destructive))}.bg-destructive\/10{background-color:hsl(var(--destructive) / .1)}.bg-destructive\/15{background-color:hsl(var(--destructive) / .15)}.bg-destructive\/5{background-color:hsl(var(--destructive) / .05)}.bg-foreground\/40{background-color:hsl(var(--foreground) / .4)}.bg-muted{background-color:hsl(var(--muted))}.bg-muted-foreground\/60{background-color:hsl(var(--muted-foreground) / .6)}.bg-muted\/10{background-color:hsl(var(--muted) / .1)}.bg-muted\/30{background-color:hsl(var(--muted) / .3)}.bg-muted\/40{background-color:hsl(var(--muted) / .4)}.bg-muted\/50{background-color:hsl(var(--muted) / .5)}.bg-primary{background-color:hsl(var(--primary))}.bg-primary\/10{background-color:hsl(var(--primary) / .1)}.bg-primary\/15{background-color:hsl(var(--primary) / .15)}.bg-secondary{background-color:hsl(var(--secondary))}.bg-sidebar{background-color:hsl(var(--sidebar))}.bg-success{background-color:hsl(var(--success))}.bg-success\/15{background-color:hsl(var(--success) / .15)}.bg-transparent{background-color:transparent}.bg-warning{background-color:hsl(var(--warning))}.bg-warning\/10{background-color:hsl(var(--warning) / .1)}.bg-warning\/15{background-color:hsl(var(--warning) / .15)}.bg-warning\/5{background-color:hsl(var(--warning) / .05)}.bg-warning\/55{background-color:hsl(var(--warning) / .55)}.fill-destructive\/20{fill:hsl(var(--destructive) / .2)}.fill-foreground{fill:hsl(var(--foreground))}.fill-muted-foreground{fill:hsl(var(--muted-foreground))}.fill-muted-foreground\/60{fill:hsl(var(--muted-foreground) / .6)}.fill-muted-foreground\/70{fill:hsl(var(--muted-foreground) / .7)}.fill-muted\/50{fill:hsl(var(--muted) / .5)}.fill-primary{fill:hsl(var(--primary))}.fill-primary-foreground{fill:hsl(var(--primary-foreground))}.fill-primary\/20{fill:hsl(var(--primary) / .2)}.fill-success{fill:hsl(var(--success))}.fill-success\/15{fill:hsl(var(--success) / .15)}.fill-warning\/10{fill:hsl(var(--warning) / .1)}.fill-warning\/20{fill:hsl(var(--warning) / .2)}.stroke-border{stroke:hsl(var(--border))}.stroke-destructive{stroke:hsl(var(--destructive))}.stroke-muted-foreground\/40{stroke:hsl(var(--muted-foreground) / .4)}.stroke-primary{stroke:hsl(var(--primary))}.stroke-success\/50{stroke:hsl(var(--success) / .5)}.stroke-warning{stroke:hsl(var(--warning))}.stroke-warning\/30{stroke:hsl(var(--warning) / .3)}.p-0{padding:0}.p-1{padding:.25rem}.p-12{padding:3rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.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-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-16{padding-top:4rem;padding-bottom:4rem}.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}.pb-2{padding-bottom:.5rem}.pb-4{padding-bottom:1rem}.pb-\[15vh\]{padding-bottom:15vh}.pl-6{padding-left:1.5rem}.pr-1{padding-right:.25rem}.pt-0{padding-top:0}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-4{padding-top:1rem}.pt-\[10vh\]{padding-top:10vh}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,monospace}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.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-none{line-height:1}.leading-relaxed{line-height:1.625}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-accent-foreground{color:hsl(var(--accent-foreground))}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-destructive\/60{color:hsl(var(--destructive) / .6)}.text-foreground{color:hsl(var(--foreground))}.text-foreground\/70{color:hsl(var(--foreground) / .7)}.text-foreground\/80{color:hsl(var(--foreground) / .8)}.text-foreground\/90{color:hsl(var(--foreground) / .9)}.text-inherit{color:inherit}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-muted-foreground\/30{color:hsl(var(--muted-foreground) / .3)}.text-muted-foreground\/40{color:hsl(var(--muted-foreground) / .4)}.text-muted-foreground\/50{color:hsl(var(--muted-foreground) / .5)}.text-muted-foreground\/60{color:hsl(var(--muted-foreground) / .6)}.text-muted-foreground\/70{color:hsl(var(--muted-foreground) / .7)}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-success{color:hsl(var(--success))}.text-success-foreground{color:hsl(var(--success-foreground))}.text-success\/60{color:hsl(var(--success) / .6)}.text-warning{color:hsl(var(--warning))}.text-white\/60{color:#fff9}.text-yellow-400{--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-black\/40{--tw-shadow-color: rgb(0 0 0 / .4);--tw-shadow: var(--tw-shadow-colored)}.shadow-destructive\/5{--tw-shadow-color: hsl(var(--destructive) / .05);--tw-shadow: var(--tw-shadow-colored)}.outline{outline-style:solid}.ring{--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 #0000)}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.drop-shadow{--tw-drop-shadow: drop-shadow(0 1px 2px rgb(0 0 0 / .1)) drop-shadow(0 1px 1px rgb(0 0 0 / .06));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur{--tw-backdrop-blur: blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-md{--tw-backdrop-blur: blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.theme-transition{transition:background-color .3s ease,color .2s ease,border-color .3s ease}.animate-fade-in{animation:fadeIn .3s ease-out}.prose-markdown{line-height:1.65;word-wrap:break-word;overflow-wrap:break-word}.prose-markdown p{margin:.25em 0}.prose-markdown strong{font-weight:700;color:hsl(var(--foreground))}.prose-markdown em{font-style:italic}.prose-markdown h1,.prose-markdown h2,.prose-markdown h3,.prose-markdown h4,.prose-markdown h5,.prose-markdown h6{font-weight:700;margin:.75em 0 .25em;color:hsl(var(--foreground))}.prose-markdown h1{font-size:1.4em}.prose-markdown h2{font-size:1.25em}.prose-markdown h3{font-size:1.1em}.prose-markdown code{font-family:JetBrains Mono,ui-monospace,monospace;font-size:.875em;background:hsl(var(--muted));padding:.15em .35em;border-radius:.25em}.prose-markdown pre{background:hsl(var(--muted));border:1px solid hsl(var(--border));border-radius:.375rem;padding:.75em 1em;margin:.5em 0;overflow-x:auto}.prose-markdown pre code{background:none;padding:0;font-size:.85em}.prose-markdown ul,.prose-markdown ol{margin:.35em 0;padding-left:1.5em}.prose-markdown ul{list-style:disc}.prose-markdown ol{list-style:decimal}.prose-markdown li{margin:.15em 0}.prose-markdown blockquote{border-left:3px solid hsl(var(--border));margin:.5em 0;padding:.25em .75em;color:hsl(var(--muted-foreground))}.prose-markdown table{border-collapse:collapse;width:100%;margin:.5em 0;font-size:.9em}.prose-markdown th,.prose-markdown td{border:1px solid hsl(var(--border));padding:.4em .75em;text-align:left}.prose-markdown th{background:hsl(var(--muted));font-weight:600}.prose-markdown a{color:hsl(var(--primary));text-decoration:underline;text-underline-offset:2px}.prose-markdown a:hover{opacity:.8}.prose-markdown hr{border:none;border-top:1px solid hsl(var(--border));margin:.75em 0}@keyframes fadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground\/50::-moz-placeholder{color:hsl(var(--muted-foreground) / .5)}.placeholder\:text-muted-foreground\/50::placeholder{color:hsl(var(--muted-foreground) / .5)}.hover\:border-border:hover{border-color:hsl(var(--border))}.hover\:border-destructive\/30:hover{border-color:hsl(var(--destructive) / .3)}.hover\:border-primary\/30:hover{border-color:hsl(var(--primary) / .3)}.hover\:border-warning\/30:hover{border-color:hsl(var(--warning) / .3)}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-accent\/30:hover{background-color:hsl(var(--accent) / .3)}.hover\:bg-accent\/40:hover{background-color:hsl(var(--accent) / .4)}.hover\:bg-accent\/50:hover{background-color:hsl(var(--accent) / .5)}.hover\:bg-destructive:hover{background-color:hsl(var(--destructive))}.hover\:bg-muted:hover{background-color:hsl(var(--muted))}.hover\:bg-muted\/60:hover{background-color:hsl(var(--muted) / .6)}.hover\:bg-warning\/20:hover{background-color:hsl(var(--warning) / .2)}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-destructive:hover{color:hsl(var(--destructive))}.hover\:text-destructive-foreground:hover{color:hsl(var(--destructive-foreground))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:underline:hover{text-decoration-line:underline}.hover\:brightness-110:hover{--tw-brightness: brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.focus\:border-ring:focus{border-color:hsl(var(--ring))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-primary\/50:focus{--tw-ring-color: hsl(var(--primary) / .5)}.focus\:ring-ring\/40:focus{--tw-ring-color: hsl(var(--ring) / .4)}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.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 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color: hsl(var(--ring))}.focus-visible\:ring-ring\/40:focus-visible{--tw-ring-color: hsl(var(--ring) / .4)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.active\:scale-\[0\.97\]:active{--tw-scale-x: .97;--tw-scale-y: .97;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:640px){.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-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:items-center{align-items:center}.sm\:pb-4{padding-bottom:1rem}.sm\:pt-\[20vh\]{padding-top:20vh}}@media(min-width:768px){.md\:flex{display:flex}.md\:hidden{display:none}.md\:flex-row{flex-direction:row}}@media(min-width:1024px){.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@keyframes svelte-jz1l8o-pulse-slow{0%,to{opacity:1}50%{opacity:.75}}.animate-pulse-slow{animation:svelte-jz1l8o-pulse-slow 2s ease-in-out infinite}.wordmark-glow.svelte-8mgguq{filter:drop-shadow(0 0 8px rgba(0,255,65,.4)) drop-shadow(0 0 3px rgba(0,255,65,.3))}
|