diff --git a/README.md b/README.md index c1c51bf..cb4e141 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ Kontext balances security and utility for AI agents: low-risk actions keep movin - **Audit trails:** Record who instructed which agent to do what, what the agent accessed, which tools it called, what policy decisions were made, and what happened next. Build a chain of custody for security review, incident investigation, and compliance evidence. - **Deterministic policy:** Apply `allow`, `ask`, and `deny` rules to agent actions at runtime, before they execute. Use hard policies for known boundaries such as destructive commands, production resources, sensitive files, data exports, and credential access. -- **Probabilistic risk detection:** Detect when an agent is entering an unsafe state, drifting from user intent, or executing actions the user likely did not mean to authorize. Escalate ambiguous behavior without blocking normal agent productivity. +- **Probabilistic risk detection:** Route actions that deterministic policy allows through a local judge for an additional allow/deny decision without sending tool context to hosted services. - **Credential injection:** Inject scoped OAuth credentials at runtime using RFC 8693-compliant OAuth 2.0 Token Exchange, so agents can access approved tools without users pasting secrets into chat, config files, or project environments. Credentials can be short-lived, least-privilege, and bound to the current user, session, or workflow. The local decision path is: diff --git a/docs/guard-model-updates.md b/docs/guard-model-updates.md deleted file mode 100644 index a2e037b..0000000 --- a/docs/guard-model-updates.md +++ /dev/null @@ -1,40 +0,0 @@ -# Guard Model Updates - -Guard runtime ships model parameters as JSON files in `models/guard/`. - -The public runtime does not train models. It loads an accepted model file, combines the Markov-chain score with deterministic rules, and falls back to deterministic baseline scoring when the model does not know a state. - -## Source of new models - -Lab owns model improvement: - -```text -new traces/datasets - -> ingestion + normalization - -> weak labels / evaluation labels - -> candidate Markov model - -> benchmark against current shipped model - -> promote only if better - -> PR new JSON into kontext-cli/models/guard -``` - -## Promotion rule - -A candidate model should not replace the shipped model unless it improves the agreed evaluation gate. At minimum, compare: - -- precision/recall for risky events -- false positive rate on normal coding flows -- Brier/calibration where labels exist -- behavior on hand-written regression fixtures -- deterministic-rule compatibility - -## Runtime contract - -- Model files are local JSON artifacts. -- Guard activates the configured model into a local snapshot store before - loading the in-memory scorer used on the hook hot path. -- Snapshot metadata records the active model, content hash, activation time, and - rollback target. -- Guard mode must not call a hosted scoring service. -- Unknown model states must not crash runtime. -- Deterministic rules remain authoritative for obvious security risk. diff --git a/docs/guard.md b/docs/guard.md index d744b8b..dc70f0f 100644 --- a/docs/guard.md +++ b/docs/guard.md @@ -2,7 +2,7 @@ Guard is the local safety mode inside `kontext`. -It lets a developer run Claude Code normally while Kontext watches tool calls locally, redacts captured data, scores risk, stores events in local SQLite, and shows a local dashboard with `would allow`, `would ask`, and `would deny` decisions. +It lets a developer run Claude Code normally while Kontext watches tool calls locally, redacts captured data, stores events in local SQLite, and shows a local dashboard with `would allow`, `would ask`, and `would deny` decisions. ## User path @@ -46,8 +46,8 @@ Claude Code -> kontext hook --agent claude --mode observe -> local runtime Unix socket -> RuntimeCore - -> deterministic risk rules - -> optional local LLM judge or Markov-chain risk model + -> deterministic policy + -> local LLM judge when deterministic policy allows -> local SQLite -> local dashboard + notifications ``` @@ -56,10 +56,8 @@ Claude Code Guard uses two layers: -1. Deterministic rules for obvious risk, such as credential access, direct provider API calls with credential material, production mutations, and destructive persistent-resource operations. -2. A local Markov-chain risk model for sequence context in coding-agent workflows. - -The shipped model is a JSON artifact under `models/guard/`. Lab is the private pipeline that ingests datasets and local traces, evaluates candidate models, and produces improved JSON files. Accepted model files are committed back to this repo by PR. +1. Deterministic policy for obvious risk, such as credential access, direct provider API calls with credential material, production mutations, and destructive persistent-resource operations. +2. A local LLM judge for cases deterministic policy allows. ## Local judge @@ -121,16 +119,13 @@ Public in `kontext-cli`: - `kontext guard ...` commands - Claude Code local hook adapter - local daemon, SQLite store, dashboard, notifications -- deterministic risk rules -- shipped baseline/candidate model JSON files +- deterministic policy and local LLM judge wiring Private in Lab: - dataset ingestion - OpenTelemetry/Claude trace import - weak labeling -- model training/evaluation -- model promotion gates - unpublished datasets and experiments ## Work tracking diff --git a/internal/guard/app/server/policy.go b/internal/guard/app/server/policy.go index f2a0fff..b476edc 100644 --- a/internal/guard/app/server/policy.go +++ b/internal/guard/app/server/policy.go @@ -19,14 +19,12 @@ type PolicyConfigProvider interface { } type RiskPolicyProvider struct { - scorer risk.Scorer judge judge.Judge policyEngine guardpolicy.Engine policyConfig PolicyConfigProvider } type RiskPolicyProviderOptions struct { - Scorer risk.Scorer Judge judge.Judge PolicyEngine guardpolicy.Engine PolicyConfig guardpolicy.Config @@ -41,28 +39,22 @@ func (p staticPolicyConfigProvider) ActivePolicyConfig(context.Context) (guardpo return p.config, nil } -func NewRiskPolicyProvider(scorer risk.Scorer) RiskPolicyProvider { - return NewRiskPolicyProviderWithJudge(scorer, nil) +func NewRiskPolicyProvider() RiskPolicyProvider { + return NewRiskPolicyProviderWithJudge(nil) } -func NewRiskPolicyProviderWithJudge(scorer risk.Scorer, localJudge judge.Judge) RiskPolicyProvider { +func NewRiskPolicyProviderWithJudge(localJudge judge.Judge) RiskPolicyProvider { return NewRiskPolicyProviderWithOptions(RiskPolicyProviderOptions{ - Scorer: scorer, - Judge: localJudge, + Judge: localJudge, }) } func NewRiskPolicyProviderWithOptions(opts RiskPolicyProviderOptions) RiskPolicyProvider { - scorer := opts.Scorer - if scorer == nil { - scorer = risk.NoopScorer{} - } configProvider := opts.PolicyConfigProvider if configProvider == nil { configProvider = staticPolicyConfigProvider{config: opts.PolicyConfig} } return RiskPolicyProvider{ - scorer: scorer, judge: opts.Judge, policyEngine: opts.PolicyEngine, policyConfig: configProvider, @@ -70,61 +62,83 @@ func NewRiskPolicyProviderWithOptions(opts RiskPolicyProviderOptions) RiskPolicy } func (p RiskPolicyProvider) DecideHook(ctx context.Context, event risk.HookEvent) (risk.RiskDecision, error) { - if p.judge != nil && event.HookEventName == "PreToolUse" { - return p.decideWithJudge(ctx, event) + if event.HookEventName != "PreToolUse" { + return p.asyncTelemetryDecision(event), nil } - return risk.DecideRisk(event, p.scorer) -} - -func (p RiskPolicyProvider) decideWithJudge(ctx context.Context, event risk.HookEvent) (risk.RiskDecision, error) { riskEvent := risk.NormalizeHookEvent(event) - score, err := p.scorer.Score(riskEvent) - if err != nil { - return risk.RiskDecision{}, err - } - riskEvent.RiskScore = score.RiskScore - riskEvent.ModelVersion = score.ModelVersion - policyResult := p.policyEngine.Evaluate(riskEvent, p.activePolicyConfig(ctx)) applyPolicyMetadata(&riskEvent, policyResult) if policyResult.Decision == guardpolicy.DecisionDeny { - riskEvent.Decision = risk.DecisionDeny - riskEvent.ReasonCode = policyResult.ReasonCode - riskEvent.GuardID = policyResult.RuleID - riskEvent.DecisionStage = risk.DecisionStageDeterministicDeny - return risk.RiskDecision{ - Decision: risk.DecisionDeny, - Reason: policyResult.Reason, - ReasonCode: policyResult.ReasonCode, - RiskScore: score.RiskScore, - Threshold: score.Threshold, - ModelVersion: score.ModelVersion, - GuardID: policyResult.RuleID, - RiskEvent: riskEvent, - }, nil + return deterministicDenyDecision(riskEvent, policyResult), nil + } + if p.judge == nil { + return deterministicAllowDecision(riskEvent, policyResult), nil } result, err := p.judge.Decide(ctx, judgeInputFromRiskEvent(event, riskEvent, policyResult)) if err != nil { - failureKind := judge.FailureKind(err) - metadata := judgeMetadata(p.judge) - riskEvent.Decision = risk.DecisionAllow - riskEvent.ReasonCode = "judge_unavailable_allow" - riskEvent.DecisionStage = risk.DecisionStageJudgeFailOpen - riskEvent.JudgeRuntime = metadata.Runtime - riskEvent.JudgeModel = metadata.Model - riskEvent.JudgeFailureKind = failureKind - return risk.RiskDecision{ - Decision: risk.DecisionAllow, - Reason: "local judge unavailable; allowing by fail-open policy", - ReasonCode: "judge_unavailable_allow", - RiskScore: score.RiskScore, - Threshold: score.Threshold, - ModelVersion: score.ModelVersion, - RiskEvent: riskEvent, - }, nil + return judgeFailOpenDecision(riskEvent, p.judge, err), nil } + return judgeDecision(riskEvent, result), nil +} +func (p RiskPolicyProvider) asyncTelemetryDecision(event risk.HookEvent) risk.RiskDecision { + riskEvent := risk.NormalizeHookEvent(event) + riskEvent.Decision = risk.DecisionAllow + riskEvent.ReasonCode = "async_telemetry" + riskEvent.DecisionStage = "async_telemetry" + return risk.RiskDecision{ + Decision: risk.DecisionAllow, + Reason: "async telemetry event recorded", + ReasonCode: "async_telemetry", + RiskEvent: riskEvent, + } +} + +func deterministicDenyDecision(riskEvent risk.RiskEvent, policyResult guardpolicy.Result) risk.RiskDecision { + riskEvent.Decision = risk.DecisionDeny + riskEvent.ReasonCode = policyResult.ReasonCode + riskEvent.GuardID = policyResult.RuleID + riskEvent.DecisionStage = risk.DecisionStageDeterministicDeny + return risk.RiskDecision{ + Decision: risk.DecisionDeny, + Reason: policyResult.Reason, + ReasonCode: policyResult.ReasonCode, + GuardID: policyResult.RuleID, + RiskEvent: riskEvent, + } +} + +func deterministicAllowDecision(riskEvent risk.RiskEvent, policyResult guardpolicy.Result) risk.RiskDecision { + riskEvent.Decision = risk.DecisionAllow + riskEvent.ReasonCode = policyResult.ReasonCode + riskEvent.DecisionStage = "deterministic_allow" + return risk.RiskDecision{ + Decision: risk.DecisionAllow, + Reason: policyResult.Reason, + ReasonCode: policyResult.ReasonCode, + RiskEvent: riskEvent, + } +} + +func judgeFailOpenDecision(riskEvent risk.RiskEvent, localJudge judge.Judge, err error) risk.RiskDecision { + failureKind := judge.FailureKind(err) + metadata := judgeMetadata(localJudge) + riskEvent.Decision = risk.DecisionAllow + riskEvent.ReasonCode = "judge_unavailable_allow" + riskEvent.DecisionStage = risk.DecisionStageJudgeFailOpen + riskEvent.JudgeRuntime = metadata.Runtime + riskEvent.JudgeModel = metadata.Model + riskEvent.JudgeFailureKind = failureKind + return risk.RiskDecision{ + Decision: risk.DecisionAllow, + Reason: "local judge unavailable; allowing by fail-open policy", + ReasonCode: "judge_unavailable_allow", + RiskEvent: riskEvent, + } +} + +func judgeDecision(riskEvent risk.RiskEvent, result judge.Result) risk.RiskDecision { decision := risk.DecisionAllow reasonCode := risk.DecisionStageJudgeAllow if result.Output.Decision == judge.DecisionDeny { @@ -143,15 +157,12 @@ func (p RiskPolicyProvider) decideWithJudge(ctx context.Context, event risk.Hook riskEvent.JudgeCategories = result.Output.Categories return risk.RiskDecision{ - Decision: decision, - Reason: result.Output.Reason, - ReasonCode: reasonCode, - RiskScore: score.RiskScore, - Threshold: score.Threshold, - ModelVersion: score.ModelVersion, - GuardID: "local_llm_judge", - RiskEvent: riskEvent, - }, nil + Decision: decision, + Reason: result.Output.Reason, + ReasonCode: reasonCode, + GuardID: "local_llm_judge", + RiskEvent: riskEvent, + } } func (p RiskPolicyProvider) activePolicyConfig(ctx context.Context) guardpolicy.Config { diff --git a/internal/guard/app/server/server.go b/internal/guard/app/server/server.go index be08130..3ce7f6e 100644 --- a/internal/guard/app/server/server.go +++ b/internal/guard/app/server/server.go @@ -44,7 +44,6 @@ type ProcessResponse struct { } type Options struct { - Scorer risk.Scorer Judge judge.Judge PolicyConfig policy.Config PolicyConfigProvider PolicyConfigProvider @@ -67,8 +66,8 @@ type ActivatePolicyProfileRequest struct { Profile policy.Profile `json:"profile"` } -func NewServer(store *sqlite.Store, scorer risk.Scorer) (*Server, error) { - return NewServerWithOptions(store, Options{Scorer: scorer}) +func NewServer(store *sqlite.Store) (*Server, error) { + return NewServerWithOptions(store, Options{}) } func NewServerWithOptions(store *sqlite.Store, opts Options) (*Server, error) { @@ -85,7 +84,6 @@ func NewServerWithOptions(store *sqlite.Store, opts Options) (*Server, error) { } } return NewServerWithPolicyConfig(store, NewRiskPolicyProviderWithOptions(RiskPolicyProviderOptions{ - Scorer: opts.Scorer, Judge: opts.Judge, PolicyConfigProvider: configProvider, }), policyStore) @@ -391,8 +389,8 @@ func openPolicyStoreForSQLite(store *sqlite.Store) (*policyconfig.Store, error) return policyconfig.Open(filepath.Dir(store.Path())) } -func OpenDefaultServer(dbPath string, scorer risk.Scorer) (*Server, func() error, error) { - return OpenDefaultServerWithOptions(dbPath, Options{Scorer: scorer}) +func OpenDefaultServer(dbPath string) (*Server, func() error, error) { + return OpenDefaultServerWithOptions(dbPath, Options{}) } func OpenDefaultServerWithOptions(dbPath string, opts Options) (*Server, func() error, error) { diff --git a/internal/guard/app/server/server_test.go b/internal/guard/app/server/server_test.go index 2b39a50..65554bd 100644 --- a/internal/guard/app/server/server_test.go +++ b/internal/guard/app/server/server_test.go @@ -4,7 +4,6 @@ import ( "bytes" "context" "encoding/json" - "errors" "net/http" "net/http/httptest" "os" @@ -19,9 +18,9 @@ import ( "github.com/kontext-security/kontext-cli/internal/guard/store/sqlite" ) -func newTestServer(t *testing.T, store *sqlite.Store, scorer risk.Scorer) *Server { +func newTestServer(t *testing.T, store *sqlite.Store) *Server { t.Helper() - server, err := NewServer(store, scorer) + server, err := NewServer(store) if err != nil { t.Fatalf("NewServer() error = %v", err) } @@ -39,7 +38,7 @@ func newTestServerWithPolicy(t *testing.T, store *sqlite.Store, policy PolicyPro func newTestServerWithPolicyConfig(t *testing.T, store *sqlite.Store, policyStore *policyconfig.Store) *Server { t.Helper() - server, err := NewServerWithPolicyConfig(store, NewRiskPolicyProvider(risk.NoopScorer{}), policyStore) + server, err := NewServerWithPolicyConfig(store, NewRiskPolicyProvider(), policyStore) if err != nil { t.Fatalf("NewServerWithPolicyConfig() error = %v", err) } @@ -52,7 +51,7 @@ func TestStorePersistsSummaryCounts(t *testing.T) { t.Fatal(err) } defer store.Close() - server := newTestServer(t, store, risk.NoopScorer{}) + server := newTestServer(t, store) events := []risk.HookEvent{ {SessionID: "s1", HookEventName: "PreToolUse", ToolName: "Read", ToolInput: map[string]any{"file_path": "README.md"}}, {SessionID: "s1", HookEventName: "PreToolUse", ToolName: "Read", ToolInput: map[string]any{"file_path": ".env"}}, @@ -67,37 +66,11 @@ func TestStorePersistsSummaryCounts(t *testing.T) { if err != nil { t.Fatal(err) } - if summary.Actions != 3 || summary.Warnings != 1 || summary.Critical != 1 || summary.Sessions != 1 { + if summary.Actions != 3 || summary.Warnings != 0 || summary.Critical != 2 || summary.Sessions != 1 { t.Fatalf("summary = %+v", summary) } } -func TestProcessHookEventReturnsScorerError(t *testing.T) { - store, err := sqlite.OpenStore(t.TempDir() + "/guard.db") - if err != nil { - t.Fatal(err) - } - defer store.Close() - want := errors.New("score failed") - server := newTestServer(t, store, failingScorer{err: want}) - _, err = server.ProcessHookEvent(context.Background(), risk.HookEvent{ - SessionID: "s1", - HookEventName: "PreToolUse", - ToolName: "Read", - ToolInput: map[string]any{"file_path": "README.md"}, - }) - if !errors.Is(err, want) { - t.Fatalf("err = %v, want %v", err, want) - } - summary, err := store.Summary(context.Background()) - if err != nil { - t.Fatal(err) - } - if summary.Actions != 0 { - t.Fatalf("summary = %+v, want no persisted action", summary) - } -} - func TestProcessHookEventUsesPolicyProvider(t *testing.T) { store, err := sqlite.OpenStore(t.TempDir() + "/guard.db") if err != nil { @@ -334,7 +307,7 @@ func TestProcessHookEventEnsuresDaemonObservedSession(t *testing.T) { t.Fatal(err) } defer store.Close() - server := newTestServer(t, store, risk.NoopScorer{}) + server := newTestServer(t, store) if _, err := server.ProcessHookEvent(context.Background(), risk.HookEvent{ HookEventName: "PreToolUse", @@ -367,7 +340,7 @@ func TestProcessHookEventPreservesClosedWrapperOwnedSession(t *testing.T) { t.Fatal(err) } defer store.Close() - server := newTestServer(t, store, risk.NoopScorer{}) + server := newTestServer(t, store) if _, err := store.OpenSession(context.Background(), "session-123", "claude", "/tmp/project", "wrapper_owned", "backend-123"); err != nil { t.Fatal(err) @@ -757,7 +730,7 @@ func TestEvaluateHookRejectsTelemetryEvents(t *testing.T) { t.Fatal(err) } defer store.Close() - server := newTestServer(t, store, risk.NoopScorer{}) + server := newTestServer(t, store) _, err = server.EvaluateHook(context.Background(), risk.HookEvent{ SessionID: "s1", HookEventName: "PostToolUse", @@ -782,7 +755,7 @@ func TestIngestEventRecordsTelemetry(t *testing.T) { t.Fatal(err) } defer store.Close() - server := newTestServer(t, store, risk.NoopScorer{}) + server := newTestServer(t, store) decision, err := server.IngestEvent(context.Background(), risk.HookEvent{ SessionID: "s1", HookEventName: "PostToolUse", @@ -810,7 +783,7 @@ func TestIngestEventRejectsBlockingEvents(t *testing.T) { t.Fatal(err) } defer store.Close() - server := newTestServer(t, store, risk.NoopScorer{}) + server := newTestServer(t, store) _, err = server.IngestEvent(context.Background(), risk.HookEvent{ SessionID: "s1", HookEventName: "PreToolUse", @@ -829,14 +802,6 @@ func TestIngestEventRejectsBlockingEvents(t *testing.T) { } } -type failingScorer struct { - err error -} - -func (s failingScorer) Score(risk.RiskEvent) (risk.ScoreResult, error) { - return risk.ScoreResult{}, s.err -} - type recordingPolicy struct { called bool decision risk.RiskDecision @@ -870,7 +835,7 @@ func TestStoreListsSessions(t *testing.T) { t.Fatal(err) } defer store.Close() - server := newTestServer(t, store, risk.NoopScorer{}) + server := newTestServer(t, store) if _, err := server.ProcessHookEvent(context.Background(), risk.HookEvent{ SessionID: "s1", HookEventName: "PreToolUse", @@ -883,7 +848,7 @@ func TestStoreListsSessions(t *testing.T) { if err != nil { t.Fatal(err) } - if len(sessions) != 1 || sessions[0].SessionID != "s1" || sessions[0].Warnings != 1 { + if len(sessions) != 1 || sessions[0].SessionID != "s1" || sessions[0].Critical != 1 { t.Fatalf("sessions = %+v", sessions) } } diff --git a/internal/guard/cli/cli.go b/internal/guard/cli/cli.go index 5b83a61..b7ae4db 100644 --- a/internal/guard/cli/cli.go +++ b/internal/guard/cli/cli.go @@ -21,18 +21,13 @@ import ( "github.com/kontext-security/kontext-cli/internal/diagnostic" "github.com/kontext-security/kontext-cli/internal/guard/app/server" "github.com/kontext-security/kontext-cli/internal/guard/judge" - "github.com/kontext-security/kontext-cli/internal/guard/markov" - "github.com/kontext-security/kontext-cli/internal/guard/modelsnapshot" - "github.com/kontext-security/kontext-cli/internal/guard/risk" "github.com/kontext-security/kontext-cli/internal/guard/store/sqlite" - "github.com/kontext-security/kontext-cli/internal/guard/trace" "github.com/kontext-security/kontext-cli/internal/hook" "github.com/kontext-security/kontext-cli/internal/localruntime" ) const ( - defaultBaseURL = "http://" + server.DefaultAddr - defaultModelPath = "models/guard/coding-agent-v0.json" + defaultBaseURL = "http://" + server.DefaultAddr ) // Run executes the Kontext command line. @@ -57,8 +52,6 @@ func Run(ctx context.Context, args []string, stdin io.Reader, stdout, stderr io. return runHooks(args[1:], stdout) case "traces": return runTraces(ctx, args[1:], stdout) - case "model": - return runModel(args[1:], stdout) case "judge": return runJudge(ctx, args[1:], stdout) case "smoke-test": @@ -83,20 +76,10 @@ func usage(out io.Writer) { fmt.Fprintln(out, " hooks install claude-code Install Claude Code hooks") fmt.Fprintln(out, " hooks uninstall claude-code Remove Claude Code hooks") fmt.Fprintln(out, " traces inspect Inspect local trace summary") - fmt.Fprintln(out, " model info Print baseline model info") - fmt.Fprintln(out, " model train Train a local fixture model") fmt.Fprintln(out, " judge eval Evaluate local judge fixtures") } func runDaemon(ctx context.Context, args []string, out io.Writer) error { - defaultThreshold, err := envFloat("KONTEXT_THRESHOLD", 0.5) - if err != nil { - return err - } - defaultHorizon, err := envInt("KONTEXT_HORIZON", 5) - if err != nil { - return err - } defaultJudgeTimeout, err := envDuration("KONTEXT_JUDGE_TIMEOUT", judge.DefaultTimeout) if err != nil { return err @@ -117,9 +100,6 @@ func runDaemon(ctx context.Context, args []string, out io.Writer) error { fs.SetOutput(io.Discard) addr := fs.String("addr", envString("KONTEXT_ADDR", server.DefaultAddr), "listen address") dbPath := fs.String("db", envString("KONTEXT_DB", defaultDBPath()), "SQLite database path") - modelPath := fs.String("model", envString("KONTEXT_MODEL", defaultModelPath), "optional Markov-chain model path") - threshold := fs.Float64("threshold", defaultThreshold, "Markov-chain risk threshold") - horizon := fs.Int("horizon", defaultHorizon, "Markov-chain risk horizon") skipHookInstall := fs.Bool("skip-hook-install", false, "skip Claude Code hook install") noOpen := fs.Bool("no-open", false, "do not open the local dashboard") socketPath := fs.String("socket", defaultGuardSocketPath(), "Unix socket path for local hook runtime") @@ -146,20 +126,6 @@ func runDaemon(ctx context.Context, args []string, out io.Writer) error { return err } } - var scorer risk.Scorer = risk.NoopScorer{} - activeModelPath := *modelPath - if *modelPath != "" { - snapshot, err := modelsnapshot.NewWithValidator(defaultModelSnapshotDir(*dbPath), risk.ValidateMarkovModel).ActivateFromFile(*modelPath) - if err != nil { - return err - } - activeModelPath = snapshot.Path - loaded, err := risk.LoadMarkovScorer(activeModelPath, *threshold, *horizon) - if err != nil { - return err - } - scorer = loaded - } localJudge, closeJudge, judgeStatus, err := configureLocalJudge(ctx, localJudgeConfig{ URL: *judgeURL, Model: *judgeModel, @@ -179,8 +145,7 @@ func runDaemon(ctx context.Context, args []string, out io.Writer) error { } defer closeJudge() localServer, closeStore, err := server.OpenDefaultServerWithOptions(*dbPath, server.Options{ - Scorer: scorer, - Judge: localJudge, + Judge: localJudge, }) if err != nil { return err @@ -209,7 +174,6 @@ func runDaemon(ctx context.Context, args []string, out io.Writer) error { fmt.Fprintf(out, "Hook runtime: unix://%s\n", *socketPath) fmt.Fprintln(out, "Mode: observe (Claude Code runs normally; decisions are recorded as would allow / would ask / would deny).") fmt.Fprintf(out, "Dashboard: http://%s\n", *addr) - fmt.Fprintf(out, "Risk model: %s\n", activeModelPath) if localJudge != nil { fmt.Fprintf(out, "Local judge: %s\n", judgeStatus) } else { @@ -723,7 +687,7 @@ func runSmokeTest(ctx context.Context, args []string, out io.Writer) error { return err } defer store.Close() - localServer, err := server.NewServer(store, risk.NoopScorer{}) + localServer, err := server.NewServer(store) if err != nil { return err } @@ -749,8 +713,8 @@ func runSmokeTest(ctx context.Context, args []string, out io.Writer) error { want hook.Decision }{ {"safe read", hook.Event{SessionID: "smoke", HookName: hook.HookPreToolUse, ToolName: "Read", ToolInput: map[string]any{"file_path": "README.md"}}, hook.DecisionAllow}, - {"env read", hook.Event{SessionID: "smoke", HookName: hook.HookPreToolUse, ToolName: "Read", ToolInput: map[string]any{"file_path": ".env"}}, hook.DecisionAsk}, - {"cat env", hook.Event{SessionID: "smoke", HookName: hook.HookPreToolUse, ToolName: "Bash", ToolInput: map[string]any{"command": "cat .env"}}, hook.DecisionAsk}, + {"env read", hook.Event{SessionID: "smoke", HookName: hook.HookPreToolUse, ToolName: "Read", ToolInput: map[string]any{"file_path": ".env"}}, hook.DecisionDeny}, + {"cat env", hook.Event{SessionID: "smoke", HookName: hook.HookPreToolUse, ToolName: "Bash", ToolInput: map[string]any{"command": "cat .env"}}, hook.DecisionDeny}, {"provider token", hook.Event{SessionID: "smoke", HookName: hook.HookPreToolUse, ToolName: "Bash", ToolInput: map[string]any{"command": "curl https://api.railway.app/graphql -H 'Authorization: Bearer secret'"}}, hook.DecisionDeny}, {"drop database", hook.Event{SessionID: "smoke", HookName: hook.HookPreToolUse, ToolName: "Bash", ToolInput: map[string]any{"command": "drop database"}}, hook.DecisionDeny}, } @@ -768,8 +732,8 @@ func runSmokeTest(ctx context.Context, args []string, out io.Writer) error { if err != nil { return err } - if summary.Actions != 5 || summary.Warnings != 2 || summary.Critical != 2 { - return fmt.Errorf("summary=%+v, want actions=5 warnings=2 critical=2", summary) + if summary.Actions != 5 || summary.Warnings != 0 || summary.Critical != 4 { + return fmt.Errorf("summary=%+v, want actions=5 warnings=0 critical=4", summary) } fmt.Fprintf(out, "summary critical=%d warnings=%d actions=%d\n", summary.Critical, summary.Warnings, summary.Actions) return nil @@ -787,25 +751,6 @@ func runTraces(ctx context.Context, args []string, out io.Writer) error { } } -func runModel(args []string, out io.Writer) error { - if len(args) == 0 { - return fmt.Errorf("usage: kontext guard model info|train") - } - switch args[0] { - case "info": - info, err := modelInfo(defaultModelPath) - if err != nil { - return err - } - fmt.Fprintln(out, info) - return nil - case "train": - return runTrainFixtureModel(args[1:], out) - default: - return fmt.Errorf("usage: kontext guard model info|train") - } -} - func runJudge(ctx context.Context, args []string, out io.Writer) error { if len(args) == 0 { return fmt.Errorf("usage: kontext guard judge eval") @@ -889,57 +834,6 @@ func readJudgeEvalFixtures(path string) ([]judge.Fixture, error) { return fixtures, nil } -func modelInfo(path string) (string, error) { - file, err := os.Open(path) - if err != nil { - return "", err - } - defer file.Close() - model, err := markov.ReadModelJSON(file) - if err != nil { - return "", err - } - return fmt.Sprintf("%s: %d states", path, len(model.States)), nil -} - -func runTrainFixtureModel(args []string, out io.Writer) error { - fs := flag.NewFlagSet("model train", flag.ContinueOnError) - fs.SetOutput(io.Discard) - inputPath := fs.String("input", "internal/trace/testdata/coding_sessions.jsonl", "fixture JSONL path") - outputPath := fs.String("out", "models/generated/local-model.json", "model output path") - alpha := fs.Float64("alpha", 1, "Markov smoothing alpha") - if err := fs.Parse(args); err != nil { - return err - } - file, err := os.Open(*inputPath) - if err != nil { - return err - } - defer file.Close() - events, err := trace.ReadJSONL(file) - if err != nil { - return err - } - sessions := trace.GroupSessions(events) - model, err := markov.BuildModel(trace.Observations(sessions), trace.CodingAbstraction{}, markov.BuildOptions{Alpha: *alpha}) - if err != nil { - return err - } - if err := os.MkdirAll(filepath.Dir(*outputPath), 0o755); err != nil { - return err - } - outFile, err := os.Create(*outputPath) - if err != nil { - return err - } - defer outFile.Close() - if err := markov.WriteModelJSON(outFile, model); err != nil { - return err - } - fmt.Fprintf(out, "wrote %s from %d events, %d sessions, %d states\n", *outputPath, len(events), len(sessions), len(model.States)) - return nil -} - func envString(key, fallback string) string { if value := os.Getenv(key); value != "" { return value @@ -969,17 +863,6 @@ func envBool(key string, fallback bool) (bool, error) { return fallback, nil } -func envFloat(key string, fallback float64) (float64, error) { - if value := os.Getenv(key); value != "" { - parsed, err := strconv.ParseFloat(value, 64) - if err != nil { - return 0, fmt.Errorf("%s must be a number: %w", key, err) - } - return parsed, nil - } - return fallback, nil -} - func envDuration(key string, fallback time.Duration) (time.Duration, error) { if value := os.Getenv(key); value != "" { parsed, err := time.ParseDuration(value) @@ -1017,13 +900,6 @@ func defaultDBPath() string { return "kontext-guard.db" } -func defaultModelSnapshotDir(dbPath string) string { - if dbPath != "" { - return filepath.Join(filepath.Dir(dbPath), "models") - } - return filepath.Join(".", "models") -} - func defaultJudgeCacheDir(dbPath string) string { if dbPath != "" { return filepath.Join(filepath.Dir(dbPath), "judge-models") diff --git a/internal/guard/cli/cli_test.go b/internal/guard/cli/cli_test.go index 5fe0007..fdd2669 100644 --- a/internal/guard/cli/cli_test.go +++ b/internal/guard/cli/cli_test.go @@ -4,12 +4,10 @@ import ( "bytes" "context" "encoding/json" - "errors" "net/http" "net/http/httptest" "os" "path/filepath" - "strconv" "strings" "testing" @@ -108,21 +106,6 @@ func TestMergeHooksInstallsOnlyToolHooks(t *testing.T) { } } -func TestStartRejectsInvalidNumericEnvironment(t *testing.T) { - t.Setenv("KONTEXT_THRESHOLD", "high") - - var stdout bytes.Buffer - var stderr bytes.Buffer - err := Run(context.Background(), []string{"start", "--model", "", "--skip-hook-install", "--no-open"}, strings.NewReader(""), &stdout, &stderr) - if err == nil { - t.Fatal("expected invalid threshold error") - } - var numErr *strconv.NumError - if !strings.Contains(err.Error(), "KONTEXT_THRESHOLD must be a number") || !errors.As(err, &numErr) { - t.Fatalf("err = %v", err) - } -} - func TestValidateLocalJudgeURLRejectsHostedURL(t *testing.T) { if err := validateLocalJudgeURL("https://api.example.com/v1"); err == nil { t.Fatal("validateLocalJudgeURL() error = nil, want hosted URL rejection") diff --git a/internal/guard/markov/abstraction/abstraction.go b/internal/guard/markov/abstraction/abstraction.go deleted file mode 100644 index 318d845..0000000 --- a/internal/guard/markov/abstraction/abstraction.go +++ /dev/null @@ -1,110 +0,0 @@ -package abstraction - -import ( - "fmt" - "sort" - "strings" - - "github.com/kontext-security/kontext-cli/internal/guard/markov/predicate" -) - -// Finish is the conventional terminal state label. -const Finish = "finish" - -// Abstraction maps domain observations into finite symbolic states. -// -// Implementations own the domain-specific encoding, decoding, and transition -// validity rules. The Markov-chain model learner only requires Encode and ValidTransition; -// Decode is exposed for tooling and interpretation. -type Interface[O any] interface { - Encode(observation O) (string, error) - Decode(state string) (O, error) - ValidTransition(from, to string) bool -} - -// StateInterpreter is an optional extension for abstractions that can expose -// per-state proposition truth values for diagnostics and JSON output. -type StateInterpreter interface { - StateInterpretation(states []string) map[string]map[string]bool -} - -// StateIndexer is an optional extension for abstractions that need to control -// state index assignment. If absent, states are sorted lexicographically. -type StateIndexer interface { - StateIndex(states []string) map[string]int -} - -// PredicateAbstraction encodes one observation as a bitstring over predicates. -type PredicateAbstraction struct { - Predicates []predicate.Predicate -} - -// Encode returns one bit per predicate, in the configured order. -func (a PredicateAbstraction) Encode(observation predicate.Observation) (string, error) { - var b strings.Builder - b.Grow(len(a.Predicates)) - for _, predicate := range a.Predicates { - ok, err := predicate.Evaluate(observation) - if err != nil { - return "", err - } - if ok { - b.WriteByte('1') - } else { - b.WriteByte('0') - } - } - return b.String(), nil -} - -// Decode returns a representative observation for the encoded predicate values. -// It is intentionally lossy: predicate abstractions generally cannot reconstruct -// the original domain observation. -func (a PredicateAbstraction) Decode(state string) (predicate.Observation, error) { - if len(state) != len(a.Predicates) { - return nil, fmt.Errorf("state length %d does not match predicate count %d", len(state), len(a.Predicates)) - } - decoded := make(predicate.Observation, len(a.Predicates)) - for i, predicate := range a.Predicates { - switch state[i] { - case '0': - decoded[predicate.String()] = false - case '1': - decoded[predicate.String()] = true - default: - return nil, fmt.Errorf("state contains non-bit byte %q at index %d", state[i], i) - } - } - return decoded, nil -} - -// ValidTransition allows every transition except transitions out of Finish. -func (a PredicateAbstraction) ValidTransition(from, to string) bool { - return from != Finish -} - -// StateInterpretation exposes predicate truth values for each state. -func (a PredicateAbstraction) StateInterpretation(states []string) map[string]map[string]bool { - result := make(map[string]map[string]bool, len(states)) - for _, state := range states { - interpretation := make(map[string]bool, len(a.Predicates)) - for i, predicate := range a.Predicates { - if i < len(state) { - interpretation[predicate.String()] = state[i] == '1' - } - } - result[state] = interpretation - } - return result -} - -// DefaultStateIndex returns a deterministic lexicographic state index. -func DefaultStateIndex(states []string) map[string]int { - copied := append([]string(nil), states...) - sort.Strings(copied) - index := make(map[string]int, len(copied)) - for i, state := range copied { - index[state] = i - } - return index -} diff --git a/internal/guard/markov/bound.go b/internal/guard/markov/bound.go deleted file mode 100644 index 3c5b543..0000000 --- a/internal/guard/markov/bound.go +++ /dev/null @@ -1,35 +0,0 @@ -package markov - -import "math" - -// ChenBound returns a sample-bound right-hand side for one source state. -func ChenBound(counts [][]int, source int, epsilon, delta float64) float64 { - if len(counts) == 0 || source < 0 || source >= len(counts) || epsilon <= 0 || delta <= 0 { - return 0 - } - - total := 0 - for _, count := range counts[source] { - total += count - } - if total == 0 { - return 0 - } - - deltaPrime := delta / float64(len(counts)) - coeff := (2.0 / (epsilon * epsilon)) * math.Log(2.0/deltaPrime) - - maximum := 0.0 - for _, count := range counts[source] { - p := float64(count) / float64(total) - inner := math.Abs(0.5-p) - (2.0/3.0)*epsilon - term := 0.25 - inner*inner - if term <= 0 { - continue - } - if h := coeff * term; h > maximum { - maximum = h - } - } - return maximum -} diff --git a/internal/guard/markov/horizon.go b/internal/guard/markov/horizon.go deleted file mode 100644 index 62d6646..0000000 --- a/internal/guard/markov/horizon.go +++ /dev/null @@ -1,71 +0,0 @@ -package markov - -import "fmt" - -// HorizonReachabilityProbability computes P_start(F<=steps target). -// -// Unlike ReachabilityProbability, this is a finite-session risk estimate. It is -// the probability of reaching a target state within the next steps transitions. -func HorizonReachabilityProbability(model *Model, start int, targets map[int]struct{}, steps int) (float64, error) { - if model == nil { - return 0, fmt.Errorf("model is nil") - } - if err := model.Validate(); err != nil { - return 0, err - } - if start < 0 || start >= len(model.States) { - return 0, fmt.Errorf("start state %d is out of range", start) - } - for target := range targets { - if target < 0 || target >= len(model.States) { - return 0, fmt.Errorf("target state %d is out of range", target) - } - } - if _, ok := targets[start]; ok { - return 1, nil - } - if steps <= 0 { - return 0, nil - } - - probs := make([]float64, len(model.States)) - next := make([]float64, len(model.States)) - for target := range targets { - probs[target] = 1 - next[target] = 1 - } - - for step := 0; step < steps; step++ { - for state := range model.States { - if _, target := targets[state]; target { - next[state] = 1 - continue - } - value := 0.0 - for to, probability := range model.TransitionProbs[state] { - value += probability * probs[to] - } - next[state] = value - } - copy(probs, next) - } - return probs[start], nil -} - -// HorizonReachabilityProbabilityByState computes finite-horizon reachability -// using symbolic state labels. -func HorizonReachabilityProbabilityByState(model *Model, startState string, targetStates []string, steps int) (float64, error) { - start, ok := model.IndexForState(startState) - if !ok { - return 0, fmt.Errorf("unknown start state %q", startState) - } - targets := make(map[int]struct{}, len(targetStates)) - for _, state := range targetStates { - index, ok := model.IndexForState(state) - if !ok { - return 0, fmt.Errorf("unknown target state %q", state) - } - targets[index] = struct{}{} - } - return HorizonReachabilityProbability(model, start, targets, steps) -} diff --git a/internal/guard/markov/json.go b/internal/guard/markov/json.go deleted file mode 100644 index ba85f33..0000000 --- a/internal/guard/markov/json.go +++ /dev/null @@ -1,25 +0,0 @@ -package markov - -import ( - "encoding/json" - "io" -) - -// WriteModelJSON writes a learned model as JSON. -func WriteModelJSON(w io.Writer, model *Model) error { - encoder := json.NewEncoder(w) - encoder.SetIndent("", " ") - return encoder.Encode(model) -} - -// ReadModelJSON reads a learned model from JSON. -func ReadModelJSON(r io.Reader) (*Model, error) { - var model Model - if err := json.NewDecoder(r).Decode(&model); err != nil { - return nil, err - } - if err := model.Validate(); err != nil { - return nil, err - } - return &model, nil -} diff --git a/internal/guard/markov/learn.go b/internal/guard/markov/learn.go deleted file mode 100644 index 25df778..0000000 --- a/internal/guard/markov/learn.go +++ /dev/null @@ -1,153 +0,0 @@ -package markov - -import ( - "fmt" - "sort" - - "github.com/kontext-security/kontext-cli/internal/guard/markov/abstraction" -) - -// BuildOptions controls Markov-chain model learning. -type BuildOptions struct { - // Alpha is the validity-aware Laplace smoothing amount. - Alpha float64 -} - -// BuildModel learns a Markov-chain model from observation traces. -func BuildModel[O any](logs [][]O, abs abstraction.Interface[O], options BuildOptions) (*Model, error) { - if abs == nil { - return nil, fmt.Errorf("abstraction is nil") - } - alpha := options.Alpha - if alpha < 0 { - return nil, fmt.Errorf("alpha must be non-negative") - } - - traceStates := make([][]string, 0, len(logs)) - stateSet := map[string]struct{}{} - for traceIndex, log := range logs { - encodedTrace := make([]string, 0, len(log)) - for observationIndex, observation := range log { - state, err := abs.Encode(observation) - if err != nil { - return nil, fmt.Errorf("encode trace %d observation %d: %w", traceIndex, observationIndex, err) - } - encodedTrace = append(encodedTrace, state) - stateSet[state] = struct{}{} - } - traceStates = append(traceStates, encodedTrace) - } - if len(stateSet) == 0 { - return nil, fmt.Errorf("cannot build model from empty logs") - } - - states := make([]string, 0, len(stateSet)) - for state := range stateSet { - states = append(states, state) - } - - stateIndex := buildStateIndex(states, abs) - statesByIndex := make([]string, len(states)) - for state, index := range stateIndex { - if index < 0 || index >= len(states) { - return nil, fmt.Errorf("state index for %q is out of range: %d", state, index) - } - statesByIndex[index] = state - } - - countMatrix := make([][]int, len(statesByIndex)) - for i := range countMatrix { - countMatrix[i] = make([]int, len(statesByIndex)) - } - stateCounts := make(map[int]int, len(statesByIndex)) - - for _, trace := range traceStates { - for _, state := range trace { - index, ok := stateIndex[state] - if !ok { - return nil, fmt.Errorf("unknown observed state %q", state) - } - stateCounts[index]++ - } - for i := 1; i < len(trace); i++ { - from, ok := stateIndex[trace[i-1]] - if !ok { - return nil, fmt.Errorf("unknown source state %q", trace[i-1]) - } - to, ok := stateIndex[trace[i]] - if !ok { - return nil, fmt.Errorf("unknown target state %q", trace[i]) - } - countMatrix[from][to]++ - } - } - - counts := make(map[int]map[int]int) - probs := make(map[int]map[int]float64, len(statesByIndex)) - for from, fromState := range statesByIndex { - denominator := 0.0 - weights := make([]float64, len(statesByIndex)) - for to, toState := range statesByIndex { - weight := float64(countMatrix[from][to]) - if abs.ValidTransition(fromState, toState) { - weight += alpha - } - if weight > 0 { - weights[to] = weight - denominator += weight - } - if countMatrix[from][to] > 0 { - if counts[from] == nil { - counts[from] = map[int]int{} - } - counts[from][to] = countMatrix[from][to] - } - } - if denominator == 0 { - probs[from] = map[int]float64{from: 1} - continue - } - row := make(map[int]float64) - for to, weight := range weights { - if weight > 0 { - row[to] = weight / denominator - } - } - probs[from] = row - } - - var interpretation map[string]map[string]bool - if interpreter, ok := any(abs).(abstraction.StateInterpreter); ok { - interpretation = interpreter.StateInterpretation(statesByIndex) - } - - model := &Model{ - States: statesByIndex, - StateIndex: stateIndex, - StateInterpretation: interpretation, - StateCounts: stateCounts, - TransitionCounts: counts, - TransitionProbs: probs, - } - if err := model.Validate(); err != nil { - return nil, err - } - return model, nil -} - -func buildStateIndex[O any](states []string, abs abstraction.Interface[O]) map[string]int { - if indexer, ok := any(abs).(abstraction.StateIndexer); ok { - index := indexer.StateIndex(append([]string(nil), states...)) - if len(index) == len(states) { - return index - } - } - - sorted := append([]string(nil), states...) - sort.Strings(sorted) - index := make(map[string]int, len(sorted)) - for i, state := range sorted { - index[state] = i - } - return index -} diff --git a/internal/guard/markov/model.go b/internal/guard/markov/model.go deleted file mode 100644 index 92c04cd..0000000 --- a/internal/guard/markov/model.go +++ /dev/null @@ -1,89 +0,0 @@ -package markov - -import ( - "encoding/json" - "fmt" - "sort" -) - -// Model is a learned Markov-chain model over integer-indexed symbolic states. -type Model struct { - States []string `json:"states"` - StateIndex map[string]int `json:"state_index"` - StateInterpretation map[string]map[string]bool `json:"state_interpret,omitempty"` - StateCounts map[int]int `json:"state_counts,omitempty"` - TransitionCounts map[int]map[int]int `json:"transition_counts,omitempty"` - TransitionProbs map[int]map[int]float64 `json:"transition_probs"` - Metadata map[string]json.RawMessage `json:"metadata,omitempty"` -} - -// Validate checks basic Markov-chain model invariants. -func (m Model) Validate() error { - if len(m.States) == 0 { - return fmt.Errorf("model has no states") - } - if len(m.StateIndex) != len(m.States) { - return fmt.Errorf("state index has %d entries for %d states", len(m.StateIndex), len(m.States)) - } - seen := make(map[int]string, len(m.StateIndex)) - for state, index := range m.StateIndex { - if index < 0 || index >= len(m.States) { - return fmt.Errorf("state %q has out-of-range index %d", state, index) - } - if other, exists := seen[index]; exists { - return fmt.Errorf("states %q and %q share index %d", other, state, index) - } - seen[index] = state - } - for index, state := range m.States { - if m.StateIndex[state] != index { - return fmt.Errorf("states[%d]=%q but state index maps it to %d", index, state, m.StateIndex[state]) - } - } - for from, row := range m.TransitionProbs { - if from < 0 || from >= len(m.States) { - return fmt.Errorf("transition source %d is out of range", from) - } - sum := 0.0 - for to, probability := range row { - if to < 0 || to >= len(m.States) { - return fmt.Errorf("transition target %d is out of range", to) - } - if probability < 0 { - return fmt.Errorf("transition %d -> %d has negative probability %f", from, to, probability) - } - sum += probability - } - if len(row) == 0 { - return fmt.Errorf("transition row %d is empty", from) - } - if sum < 0.999999 || sum > 1.000001 { - return fmt.Errorf("transition row %d sums to %f", from, sum) - } - } - return nil -} - -// StateForIndex returns the symbolic state for an index. -func (m Model) StateForIndex(index int) (string, bool) { - if index < 0 || index >= len(m.States) { - return "", false - } - return m.States[index], true -} - -// IndexForState returns the integer index for a symbolic state. -func (m Model) IndexForState(state string) (int, bool) { - index, ok := m.StateIndex[state] - return index, ok -} - -// SortedStateIndexes returns all model indexes in ascending order. -func (m Model) SortedStateIndexes() []int { - indexes := make([]int, 0, len(m.States)) - for i := range m.States { - indexes = append(indexes, i) - } - sort.Ints(indexes) - return indexes -} diff --git a/internal/guard/markov/model_test.go b/internal/guard/markov/model_test.go deleted file mode 100644 index b97d92a..0000000 --- a/internal/guard/markov/model_test.go +++ /dev/null @@ -1,123 +0,0 @@ -package markov - -import ( - "math" - "testing" - - "github.com/kontext-security/kontext-cli/internal/guard/markov/abstraction" -) - -type stringAbstraction struct{} - -func (stringAbstraction) Encode(observation string) (string, error) { - return observation, nil -} - -func (stringAbstraction) Decode(state string) (string, error) { - return state, nil -} - -func (stringAbstraction) ValidTransition(from, to string) bool { - return from != abstraction.Finish -} - -func TestBuildModelWithoutSmoothing(t *testing.T) { - t.Parallel() - - model, err := BuildModel([][]string{ - {"a", "b", "b", "c"}, - {"a", "c"}, - }, stringAbstraction{}, BuildOptions{}) - if err != nil { - t.Fatalf("BuildModel returned error: %v", err) - } - - a := model.StateIndex["a"] - b := model.StateIndex["b"] - c := model.StateIndex["c"] - - assertNear(t, model.TransitionProbs[a][b], 0.5) - assertNear(t, model.TransitionProbs[a][c], 0.5) - assertNear(t, model.TransitionProbs[b][b], 0.5) - assertNear(t, model.TransitionProbs[b][c], 0.5) - assertNear(t, model.TransitionProbs[c][c], 1) -} - -func TestBuildModelWithValidityAwareSmoothing(t *testing.T) { - t.Parallel() - - model, err := BuildModel([][]string{ - {"a", "b"}, - }, stringAbstraction{}, BuildOptions{Alpha: 1}) - if err != nil { - t.Fatalf("BuildModel returned error: %v", err) - } - - a := model.StateIndex["a"] - b := model.StateIndex["b"] - - assertNear(t, model.TransitionProbs[a][a], 1.0/3.0) - assertNear(t, model.TransitionProbs[a][b], 2.0/3.0) - assertNear(t, model.TransitionProbs[b][a], 0.5) - assertNear(t, model.TransitionProbs[b][b], 0.5) -} - -func TestReachabilityProbability(t *testing.T) { - t.Parallel() - - model := &Model{ - States: []string{"safe", "risky", "unsafe"}, - StateIndex: map[string]int{"safe": 0, "risky": 1, "unsafe": 2}, - TransitionProbs: map[int]map[int]float64{ - 0: {1: 0.5, 2: 0.5}, - 1: {1: 0.5, 2: 0.5}, - 2: {2: 1}, - }, - } - - probability, err := ReachabilityProbability(model, 0, map[int]struct{}{2: {}}, ReachabilityOptions{}) - if err != nil { - t.Fatalf("ReachabilityProbability returned error: %v", err) - } - assertNear(t, probability, 1) -} - -func TestHorizonReachabilityProbability(t *testing.T) { - t.Parallel() - - model := &Model{ - States: []string{"safe", "middle", "unsafe"}, - StateIndex: map[string]int{"safe": 0, "middle": 1, "unsafe": 2}, - TransitionProbs: map[int]map[int]float64{ - 0: {1: 1}, - 1: {1: 0.75, 2: 0.25}, - 2: {2: 1}, - }, - } - targets := map[int]struct{}{2: {}} - - zero, err := HorizonReachabilityProbability(model, 0, targets, 0) - if err != nil { - t.Fatalf("HorizonReachabilityProbability returned error: %v", err) - } - assertNear(t, zero, 0) - - one, err := HorizonReachabilityProbability(model, 0, targets, 1) - if err != nil { - t.Fatalf("HorizonReachabilityProbability returned error: %v", err) - } - assertNear(t, one, 0) - - two, err := HorizonReachabilityProbability(model, 0, targets, 2) - if err != nil { - t.Fatalf("HorizonReachabilityProbability returned error: %v", err) - } - assertNear(t, two, 0.25) -} - -func assertNear(t *testing.T, got, want float64) { - t.Helper() - if math.Abs(got-want) > 1e-9 { - t.Fatalf("got %f, want %f", got, want) - } -} diff --git a/internal/guard/markov/monitor/monitor.go b/internal/guard/markov/monitor/monitor.go deleted file mode 100644 index 4813794..0000000 --- a/internal/guard/markov/monitor/monitor.go +++ /dev/null @@ -1,54 +0,0 @@ -package monitor - -import ( - "fmt" - - "github.com/kontext-security/kontext-cli/internal/guard/markov" - "github.com/kontext-security/kontext-cli/internal/guard/markov/abstraction" -) - -// Monitor evaluates runtime observations against a learned Markov-chain model. -type Monitor[O any] struct { - Model *markov.Model - Abstraction abstraction.Interface[O] - Unsafe map[int]struct{} - Threshold float64 - Solver markov.ReachabilityOptions -} - -// Decision is one runtime monitoring result. -type Decision struct { - State string - StateIndex int - Risk float64 - Intervention bool -} - -// Observe encodes an observation, computes probability of eventually reaching -// an unsafe state, and flags intervention if Risk > Threshold. -func (m Monitor[O]) Observe(observation O) (Decision, error) { - if m.Model == nil { - return Decision{}, fmt.Errorf("model is nil") - } - if m.Abstraction == nil { - return Decision{}, fmt.Errorf("abstraction is nil") - } - state, err := m.Abstraction.Encode(observation) - if err != nil { - return Decision{}, err - } - index, ok := m.Model.IndexForState(state) - if !ok { - return Decision{}, fmt.Errorf("encoded state %q is not present in model", state) - } - risk, err := markov.ReachabilityProbability(m.Model, index, m.Unsafe, m.Solver) - if err != nil { - return Decision{}, err - } - return Decision{ - State: state, - StateIndex: index, - Risk: risk, - Intervention: risk > m.Threshold, - }, nil -} diff --git a/internal/guard/markov/predicate/predicate.go b/internal/guard/markov/predicate/predicate.go deleted file mode 100644 index 1f15f38..0000000 --- a/internal/guard/markov/predicate/predicate.go +++ /dev/null @@ -1,210 +0,0 @@ -package predicate - -import ( - "fmt" - "reflect" -) - -// Observation is the default map shape used by predicates. -type Observation map[string]any - -// Predicate evaluates a boolean property over one observation. -type Predicate interface { - Evaluate(observation Observation) (bool, error) - String() string -} - -// ComparisonOp is a supported atomic predicate comparison. -type ComparisonOp string - -const ( - OpEQ ComparisonOp = "==" - OpNEQ ComparisonOp = "!=" - OpGT ComparisonOp = ">" - OpLT ComparisonOp = "<" - OpGTE ComparisonOp = ">=" - OpLTE ComparisonOp = "<=" -) - -// AtomicPredicate compares one observation field with a right-hand value. -type AtomicPredicate struct { - Negated bool `json:"negated,omitempty"` - LHS string `json:"lhs"` - Op ComparisonOp `json:"op"` - RHS any `json:"rhs"` -} - -func (p AtomicPredicate) String() string { - prefix := "" - if p.Negated { - prefix = "!" - } - return fmt.Sprintf("%s(%s %s %v)", prefix, p.LHS, p.Op, p.RHS) -} - -func (p AtomicPredicate) Evaluate(observation Observation) (bool, error) { - left, ok := observation[p.LHS] - if !ok { - return false, fmt.Errorf("observation missing field %q", p.LHS) - } - result, err := compareValues(left, p.Op, p.RHS) - if err != nil { - return false, fmt.Errorf("%s: %w", p.String(), err) - } - if p.Negated { - return !result, nil - } - return result, nil -} - -// BinaryOp combines two predicates. -type BinaryOp string - -const ( - OpAnd BinaryOp = "and" - OpOr BinaryOp = "or" -) - -// BinaryPredicate combines two predicates with boolean AND or OR. -type BinaryPredicate struct { - LHS Predicate `json:"-"` - Op BinaryOp `json:"op"` - RHS Predicate `json:"-"` -} - -func (p BinaryPredicate) String() string { - return fmt.Sprintf("(%s) %s (%s)", p.LHS.String(), p.Op, p.RHS.String()) -} - -func (p BinaryPredicate) Evaluate(observation Observation) (bool, error) { - left, err := p.LHS.Evaluate(observation) - if err != nil { - return false, err - } - switch p.Op { - case OpAnd: - if !left { - return false, nil - } - return p.RHS.Evaluate(observation) - case OpOr: - if left { - return true, nil - } - return p.RHS.Evaluate(observation) - default: - return false, fmt.Errorf("unsupported binary predicate operator %q", p.Op) - } -} - -// Quantifier determines how a predicate is evaluated over a slice of objects. -type Quantifier string - -const ( - QuantifierExists Quantifier = "exist" - QuantifierAll Quantifier = "all" -) - -// QuantifiedPredicate evaluates a predicate over multiple object observations. -type QuantifiedPredicate struct { - Quantifier Quantifier - Predicate Predicate -} - -func (p QuantifiedPredicate) String() string { - return fmt.Sprintf("%s %s", p.Quantifier, p.Predicate.String()) -} - -func (p QuantifiedPredicate) Evaluate(observations []Observation) (bool, error) { - switch p.Quantifier { - case QuantifierExists: - for _, observation := range observations { - ok, err := p.Predicate.Evaluate(observation) - if err != nil { - return false, err - } - if ok { - return true, nil - } - } - return false, nil - case QuantifierAll: - for _, observation := range observations { - ok, err := p.Predicate.Evaluate(observation) - if err != nil { - return false, err - } - if !ok { - return false, nil - } - } - return true, nil - default: - return false, fmt.Errorf("unsupported quantifier %q", p.Quantifier) - } -} - -func compareValues(left any, op ComparisonOp, right any) (bool, error) { - if lf, ok := asFloat64(left); ok { - rf, ok := asFloat64(right) - if !ok { - return false, fmt.Errorf("cannot compare numeric value with %T", right) - } - switch op { - case OpEQ: - return lf == rf, nil - case OpNEQ: - return lf != rf, nil - case OpGT: - return lf > rf, nil - case OpLT: - return lf < rf, nil - case OpGTE: - return lf >= rf, nil - case OpLTE: - return lf <= rf, nil - default: - return false, fmt.Errorf("unsupported comparison operator %q", op) - } - } - - switch op { - case OpEQ: - return reflect.DeepEqual(left, right), nil - case OpNEQ: - return !reflect.DeepEqual(left, right), nil - default: - return false, fmt.Errorf("operator %q requires numeric operands", op) - } -} - -func asFloat64(value any) (float64, bool) { - switch v := value.(type) { - case int: - return float64(v), true - case int8: - return float64(v), true - case int16: - return float64(v), true - case int32: - return float64(v), true - case int64: - return float64(v), true - case uint: - return float64(v), true - case uint8: - return float64(v), true - case uint16: - return float64(v), true - case uint32: - return float64(v), true - case uint64: - return float64(v), true - case float32: - return float64(v), true - case float64: - return v, true - default: - return 0, false - } -} diff --git a/internal/guard/markov/reachability.go b/internal/guard/markov/reachability.go deleted file mode 100644 index 12a97d4..0000000 --- a/internal/guard/markov/reachability.go +++ /dev/null @@ -1,91 +0,0 @@ -package markov - -import "fmt" - -// ReachabilityOptions controls iterative probability solving. -type ReachabilityOptions struct { - Tolerance float64 - MaxIterations int -} - -func (o ReachabilityOptions) withDefaults() ReachabilityOptions { - if o.Tolerance <= 0 { - o.Tolerance = 1e-12 - } - if o.MaxIterations <= 0 { - o.MaxIterations = 10000 - } - return o -} - -// ReachabilityProbability computes P_start(F target) for the Markov-chain model. -func ReachabilityProbability(model *Model, start int, targets map[int]struct{}, options ReachabilityOptions) (float64, error) { - if model == nil { - return 0, fmt.Errorf("model is nil") - } - if err := model.Validate(); err != nil { - return 0, err - } - if start < 0 || start >= len(model.States) { - return 0, fmt.Errorf("start state %d is out of range", start) - } - if _, ok := targets[start]; ok { - return 1, nil - } - - options = options.withDefaults() - probs := make([]float64, len(model.States)) - next := make([]float64, len(model.States)) - for target := range targets { - if target < 0 || target >= len(model.States) { - return 0, fmt.Errorf("target state %d is out of range", target) - } - probs[target] = 1 - next[target] = 1 - } - - for iteration := 0; iteration < options.MaxIterations; iteration++ { - delta := 0.0 - for state := range model.States { - if _, target := targets[state]; target { - next[state] = 1 - continue - } - value := 0.0 - for to, probability := range model.TransitionProbs[state] { - value += probability * probs[to] - } - next[state] = value - diff := value - probs[state] - if diff < 0 { - diff = -diff - } - if diff > delta { - delta = diff - } - } - copy(probs, next) - if delta <= options.Tolerance { - return probs[start], nil - } - } - return probs[start], fmt.Errorf("reachability solver did not converge after %d iterations", options.MaxIterations) -} - -// ReachabilityProbabilityByState computes P_start(F target) using symbolic -// state labels. -func ReachabilityProbabilityByState(model *Model, startState string, targetStates []string, options ReachabilityOptions) (float64, error) { - start, ok := model.IndexForState(startState) - if !ok { - return 0, fmt.Errorf("unknown start state %q", startState) - } - targets := make(map[int]struct{}, len(targetStates)) - for _, state := range targetStates { - index, ok := model.IndexForState(state) - if !ok { - return 0, fmt.Errorf("unknown target state %q", state) - } - targets[index] = struct{}{} - } - return ReachabilityProbability(model, start, targets, options) -} diff --git a/internal/guard/modelsnapshot/store.go b/internal/guard/modelsnapshot/store.go deleted file mode 100644 index 85dc783..0000000 --- a/internal/guard/modelsnapshot/store.go +++ /dev/null @@ -1,225 +0,0 @@ -package modelsnapshot - -import ( - "bytes" - "crypto/sha256" - "encoding/hex" - "encoding/json" - "errors" - "fmt" - "os" - "path/filepath" - "strings" - "time" - - "github.com/kontext-security/kontext-cli/internal/guard/markov" -) - -var ErrNoActiveSnapshot = errors.New("no active model snapshot") - -type Snapshot struct { - ID string `json:"id"` - SourcePath string `json:"source_path"` - Path string `json:"path"` - SHA256 string `json:"sha256"` - CreatedAt time.Time `json:"created_at"` - ActivatedAt time.Time `json:"activated_at"` - PreviousID string `json:"previous_id,omitempty"` -} - -type Store struct { - root string - validate func(*markov.Model) error -} - -func New(root string) *Store { - return &Store{root: root} -} - -func NewWithValidator(root string, validate func(*markov.Model) error) *Store { - return &Store{root: root, validate: validate} -} - -func (s *Store) ActivateFromFile(path string) (Snapshot, error) { - if strings.TrimSpace(path) == "" { - return Snapshot{}, fmt.Errorf("model path is required") - } - data, err := os.ReadFile(path) - if err != nil { - return Snapshot{}, err - } - return s.activate(path, data) -} - -func (s *Store) ActivateBytes(source string, data []byte) (Snapshot, error) { - if strings.TrimSpace(source) == "" { - return Snapshot{}, fmt.Errorf("model source is required") - } - if len(data) == 0 { - return Snapshot{}, fmt.Errorf("model data is required") - } - return s.activate(source, data) -} - -func (s *Store) activate(source string, data []byte) (Snapshot, error) { - model, err := markov.ReadModelJSON(bytes.NewReader(data)) - if err != nil { - return Snapshot{}, fmt.Errorf("validate model snapshot: %w", err) - } - if s.validate != nil { - if err := s.validate(model); err != nil { - return Snapshot{}, fmt.Errorf("validate model snapshot: %w", err) - } - } - - sum := sha256.Sum256(data) - hash := hex.EncodeToString(sum[:]) - active, activeErr := s.Active() - if activeErr == nil && active.SHA256 == hash { - return active, nil - } else if activeErr != nil && !errors.Is(activeErr, ErrNoActiveSnapshot) { - return Snapshot{}, activeErr - } - - now := time.Now().UTC() - previousID := "" - if activeErr == nil { - previousID = active.ID - } - - id := now.Format("20060102T150405.000000000Z") + "-" + hash[:12] - snapshotDir := filepath.Join(s.root, "snapshots") - if err := os.MkdirAll(snapshotDir, 0o700); err != nil { - return Snapshot{}, err - } - modelPath := filepath.Join(snapshotDir, id+".json") - if err := writeFileAtomic(modelPath, data, 0o600); err != nil { - return Snapshot{}, err - } - snapshot := Snapshot{ - ID: id, - SourcePath: source, - Path: modelPath, - SHA256: hash, - CreatedAt: now, - ActivatedAt: now, - PreviousID: previousID, - } - if err := s.writeSnapshot(snapshot); err != nil { - return Snapshot{}, err - } - if err := s.writeActive(snapshot); err != nil { - return Snapshot{}, err - } - return snapshot, nil -} - -func (s *Store) Active() (Snapshot, error) { - data, err := os.ReadFile(s.activePath()) - if errors.Is(err, os.ErrNotExist) { - return Snapshot{}, ErrNoActiveSnapshot - } - if err != nil { - return Snapshot{}, err - } - var snapshot Snapshot - if err := json.Unmarshal(data, &snapshot); err != nil { - return Snapshot{}, err - } - if snapshot.ID == "" || snapshot.Path == "" { - return Snapshot{}, fmt.Errorf("active model snapshot is invalid") - } - return snapshot, nil -} - -func (s *Store) Rollback() (Snapshot, error) { - active, err := s.Active() - if err != nil { - return Snapshot{}, err - } - if active.PreviousID == "" { - return Snapshot{}, fmt.Errorf("active model snapshot has no rollback target") - } - previous, err := s.readSnapshot(active.PreviousID) - if err != nil { - return Snapshot{}, err - } - previous.PreviousID = active.ID - previous.ActivatedAt = time.Now().UTC() - if err := s.writeSnapshot(previous); err != nil { - return Snapshot{}, err - } - if err := s.writeActive(previous); err != nil { - return Snapshot{}, err - } - return previous, nil -} - -func (s *Store) writeSnapshot(snapshot Snapshot) error { - data, err := json.MarshalIndent(snapshot, "", " ") - if err != nil { - return err - } - data = append(data, '\n') - return writeFileAtomic(s.snapshotMetadataPath(snapshot.ID), data, 0o600) -} - -func (s *Store) readSnapshot(id string) (Snapshot, error) { - data, err := os.ReadFile(s.snapshotMetadataPath(id)) - if err != nil { - return Snapshot{}, err - } - var snapshot Snapshot - if err := json.Unmarshal(data, &snapshot); err != nil { - return Snapshot{}, err - } - if snapshot.ID == "" || snapshot.Path == "" { - return Snapshot{}, fmt.Errorf("model snapshot %q is invalid", id) - } - return snapshot, nil -} - -func (s *Store) writeActive(snapshot Snapshot) error { - data, err := json.MarshalIndent(snapshot, "", " ") - if err != nil { - return err - } - data = append(data, '\n') - return writeFileAtomic(s.activePath(), data, 0o600) -} - -func (s *Store) activePath() string { - return filepath.Join(s.root, "active.json") -} - -func (s *Store) snapshotMetadataPath(id string) string { - return filepath.Join(s.root, "snapshots", id+".metadata.json") -} - -func writeFileAtomic(path string, data []byte, perm os.FileMode) error { - if err := os.MkdirAll(filepath.Dir(path), 0o700); err != nil { - return err - } - tmp, err := os.CreateTemp(filepath.Dir(path), "."+filepath.Base(path)+".tmp-*") - if err != nil { - return err - } - tmpPath := tmp.Name() - defer os.Remove(tmpPath) - if _, err := tmp.Write(data); err != nil { - tmp.Close() - return err - } - if err := tmp.Chmod(perm); err != nil { - tmp.Close() - return err - } - if err := tmp.Sync(); err != nil { - tmp.Close() - return err - } - if err := tmp.Close(); err != nil { - return err - } - return os.Rename(tmpPath, path) -} diff --git a/internal/guard/modelsnapshot/store_test.go b/internal/guard/modelsnapshot/store_test.go deleted file mode 100644 index 80eb110..0000000 --- a/internal/guard/modelsnapshot/store_test.go +++ /dev/null @@ -1,191 +0,0 @@ -package modelsnapshot - -import ( - "encoding/json" - "errors" - "os" - "path/filepath" - "testing" - - "github.com/kontext-security/kontext-cli/internal/guard/markov" - "github.com/kontext-security/kontext-cli/internal/guard/trace" -) - -func TestActivateFromFilePersistsActiveSnapshot(t *testing.T) { - source := writeModel(t, t.TempDir(), "model.json", "v1") - store := New(t.TempDir()) - - snapshot, err := store.ActivateFromFile(source) - if err != nil { - t.Fatalf("ActivateFromFile() error = %v", err) - } - if snapshot.ID == "" || snapshot.Path == "" || snapshot.SHA256 == "" { - t.Fatalf("snapshot missing metadata: %+v", snapshot) - } - if snapshot.SourcePath != source { - t.Fatalf("SourcePath = %q, want %q", snapshot.SourcePath, source) - } - if _, err := os.Stat(snapshot.Path); err != nil { - t.Fatalf("snapshot model file: %v", err) - } - active, err := store.Active() - if err != nil { - t.Fatalf("Active() error = %v", err) - } - if active.ID != snapshot.ID || active.Path != snapshot.Path { - t.Fatalf("active = %+v, want snapshot %+v", active, snapshot) - } -} - -func TestActivateBytesPersistsPrivateSnapshot(t *testing.T) { - source := writeModel(t, t.TempDir(), "model.json", "v1") - data, err := os.ReadFile(source) - if err != nil { - t.Fatal(err) - } - root := t.TempDir() - store := New(root) - - snapshot, err := store.ActivateBytes("embedded:test-model", data) - if err != nil { - t.Fatalf("ActivateBytes() error = %v", err) - } - if snapshot.SourcePath != "embedded:test-model" { - t.Fatalf("SourcePath = %q, want embedded source", snapshot.SourcePath) - } - for _, path := range []string{snapshot.Path, store.activePath(), store.snapshotMetadataPath(snapshot.ID)} { - info, err := os.Stat(path) - if err != nil { - t.Fatalf("Stat(%s) error = %v", path, err) - } - if got := info.Mode().Perm(); got != 0o600 { - t.Fatalf("%s mode = %o, want 600", path, got) - } - } - if info, err := os.Stat(filepath.Join(root, "snapshots")); err != nil { - t.Fatalf("snapshot dir stat error = %v", err) - } else if got := info.Mode().Perm(); got != 0o700 { - t.Fatalf("snapshot dir mode = %o, want 700", got) - } -} - -func TestActivateFromFileReusesActiveSnapshotForSameModel(t *testing.T) { - source := writeModel(t, t.TempDir(), "model.json", "v1") - store := New(t.TempDir()) - - first, err := store.ActivateFromFile(source) - if err != nil { - t.Fatalf("first ActivateFromFile() error = %v", err) - } - second, err := store.ActivateFromFile(source) - if err != nil { - t.Fatalf("second ActivateFromFile() error = %v", err) - } - if second.ID != first.ID { - t.Fatalf("second ID = %q, want reused active ID %q", second.ID, first.ID) - } -} - -func TestRollbackActivatesPreviousSnapshot(t *testing.T) { - dir := t.TempDir() - store := New(t.TempDir()) - firstSource := writeModel(t, dir, "model-v1.json", "v1") - secondSource := writeModel(t, dir, "model-v2.json", "v2") - - first, err := store.ActivateFromFile(firstSource) - if err != nil { - t.Fatalf("first ActivateFromFile() error = %v", err) - } - second, err := store.ActivateFromFile(secondSource) - if err != nil { - t.Fatalf("second ActivateFromFile() error = %v", err) - } - if second.PreviousID != first.ID { - t.Fatalf("PreviousID = %q, want %q", second.PreviousID, first.ID) - } - rolledBack, err := store.Rollback() - if err != nil { - t.Fatalf("Rollback() error = %v", err) - } - if rolledBack.ID != first.ID { - t.Fatalf("rolledBack ID = %q, want %q", rolledBack.ID, first.ID) - } - active, err := store.Active() - if err != nil { - t.Fatalf("Active() error = %v", err) - } - if active.ID != first.ID || active.PreviousID != second.ID { - t.Fatalf("active after rollback = %+v, want first with previous second", active) - } - persisted, err := store.readSnapshot(first.ID) - if err != nil { - t.Fatalf("readSnapshot() error = %v", err) - } - if persisted.ID != first.ID || persisted.PreviousID != second.ID { - t.Fatalf("persisted snapshot after rollback = %+v, want first with previous second", persisted) - } - if !persisted.ActivatedAt.Equal(rolledBack.ActivatedAt) { - t.Fatalf("persisted ActivatedAt = %s, want returned rollback activation time %s", persisted.ActivatedAt, rolledBack.ActivatedAt) - } -} - -func TestActiveReturnsNoActiveSnapshot(t *testing.T) { - _, err := New(t.TempDir()).Active() - if !errors.Is(err, ErrNoActiveSnapshot) { - t.Fatalf("Active() error = %v, want ErrNoActiveSnapshot", err) - } -} - -func TestActivateFromFileRejectsInvalidModel(t *testing.T) { - dir := t.TempDir() - path := filepath.Join(dir, "invalid.json") - if err := os.WriteFile(path, []byte(`{"states":[]}`), 0o644); err != nil { - t.Fatal(err) - } - if _, err := New(t.TempDir()).ActivateFromFile(path); err == nil { - t.Fatal("ActivateFromFile() error = nil, want invalid model error") - } -} - -func TestActivateFromFileRejectsValidatorError(t *testing.T) { - source := writeModel(t, t.TempDir(), "model.json", "v1") - store := NewWithValidator(t.TempDir(), func(*markov.Model) error { - return errors.New("unsupported abstraction") - }) - - if _, err := store.ActivateFromFile(source); err == nil { - t.Fatal("ActivateFromFile() error = nil, want validator error") - } - if _, err := store.Active(); !errors.Is(err, ErrNoActiveSnapshot) { - t.Fatalf("Active() error = %v, want ErrNoActiveSnapshot", err) - } -} - -func writeModel(t *testing.T, dir, name, version string) string { - t.Helper() - path := filepath.Join(dir, name) - metadata, err := json.Marshal(map[string]string{"abstraction_version": trace.RiskAbstractionVersion, "version": version}) - if err != nil { - t.Fatal(err) - } - model := markov.Model{ - States: []string{"safe"}, - StateIndex: map[string]int{ - "safe": 0, - }, - TransitionProbs: map[int]map[int]float64{ - 0: {0: 1}, - }, - Metadata: map[string]json.RawMessage{ - "abstraction_version": metadata, - }, - } - data, err := json.Marshal(model) - if err != nil { - t.Fatal(err) - } - if err := os.WriteFile(path, data, 0o644); err != nil { - t.Fatal(err) - } - return path -} diff --git a/internal/guard/risk/decision.go b/internal/guard/risk/decision.go index 9f70fea..7632ca1 100644 --- a/internal/guard/risk/decision.go +++ b/internal/guard/risk/decision.go @@ -2,30 +2,18 @@ package risk const PolicyVersionLaunchV0 = "guard-launch-v0" -func DecideRisk(event HookEvent, scorer Scorer) (RiskDecision, error) { - if scorer == nil { - scorer = NoopScorer{} - } +func DecideRisk(event HookEvent) (RiskDecision, error) { riskEvent := NormalizeHookEvent(event) riskEvent.PolicyVersion = PolicyVersionLaunchV0 - score, err := scorer.Score(riskEvent) - if err != nil { - return RiskDecision{}, err - } - riskEvent.RiskScore = score.RiskScore - riskEvent.ModelVersion = score.ModelVersion if event.HookEventName != "PreToolUse" { riskEvent.Decision = DecisionAllow riskEvent.ReasonCode = "async_telemetry" riskEvent.DecisionStage = "async_telemetry" return RiskDecision{ - Decision: DecisionAllow, - Reason: "async telemetry event recorded", - ReasonCode: "async_telemetry", - RiskScore: score.RiskScore, - Threshold: score.Threshold, - ModelVersion: score.ModelVersion, - RiskEvent: riskEvent, + Decision: DecisionAllow, + Reason: "async telemetry event recorded", + ReasonCode: "async_telemetry", + RiskEvent: riskEvent, }, nil } @@ -36,29 +24,14 @@ func DecideRisk(event HookEvent, scorer Scorer) (RiskDecision, error) { Reason: "normal tool call", ReasonCode: "normal_tool_call", } - if score.Known && score.RiskScore != nil && score.Threshold != nil && *score.RiskScore >= *score.Threshold && modelCanEscalate(riskEvent) { - decision = RiskDecision{ - Decision: DecisionAsk, - Reason: "model risk exceeded threshold", - ReasonCode: "model_risk_threshold", - GuardID: "markov_threshold", - } - } } - decision.RiskScore = score.RiskScore - decision.Threshold = score.Threshold - decision.ModelVersion = score.ModelVersion decision.RiskEvent = riskEvent decision.RiskEvent.Decision = decision.Decision decision.RiskEvent.ReasonCode = decision.ReasonCode decision.RiskEvent.GuardID = decision.GuardID - decision.RiskEvent.RiskScore = decision.RiskScore - decision.RiskEvent.ModelVersion = decision.ModelVersion decision.RiskEvent.PolicyVersion = PolicyVersionLaunchV0 if decision.RiskEvent.DecisionStage == "" { switch { - case decision.ReasonCode == "model_risk_threshold": - decision.RiskEvent.DecisionStage = "model" case decision.GuardID != "": decision.RiskEvent.DecisionStage = "deterministic" default: @@ -72,13 +45,6 @@ func DeterministicDecision(event RiskEvent) RiskDecision { return guardDecision(event) } -func modelCanEscalate(event RiskEvent) bool { - return event.Type == EventUnknown || - event.Type == EventCredentialAccess || - event.Type == EventDirectProviderAPICall || - event.Type == EventDestructiveProviderOperation -} - func guardDecision(event RiskEvent) RiskDecision { if event.Type == EventDestructiveProviderOperation && isPersistentResource(event.ResourceClass) && !event.ExplicitUserIntent { return RiskDecision{ diff --git a/internal/guard/risk/risk_test.go b/internal/guard/risk/risk_test.go index 6e514e4..b243a22 100644 --- a/internal/guard/risk/risk_test.go +++ b/internal/guard/risk/risk_test.go @@ -1,13 +1,8 @@ package risk import ( - "encoding/json" - "errors" "strings" "testing" - - "github.com/kontext-security/kontext-cli/internal/guard/markov" - "github.com/kontext-security/kontext-cli/internal/guard/trace" ) func TestNormalizeCredentialFileRead(t *testing.T) { @@ -124,8 +119,8 @@ func TestNormalizeRedactsCredentialValuesFromSummaries(t *testing.T) { } } -func TestGuardDecisionBeatsScorer(t *testing.T) { - decision, err := DecideRisk(HookEvent{HookEventName: "PreToolUse", ToolName: "Bash", ToolInput: map[string]any{"command": "drop database"}}, fixedScorer(0)) +func TestDeterministicDecisionBlocksDestructiveCommand(t *testing.T) { + decision, err := DecideRisk(HookEvent{HookEventName: "PreToolUse", ToolName: "Bash", ToolInput: map[string]any{"command": "drop database"}}) if err != nil { t.Fatal(err) } @@ -134,158 +129,22 @@ func TestGuardDecisionBeatsScorer(t *testing.T) { } } -func TestModelRiskDoesNotBlockNormalToolCalls(t *testing.T) { - decision, err := DecideRisk(HookEvent{HookEventName: "PreToolUse", ToolName: "Read", ToolInput: map[string]any{"file_path": "README.md"}}, fixedScorer(0.99)) +func TestDeterministicDecisionAllowsNormalToolCalls(t *testing.T) { + decision, err := DecideRisk(HookEvent{HookEventName: "PreToolUse", ToolName: "Read", ToolInput: map[string]any{"file_path": "README.md"}}) if err != nil { t.Fatal(err) } if decision.Decision != DecisionAllow { t.Fatalf("decision = %s", decision.Decision) } - if decision.RiskScore == nil || *decision.RiskScore != 0.99 { - t.Fatalf("risk score was not recorded: %+v", decision.RiskScore) - } } -func TestAsyncTelemetryStillGetsScore(t *testing.T) { - decision, err := DecideRisk(HookEvent{HookEventName: "UserPromptSubmit", ToolName: "Read"}, fixedScorer(0.42)) +func TestAsyncTelemetryAllowsWithoutRiskModel(t *testing.T) { + decision, err := DecideRisk(HookEvent{HookEventName: "UserPromptSubmit", ToolName: "Read"}) if err != nil { t.Fatal(err) } if decision.Decision != DecisionAllow { t.Fatalf("decision = %s", decision.Decision) } - if decision.RiskScore == nil || *decision.RiskScore != 0.42 { - t.Fatalf("risk score = %+v", decision.RiskScore) - } -} - -func TestNoopScorerReturnsNumericScore(t *testing.T) { - decision, err := DecideRisk(HookEvent{HookEventName: "PreToolUse", ToolName: "Read", ToolInput: map[string]any{"file_path": "README.md"}}, NoopScorer{}) - if err != nil { - t.Fatal(err) - } - if decision.RiskScore == nil || *decision.RiskScore != 0 { - t.Fatalf("risk score = %+v", decision.RiskScore) - } - if decision.Threshold == nil || *decision.Threshold != 0.5 { - t.Fatalf("threshold = %+v", decision.Threshold) - } -} - -func TestDecideRiskReturnsScorerErrors(t *testing.T) { - want := errors.New("model state is invalid") - _, err := DecideRisk(HookEvent{HookEventName: "PreToolUse", ToolName: "Read"}, errorScorer{err: want}) - if !errors.Is(err, want) { - t.Fatalf("err = %v, want %v", err, want) - } -} - -func TestMarkovScorerUsesRiskAbstractionMetadata(t *testing.T) { - model := &markov.Model{ - States: []string{ - "001000000000000000000000", - "001001000000000000000000", - "001110011000000000000000", - }, - StateIndex: map[string]int{ - "001000000000000000000000": 0, - "001001000000000000000000": 1, - "001110011000000000000000": 2, - }, - TransitionProbs: map[int]map[int]float64{ - 0: {0: 1}, - 1: {1: 1}, - 2: {2: 1}, - }, - Metadata: map[string]json.RawMessage{ - "abstraction_version": json.RawMessage(`"coding-risk-v2"`), - }, - } - scorer := &MarkovScorer{ - Model: model, - Threshold: 0.5, - Horizon: 5, - ModelVersion: "test", - Abstraction: trace.RiskCodingAbstraction{}, - Unsafe: trace.IsRiskUnsafeState, - } - - cases := []RiskEvent{ - {Type: EventNormalToolCall}, - {Type: EventCredentialAccess, CredentialObserved: true}, - { - Type: EventDirectProviderAPICall, - CredentialObserved: true, - DirectAPICall: true, - ProviderCategory: "infrastructure", - CommandSummary: "curl https://api.cloudflare.com -H 'Authorization: Bearer token'", - }, - } - for _, item := range cases { - score, err := scorer.Score(item) - if err != nil { - t.Fatal(err) - } - if !score.Known { - t.Fatalf("event %+v mapped to unknown state", item) - } - } -} - -func TestLoadMarkovScorerRejectsMissingAbstractionMetadata(t *testing.T) { - model := &markov.Model{ - States: []string{"000000000000000000000000"}, - StateIndex: map[string]int{"000000000000000000000000": 0}, - TransitionProbs: map[int]map[int]float64{0: {0: 1}}, - } - _, _, err := abstractionFromModel(model) - if err == nil { - t.Fatal("expected missing abstraction metadata error") - } -} - -func TestMarkovScorerUsesBaselineScoreForUnknownState(t *testing.T) { - model := &markov.Model{ - States: []string{"000000000000000000000000"}, - StateIndex: map[string]int{"000000000000000000000000": 0}, - TransitionProbs: map[int]map[int]float64{0: {0: 1}}, - Metadata: map[string]json.RawMessage{ - "abstraction_version": json.RawMessage(`"coding-risk-v2"`), - }, - } - scorer := &MarkovScorer{ - Model: model, - Threshold: 0.5, - Horizon: 5, - ModelVersion: "test", - Abstraction: trace.RiskCodingAbstraction{}, - Unsafe: trace.IsRiskUnsafeState, - } - score, err := scorer.Score(RiskEvent{Type: EventNormalToolCall}) - if err != nil { - t.Fatal(err) - } - if score.Known { - t.Fatal("unknown model state should not be marked known") - } - if score.RiskScore == nil || *score.RiskScore != 0.05 { - t.Fatalf("baseline risk score = %+v", score.RiskScore) - } -} - -type fixedScorer float64 - -func (s fixedScorer) Score(RiskEvent) (ScoreResult, error) { - score := float64(s) - threshold := 0.5 - return ScoreResult{RiskScore: &score, Threshold: &threshold, ModelVersion: "test", Known: true}, nil -} - -type errorScorer struct { - err error -} - -func (s errorScorer) Score(RiskEvent) (ScoreResult, error) { - return ScoreResult{}, s.err } diff --git a/internal/guard/risk/scorer.go b/internal/guard/risk/scorer.go deleted file mode 100644 index cf88873..0000000 --- a/internal/guard/risk/scorer.go +++ /dev/null @@ -1,186 +0,0 @@ -package risk - -import ( - "encoding/json" - "fmt" - "os" - "strings" - - "github.com/kontext-security/kontext-cli/internal/guard/markov" - "github.com/kontext-security/kontext-cli/internal/guard/markov/abstraction" - "github.com/kontext-security/kontext-cli/internal/guard/trace" -) - -type MarkovScorer struct { - Model *markov.Model - Threshold float64 - Horizon int - ModelVersion string - Abstraction abstraction.Interface[trace.Event] - Unsafe func(string) bool -} - -func LoadMarkovScorer(path string, threshold float64, horizon int) (*MarkovScorer, error) { - file, err := os.Open(path) - if err != nil { - return nil, err - } - defer file.Close() - model, err := markov.ReadModelJSON(file) - if err != nil { - return nil, err - } - abs, unsafe, err := abstractionFromModel(model) - if err != nil { - return nil, fmt.Errorf("select model abstraction: %w", err) - } - return &MarkovScorer{ - Model: model, - Threshold: threshold, - Horizon: horizon, - ModelVersion: path, - Abstraction: abs, - Unsafe: unsafe, - }, nil -} - -func ValidateMarkovModel(model *markov.Model) error { - _, _, err := abstractionFromModel(model) - return err -} - -func (s *MarkovScorer) Score(event RiskEvent) (ScoreResult, error) { - if s == nil || s.Model == nil { - return ScoreResult{}, fmt.Errorf("markov scorer model is nil") - } - traceEvent := riskEventToTrace(event) - abs := s.Abstraction - if abs == nil { - return ScoreResult{}, fmt.Errorf("markov scorer abstraction is nil") - } - unsafePredicate := s.Unsafe - if unsafePredicate == nil { - return ScoreResult{}, fmt.Errorf("markov scorer unsafe predicate is nil") - } - state, err := abs.Encode(traceEvent) - if err != nil { - return ScoreResult{}, err - } - index, ok := s.Model.IndexForState(state) - threshold := s.Threshold - result := ScoreResult{Threshold: &threshold, ModelVersion: s.ModelVersion} - if !ok { - score := baselineScore(event) - result.RiskScore = &score - return result, nil - } - unsafe := trace.UnsafeStates(s.Model.StateIndex, unsafePredicate) - riskScore, err := markov.HorizonReachabilityProbability(s.Model, index, unsafe, s.Horizon) - if err != nil { - return ScoreResult{}, err - } - result.RiskScore = &riskScore - result.Known = true - return result, nil -} - -func baselineScore(event RiskEvent) float64 { - switch event.Type { - case EventDestructiveProviderOperation: - return 0.95 - case EventDirectProviderAPICall: - return 0.85 - case EventCredentialAccess: - return 0.72 - case EventUnknown: - return 0.65 - default: - return 0.05 - } -} - -func abstractionFromModel(model *markov.Model) (abstraction.Interface[trace.Event], func(string) bool, error) { - if model == nil { - return nil, nil, fmt.Errorf("model is nil") - } - raw, ok := model.Metadata["abstraction_version"] - if !ok { - return nil, nil, fmt.Errorf("model metadata missing abstraction_version") - } - version := "" - if err := json.Unmarshal(raw, &version); err != nil { - var wrapped map[string]any - if wrappedErr := json.Unmarshal(raw, &wrapped); wrappedErr != nil { - return nil, nil, fmt.Errorf("decode abstraction_version: %w", err) - } - value, ok := wrapped["abstraction_version"].(string) - if !ok { - return nil, nil, fmt.Errorf("abstraction_version is not a string") - } - version = value - } - switch strings.TrimSpace(version) { - case trace.CodingAbstractionVersion: - return trace.CodingAbstraction{}, trace.IsFailureState, nil - case trace.RiskAbstractionVersion: - return trace.RiskCodingAbstraction{}, trace.IsRiskUnsafeState, nil - default: - return nil, nil, fmt.Errorf("unsupported abstraction_version %q", version) - } -} - -func riskEventToTrace(event RiskEvent) trace.Event { - category := trace.ToolCategoryOther - name := string(event.Type) - switch event.Type { - case EventCredentialAccess: - category = trace.ToolCategoryRead - case EventDirectProviderAPICall: - category = trace.ToolCategoryBashNet - case EventDestructiveProviderOperation: - category = trace.ToolCategoryBash - case EventManagedToolCall: - category = trace.ToolCategoryMCP - case EventNormalToolCall: - category = trace.ToolCategoryOther - } - metadata := map[string]any{} - addStringMetadata(metadata, "provider", event.Provider) - addStringMetadata(metadata, "provider_category", event.ProviderCategory) - addStringMetadata(metadata, "operation", event.Operation) - addStringMetadata(metadata, "operation_class", event.OperationClass) - addStringMetadata(metadata, "resource_class", event.ResourceClass) - addStringMetadata(metadata, "environment", event.Environment) - addStringMetadata(metadata, "command_summary", event.CommandSummary) - addStringMetadata(metadata, "request_summary", event.RequestSummary) - if event.Type == EventCredentialAccess { - metadata["credential_access"] = true - } - if event.CredentialObserved { - metadata["credential_observed"] = true - } - if event.DirectAPICall || event.Type == EventDirectProviderAPICall { - metadata["direct_provider_api_call"] = true - } - if event.ExplicitUserIntent { - metadata["explicit_user_intent"] = true - } - for _, signal := range event.Signals { - metadata[signal] = true - } - return trace.Event{ - Actor: trace.ActorTool, - Kind: trace.KindTool, - ToolName: name, - ToolCategory: category, - Metadata: metadata, - } -} - -func addStringMetadata(metadata map[string]any, key, value string) { - value = strings.TrimSpace(value) - if value == "" || value == "unknown" { - return - } - metadata[key] = value -} diff --git a/internal/guard/risk/types.go b/internal/guard/risk/types.go index 679927e..85a750e 100644 --- a/internal/guard/risk/types.go +++ b/internal/guard/risk/types.go @@ -92,30 +92,6 @@ type RiskDecision struct { RiskEvent RiskEvent `json:"risk_event"` } -type Scorer interface { - Score(event RiskEvent) (ScoreResult, error) -} - -type ScoreResult struct { - RiskScore *float64 - Threshold *float64 - ModelVersion string - Known bool -} - -type NoopScorer struct{} - -func (NoopScorer) Score(RiskEvent) (ScoreResult, error) { - score := 0.0 - threshold := 0.5 - return ScoreResult{ - RiskScore: &score, - Threshold: &threshold, - ModelVersion: "none", - Known: false, - }, nil -} - func MarshalInput(value map[string]any) string { if len(value) == 0 { return "" diff --git a/internal/guard/trace/abstraction.go b/internal/guard/trace/abstraction.go deleted file mode 100644 index 88ec45c..0000000 --- a/internal/guard/trace/abstraction.go +++ /dev/null @@ -1,173 +0,0 @@ -package trace - -import ( - "strings" -) - -const CodingAbstractionVersion = "coding-v1" - -// CodingAbstraction maps coding-agent events into safety-relevant state bits. -// -// Bit layout: -// 0 user prompt -// 1 agent reply -// 2 tool call -// 3 write/edit operation -// 4 shell-like operation -// 5 git operation -// 6 failed tool -// 7 user pushback -// 8 commit -// 9 agent-authored/vibe-coded commit -// 10 vulnerability introduced -// 11 agent asked user for clarification -// 12 hard interruption -// 13 plan-mode boundary -type CodingAbstraction struct{} - -func (CodingAbstraction) Encode(event Event) (string, error) { - bits := []byte("00000000000000") - if event.Actor == ActorUser || event.Kind == KindPrompt { - bits[0] = '1' - } - if event.Actor == ActorAgent || event.Kind == KindReply { - bits[1] = '1' - } - if event.Kind == KindTool || event.Actor == ActorTool { - bits[2] = '1' - } - if event.Kind == KindEdit || event.ToolCategory == ToolCategoryWrite || event.ToolCategory == ToolCategoryEdit || - event.FilesChanged > 0 || event.LinesAdded > 0 || event.LinesDeleted > 0 { - bits[3] = '1' - } - tool := strings.ToLower(event.ToolName) - if event.ToolCategory == ToolCategoryBash || event.ToolCategory == ToolCategoryBashFile || - event.ToolCategory == ToolCategoryBashBuild || event.ToolCategory == ToolCategoryBashNet || - strings.Contains(tool, "bash") || strings.Contains(tool, "shell") || strings.Contains(tool, "terminal") { - bits[4] = '1' - } - if event.ToolCategory == ToolCategoryGit || strings.Contains(tool, "git") || event.Kind == KindCommit { - bits[5] = '1' - } - if event.ToolStatus == ToolStatusFailure { - bits[6] = '1' - } - if event.PushbackType == PushbackCorrection || event.PushbackType == PushbackRejection || event.PushbackType == PushbackFailureReport || - (event.Annotations != nil && (event.Annotations.PushbackType == PushbackCorrection || - event.Annotations.PushbackType == PushbackRejection || - event.Annotations.PushbackType == PushbackFailureReport)) { - bits[7] = '1' - } - if event.Kind == KindCommit { - bits[8] = '1' - } - if event.CommitOutcome != nil && event.CommitOutcome.AgentAuthoredRatio >= 0.99 { - bits[9] = '1' - } - if event.CommitOutcome != nil && event.CommitOutcome.NewVulnerabilities > 0 { - bits[10] = '1' - } - if event.ToolCategory == ToolCategoryAskUser { - bits[11] = '1' - } - if event.Kind == KindInterrupt || (event.Kind == KindUnknown && strings.Contains(strings.ToLower(event.ToolName), "interrupted")) { - bits[12] = '1' - } - if event.ToolCategory == ToolCategoryEnterPlan || event.ToolCategory == ToolCategoryExitPlan { - bits[13] = '1' - } - return string(bits), nil -} - -func (CodingAbstraction) Decode(state string) (Event, error) { - event := Event{} - if len(state) > 0 && state[0] == '1' { - event.Actor = ActorUser - event.Kind = KindPrompt - } - if len(state) > 1 && state[1] == '1' { - event.Actor = ActorAgent - event.Kind = KindReply - } - if len(state) > 2 && state[2] == '1' { - event.Actor = ActorTool - event.Kind = KindTool - } - if len(state) > 6 && state[6] == '1' { - event.ToolStatus = ToolStatusFailure - } - if len(state) > 7 && state[7] == '1' { - event.PushbackType = PushbackCorrection - } - if len(state) > 8 && state[8] == '1' { - event.Kind = KindCommit - } - if len(state) > 9 && state[9] == '1' { - event.CommitOutcome = &CommitOutcome{AgentAuthoredRatio: 1, CodingMode: CodingModeVibe} - } - if len(state) > 10 && state[10] == '1' { - if event.CommitOutcome == nil { - event.CommitOutcome = &CommitOutcome{} - } - event.CommitOutcome.NewVulnerabilities = 1 - } - if len(state) > 11 && state[11] == '1' { - event.ToolCategory = ToolCategoryAskUser - } - if len(state) > 13 && state[13] == '1' { - event.ToolCategory = ToolCategoryEnterPlan - } - return event, nil -} - -func (CodingAbstraction) ValidTransition(from, to string) bool { - return true -} - -func (CodingAbstraction) StateInterpretation(states []string) map[string]map[string]bool { - names := []string{ - "user_prompt", - "agent_reply", - "tool_call", - "write_operation", - "shell_operation", - "git_operation", - "failed_tool", - "user_pushback", - "commit", - "agent_authored_commit", - "vulnerability_introduced", - "agent_asked_user", - "hard_interruption", - "plan_mode_boundary", - } - result := make(map[string]map[string]bool, len(states)) - for _, state := range states { - interpretation := make(map[string]bool, len(names)) - for i, name := range names { - interpretation[name] = i < len(state) && state[i] == '1' - } - result[state] = interpretation - } - return result -} - -// UnsafeStates returns model state indexes that match the supplied predicate. -func UnsafeStates(stateIndex map[string]int, match func(state string) bool) map[int]struct{} { - unsafe := map[int]struct{}{} - for state, index := range stateIndex { - if match(state) { - unsafe[index] = struct{}{} - } - } - return unsafe -} - -// IsFailureState is a reasonable default unsafe predicate for coding-agent -// replay: failed tools, user pushback, or newly introduced vulnerabilities. -func IsFailureState(state string) bool { - return (len(state) > 6 && state[6] == '1') || - (len(state) > 7 && state[7] == '1') || - (len(state) > 10 && state[10] == '1') || - (len(state) > 12 && state[12] == '1') -} diff --git a/internal/guard/trace/event.go b/internal/guard/trace/event.go deleted file mode 100644 index bd4acbc..0000000 --- a/internal/guard/trace/event.go +++ /dev/null @@ -1,283 +0,0 @@ -package trace - -import ( - "bufio" - "encoding/json" - "fmt" - "io" - "sort" - "time" -) - -// Event is the package's canonical historical trace unit. -// -// Source datasets should be adapted into this shape before learning a Markov-chain model. -// The fields intentionally capture behavior that matters for proactive -// evaluation rather than preserving every source-specific column. -type Event struct { - SessionID string `json:"session_id"` - CheckpointID string `json:"checkpoint_id,omitempty"` - Repository string `json:"repository,omitempty"` - Agent string `json:"agent,omitempty"` - TurnID string `json:"turn_id,omitempty"` - Step int `json:"step"` - Timestamp time.Time `json:"timestamp,omitempty"` - Actor Actor `json:"actor"` - Kind Kind `json:"kind"` - ToolName string `json:"tool_name,omitempty"` - ToolCategory ToolCategory `json:"tool_category,omitempty"` - ToolStatus ToolStatus `json:"tool_status,omitempty"` - PromptIntent PromptIntent `json:"prompt_intent,omitempty"` - PushbackType PushbackType `json:"pushback_type,omitempty"` - FilesChanged int `json:"files_changed,omitempty"` - LinesAdded int `json:"lines_added,omitempty"` - LinesDeleted int `json:"lines_deleted,omitempty"` - TokensInput int `json:"tokens_input,omitempty"` - TokensOutput int `json:"tokens_output,omitempty"` - TokensCache int `json:"tokens_cache,omitempty"` - CostUSD float64 `json:"cost_usd,omitempty"` - DurationMS int64 `json:"duration_ms,omitempty"` - CommitOutcome *CommitOutcome `json:"commit_outcome,omitempty"` - Annotations *Annotations `json:"annotations,omitempty"` - Metadata map[string]any `json:"metadata,omitempty"` -} - -type Actor string - -const ( - ActorUser Actor = "user" - ActorAgent Actor = "agent" - ActorTool Actor = "tool" - ActorOther Actor = "other" -) - -type Kind string - -const ( - KindPrompt Kind = "prompt" - KindReply Kind = "reply" - KindTool Kind = "tool" - KindEdit Kind = "edit" - KindCommit Kind = "commit" - KindReview Kind = "review" - KindInterrupt Kind = "interrupt" - KindUnknown Kind = "unknown" -) - -type ToolStatus string - -const ( - ToolStatusUnset ToolStatus = "" - ToolStatusSuccess ToolStatus = "success" - ToolStatusFailure ToolStatus = "failure" -) - -type ToolCategory string - -const ( - ToolCategoryRead ToolCategory = "read" - ToolCategoryGrep ToolCategory = "grep" - ToolCategoryGlob ToolCategory = "glob" - ToolCategoryBashFile ToolCategory = "bash:file" - ToolCategoryBashBuild ToolCategory = "bash:build" - ToolCategoryBashNet ToolCategory = "bash:net" - ToolCategoryBash ToolCategory = "bash" - ToolCategoryGit ToolCategory = "git/gh" - ToolCategoryWrite ToolCategory = "write" - ToolCategoryEdit ToolCategory = "edit" - ToolCategoryWeb ToolCategory = "web" - ToolCategoryAgent ToolCategory = "agent" - ToolCategoryMCP ToolCategory = "mcp" - ToolCategoryTodoWrite ToolCategory = "TodoWrite" - ToolCategoryToolSearch ToolCategory = "ToolSearch" - ToolCategoryAskUser ToolCategory = "AskUserQuestion" - ToolCategorySkill ToolCategory = "Skill" - ToolCategoryEnterPlan ToolCategory = "EnterPlanMode" - ToolCategoryExitPlan ToolCategory = "ExitPlanMode" - ToolCategoryOther ToolCategory = "other" - ToolCategoryUnclassified ToolCategory = "" -) - -type PromptIntent string - -const ( - PromptIntentCreate PromptIntent = "create new code" - PromptIntentRefactor PromptIntent = "refactor" - PromptIntentDebug PromptIntent = "debug" - PromptIntentUnderstand PromptIntent = "understand" - PromptIntentConnect PromptIntent = "connect" - PromptIntentGit PromptIntent = "git" - PromptIntentTest PromptIntent = "test" - PromptIntentOther PromptIntent = "other" -) - -type PushbackType string - -const ( - PushbackNone PushbackType = "" - PushbackCorrection PushbackType = "correction" - PushbackRejection PushbackType = "rejection" - PushbackFailureReport PushbackType = "failure_report" - PushbackNonPushback PushbackType = "non_pushback" -) - -type Persona string - -const ( - PersonaExpertNitpicker Persona = "Expert Nitpicker" - PersonaVagueRequester Persona = "Vague Requester" - PersonaMindChanger Persona = "Mind Changer" - PersonaOther Persona = "Other" -) - -type CodingMode string - -const ( - CodingModeHumanOnly CodingMode = "human-only" - CodingModeCollaborative CodingMode = "collaborative" - CodingModeVibe CodingMode = "vibe coding" -) - -type CommitOutcome struct { - CommitSHA string `json:"commit_sha,omitempty"` - CommittedLines int `json:"committed_lines,omitempty"` - AgentAuthoredRatio float64 `json:"agent_authored_ratio,omitempty"` - AgentLinesProduced int `json:"agent_lines_produced,omitempty"` - AgentLinesSurvived int `json:"agent_lines_survived,omitempty"` - AgentLinesFinal int `json:"agent_lines_final,omitempty"` - AgentSelfOverwriteLines int `json:"agent_self_overwrite_lines,omitempty"` - HumanOverwriteLines int `json:"human_overwrite_lines,omitempty"` - HumanDeletionLines int `json:"human_deletion_lines,omitempty"` - NewVulnerabilities int `json:"new_vulnerabilities,omitempty"` - FixedVulnerabilities int `json:"fixed_vulnerabilities,omitempty"` - IntroducedVulnerabilityCWEs []string `json:"introduced_vulnerability_cwes,omitempty"` - CodingMode CodingMode `json:"coding_mode,omitempty"` -} - -type Annotations struct { - SessionSuccessScore int `json:"session_success_score,omitempty"` - Persona Persona `json:"persona,omitempty"` - RepositoryDomain string `json:"repository_domain,omitempty"` - RepositoryAudience string `json:"repository_audience,omitempty"` - PushbackType PushbackType `json:"pushback_type,omitempty"` - PromptIntent PromptIntent `json:"prompt_intent,omitempty"` -} - -// Session is one ordered coding-agent interaction trace. -type Session struct { - ID string `json:"id"` - Repository string `json:"repository,omitempty"` - Agent string `json:"agent,omitempty"` - CheckpointIDs []string `json:"checkpoint_ids,omitempty"` - SuccessScore int `json:"success_score,omitempty"` - Persona Persona `json:"persona,omitempty"` - CodingMode CodingMode `json:"coding_mode,omitempty"` - AgentAuthoredRatio float64 `json:"agent_authored_ratio,omitempty"` - Metadata map[string]any `json:"metadata,omitempty"` - Events []Event `json:"events"` -} - -// GroupSessions groups flat events by session and sorts each trace by Step. -func GroupSessions(events []Event) []Session { - byID := map[string][]Event{} - for _, event := range events { - byID[event.SessionID] = append(byID[event.SessionID], event) - } - - ids := make([]string, 0, len(byID)) - for id := range byID { - ids = append(ids, id) - } - sort.Strings(ids) - - sessions := make([]Session, 0, len(ids)) - for _, id := range ids { - trace := byID[id] - sort.SliceStable(trace, func(i, j int) bool { - if !trace[i].Timestamp.IsZero() && !trace[j].Timestamp.IsZero() && !trace[i].Timestamp.Equal(trace[j].Timestamp) { - return trace[i].Timestamp.Before(trace[j].Timestamp) - } - return trace[i].Step < trace[j].Step - }) - session := Session{ID: id, Events: trace} - checkpoints := map[string]struct{}{} - for _, event := range trace { - if session.Repository == "" { - session.Repository = event.Repository - } - if session.Agent == "" { - session.Agent = event.Agent - } - if event.CheckpointID != "" { - checkpoints[event.CheckpointID] = struct{}{} - } - if event.Annotations != nil { - if session.SuccessScore == 0 { - session.SuccessScore = event.Annotations.SessionSuccessScore - } - if session.Persona == "" { - session.Persona = event.Annotations.Persona - } - } - if event.CommitOutcome != nil { - if session.CodingMode == "" { - session.CodingMode = event.CommitOutcome.CodingMode - } - if session.AgentAuthoredRatio == 0 { - session.AgentAuthoredRatio = event.CommitOutcome.AgentAuthoredRatio - } - } - } - for checkpoint := range checkpoints { - session.CheckpointIDs = append(session.CheckpointIDs, checkpoint) - } - sort.Strings(session.CheckpointIDs) - sessions = append(sessions, session) - } - return sessions -} - -// Observations converts sessions into logs suitable for markov.BuildModel. -func Observations(sessions []Session) [][]Event { - logs := make([][]Event, 0, len(sessions)) - for _, session := range sessions { - if len(session.Events) == 0 { - continue - } - logs = append(logs, append([]Event(nil), session.Events...)) - } - return logs -} - -// ReadJSONL reads one Event per line. -func ReadJSONL(r io.Reader) ([]Event, error) { - scanner := bufio.NewScanner(r) - var events []Event - line := 0 - for scanner.Scan() { - line++ - if len(scanner.Bytes()) == 0 { - continue - } - var event Event - if err := json.Unmarshal(scanner.Bytes(), &event); err != nil { - return nil, fmt.Errorf("decode JSONL line %d: %w", line, err) - } - events = append(events, event) - } - if err := scanner.Err(); err != nil { - return nil, err - } - return events, nil -} - -// WriteJSONL writes one Event per line. -func WriteJSONL(w io.Writer, events []Event) error { - encoder := json.NewEncoder(w) - for _, event := range events { - if err := encoder.Encode(event); err != nil { - return err - } - } - return nil -} diff --git a/internal/guard/trace/replay_test.go b/internal/guard/trace/replay_test.go deleted file mode 100644 index b806216..0000000 --- a/internal/guard/trace/replay_test.go +++ /dev/null @@ -1,69 +0,0 @@ -package trace - -import ( - "os" - "testing" - - "github.com/kontext-security/kontext-cli/internal/guard/markov" - "github.com/kontext-security/kontext-cli/internal/guard/markov/monitor" -) - -func TestEndToEndReplayFixture(t *testing.T) { - t.Parallel() - - file, err := os.Open("testdata/coding_sessions.jsonl") - if err != nil { - t.Fatalf("open fixture: %v", err) - } - defer file.Close() - - events, err := ReadJSONL(file) - if err != nil { - t.Fatalf("ReadJSONL returned error: %v", err) - } - sessions := GroupSessions(events) - model, err := markov.BuildModel(Observations(sessions), CodingAbstraction{}, markov.BuildOptions{Alpha: 1}) - if err != nil { - t.Fatalf("BuildModel returned error: %v", err) - } - - unsafe := UnsafeStates(model.StateIndex, IsFailureState) - if len(unsafe) == 0 { - t.Fatal("expected fixture to produce unsafe states") - } - - replayMonitor := monitor.Monitor[Event]{ - Model: model, - Abstraction: CodingAbstraction{}, - Unsafe: unsafe, - Threshold: 0.5, - } - - riskyDecision, err := replayMonitor.Observe(Event{ - Actor: ActorTool, - Kind: KindTool, - ToolName: "Bash npm test", - ToolCategory: ToolCategoryBashBuild, - ToolStatus: ToolStatusFailure, - }) - if err != nil { - t.Fatalf("Observe risky event returned error: %v", err) - } - if !riskyDecision.Intervention { - t.Fatalf("expected risky event to trigger intervention, got risk %.3f", riskyDecision.Risk) - } - - benignDecision, err := replayMonitor.Observe(Event{ - Actor: ActorTool, - Kind: KindTool, - ToolName: "Read", - ToolCategory: ToolCategoryRead, - ToolStatus: ToolStatusSuccess, - }) - if err != nil { - t.Fatalf("Observe benign event returned error: %v", err) - } - if benignDecision.Risk >= riskyDecision.Risk { - t.Fatalf("benign risk %.3f should be lower than risky risk %.3f", benignDecision.Risk, riskyDecision.Risk) - } -} diff --git a/internal/guard/trace/risk_abstraction.go b/internal/guard/trace/risk_abstraction.go deleted file mode 100644 index 1981dd3..0000000 --- a/internal/guard/trace/risk_abstraction.go +++ /dev/null @@ -1,311 +0,0 @@ -package trace - -import ( - "fmt" - "strings" -) - -const RiskAbstractionVersion = "coding-risk-v2" - -var RiskUnsafeDefinition = []string{ - "policy_block", - "failed_tool", - "hard_interruption", - "vulnerability_introduced", - "direct_infrastructure_api_with_managed_credential", - "unapproved_destructive_persistent_or_production_operation", -} - -// RiskCodingAbstraction maps agent trace events into risk-oriented state bits. -// -// Bit layout: -// 0 user_prompt -// 1 agent_reply -// 2 tool_call -// 3 shell_operation -// 4 network_operation -// 5 credential_access -// 6 managed_credential_use -// 7 direct_provider_api_call -// 8 infrastructure_provider -// 9 destructive_operation -// 10 persistent_data_resource -// 11 production_environment -// 12 explicit_user_approval -// 13 policy_ask -// 14 policy_block -// 15 failed_tool -// 16 user_pushback -// 17 hard_interruption -// 18 vulnerability_introduced -// 19 unknown_or_low_confidence -// 20 managed_tool_call -// 21 write_operation -// 22 source_control_provider -// 23 identity_or_docs_provider -type RiskCodingAbstraction struct{} - -func (RiskCodingAbstraction) Encode(event Event) (string, error) { - bits := []byte(strings.Repeat("0", len(riskSignalNames))) - tool := strings.ToLower(event.ToolName) - meta := metadataText(event.Metadata) - text := strings.ToLower(strings.Join([]string{tool, meta, string(event.ToolCategory), string(event.Kind)}, " ")) - - set := func(index int) { - bits[index] = '1' - } - - if event.Actor == ActorUser || event.Kind == KindPrompt { - set(riskSignalUserPrompt) - } - if event.Actor == ActorAgent || event.Kind == KindReply { - set(riskSignalAgentReply) - } - if event.Kind == KindTool || event.Kind == KindEdit || event.Actor == ActorTool { - set(riskSignalToolCall) - } - if isShellEvent(event, tool) { - set(riskSignalShellOperation) - } - if isNetworkEvent(event, text) { - set(riskSignalNetworkOperation) - } - if isCredentialAccess(event, text) { - set(riskSignalCredentialAccess) - } - if isManagedCredentialUse(event, text) { - set(riskSignalManagedCredentialUse) - } - if isDirectProviderAPICall(event, text) { - set(riskSignalDirectProviderAPICall) - } - if isInfrastructureProvider(text) { - set(riskSignalInfrastructureProvider) - } - if isDestructiveOperation(text) { - set(riskSignalDestructiveOperation) - } - if isPersistentDataResource(text) { - set(riskSignalPersistentDataResource) - } - if strings.Contains(text, "production") || strings.Contains(text, " prod ") { - set(riskSignalProductionEnvironment) - } - if strings.Contains(text, "explicit_user_intent") || strings.Contains(text, "approved_by_user") || strings.Contains(text, "user_approved") { - set(riskSignalExplicitUserApproval) - } - if metadataBool(event.Metadata, "kontext_warn") || strings.Contains(text, "policy_ask") || strings.Contains(text, "permissionDecision:ask") { - set(riskSignalPolicyAsk) - } - if strings.Contains(text, "policy_block") || strings.Contains(text, "permissionDecision:deny") { - set(riskSignalPolicyBlock) - } - if event.ToolStatus == ToolStatusFailure { - set(riskSignalFailedTool) - } - if event.PushbackType == PushbackCorrection || event.PushbackType == PushbackRejection || event.PushbackType == PushbackFailureReport || - (event.Annotations != nil && (event.Annotations.PushbackType == PushbackCorrection || - event.Annotations.PushbackType == PushbackRejection || - event.Annotations.PushbackType == PushbackFailureReport)) { - set(riskSignalUserPushback) - } - if event.Kind == KindInterrupt || (event.Kind == KindUnknown && strings.Contains(tool, "interrupted")) { - set(riskSignalHardInterruption) - } - if event.CommitOutcome != nil && event.CommitOutcome.NewVulnerabilities > 0 { - set(riskSignalVulnerabilityIntroduced) - } - if event.ToolCategory == ToolCategoryUnclassified || strings.Contains(text, "unknown") || event.ToolName == "" && event.Kind == KindTool { - set(riskSignalUnknownOrLowConfidence) - } - if event.ToolCategory == ToolCategoryMCP || strings.Contains(text, "managed_tool_call") || strings.Contains(text, "execute_tool") || strings.Contains(text, "remote_execute_tool") { - set(riskSignalManagedToolCall) - } - if event.Kind == KindEdit || event.ToolCategory == ToolCategoryWrite || event.ToolCategory == ToolCategoryEdit || - event.FilesChanged > 0 || event.LinesAdded > 0 || event.LinesDeleted > 0 { - set(riskSignalWriteOperation) - } - if isSourceControlProvider(text) { - set(riskSignalSourceControlProvider) - } - if isIdentityOrDocsProvider(text) { - set(riskSignalIdentityOrDocsProvider) - } - return string(bits), nil -} - -func (RiskCodingAbstraction) Decode(state string) (Event, error) { - event := Event{} - if bit(state, riskSignalUserPrompt) { - event.Actor = ActorUser - event.Kind = KindPrompt - } - if bit(state, riskSignalToolCall) { - event.Actor = ActorTool - event.Kind = KindTool - } - if bit(state, riskSignalFailedTool) { - event.ToolStatus = ToolStatusFailure - } - if bit(state, riskSignalHardInterruption) { - event.Kind = KindInterrupt - } - return event, nil -} - -func (RiskCodingAbstraction) ValidTransition(from, to string) bool { - return true -} - -func (RiskCodingAbstraction) StateInterpretation(states []string) map[string]map[string]bool { - result := make(map[string]map[string]bool, len(states)) - for _, state := range states { - interpretation := make(map[string]bool, len(riskSignalNames)) - for i, name := range riskSignalNames { - interpretation[name] = i < len(state) && state[i] == '1' - } - result[state] = interpretation - } - return result -} - -func IsRiskUnsafeState(state string) bool { - return bit(state, riskSignalPolicyBlock) || bit(state, riskSignalFailedTool) || - bit(state, riskSignalHardInterruption) || bit(state, riskSignalVulnerabilityIntroduced) || - (bit(state, riskSignalDirectProviderAPICall) && bit(state, riskSignalManagedCredentialUse) && bit(state, riskSignalInfrastructureProvider)) || - (bit(state, riskSignalDestructiveOperation) && (bit(state, riskSignalPersistentDataResource) || bit(state, riskSignalProductionEnvironment)) && !bit(state, riskSignalExplicitUserApproval)) -} - -const ( - riskSignalUserPrompt = iota - riskSignalAgentReply - riskSignalToolCall - riskSignalShellOperation - riskSignalNetworkOperation - riskSignalCredentialAccess - riskSignalManagedCredentialUse - riskSignalDirectProviderAPICall - riskSignalInfrastructureProvider - riskSignalDestructiveOperation - riskSignalPersistentDataResource - riskSignalProductionEnvironment - riskSignalExplicitUserApproval - riskSignalPolicyAsk - riskSignalPolicyBlock - riskSignalFailedTool - riskSignalUserPushback - riskSignalHardInterruption - riskSignalVulnerabilityIntroduced - riskSignalUnknownOrLowConfidence - riskSignalManagedToolCall - riskSignalWriteOperation - riskSignalSourceControlProvider - riskSignalIdentityOrDocsProvider -) - -var riskSignalNames = []string{ - "user_prompt", - "agent_reply", - "tool_call", - "shell_operation", - "network_operation", - "credential_access", - "managed_credential_use", - "direct_provider_api_call", - "infrastructure_provider", - "destructive_operation", - "persistent_data_resource", - "production_environment", - "explicit_user_approval", - "policy_ask", - "policy_block", - "failed_tool", - "user_pushback", - "hard_interruption", - "vulnerability_introduced", - "unknown_or_low_confidence", - "managed_tool_call", - "write_operation", - "source_control_provider", - "identity_or_docs_provider", -} - -func bit(state string, index int) bool { - return len(state) > index && state[index] == '1' -} - -func isShellEvent(event Event, tool string) bool { - return event.ToolCategory == ToolCategoryBash || event.ToolCategory == ToolCategoryBashFile || - event.ToolCategory == ToolCategoryBashBuild || event.ToolCategory == ToolCategoryBashNet || - strings.Contains(tool, "bash") || strings.Contains(tool, "shell") || strings.Contains(tool, "terminal") -} - -func isNetworkEvent(event Event, text string) bool { - return event.ToolCategory == ToolCategoryBashNet || event.ToolCategory == ToolCategoryWeb || - strings.Contains(text, "curl") || strings.Contains(text, "wget") || strings.Contains(text, "http") -} - -func isCredentialAccess(event Event, text string) bool { - return strings.Contains(text, ".env") || strings.Contains(text, ".npmrc") || strings.Contains(text, ".pypirc") || - strings.Contains(text, ".netrc") || strings.Contains(text, ".aws") || strings.Contains(text, ".gcloud") || - strings.Contains(text, "credential_access") -} - -func isManagedCredentialUse(event Event, text string) bool { - return strings.Contains(text, "credentialkind") || strings.Contains(text, "credential_kind") || - strings.Contains(text, "credential_exchange") || strings.Contains(text, "broker_credential") || - strings.Contains(text, "authenticated_call") || strings.Contains(text, "provider_token_exchange") -} - -func isDirectProviderAPICall(event Event, text string) bool { - if strings.Contains(text, "direct_provider_api_call") { - return true - } - return isShellEvent(event, strings.ToLower(event.ToolName)) && (strings.Contains(text, "curl") || strings.Contains(text, "authorization") || strings.Contains(text, "bearer")) -} - -func isInfrastructureProvider(text string) bool { - return strings.Contains(text, "railway") || strings.Contains(text, "vercel") || strings.Contains(text, "cloudflare") || - strings.Contains(text, "aws") || strings.Contains(text, "googleapis") || strings.Contains(text, "gcloud") || - strings.Contains(text, "digitalocean") || strings.Contains(text, "database") || strings.Contains(text, "bucket") -} - -func isSourceControlProvider(text string) bool { - return strings.Contains(text, "github") || strings.Contains(text, "gitlab") || strings.Contains(text, "pull_request") || - strings.Contains(text, "repository") || strings.Contains(text, "commit") -} - -func isIdentityOrDocsProvider(text string) bool { - return strings.Contains(text, "notion") || strings.Contains(text, "google") || strings.Contains(text, "slack") || - strings.Contains(text, "linear") || strings.Contains(text, "user") || strings.Contains(text, "team") -} - -func isDestructiveOperation(text string) bool { - return strings.Contains(text, "delete") || strings.Contains(text, "destroy") || strings.Contains(text, "drop") || - strings.Contains(text, "truncate") || strings.Contains(text, "wipe") || strings.Contains(text, "remove") -} - -func isPersistentDataResource(text string) bool { - return strings.Contains(text, "database") || strings.Contains(text, "volume") || strings.Contains(text, "backup") || - strings.Contains(text, "bucket") || strings.Contains(text, "project") -} - -func metadataText(metadata map[string]any) string { - if len(metadata) == 0 { - return "" - } - var b strings.Builder - for key, value := range metadata { - fmt.Fprintf(&b, " %s:%v", key, value) - } - return b.String() -} - -func metadataBool(metadata map[string]any, key string) bool { - value, ok := metadata[key] - if !ok { - return false - } - typed, ok := value.(bool) - return ok && typed -} diff --git a/internal/guard/trace/risk_abstraction_test.go b/internal/guard/trace/risk_abstraction_test.go deleted file mode 100644 index 18769e1..0000000 --- a/internal/guard/trace/risk_abstraction_test.go +++ /dev/null @@ -1,37 +0,0 @@ -package trace - -import ( - "encoding/json" - "os" - "reflect" - "testing" -) - -type riskAbstractionSchema struct { - AbstractionVersion string `json:"abstraction_version"` - Signals []string `json:"signals"` - UnsafeDefinition []string `json:"unsafe_definition"` -} - -func TestRiskAbstractionSchemaMatchesRuntime(t *testing.T) { - raw, err := os.ReadFile("../../../models/guard/coding-risk-v2.schema.json") - if err != nil { - t.Fatal(err) - } - var schema riskAbstractionSchema - if err := json.Unmarshal(raw, &schema); err != nil { - t.Fatal(err) - } - if schema.AbstractionVersion != RiskAbstractionVersion { - t.Fatalf("abstraction version = %q, want %q", schema.AbstractionVersion, RiskAbstractionVersion) - } - if !reflect.DeepEqual(schema.Signals, riskSignalNames) { - t.Fatalf("signals = %#v, want %#v", schema.Signals, riskSignalNames) - } - if !reflect.DeepEqual(schema.UnsafeDefinition, RiskUnsafeDefinition) { - t.Fatalf("unsafe definition = %#v, want %#v", schema.UnsafeDefinition, RiskUnsafeDefinition) - } - if len(riskSignalNames) != riskSignalIdentityOrDocsProvider+1 { - t.Fatalf("risk signal indexes cover %d signals, want %d", riskSignalIdentityOrDocsProvider+1, len(riskSignalNames)) - } -} diff --git a/internal/guard/trace/testdata/coding_sessions.jsonl b/internal/guard/trace/testdata/coding_sessions.jsonl deleted file mode 100644 index 3be9c4b..0000000 --- a/internal/guard/trace/testdata/coding_sessions.jsonl +++ /dev/null @@ -1,15 +0,0 @@ -{"session_id":"clean-1","checkpoint_id":"c-clean-1","repository":"example/app","agent":"claude-code","turn_id":"clean-1:t1","step":1,"actor":"user","kind":"prompt","prompt_intent":"understand"} -{"session_id":"clean-1","checkpoint_id":"c-clean-1","repository":"example/app","agent":"claude-code","turn_id":"clean-1:t1","step":2,"actor":"tool","kind":"tool","tool_name":"Read","tool_category":"read","tool_status":"success"} -{"session_id":"clean-1","checkpoint_id":"c-clean-1","repository":"example/app","agent":"claude-code","turn_id":"clean-1:t1","step":3,"actor":"agent","kind":"reply"} -{"session_id":"clean-2","checkpoint_id":"c-clean-2","repository":"example/app","agent":"claude-code","turn_id":"clean-2:t1","step":1,"actor":"user","kind":"prompt","prompt_intent":"create new code"} -{"session_id":"clean-2","checkpoint_id":"c-clean-2","repository":"example/app","agent":"claude-code","turn_id":"clean-2:t1","step":2,"actor":"tool","kind":"tool","tool_name":"Read","tool_category":"read","tool_status":"success"} -{"session_id":"clean-2","checkpoint_id":"c-clean-2","repository":"example/app","agent":"claude-code","turn_id":"clean-2:t1","step":3,"actor":"tool","kind":"edit","tool_name":"Edit","tool_category":"edit","tool_status":"success","files_changed":1,"lines_added":12,"lines_deleted":1} -{"session_id":"clean-2","checkpoint_id":"c-clean-2","repository":"example/app","agent":"claude-code","turn_id":"clean-2:t1","step":4,"actor":"tool","kind":"commit","tool_name":"git commit","tool_category":"git/gh","tool_status":"success","commit_outcome":{"commit_sha":"abc123","committed_lines":11,"agent_authored_ratio":0.45,"agent_lines_produced":12,"agent_lines_survived":10,"agent_lines_final":10,"coding_mode":"collaborative"}} -{"session_id":"pushback-1","checkpoint_id":"c-push-1","repository":"example/ui","agent":"claude-code","turn_id":"pushback-1:t1","step":1,"actor":"user","kind":"prompt","prompt_intent":"debug"} -{"session_id":"pushback-1","checkpoint_id":"c-push-1","repository":"example/ui","agent":"claude-code","turn_id":"pushback-1:t1","step":2,"actor":"tool","kind":"edit","tool_name":"Edit","tool_category":"edit","tool_status":"success","files_changed":1,"lines_added":4,"lines_deleted":2} -{"session_id":"pushback-1","checkpoint_id":"c-push-1","repository":"example/ui","agent":"claude-code","turn_id":"pushback-1:t2","step":3,"actor":"user","kind":"prompt","prompt_intent":"debug","pushback_type":"correction"} -{"session_id":"failed-tool-1","checkpoint_id":"c-fail-1","repository":"example/infra","agent":"claude-code","turn_id":"failed-tool-1:t1","step":1,"actor":"user","kind":"prompt","prompt_intent":"test"} -{"session_id":"failed-tool-1","checkpoint_id":"c-fail-1","repository":"example/infra","agent":"claude-code","turn_id":"failed-tool-1:t1","step":2,"actor":"tool","kind":"tool","tool_name":"Bash npm test","tool_category":"bash:build","tool_status":"failure","duration_ms":43000} -{"session_id":"vuln-1","checkpoint_id":"c-vuln-1","repository":"example/api","agent":"claude-code","turn_id":"vuln-1:t1","step":1,"actor":"user","kind":"prompt","prompt_intent":"create new code"} -{"session_id":"vuln-1","checkpoint_id":"c-vuln-1","repository":"example/api","agent":"claude-code","turn_id":"vuln-1:t1","step":2,"actor":"tool","kind":"edit","tool_name":"Edit","tool_category":"edit","tool_status":"success","files_changed":1,"lines_added":30} -{"session_id":"vuln-1","checkpoint_id":"c-vuln-1","repository":"example/api","agent":"claude-code","turn_id":"vuln-1:t1","step":3,"actor":"tool","kind":"commit","tool_name":"git commit","tool_category":"git/gh","tool_status":"success","commit_outcome":{"commit_sha":"def456","committed_lines":30,"agent_authored_ratio":1,"agent_lines_produced":45,"agent_lines_survived":30,"agent_lines_final":30,"new_vulnerabilities":1,"introduced_vulnerability_cwes":["CWE-78"],"coding_mode":"vibe coding"}} diff --git a/internal/guard/trace/trace_test.go b/internal/guard/trace/trace_test.go deleted file mode 100644 index 1ee5e3f..0000000 --- a/internal/guard/trace/trace_test.go +++ /dev/null @@ -1,86 +0,0 @@ -package trace - -import ( - "strings" - "testing" - - "github.com/kontext-security/kontext-cli/internal/guard/markov" -) - -func TestGroupSessionsAndBuildModel(t *testing.T) { - t.Parallel() - - events := []Event{ - {SessionID: "s2", Step: 2, Actor: ActorUser, Kind: KindPrompt, PushbackType: PushbackCorrection}, - {SessionID: "s1", CheckpointID: "c1", Repository: "entireio/cli", Step: 2, Actor: ActorTool, Kind: KindTool, ToolCategory: ToolCategoryBashBuild, ToolStatus: ToolStatusFailure}, - {SessionID: "s1", CheckpointID: "c1", Repository: "entireio/cli", Step: 1, Actor: ActorUser, Kind: KindPrompt, PromptIntent: PromptIntentDebug}, - } - - sessions := GroupSessions(events) - if len(sessions) != 2 { - t.Fatalf("session count = %d, want 2", len(sessions)) - } - if sessions[0].ID != "s1" || sessions[0].Events[0].Step != 1 { - t.Fatalf("sessions were not deterministically grouped and sorted: %#v", sessions) - } - if sessions[0].Repository != "entireio/cli" || len(sessions[0].CheckpointIDs) != 1 || sessions[0].CheckpointIDs[0] != "c1" { - t.Fatalf("session metadata was not derived: %#v", sessions[0]) - } - - model, err := markov.BuildModel(Observations(sessions), CodingAbstraction{}, markov.BuildOptions{Alpha: 1}) - if err != nil { - t.Fatalf("BuildModel returned error: %v", err) - } - unsafe := UnsafeStates(model.StateIndex, IsFailureState) - if len(unsafe) == 0 { - t.Fatal("expected at least one unsafe state") - } -} - -func TestJSONL(t *testing.T) { - t.Parallel() - - input := `{"session_id":"s1","step":1,"actor":"user","kind":"prompt"} -{"session_id":"s1","step":2,"actor":"tool","kind":"tool","tool_status":"failure"}` - - events, err := ReadJSONL(strings.NewReader(input)) - if err != nil { - t.Fatalf("ReadJSONL returned error: %v", err) - } - if len(events) != 2 { - t.Fatalf("event count = %d, want 2", len(events)) - } - - var output strings.Builder - if err := WriteJSONL(&output, events); err != nil { - t.Fatalf("WriteJSONL returned error: %v", err) - } - if !strings.Contains(output.String(), `"tool_status":"failure"`) { - t.Fatalf("output missing tool status: %s", output.String()) - } -} - -func TestCodingAbstractionEncodesPaperSignals(t *testing.T) { - t.Parallel() - - event := Event{ - Actor: ActorTool, - Kind: KindCommit, - ToolCategory: ToolCategoryGit, - CommitOutcome: &CommitOutcome{ - AgentAuthoredRatio: 1, - NewVulnerabilities: 2, - CodingMode: CodingModeVibe, - }, - } - - state, err := (CodingAbstraction{}).Encode(event) - if err != nil { - t.Fatalf("Encode returned error: %v", err) - } - for _, index := range []int{2, 5, 8, 9, 10} { - if state[index] != '1' { - t.Fatalf("state[%d] = %q, want 1 in %s", index, state[index], state) - } - } -} diff --git a/internal/guard/web/assets/dist/assets/index-CN9-dys9.js b/internal/guard/web/assets/dist/assets/index-CN9-dys9.js deleted file mode 100644 index ef4f2e0..0000000 --- a/internal/guard/web/assets/dist/assets/index-CN9-dys9.js +++ /dev/null @@ -1,52 +0,0 @@ -function cv(n,l){for(var i=0;ia[c]})}}}return Object.freeze(Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}))}(function(){const l=document.createElement("link").relList;if(l&&l.supports&&l.supports("modulepreload"))return;for(const c of document.querySelectorAll('link[rel="modulepreload"]'))a(c);new MutationObserver(c=>{for(const d of c)if(d.type==="childList")for(const f of d.addedNodes)f.tagName==="LINK"&&f.rel==="modulepreload"&&a(f)}).observe(document,{childList:!0,subtree:!0});function i(c){const d={};return c.integrity&&(d.integrity=c.integrity),c.referrerPolicy&&(d.referrerPolicy=c.referrerPolicy),c.crossOrigin==="use-credentials"?d.credentials="include":c.crossOrigin==="anonymous"?d.credentials="omit":d.credentials="same-origin",d}function a(c){if(c.ep)return;c.ep=!0;const d=i(c);fetch(c.href,d)}})();function tp(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var ha={exports:{}},ho={},ga={exports:{}},ge={};var df;function dv(){if(df)return ge;df=1;var n=Symbol.for("react.element"),l=Symbol.for("react.portal"),i=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),c=Symbol.for("react.profiler"),d=Symbol.for("react.provider"),f=Symbol.for("react.context"),m=Symbol.for("react.forward_ref"),v=Symbol.for("react.suspense"),x=Symbol.for("react.memo"),y=Symbol.for("react.lazy"),S=Symbol.iterator;function C(P){return P===null||typeof P!="object"?null:(P=S&&P[S]||P["@@iterator"],typeof P=="function"?P:null)}var _={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},b=Object.assign,k={};function T(P,I,de){this.props=P,this.context=I,this.refs=k,this.updater=de||_}T.prototype.isReactComponent={},T.prototype.setState=function(P,I){if(typeof P!="object"&&typeof P!="function"&&P!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,P,I,"setState")},T.prototype.forceUpdate=function(P){this.updater.enqueueForceUpdate(this,P,"forceUpdate")};function A(){}A.prototype=T.prototype;function L(P,I,de){this.props=P,this.context=I,this.refs=k,this.updater=de||_}var $=L.prototype=new A;$.constructor=L,b($,T.prototype),$.isPureReactComponent=!0;var M=Array.isArray,U=Object.prototype.hasOwnProperty,Y={current:null},B={key:!0,ref:!0,__self:!0,__source:!0};function ie(P,I,de){var me,ve={},ye=null,we=null;if(I!=null)for(me in I.ref!==void 0&&(we=I.ref),I.key!==void 0&&(ye=""+I.key),I)U.call(I,me)&&!B.hasOwnProperty(me)&&(ve[me]=I[me]);var Se=arguments.length-2;if(Se===1)ve.children=de;else if(1>>1,I=D[P];if(0>>1;Pc(ve,V))yec(we,ve)?(D[P]=we,D[ye]=V,P=ye):(D[P]=ve,D[me]=V,P=me);else if(yec(we,V))D[P]=we,D[ye]=V,P=ye;else break e}}return Q}function c(D,Q){var V=D.sortIndex-Q.sortIndex;return V!==0?V:D.id-Q.id}if(typeof performance=="object"&&typeof performance.now=="function"){var d=performance;n.unstable_now=function(){return d.now()}}else{var f=Date,m=f.now();n.unstable_now=function(){return f.now()-m}}var v=[],x=[],y=1,S=null,C=3,_=!1,b=!1,k=!1,T=typeof setTimeout=="function"?setTimeout:null,A=typeof clearTimeout=="function"?clearTimeout:null,L=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function $(D){for(var Q=i(x);Q!==null;){if(Q.callback===null)a(x);else if(Q.startTime<=D)a(x),Q.sortIndex=Q.expirationTime,l(v,Q);else break;Q=i(x)}}function M(D){if(k=!1,$(D),!b)if(i(v)!==null)b=!0,le(U);else{var Q=i(x);Q!==null&&se(M,Q.startTime-D)}}function U(D,Q){b=!1,k&&(k=!1,A(ie),ie=-1),_=!0;var V=C;try{for($(Q),S=i(v);S!==null&&(!(S.expirationTime>Q)||D&&!ue());){var P=S.callback;if(typeof P=="function"){S.callback=null,C=S.priorityLevel;var I=P(S.expirationTime<=Q);Q=n.unstable_now(),typeof I=="function"?S.callback=I:S===i(v)&&a(v),$(Q)}else a(v);S=i(v)}if(S!==null)var de=!0;else{var me=i(x);me!==null&&se(M,me.startTime-Q),de=!1}return de}finally{S=null,C=V,_=!1}}var Y=!1,B=null,ie=-1,te=5,ne=-1;function ue(){return!(n.unstable_now()-neD||125P?(D.sortIndex=V,l(x,D),i(v)===null&&D===i(x)&&(k?(A(ie),ie=-1):k=!0,se(M,V-P))):(D.sortIndex=I,l(v,D),b||_||(b=!0,le(U))),D},n.unstable_shouldYield=ue,n.unstable_wrapCallback=function(D){var Q=C;return function(){var V=C;C=Q;try{return D.apply(this,arguments)}finally{C=V}}}})(xa)),xa}var gf;function hv(){return gf||(gf=1,ya.exports=mv()),ya.exports}var vf;function gv(){if(vf)return lt;vf=1;var n=Ya(),l=hv();function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,r=1;r"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),v=Object.prototype.hasOwnProperty,x=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,y={},S={};function C(e){return v.call(S,e)?!0:v.call(y,e)?!1:x.test(e)?S[e]=!0:(y[e]=!0,!1)}function _(e,t,r,o){if(r!==null&&r.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return o?!1:r!==null?!r.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function b(e,t,r,o){if(t===null||typeof t>"u"||_(e,t,r,o))return!0;if(o)return!1;if(r!==null)switch(r.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function k(e,t,r,o,s,u,p){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=o,this.attributeNamespace=s,this.mustUseProperty=r,this.propertyName=e,this.type=t,this.sanitizeURL=u,this.removeEmptyString=p}var T={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){T[e]=new k(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];T[t]=new k(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){T[e]=new k(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){T[e]=new k(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){T[e]=new k(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){T[e]=new k(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){T[e]=new k(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){T[e]=new k(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){T[e]=new k(e,5,!1,e.toLowerCase(),null,!1,!1)});var A=/[\-:]([a-z])/g;function L(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(A,L);T[t]=new k(t,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(A,L);T[t]=new k(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(A,L);T[t]=new k(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){T[e]=new k(e,1,!1,e.toLowerCase(),null,!1,!1)}),T.xlinkHref=new k("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){T[e]=new k(e,1,!1,e.toLowerCase(),null,!0,!0)});function $(e,t,r,o){var s=T.hasOwnProperty(t)?T[t]:null;(s!==null?s.type!==0:o||!(2w||s[p]!==u[w]){var E=` -`+s[p].replace(" at new "," at ");return e.displayName&&E.includes("")&&(E=E.replace("",e.displayName)),E}while(1<=p&&0<=w);break}}}finally{de=!1,Error.prepareStackTrace=r}return(e=e?e.displayName||e.name:"")?I(e):""}function ve(e){switch(e.tag){case 5:return I(e.type);case 16:return I("Lazy");case 13:return I("Suspense");case 19:return I("SuspenseList");case 0:case 2:case 15:return e=me(e.type,!1),e;case 11:return e=me(e.type.render,!1),e;case 1:return e=me(e.type,!0),e;default:return""}}function ye(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case B:return"Fragment";case Y:return"Portal";case te:return"Profiler";case ie:return"StrictMode";case he:return"Suspense";case ce:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case ue:return(e.displayName||"Context")+".Consumer";case ne:return(e._context.displayName||"Context")+".Provider";case J:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case ee:return t=e.displayName||null,t!==null?t:ye(e.type)||"Memo";case le:t=e._payload,e=e._init;try{return ye(e(t))}catch{}}return null}function we(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return ye(t);case 8:return t===ie?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function Se(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function _e(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Ze(e){var t=_e(e)?"checked":"value",r=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),o=""+e[t];if(!e.hasOwnProperty(t)&&typeof r<"u"&&typeof r.get=="function"&&typeof r.set=="function"){var s=r.get,u=r.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return s.call(this)},set:function(p){o=""+p,u.call(this,p)}}),Object.defineProperty(e,t,{enumerable:r.enumerable}),{getValue:function(){return o},setValue:function(p){o=""+p},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Un(e){e._valueTracker||(e._valueTracker=Ze(e))}function No(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var r=t.getValue(),o="";return e&&(o=_e(e)?e.checked?"true":"false":e.value),e=o,e!==r?(t.setValue(e),!0):!1}function Ht(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Ci(e,t){var r=t.checked;return V({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:r??e._wrapperState.initialChecked})}function vu(e,t){var r=t.defaultValue==null?"":t.defaultValue,o=t.checked!=null?t.checked:t.defaultChecked;r=Se(t.value!=null?t.value:r),e._wrapperState={initialChecked:o,initialValue:r,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function yu(e,t){t=t.checked,t!=null&&$(e,"checked",t,!1)}function Ei(e,t){yu(e,t);var r=Se(t.value),o=t.type;if(r!=null)o==="number"?(r===0&&e.value===""||e.value!=r)&&(e.value=""+r):e.value!==""+r&&(e.value=""+r);else if(o==="submit"||o==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?ki(e,t.type,r):t.hasOwnProperty("defaultValue")&&ki(e,t.type,Se(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function xu(e,t,r){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var o=t.type;if(!(o!=="submit"&&o!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,r||t===e.value||(e.value=t),e.defaultValue=t}r=e.name,r!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,r!==""&&(e.name=r)}function ki(e,t,r){(t!=="number"||Ht(e.ownerDocument)!==e)&&(r==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+r&&(e.defaultValue=""+r))}var Rr=Array.isArray;function Bn(e,t,r,o){if(e=e.options,t){t={};for(var s=0;s"+t.valueOf().toString()+"",t=Po.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Tr(e,t){if(t){var r=e.firstChild;if(r&&r===e.lastChild&&r.nodeType===3){r.nodeValue=t;return}}e.textContent=t}var jr={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},mh=["Webkit","ms","Moz","O"];Object.keys(jr).forEach(function(e){mh.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),jr[t]=jr[e]})});function _u(e,t,r){return t==null||typeof t=="boolean"||t===""?"":r||typeof t!="number"||t===0||jr.hasOwnProperty(e)&&jr[e]?(""+t).trim():t+"px"}function Nu(e,t){e=e.style;for(var r in t)if(t.hasOwnProperty(r)){var o=r.indexOf("--")===0,s=_u(r,t[r],o);r==="float"&&(r="cssFloat"),o?e.setProperty(r,s):e[r]=s}}var hh=V({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Pi(e,t){if(t){if(hh[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(i(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(i(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(i(61))}if(t.style!=null&&typeof t.style!="object")throw Error(i(62))}}function bi(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Ri=null;function Ti(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var ji=null,Vn=null,Yn=null;function Pu(e){if(e=Jr(e)){if(typeof ji!="function")throw Error(i(280));var t=e.stateNode;t&&(t=Ko(t),ji(e.stateNode,e.type,t))}}function bu(e){Vn?Yn?Yn.push(e):Yn=[e]:Vn=e}function Ru(){if(Vn){var e=Vn,t=Yn;if(Yn=Vn=null,Pu(e),t)for(e=0;e>>=0,e===0?32:31-(Nh(e)/Ph|0)|0}var Oo=64,Ao=4194304;function Dr(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Lo(e,t){var r=e.pendingLanes;if(r===0)return 0;var o=0,s=e.suspendedLanes,u=e.pingedLanes,p=r&268435455;if(p!==0){var w=p&~s;w!==0?o=Dr(w):(u&=p,u!==0&&(o=Dr(u)))}else p=r&~s,p!==0?o=Dr(p):u!==0&&(o=Dr(u));if(o===0)return 0;if(t!==0&&t!==o&&(t&s)===0&&(s=o&-o,u=t&-t,s>=u||s===16&&(u&4194240)!==0))return t;if((o&4)!==0&&(o|=r&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=o;0r;r++)t.push(e);return t}function Mr(e,t,r){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-wt(t),e[t]=r}function jh(e,t){var r=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var o=e.eventTimes;for(e=e.expirationTimes;0=Br),rc=" ",oc=!1;function lc(e,t){switch(e){case"keyup":return lg.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function ic(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Xn=!1;function sg(e,t){switch(e){case"compositionend":return ic(t);case"keypress":return t.which!==32?null:(oc=!0,rc);case"textInput":return e=t.data,e===rc&&oc?null:e;default:return null}}function ag(e,t){if(Xn)return e==="compositionend"||!Xi&&lc(e,t)?(e=Zu(),Fo=Ui=ln=null,Xn=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:r,offset:t-e};e=o}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=pc(r)}}function hc(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?hc(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function gc(){for(var e=window,t=Ht();t instanceof e.HTMLIFrameElement;){try{var r=typeof t.contentWindow.location.href=="string"}catch{r=!1}if(r)e=t.contentWindow;else break;t=Ht(e.document)}return t}function qi(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function vg(e){var t=gc(),r=e.focusedElem,o=e.selectionRange;if(t!==r&&r&&r.ownerDocument&&hc(r.ownerDocument.documentElement,r)){if(o!==null&&qi(r)){if(t=o.start,e=o.end,e===void 0&&(e=t),"selectionStart"in r)r.selectionStart=t,r.selectionEnd=Math.min(e,r.value.length);else if(e=(t=r.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var s=r.textContent.length,u=Math.min(o.start,s);o=o.end===void 0?u:Math.min(o.end,s),!e.extend&&u>o&&(s=o,o=u,u=s),s=mc(r,u);var p=mc(r,o);s&&p&&(e.rangeCount!==1||e.anchorNode!==s.node||e.anchorOffset!==s.offset||e.focusNode!==p.node||e.focusOffset!==p.offset)&&(t=t.createRange(),t.setStart(s.node,s.offset),e.removeAllRanges(),u>o?(e.addRange(t),e.extend(p.node,p.offset)):(t.setEnd(p.node,p.offset),e.addRange(t)))}}for(t=[],e=r;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof r.focus=="function"&&r.focus(),r=0;r=document.documentMode,Kn=null,Ji=null,Gr=null,es=!1;function vc(e,t,r){var o=r.window===r?r.document:r.nodeType===9?r:r.ownerDocument;es||Kn==null||Kn!==Ht(o)||(o=Kn,"selectionStart"in o&&qi(o)?o={start:o.selectionStart,end:o.selectionEnd}:(o=(o.ownerDocument&&o.ownerDocument.defaultView||window).getSelection(),o={anchorNode:o.anchorNode,anchorOffset:o.anchorOffset,focusNode:o.focusNode,focusOffset:o.focusOffset}),Gr&&Qr(Gr,o)||(Gr=o,o=Qo(Ji,"onSelect"),0tr||(e.current=fs[tr],fs[tr]=null,tr--)}function Ne(e,t){tr++,fs[tr]=e.current,e.current=t}var cn={},Qe=un(cn),et=un(!1),bn=cn;function nr(e,t){var r=e.type.contextTypes;if(!r)return cn;var o=e.stateNode;if(o&&o.__reactInternalMemoizedUnmaskedChildContext===t)return o.__reactInternalMemoizedMaskedChildContext;var s={},u;for(u in r)s[u]=t[u];return o&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=s),s}function tt(e){return e=e.childContextTypes,e!=null}function Zo(){Re(et),Re(Qe)}function Oc(e,t,r){if(Qe.current!==cn)throw Error(i(168));Ne(Qe,t),Ne(et,r)}function Ac(e,t,r){var o=e.stateNode;if(t=t.childContextTypes,typeof o.getChildContext!="function")return r;o=o.getChildContext();for(var s in o)if(!(s in t))throw Error(i(108,we(e)||"Unknown",s));return V({},r,o)}function qo(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||cn,bn=Qe.current,Ne(Qe,e),Ne(et,et.current),!0}function Lc(e,t,r){var o=e.stateNode;if(!o)throw Error(i(169));r?(e=Ac(e,t,bn),o.__reactInternalMemoizedMergedChildContext=e,Re(et),Re(Qe),Ne(Qe,e)):Re(et),Ne(et,r)}var Bt=null,Jo=!1,ps=!1;function Dc(e){Bt===null?Bt=[e]:Bt.push(e)}function Rg(e){Jo=!0,Dc(e)}function dn(){if(!ps&&Bt!==null){ps=!0;var e=0,t=ke;try{var r=Bt;for(ke=1;e>=p,s-=p,Vt=1<<32-wt(t)+s|r<ae?(Be=oe,oe=null):Be=oe.sibling;var Ce=z(R,oe,j[ae],H);if(Ce===null){oe===null&&(oe=Be);break}e&&oe&&Ce.alternate===null&&t(R,oe),N=u(Ce,N,ae),re===null?q=Ce:re.sibling=Ce,re=Ce,oe=Be}if(ae===j.length)return r(R,oe),je&&Tn(R,ae),q;if(oe===null){for(;aeae?(Be=oe,oe=null):Be=oe.sibling;var wn=z(R,oe,Ce.value,H);if(wn===null){oe===null&&(oe=Be);break}e&&oe&&wn.alternate===null&&t(R,oe),N=u(wn,N,ae),re===null?q=wn:re.sibling=wn,re=wn,oe=Be}if(Ce.done)return r(R,oe),je&&Tn(R,ae),q;if(oe===null){for(;!Ce.done;ae++,Ce=j.next())Ce=W(R,Ce.value,H),Ce!==null&&(N=u(Ce,N,ae),re===null?q=Ce:re.sibling=Ce,re=Ce);return je&&Tn(R,ae),q}for(oe=o(R,oe);!Ce.done;ae++,Ce=j.next())Ce=G(oe,R,ae,Ce.value,H),Ce!==null&&(e&&Ce.alternate!==null&&oe.delete(Ce.key===null?ae:Ce.key),N=u(Ce,N,ae),re===null?q=Ce:re.sibling=Ce,re=Ce);return e&&oe.forEach(function(uv){return t(R,uv)}),je&&Tn(R,ae),q}function Ie(R,N,j,H){if(typeof j=="object"&&j!==null&&j.type===B&&j.key===null&&(j=j.props.children),typeof j=="object"&&j!==null){switch(j.$$typeof){case U:e:{for(var q=j.key,re=N;re!==null;){if(re.key===q){if(q=j.type,q===B){if(re.tag===7){r(R,re.sibling),N=s(re,j.props.children),N.return=R,R=N;break e}}else if(re.elementType===q||typeof q=="object"&&q!==null&&q.$$typeof===le&&Wc(q)===re.type){r(R,re.sibling),N=s(re,j.props),N.ref=eo(R,re,j),N.return=R,R=N;break e}r(R,re);break}else t(R,re);re=re.sibling}j.type===B?(N=zn(j.props.children,R.mode,H,j.key),N.return=R,R=N):(H=Pl(j.type,j.key,j.props,null,R.mode,H),H.ref=eo(R,N,j),H.return=R,R=H)}return p(R);case Y:e:{for(re=j.key;N!==null;){if(N.key===re)if(N.tag===4&&N.stateNode.containerInfo===j.containerInfo&&N.stateNode.implementation===j.implementation){r(R,N.sibling),N=s(N,j.children||[]),N.return=R,R=N;break e}else{r(R,N);break}else t(R,N);N=N.sibling}N=ca(j,R.mode,H),N.return=R,R=N}return p(R);case le:return re=j._init,Ie(R,N,re(j._payload),H)}if(Rr(j))return K(R,N,j,H);if(Q(j))return Z(R,N,j,H);rl(R,j)}return typeof j=="string"&&j!==""||typeof j=="number"?(j=""+j,N!==null&&N.tag===6?(r(R,N.sibling),N=s(N,j),N.return=R,R=N):(r(R,N),N=ua(j,R.mode,H),N.return=R,R=N),p(R)):r(R,N)}return Ie}var ir=Hc(!0),Uc=Hc(!1),ol=un(null),ll=null,sr=null,xs=null;function ws(){xs=sr=ll=null}function Ss(e){var t=ol.current;Re(ol),e._currentValue=t}function Cs(e,t,r){for(;e!==null;){var o=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,o!==null&&(o.childLanes|=t)):o!==null&&(o.childLanes&t)!==t&&(o.childLanes|=t),e===r)break;e=e.return}}function ar(e,t){ll=e,xs=sr=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(nt=!0),e.firstContext=null)}function ht(e){var t=e._currentValue;if(xs!==e)if(e={context:e,memoizedValue:t,next:null},sr===null){if(ll===null)throw Error(i(308));sr=e,ll.dependencies={lanes:0,firstContext:e}}else sr=sr.next=e;return t}var jn=null;function Es(e){jn===null?jn=[e]:jn.push(e)}function Bc(e,t,r,o){var s=t.interleaved;return s===null?(r.next=r,Es(t)):(r.next=s.next,s.next=r),t.interleaved=r,Qt(e,o)}function Qt(e,t){e.lanes|=t;var r=e.alternate;for(r!==null&&(r.lanes|=t),r=e,e=e.return;e!==null;)e.childLanes|=t,r=e.alternate,r!==null&&(r.childLanes|=t),r=e,e=e.return;return r.tag===3?r.stateNode:null}var fn=!1;function ks(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Vc(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Gt(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function pn(e,t,r){var o=e.updateQueue;if(o===null)return null;if(o=o.shared,(xe&2)!==0){var s=o.pending;return s===null?t.next=t:(t.next=s.next,s.next=t),o.pending=t,Qt(e,r)}return s=o.interleaved,s===null?(t.next=t,Es(o)):(t.next=s.next,s.next=t),o.interleaved=t,Qt(e,r)}function il(e,t,r){if(t=t.updateQueue,t!==null&&(t=t.shared,(r&4194240)!==0)){var o=t.lanes;o&=e.pendingLanes,r|=o,t.lanes=r,zi(e,r)}}function Yc(e,t){var r=e.updateQueue,o=e.alternate;if(o!==null&&(o=o.updateQueue,r===o)){var s=null,u=null;if(r=r.firstBaseUpdate,r!==null){do{var p={eventTime:r.eventTime,lane:r.lane,tag:r.tag,payload:r.payload,callback:r.callback,next:null};u===null?s=u=p:u=u.next=p,r=r.next}while(r!==null);u===null?s=u=t:u=u.next=t}else s=u=t;r={baseState:o.baseState,firstBaseUpdate:s,lastBaseUpdate:u,shared:o.shared,effects:o.effects},e.updateQueue=r;return}e=r.lastBaseUpdate,e===null?r.firstBaseUpdate=t:e.next=t,r.lastBaseUpdate=t}function sl(e,t,r,o){var s=e.updateQueue;fn=!1;var u=s.firstBaseUpdate,p=s.lastBaseUpdate,w=s.shared.pending;if(w!==null){s.shared.pending=null;var E=w,O=E.next;E.next=null,p===null?u=O:p.next=O,p=E;var F=e.alternate;F!==null&&(F=F.updateQueue,w=F.lastBaseUpdate,w!==p&&(w===null?F.firstBaseUpdate=O:w.next=O,F.lastBaseUpdate=E))}if(u!==null){var W=s.baseState;p=0,F=O=E=null,w=u;do{var z=w.lane,G=w.eventTime;if((o&z)===z){F!==null&&(F=F.next={eventTime:G,lane:0,tag:w.tag,payload:w.payload,callback:w.callback,next:null});e:{var K=e,Z=w;switch(z=t,G=r,Z.tag){case 1:if(K=Z.payload,typeof K=="function"){W=K.call(G,W,z);break e}W=K;break e;case 3:K.flags=K.flags&-65537|128;case 0:if(K=Z.payload,z=typeof K=="function"?K.call(G,W,z):K,z==null)break e;W=V({},W,z);break e;case 2:fn=!0}}w.callback!==null&&w.lane!==0&&(e.flags|=64,z=s.effects,z===null?s.effects=[w]:z.push(w))}else G={eventTime:G,lane:z,tag:w.tag,payload:w.payload,callback:w.callback,next:null},F===null?(O=F=G,E=W):F=F.next=G,p|=z;if(w=w.next,w===null){if(w=s.shared.pending,w===null)break;z=w,w=z.next,z.next=null,s.lastBaseUpdate=z,s.shared.pending=null}}while(!0);if(F===null&&(E=W),s.baseState=E,s.firstBaseUpdate=O,s.lastBaseUpdate=F,t=s.shared.interleaved,t!==null){s=t;do p|=s.lane,s=s.next;while(s!==t)}else u===null&&(s.shared.lanes=0);Ln|=p,e.lanes=p,e.memoizedState=W}}function Qc(e,t,r){if(e=t.effects,t.effects=null,e!==null)for(t=0;tr?r:4,e(!0);var o=Rs.transition;Rs.transition={};try{e(!1),t()}finally{ke=r,Rs.transition=o}}function fd(){return gt().memoizedState}function Ag(e,t,r){var o=vn(e);if(r={lane:o,action:r,hasEagerState:!1,eagerState:null,next:null},pd(e))md(t,r);else if(r=Bc(e,t,r,o),r!==null){var s=Je();Nt(r,e,o,s),hd(r,t,o)}}function Lg(e,t,r){var o=vn(e),s={lane:o,action:r,hasEagerState:!1,eagerState:null,next:null};if(pd(e))md(t,s);else{var u=e.alternate;if(e.lanes===0&&(u===null||u.lanes===0)&&(u=t.lastRenderedReducer,u!==null))try{var p=t.lastRenderedState,w=u(p,r);if(s.hasEagerState=!0,s.eagerState=w,St(w,p)){var E=t.interleaved;E===null?(s.next=s,Es(t)):(s.next=E.next,E.next=s),t.interleaved=s;return}}catch{}r=Bc(e,t,s,o),r!==null&&(s=Je(),Nt(r,e,o,s),hd(r,t,o))}}function pd(e){var t=e.alternate;return e===Ae||t!==null&&t===Ae}function md(e,t){oo=cl=!0;var r=e.pending;r===null?t.next=t:(t.next=r.next,r.next=t),e.pending=t}function hd(e,t,r){if((r&4194240)!==0){var o=t.lanes;o&=e.pendingLanes,r|=o,t.lanes=r,zi(e,r)}}var pl={readContext:ht,useCallback:Ge,useContext:Ge,useEffect:Ge,useImperativeHandle:Ge,useInsertionEffect:Ge,useLayoutEffect:Ge,useMemo:Ge,useReducer:Ge,useRef:Ge,useState:Ge,useDebugValue:Ge,useDeferredValue:Ge,useTransition:Ge,useMutableSource:Ge,useSyncExternalStore:Ge,useId:Ge,unstable_isNewReconciler:!1},Dg={readContext:ht,useCallback:function(e,t){return Lt().memoizedState=[e,t===void 0?null:t],e},useContext:ht,useEffect:od,useImperativeHandle:function(e,t,r){return r=r!=null?r.concat([e]):null,dl(4194308,4,sd.bind(null,t,e),r)},useLayoutEffect:function(e,t){return dl(4194308,4,e,t)},useInsertionEffect:function(e,t){return dl(4,2,e,t)},useMemo:function(e,t){var r=Lt();return t=t===void 0?null:t,e=e(),r.memoizedState=[e,t],e},useReducer:function(e,t,r){var o=Lt();return t=r!==void 0?r(t):t,o.memoizedState=o.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},o.queue=e,e=e.dispatch=Ag.bind(null,Ae,e),[o.memoizedState,e]},useRef:function(e){var t=Lt();return e={current:e},t.memoizedState=e},useState:nd,useDebugValue:Ms,useDeferredValue:function(e){return Lt().memoizedState=e},useTransition:function(){var e=nd(!1),t=e[0];return e=Og.bind(null,e[1]),Lt().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,r){var o=Ae,s=Lt();if(je){if(r===void 0)throw Error(i(407));r=r()}else{if(r=t(),Ue===null)throw Error(i(349));(An&30)!==0||Zc(o,t,r)}s.memoizedState=r;var u={value:r,getSnapshot:t};return s.queue=u,od(Jc.bind(null,o,u,e),[e]),o.flags|=2048,so(9,qc.bind(null,o,u,r,t),void 0,null),r},useId:function(){var e=Lt(),t=Ue.identifierPrefix;if(je){var r=Yt,o=Vt;r=(o&~(1<<32-wt(o)-1)).toString(32)+r,t=":"+t+"R"+r,r=lo++,0<\/script>",e=e.removeChild(e.firstChild)):typeof o.is=="string"?e=p.createElement(r,{is:o.is}):(e=p.createElement(r),r==="select"&&(p=e,o.multiple?p.multiple=!0:o.size&&(p.size=o.size))):e=p.createElementNS(e,r),e[Ot]=t,e[qr]=o,Dd(e,t,!1,!1),t.stateNode=e;e:{switch(p=bi(r,o),r){case"dialog":be("cancel",e),be("close",e),s=o;break;case"iframe":case"object":case"embed":be("load",e),s=o;break;case"video":case"audio":for(s=0;spr&&(t.flags|=128,o=!0,ao(u,!1),t.lanes=4194304)}else{if(!o)if(e=al(p),e!==null){if(t.flags|=128,o=!0,r=e.updateQueue,r!==null&&(t.updateQueue=r,t.flags|=4),ao(u,!0),u.tail===null&&u.tailMode==="hidden"&&!p.alternate&&!je)return Xe(t),null}else 2*Me()-u.renderingStartTime>pr&&r!==1073741824&&(t.flags|=128,o=!0,ao(u,!1),t.lanes=4194304);u.isBackwards?(p.sibling=t.child,t.child=p):(r=u.last,r!==null?r.sibling=p:t.child=p,u.last=p)}return u.tail!==null?(t=u.tail,u.rendering=t,u.tail=t.sibling,u.renderingStartTime=Me(),t.sibling=null,r=Oe.current,Ne(Oe,o?r&1|2:r&1),t):(Xe(t),null);case 22:case 23:return ia(),o=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==o&&(t.flags|=8192),o&&(t.mode&1)!==0?(ut&1073741824)!==0&&(Xe(t),t.subtreeFlags&6&&(t.flags|=8192)):Xe(t),null;case 24:return null;case 25:return null}throw Error(i(156,t.tag))}function Ug(e,t){switch(hs(t),t.tag){case 1:return tt(t.type)&&Zo(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return ur(),Re(et),Re(Qe),bs(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return Ns(t),null;case 13:if(Re(Oe),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));lr()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Re(Oe),null;case 4:return ur(),null;case 10:return Ss(t.type._context),null;case 22:case 23:return ia(),null;case 24:return null;default:return null}}var vl=!1,Ke=!1,Bg=typeof WeakSet=="function"?WeakSet:Set,X=null;function dr(e,t){var r=e.ref;if(r!==null)if(typeof r=="function")try{r(null)}catch(o){De(e,t,o)}else r.current=null}function Gs(e,t,r){try{r()}catch(o){De(e,t,o)}}var zd=!1;function Vg(e,t){if(is=Io,e=gc(),qi(e)){if("selectionStart"in e)var r={start:e.selectionStart,end:e.selectionEnd};else e:{r=(r=e.ownerDocument)&&r.defaultView||window;var o=r.getSelection&&r.getSelection();if(o&&o.rangeCount!==0){r=o.anchorNode;var s=o.anchorOffset,u=o.focusNode;o=o.focusOffset;try{r.nodeType,u.nodeType}catch{r=null;break e}var p=0,w=-1,E=-1,O=0,F=0,W=e,z=null;t:for(;;){for(var G;W!==r||s!==0&&W.nodeType!==3||(w=p+s),W!==u||o!==0&&W.nodeType!==3||(E=p+o),W.nodeType===3&&(p+=W.nodeValue.length),(G=W.firstChild)!==null;)z=W,W=G;for(;;){if(W===e)break t;if(z===r&&++O===s&&(w=p),z===u&&++F===o&&(E=p),(G=W.nextSibling)!==null)break;W=z,z=W.parentNode}W=G}r=w===-1||E===-1?null:{start:w,end:E}}else r=null}r=r||{start:0,end:0}}else r=null;for(ss={focusedElem:e,selectionRange:r},Io=!1,X=t;X!==null;)if(t=X,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,X=e;else for(;X!==null;){t=X;try{var K=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if(K!==null){var Z=K.memoizedProps,Ie=K.memoizedState,R=t.stateNode,N=R.getSnapshotBeforeUpdate(t.elementType===t.type?Z:Et(t.type,Z),Ie);R.__reactInternalSnapshotBeforeUpdate=N}break;case 3:var j=t.stateNode.containerInfo;j.nodeType===1?j.textContent="":j.nodeType===9&&j.documentElement&&j.removeChild(j.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(i(163))}}catch(H){De(t,t.return,H)}if(e=t.sibling,e!==null){e.return=t.return,X=e;break}X=t.return}return K=zd,zd=!1,K}function uo(e,t,r){var o=t.updateQueue;if(o=o!==null?o.lastEffect:null,o!==null){var s=o=o.next;do{if((s.tag&e)===e){var u=s.destroy;s.destroy=void 0,u!==void 0&&Gs(t,r,u)}s=s.next}while(s!==o)}}function yl(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var r=t=t.next;do{if((r.tag&e)===e){var o=r.create;r.destroy=o()}r=r.next}while(r!==t)}}function Xs(e){var t=e.ref;if(t!==null){var r=e.stateNode;e.tag,e=r,typeof t=="function"?t(e):t.current=e}}function Fd(e){var t=e.alternate;t!==null&&(e.alternate=null,Fd(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Ot],delete t[qr],delete t[ds],delete t[Pg],delete t[bg])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function $d(e){return e.tag===5||e.tag===3||e.tag===4}function Wd(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||$d(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Ks(e,t,r){var o=e.tag;if(o===5||o===6)e=e.stateNode,t?r.nodeType===8?r.parentNode.insertBefore(e,t):r.insertBefore(e,t):(r.nodeType===8?(t=r.parentNode,t.insertBefore(e,r)):(t=r,t.appendChild(e)),r=r._reactRootContainer,r!=null||t.onclick!==null||(t.onclick=Xo));else if(o!==4&&(e=e.child,e!==null))for(Ks(e,t,r),e=e.sibling;e!==null;)Ks(e,t,r),e=e.sibling}function Zs(e,t,r){var o=e.tag;if(o===5||o===6)e=e.stateNode,t?r.insertBefore(e,t):r.appendChild(e);else if(o!==4&&(e=e.child,e!==null))for(Zs(e,t,r),e=e.sibling;e!==null;)Zs(e,t,r),e=e.sibling}var Ve=null,kt=!1;function mn(e,t,r){for(r=r.child;r!==null;)Hd(e,t,r),r=r.sibling}function Hd(e,t,r){if(jt&&typeof jt.onCommitFiberUnmount=="function")try{jt.onCommitFiberUnmount(jo,r)}catch{}switch(r.tag){case 5:Ke||dr(r,t);case 6:var o=Ve,s=kt;Ve=null,mn(e,t,r),Ve=o,kt=s,Ve!==null&&(kt?(e=Ve,r=r.stateNode,e.nodeType===8?e.parentNode.removeChild(r):e.removeChild(r)):Ve.removeChild(r.stateNode));break;case 18:Ve!==null&&(kt?(e=Ve,r=r.stateNode,e.nodeType===8?cs(e.parentNode,r):e.nodeType===1&&cs(e,r),Wr(e)):cs(Ve,r.stateNode));break;case 4:o=Ve,s=kt,Ve=r.stateNode.containerInfo,kt=!0,mn(e,t,r),Ve=o,kt=s;break;case 0:case 11:case 14:case 15:if(!Ke&&(o=r.updateQueue,o!==null&&(o=o.lastEffect,o!==null))){s=o=o.next;do{var u=s,p=u.destroy;u=u.tag,p!==void 0&&((u&2)!==0||(u&4)!==0)&&Gs(r,t,p),s=s.next}while(s!==o)}mn(e,t,r);break;case 1:if(!Ke&&(dr(r,t),o=r.stateNode,typeof o.componentWillUnmount=="function"))try{o.props=r.memoizedProps,o.state=r.memoizedState,o.componentWillUnmount()}catch(w){De(r,t,w)}mn(e,t,r);break;case 21:mn(e,t,r);break;case 22:r.mode&1?(Ke=(o=Ke)||r.memoizedState!==null,mn(e,t,r),Ke=o):mn(e,t,r);break;default:mn(e,t,r)}}function Ud(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var r=e.stateNode;r===null&&(r=e.stateNode=new Bg),t.forEach(function(o){var s=ev.bind(null,e,o);r.has(o)||(r.add(o),o.then(s,s))})}}function _t(e,t){var r=t.deletions;if(r!==null)for(var o=0;os&&(s=p),o&=~u}if(o=s,o=Me()-o,o=(120>o?120:480>o?480:1080>o?1080:1920>o?1920:3e3>o?3e3:4320>o?4320:1960*Qg(o/1960))-o,10e?16:e,gn===null)var o=!1;else{if(e=gn,gn=null,El=0,(xe&6)!==0)throw Error(i(331));var s=xe;for(xe|=4,X=e.current;X!==null;){var u=X,p=u.child;if((X.flags&16)!==0){var w=u.deletions;if(w!==null){for(var E=0;EMe()-ea?Mn(e,0):Js|=r),ot(e,t)}function nf(e,t){t===0&&((e.mode&1)===0?t=1:(t=Ao,Ao<<=1,(Ao&130023424)===0&&(Ao=4194304)));var r=Je();e=Qt(e,t),e!==null&&(Mr(e,t,r),ot(e,r))}function Jg(e){var t=e.memoizedState,r=0;t!==null&&(r=t.retryLane),nf(e,r)}function ev(e,t){var r=0;switch(e.tag){case 13:var o=e.stateNode,s=e.memoizedState;s!==null&&(r=s.retryLane);break;case 19:o=e.stateNode;break;default:throw Error(i(314))}o!==null&&o.delete(t),nf(e,r)}var rf;rf=function(e,t,r){if(e!==null)if(e.memoizedProps!==t.pendingProps||et.current)nt=!0;else{if((e.lanes&r)===0&&(t.flags&128)===0)return nt=!1,Wg(e,t,r);nt=(e.flags&131072)!==0}else nt=!1,je&&(t.flags&1048576)!==0&&Mc(t,tl,t.index);switch(t.lanes=0,t.tag){case 2:var o=t.type;gl(e,t),e=t.pendingProps;var s=nr(t,Qe.current);ar(t,r),s=js(null,t,o,e,s,r);var u=Os();return t.flags|=1,typeof s=="object"&&s!==null&&typeof s.render=="function"&&s.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,tt(o)?(u=!0,qo(t)):u=!1,t.memoizedState=s.state!==null&&s.state!==void 0?s.state:null,ks(t),s.updater=ml,t.stateNode=s,s._reactInternals=t,zs(t,o,e,r),t=Hs(null,t,o,!0,u,r)):(t.tag=0,je&&u&&ms(t),qe(null,t,s,r),t=t.child),t;case 16:o=t.elementType;e:{switch(gl(e,t),e=t.pendingProps,s=o._init,o=s(o._payload),t.type=o,s=t.tag=nv(o),e=Et(o,e),s){case 0:t=Ws(null,t,o,e,r);break e;case 1:t=Rd(null,t,o,e,r);break e;case 11:t=kd(null,t,o,e,r);break e;case 14:t=_d(null,t,o,Et(o.type,e),r);break e}throw Error(i(306,o,""))}return t;case 0:return o=t.type,s=t.pendingProps,s=t.elementType===o?s:Et(o,s),Ws(e,t,o,s,r);case 1:return o=t.type,s=t.pendingProps,s=t.elementType===o?s:Et(o,s),Rd(e,t,o,s,r);case 3:e:{if(Td(t),e===null)throw Error(i(387));o=t.pendingProps,u=t.memoizedState,s=u.element,Vc(e,t),sl(t,o,null,r);var p=t.memoizedState;if(o=p.element,u.isDehydrated)if(u={element:o,isDehydrated:!1,cache:p.cache,pendingSuspenseBoundaries:p.pendingSuspenseBoundaries,transitions:p.transitions},t.updateQueue.baseState=u,t.memoizedState=u,t.flags&256){s=cr(Error(i(423)),t),t=jd(e,t,o,r,s);break e}else if(o!==s){s=cr(Error(i(424)),t),t=jd(e,t,o,r,s);break e}else for(at=an(t.stateNode.containerInfo.firstChild),st=t,je=!0,Ct=null,r=Uc(t,null,o,r),t.child=r;r;)r.flags=r.flags&-3|4096,r=r.sibling;else{if(lr(),o===s){t=Xt(e,t,r);break e}qe(e,t,o,r)}t=t.child}return t;case 5:return Gc(t),e===null&&vs(t),o=t.type,s=t.pendingProps,u=e!==null?e.memoizedProps:null,p=s.children,as(o,s)?p=null:u!==null&&as(o,u)&&(t.flags|=32),bd(e,t),qe(e,t,p,r),t.child;case 6:return e===null&&vs(t),null;case 13:return Od(e,t,r);case 4:return _s(t,t.stateNode.containerInfo),o=t.pendingProps,e===null?t.child=ir(t,null,o,r):qe(e,t,o,r),t.child;case 11:return o=t.type,s=t.pendingProps,s=t.elementType===o?s:Et(o,s),kd(e,t,o,s,r);case 7:return qe(e,t,t.pendingProps,r),t.child;case 8:return qe(e,t,t.pendingProps.children,r),t.child;case 12:return qe(e,t,t.pendingProps.children,r),t.child;case 10:e:{if(o=t.type._context,s=t.pendingProps,u=t.memoizedProps,p=s.value,Ne(ol,o._currentValue),o._currentValue=p,u!==null)if(St(u.value,p)){if(u.children===s.children&&!et.current){t=Xt(e,t,r);break e}}else for(u=t.child,u!==null&&(u.return=t);u!==null;){var w=u.dependencies;if(w!==null){p=u.child;for(var E=w.firstContext;E!==null;){if(E.context===o){if(u.tag===1){E=Gt(-1,r&-r),E.tag=2;var O=u.updateQueue;if(O!==null){O=O.shared;var F=O.pending;F===null?E.next=E:(E.next=F.next,F.next=E),O.pending=E}}u.lanes|=r,E=u.alternate,E!==null&&(E.lanes|=r),Cs(u.return,r,t),w.lanes|=r;break}E=E.next}}else if(u.tag===10)p=u.type===t.type?null:u.child;else if(u.tag===18){if(p=u.return,p===null)throw Error(i(341));p.lanes|=r,w=p.alternate,w!==null&&(w.lanes|=r),Cs(p,r,t),p=u.sibling}else p=u.child;if(p!==null)p.return=u;else for(p=u;p!==null;){if(p===t){p=null;break}if(u=p.sibling,u!==null){u.return=p.return,p=u;break}p=p.return}u=p}qe(e,t,s.children,r),t=t.child}return t;case 9:return s=t.type,o=t.pendingProps.children,ar(t,r),s=ht(s),o=o(s),t.flags|=1,qe(e,t,o,r),t.child;case 14:return o=t.type,s=Et(o,t.pendingProps),s=Et(o.type,s),_d(e,t,o,s,r);case 15:return Nd(e,t,t.type,t.pendingProps,r);case 17:return o=t.type,s=t.pendingProps,s=t.elementType===o?s:Et(o,s),gl(e,t),t.tag=1,tt(o)?(e=!0,qo(t)):e=!1,ar(t,r),vd(t,o,s),zs(t,o,s,r),Hs(null,t,o,!0,e,r);case 19:return Ld(e,t,r);case 22:return Pd(e,t,r)}throw Error(i(156,t.tag))};function of(e,t){return Iu(e,t)}function tv(e,t,r,o){this.tag=e,this.key=r,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=o,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function yt(e,t,r,o){return new tv(e,t,r,o)}function aa(e){return e=e.prototype,!(!e||!e.isReactComponent)}function nv(e){if(typeof e=="function")return aa(e)?1:0;if(e!=null){if(e=e.$$typeof,e===J)return 11;if(e===ee)return 14}return 2}function xn(e,t){var r=e.alternate;return r===null?(r=yt(e.tag,t,e.key,e.mode),r.elementType=e.elementType,r.type=e.type,r.stateNode=e.stateNode,r.alternate=e,e.alternate=r):(r.pendingProps=t,r.type=e.type,r.flags=0,r.subtreeFlags=0,r.deletions=null),r.flags=e.flags&14680064,r.childLanes=e.childLanes,r.lanes=e.lanes,r.child=e.child,r.memoizedProps=e.memoizedProps,r.memoizedState=e.memoizedState,r.updateQueue=e.updateQueue,t=e.dependencies,r.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},r.sibling=e.sibling,r.index=e.index,r.ref=e.ref,r}function Pl(e,t,r,o,s,u){var p=2;if(o=e,typeof e=="function")aa(e)&&(p=1);else if(typeof e=="string")p=5;else e:switch(e){case B:return zn(r.children,s,u,t);case ie:p=8,s|=8;break;case te:return e=yt(12,r,t,s|2),e.elementType=te,e.lanes=u,e;case he:return e=yt(13,r,t,s),e.elementType=he,e.lanes=u,e;case ce:return e=yt(19,r,t,s),e.elementType=ce,e.lanes=u,e;case se:return bl(r,s,u,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case ne:p=10;break e;case ue:p=9;break e;case J:p=11;break e;case ee:p=14;break e;case le:p=16,o=null;break e}throw Error(i(130,e==null?e:typeof e,""))}return t=yt(p,r,t,s),t.elementType=e,t.type=o,t.lanes=u,t}function zn(e,t,r,o){return e=yt(7,e,o,t),e.lanes=r,e}function bl(e,t,r,o){return e=yt(22,e,o,t),e.elementType=se,e.lanes=r,e.stateNode={isHidden:!1},e}function ua(e,t,r){return e=yt(6,e,null,t),e.lanes=r,e}function ca(e,t,r){return t=yt(4,e.children!==null?e.children:[],e.key,t),t.lanes=r,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function rv(e,t,r,o,s){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Ii(0),this.expirationTimes=Ii(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Ii(0),this.identifierPrefix=o,this.onRecoverableError=s,this.mutableSourceEagerHydrationData=null}function da(e,t,r,o,s,u,p,w,E){return e=new rv(e,t,r,w,E),t===1?(t=1,u===!0&&(t|=8)):t=0,u=yt(3,null,null,t),e.current=u,u.stateNode=e,u.memoizedState={element:o,isDehydrated:r,cache:null,transitions:null,pendingSuspenseBoundaries:null},ks(u),e}function ov(e,t,r){var o=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(l){console.error(l)}}return n(),va.exports=gv(),va.exports}var xf;function vv(){if(xf)return Dl;xf=1;var n=op();return Dl.createRoot=n.createRoot,Dl.hydrateRoot=n.hydrateRoot,Dl}var yv=vv();const xv=n=>n.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),wv=n=>n.replace(/^([A-Z])|[\s-_]+(\w)/g,(l,i,a)=>a?a.toUpperCase():i.toLowerCase()),wf=n=>{const l=wv(n);return l.charAt(0).toUpperCase()+l.slice(1)},lp=(...n)=>n.filter((l,i,a)=>!!l&&l.trim()!==""&&a.indexOf(l)===i).join(" ").trim(),Sv=n=>{for(const l in n)if(l.startsWith("aria-")||l==="role"||l==="title")return!0};var Cv={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};const Ev=g.forwardRef(({color:n="currentColor",size:l=24,strokeWidth:i=2,absoluteStrokeWidth:a,className:c="",children:d,iconNode:f,...m},v)=>g.createElement("svg",{ref:v,...Cv,width:l,height:l,stroke:n,strokeWidth:a?Number(i)*24/Number(l):i,className:lp("lucide",c),...!d&&!Sv(m)&&{"aria-hidden":"true"},...m},[...f.map(([x,y])=>g.createElement(x,y)),...Array.isArray(d)?d:[d]]));const kr=(n,l)=>{const i=g.forwardRef(({className:a,...c},d)=>g.createElement(Ev,{ref:d,iconNode:l,className:lp(`lucide-${xv(wf(n))}`,`lucide-${n}`,a),...c}));return i.displayName=wf(n),i};const kv=[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]],ip=kr("chevron-down",kv);const _v=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]],sp=kr("circle-alert",_v);const Nv=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]],Pv=kr("info",Nv);const bv=[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]],Rv=kr("loader-circle",bv);const Tv=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]],jv=kr("shield",Tv);const Ov=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],Av=kr("x",Ov);var Qa=op();const Lv=tp(Qa);function Sf(n,l){if(typeof n=="function")return n(l);n!=null&&(n.current=l)}function ap(...n){return l=>{let i=!1;const a=n.map(c=>{const d=Sf(c,l);return!i&&typeof d=="function"&&(i=!0),d});if(i)return()=>{for(let c=0;c{const{children:d,...f}=a,m=g.Children.toArray(d),v=m.find(Iv);if(v){const x=v.props.children,y=m.map(S=>S===v?g.Children.count(x)>1?g.Children.only(null):g.isValidElement(x)?x.props.children:null:S);return h.jsx(l,{...f,ref:c,children:g.isValidElement(x)?g.cloneElement(x,void 0,y):null})}return h.jsx(l,{...f,ref:c,children:d})});return i.displayName=`${n}.Slot`,i}function Dv(n){const l=g.forwardRef((i,a)=>{const{children:c,...d}=i;if(g.isValidElement(c)){const f=Fv(c),m=zv(d,c.props);return c.type!==g.Fragment&&(m.ref=a?ap(a,f):f),g.cloneElement(c,m)}return g.Children.count(c)>1?g.Children.only(null):null});return l.displayName=`${n}.SlotClone`,l}var cp=Symbol("radix.slottable");function Mv(n){const l=({children:i})=>h.jsx(h.Fragment,{children:i});return l.displayName=`${n}.Slottable`,l.__radixId=cp,l}function Iv(n){return g.isValidElement(n)&&typeof n.type=="function"&&"__radixId"in n.type&&n.type.__radixId===cp}function zv(n,l){const i={...l};for(const a in l){const c=n[a],d=l[a];/^on[A-Z]/.test(a)?c&&d?i[a]=(...m)=>{const v=d(...m);return c(...m),v}:c&&(i[a]=c):a==="style"?i[a]={...c,...d}:a==="className"&&(i[a]=[c,d].filter(Boolean).join(" "))}return{...n,...i}}function Fv(n){let l=Object.getOwnPropertyDescriptor(n.props,"ref")?.get,i=l&&"isReactWarning"in l&&l.isReactWarning;return i?n.ref:(l=Object.getOwnPropertyDescriptor(n,"ref")?.get,i=l&&"isReactWarning"in l&&l.isReactWarning,i?n.props.ref:n.props.ref||n.ref)}var $v=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],Le=$v.reduce((n,l)=>{const i=up(`Primitive.${l}`),a=g.forwardRef((c,d)=>{const{asChild:f,...m}=c,v=f?i:l;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),h.jsx(v,{...m,ref:d})});return a.displayName=`Primitive.${l}`,{...n,[l]:a}},{});function Wv(n,l){n&&Qa.flushSync(()=>n.dispatchEvent(l))}var Ft=globalThis?.document?g.useLayoutEffect:()=>{};function Hv(n,l){return g.useReducer((i,a)=>l[i][a]??i,n)}var Rt=n=>{const{present:l,children:i}=n,a=Uv(l),c=typeof i=="function"?i({present:a.isPresent}):g.Children.only(i),d=We(a.ref,Bv(c));return typeof i=="function"||a.isPresent?g.cloneElement(c,{ref:d}):null};Rt.displayName="Presence";function Uv(n){const[l,i]=g.useState(),a=g.useRef(null),c=g.useRef(n),d=g.useRef("none"),f=n?"mounted":"unmounted",[m,v]=Hv(f,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return g.useEffect(()=>{const x=Ml(a.current);d.current=m==="mounted"?x:"none"},[m]),Ft(()=>{const x=a.current,y=c.current;if(y!==n){const C=d.current,_=Ml(x);n?v("MOUNT"):_==="none"||x?.display==="none"?v("UNMOUNT"):v(y&&C!==_?"ANIMATION_OUT":"UNMOUNT"),c.current=n}},[n,v]),Ft(()=>{if(l){let x;const y=l.ownerDocument.defaultView??window,S=_=>{const k=Ml(a.current).includes(CSS.escape(_.animationName));if(_.target===l&&k&&(v("ANIMATION_END"),!c.current)){const T=l.style.animationFillMode;l.style.animationFillMode="forwards",x=y.setTimeout(()=>{l.style.animationFillMode==="forwards"&&(l.style.animationFillMode=T)})}},C=_=>{_.target===l&&(d.current=Ml(a.current))};return l.addEventListener("animationstart",C),l.addEventListener("animationcancel",S),l.addEventListener("animationend",S),()=>{y.clearTimeout(x),l.removeEventListener("animationstart",C),l.removeEventListener("animationcancel",S),l.removeEventListener("animationend",S)}}else v("ANIMATION_END")},[l,v]),{isPresent:["mounted","unmountSuspended"].includes(m),ref:g.useCallback(x=>{a.current=x?getComputedStyle(x):null,i(x)},[])}}function Ml(n){return n?.animationName||"none"}function Bv(n){let l=Object.getOwnPropertyDescriptor(n.props,"ref")?.get,i=l&&"isReactWarning"in l&&l.isReactWarning;return i?n.ref:(l=Object.getOwnPropertyDescriptor(n,"ref")?.get,i=l&&"isReactWarning"in l&&l.isReactWarning,i?n.props.ref:n.props.ref||n.ref)}function Vv(n,l){const i=g.createContext(l),a=d=>{const{children:f,...m}=d,v=g.useMemo(()=>m,Object.values(m));return h.jsx(i.Provider,{value:v,children:f})};a.displayName=n+"Provider";function c(d){const f=g.useContext(i);if(f)return f;if(l!==void 0)return l;throw new Error(`\`${d}\` must be used within \`${n}\``)}return[a,c]}function _r(n,l=[]){let i=[];function a(d,f){const m=g.createContext(f),v=i.length;i=[...i,f];const x=S=>{const{scope:C,children:_,...b}=S,k=C?.[n]?.[v]||m,T=g.useMemo(()=>b,Object.values(b));return h.jsx(k.Provider,{value:T,children:_})};x.displayName=d+"Provider";function y(S,C){const _=C?.[n]?.[v]||m,b=g.useContext(_);if(b)return b;if(f!==void 0)return f;throw new Error(`\`${S}\` must be used within \`${d}\``)}return[x,y]}const c=()=>{const d=i.map(f=>g.createContext(f));return function(m){const v=m?.[n]||d;return g.useMemo(()=>({[`__scope${n}`]:{...m,[n]:v}}),[m,v])}};return c.scopeName=n,[a,Yv(c,...l)]}function Yv(...n){const l=n[0];if(n.length===1)return l;const i=()=>{const a=n.map(c=>({useScope:c(),scopeName:c.scopeName}));return function(d){const f=a.reduce((m,{useScope:v,scopeName:x})=>{const S=v(d)[`__scope${x}`];return{...m,...S}},{});return g.useMemo(()=>({[`__scope${l.scopeName}`]:f}),[f])}};return i.scopeName=l.scopeName,i}function dt(n){const l=g.useRef(n);return g.useEffect(()=>{l.current=n}),g.useMemo(()=>(...i)=>l.current?.(...i),[])}var Qv=g.createContext(void 0);function Gv(n){const l=g.useContext(Qv);return n||l||"ltr"}function Xv(n,[l,i]){return Math.min(i,Math.max(l,n))}function Ee(n,l,{checkForDefaultPrevented:i=!0}={}){return function(c){if(n?.(c),i===!1||!c.defaultPrevented)return l?.(c)}}function Kv(n,l){return g.useReducer((i,a)=>l[i][a]??i,n)}var Ga="ScrollArea",[dp]=_r(Ga),[Zv,xt]=dp(Ga),fp=g.forwardRef((n,l)=>{const{__scopeScrollArea:i,type:a="hover",dir:c,scrollHideDelay:d=600,...f}=n,[m,v]=g.useState(null),[x,y]=g.useState(null),[S,C]=g.useState(null),[_,b]=g.useState(null),[k,T]=g.useState(null),[A,L]=g.useState(0),[$,M]=g.useState(0),[U,Y]=g.useState(!1),[B,ie]=g.useState(!1),te=We(l,ue=>v(ue)),ne=Gv(c);return h.jsx(Zv,{scope:i,type:a,dir:ne,scrollHideDelay:d,scrollArea:m,viewport:x,onViewportChange:y,content:S,onContentChange:C,scrollbarX:_,onScrollbarXChange:b,scrollbarXEnabled:U,onScrollbarXEnabledChange:Y,scrollbarY:k,onScrollbarYChange:T,scrollbarYEnabled:B,onScrollbarYEnabledChange:ie,onCornerWidthChange:L,onCornerHeightChange:M,children:h.jsx(Le.div,{dir:ne,...f,ref:te,style:{position:"relative","--radix-scroll-area-corner-width":A+"px","--radix-scroll-area-corner-height":$+"px",...n.style}})})});fp.displayName=Ga;var pp="ScrollAreaViewport",mp=g.forwardRef((n,l)=>{const{__scopeScrollArea:i,children:a,nonce:c,...d}=n,f=xt(pp,i),m=g.useRef(null),v=We(l,m,f.onViewportChange);return h.jsxs(h.Fragment,{children:[h.jsx("style",{dangerouslySetInnerHTML:{__html:"[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}"},nonce:c}),h.jsx(Le.div,{"data-radix-scroll-area-viewport":"",...d,ref:v,style:{overflowX:f.scrollbarXEnabled?"scroll":"hidden",overflowY:f.scrollbarYEnabled?"scroll":"hidden",...n.style},children:h.jsx("div",{ref:f.onContentChange,style:{minWidth:"100%",display:"table"},children:a})})]})});mp.displayName=pp;var $t="ScrollAreaScrollbar",Xa=g.forwardRef((n,l)=>{const{forceMount:i,...a}=n,c=xt($t,n.__scopeScrollArea),{onScrollbarXEnabledChange:d,onScrollbarYEnabledChange:f}=c,m=n.orientation==="horizontal";return g.useEffect(()=>(m?d(!0):f(!0),()=>{m?d(!1):f(!1)}),[m,d,f]),c.type==="hover"?h.jsx(qv,{...a,ref:l,forceMount:i}):c.type==="scroll"?h.jsx(Jv,{...a,ref:l,forceMount:i}):c.type==="auto"?h.jsx(hp,{...a,ref:l,forceMount:i}):c.type==="always"?h.jsx(Ka,{...a,ref:l}):null});Xa.displayName=$t;var qv=g.forwardRef((n,l)=>{const{forceMount:i,...a}=n,c=xt($t,n.__scopeScrollArea),[d,f]=g.useState(!1);return g.useEffect(()=>{const m=c.scrollArea;let v=0;if(m){const x=()=>{window.clearTimeout(v),f(!0)},y=()=>{v=window.setTimeout(()=>f(!1),c.scrollHideDelay)};return m.addEventListener("pointerenter",x),m.addEventListener("pointerleave",y),()=>{window.clearTimeout(v),m.removeEventListener("pointerenter",x),m.removeEventListener("pointerleave",y)}}},[c.scrollArea,c.scrollHideDelay]),h.jsx(Rt,{present:i||d,children:h.jsx(hp,{"data-state":d?"visible":"hidden",...a,ref:l})})}),Jv=g.forwardRef((n,l)=>{const{forceMount:i,...a}=n,c=xt($t,n.__scopeScrollArea),d=n.orientation==="horizontal",f=ti(()=>v("SCROLL_END"),100),[m,v]=Kv("hidden",{hidden:{SCROLL:"scrolling"},scrolling:{SCROLL_END:"idle",POINTER_ENTER:"interacting"},interacting:{SCROLL:"interacting",POINTER_LEAVE:"idle"},idle:{HIDE:"hidden",SCROLL:"scrolling",POINTER_ENTER:"interacting"}});return g.useEffect(()=>{if(m==="idle"){const x=window.setTimeout(()=>v("HIDE"),c.scrollHideDelay);return()=>window.clearTimeout(x)}},[m,c.scrollHideDelay,v]),g.useEffect(()=>{const x=c.viewport,y=d?"scrollLeft":"scrollTop";if(x){let S=x[y];const C=()=>{const _=x[y];S!==_&&(v("SCROLL"),f()),S=_};return x.addEventListener("scroll",C),()=>x.removeEventListener("scroll",C)}},[c.viewport,d,v,f]),h.jsx(Rt,{present:i||m!=="hidden",children:h.jsx(Ka,{"data-state":m==="hidden"?"hidden":"visible",...a,ref:l,onPointerEnter:Ee(n.onPointerEnter,()=>v("POINTER_ENTER")),onPointerLeave:Ee(n.onPointerLeave,()=>v("POINTER_LEAVE"))})})}),hp=g.forwardRef((n,l)=>{const i=xt($t,n.__scopeScrollArea),{forceMount:a,...c}=n,[d,f]=g.useState(!1),m=n.orientation==="horizontal",v=ti(()=>{if(i.viewport){const x=i.viewport.offsetWidth{const{orientation:i="vertical",...a}=n,c=xt($t,n.__scopeScrollArea),d=g.useRef(null),f=g.useRef(0),[m,v]=g.useState({content:0,viewport:0,scrollbar:{size:0,paddingStart:0,paddingEnd:0}}),x=wp(m.viewport,m.content),y={...a,sizes:m,onSizesChange:v,hasThumb:x>0&&x<1,onThumbChange:C=>d.current=C,onThumbPointerUp:()=>f.current=0,onThumbPointerDown:C=>f.current=C};function S(C,_){return ly(C,f.current,m,_)}return i==="horizontal"?h.jsx(ey,{...y,ref:l,onThumbPositionChange:()=>{if(c.viewport&&d.current){const C=c.viewport.scrollLeft,_=Cf(C,m,c.dir);d.current.style.transform=`translate3d(${_}px, 0, 0)`}},onWheelScroll:C=>{c.viewport&&(c.viewport.scrollLeft=C)},onDragScroll:C=>{c.viewport&&(c.viewport.scrollLeft=S(C,c.dir))}}):i==="vertical"?h.jsx(ty,{...y,ref:l,onThumbPositionChange:()=>{if(c.viewport&&d.current){const C=c.viewport.scrollTop,_=Cf(C,m);d.current.style.transform=`translate3d(0, ${_}px, 0)`}},onWheelScroll:C=>{c.viewport&&(c.viewport.scrollTop=C)},onDragScroll:C=>{c.viewport&&(c.viewport.scrollTop=S(C))}}):null}),ey=g.forwardRef((n,l)=>{const{sizes:i,onSizesChange:a,...c}=n,d=xt($t,n.__scopeScrollArea),[f,m]=g.useState(),v=g.useRef(null),x=We(l,v,d.onScrollbarXChange);return g.useEffect(()=>{v.current&&m(getComputedStyle(v.current))},[v]),h.jsx(vp,{"data-orientation":"horizontal",...c,ref:x,sizes:i,style:{bottom:0,left:d.dir==="rtl"?"var(--radix-scroll-area-corner-width)":0,right:d.dir==="ltr"?"var(--radix-scroll-area-corner-width)":0,"--radix-scroll-area-thumb-width":ei(i)+"px",...n.style},onThumbPointerDown:y=>n.onThumbPointerDown(y.x),onDragScroll:y=>n.onDragScroll(y.x),onWheelScroll:(y,S)=>{if(d.viewport){const C=d.viewport.scrollLeft+y.deltaX;n.onWheelScroll(C),Cp(C,S)&&y.preventDefault()}},onResize:()=>{v.current&&d.viewport&&f&&a({content:d.viewport.scrollWidth,viewport:d.viewport.offsetWidth,scrollbar:{size:v.current.clientWidth,paddingStart:Yl(f.paddingLeft),paddingEnd:Yl(f.paddingRight)}})}})}),ty=g.forwardRef((n,l)=>{const{sizes:i,onSizesChange:a,...c}=n,d=xt($t,n.__scopeScrollArea),[f,m]=g.useState(),v=g.useRef(null),x=We(l,v,d.onScrollbarYChange);return g.useEffect(()=>{v.current&&m(getComputedStyle(v.current))},[v]),h.jsx(vp,{"data-orientation":"vertical",...c,ref:x,sizes:i,style:{top:0,right:d.dir==="ltr"?0:void 0,left:d.dir==="rtl"?0:void 0,bottom:"var(--radix-scroll-area-corner-height)","--radix-scroll-area-thumb-height":ei(i)+"px",...n.style},onThumbPointerDown:y=>n.onThumbPointerDown(y.y),onDragScroll:y=>n.onDragScroll(y.y),onWheelScroll:(y,S)=>{if(d.viewport){const C=d.viewport.scrollTop+y.deltaY;n.onWheelScroll(C),Cp(C,S)&&y.preventDefault()}},onResize:()=>{v.current&&d.viewport&&f&&a({content:d.viewport.scrollHeight,viewport:d.viewport.offsetHeight,scrollbar:{size:v.current.clientHeight,paddingStart:Yl(f.paddingTop),paddingEnd:Yl(f.paddingBottom)}})}})}),[ny,gp]=dp($t),vp=g.forwardRef((n,l)=>{const{__scopeScrollArea:i,sizes:a,hasThumb:c,onThumbChange:d,onThumbPointerUp:f,onThumbPointerDown:m,onThumbPositionChange:v,onDragScroll:x,onWheelScroll:y,onResize:S,...C}=n,_=xt($t,i),[b,k]=g.useState(null),T=We(l,te=>k(te)),A=g.useRef(null),L=g.useRef(""),$=_.viewport,M=a.content-a.viewport,U=dt(y),Y=dt(v),B=ti(S,10);function ie(te){if(A.current){const ne=te.clientX-A.current.left,ue=te.clientY-A.current.top;x({x:ne,y:ue})}}return g.useEffect(()=>{const te=ne=>{const ue=ne.target;b?.contains(ue)&&U(ne,M)};return document.addEventListener("wheel",te,{passive:!1}),()=>document.removeEventListener("wheel",te,{passive:!1})},[$,b,M,U]),g.useEffect(Y,[a,Y]),Sr(b,B),Sr(_.content,B),h.jsx(ny,{scope:i,scrollbar:b,hasThumb:c,onThumbChange:dt(d),onThumbPointerUp:dt(f),onThumbPositionChange:Y,onThumbPointerDown:dt(m),children:h.jsx(Le.div,{...C,ref:T,style:{position:"absolute",...C.style},onPointerDown:Ee(n.onPointerDown,te=>{te.button===0&&(te.target.setPointerCapture(te.pointerId),A.current=b.getBoundingClientRect(),L.current=document.body.style.webkitUserSelect,document.body.style.webkitUserSelect="none",_.viewport&&(_.viewport.style.scrollBehavior="auto"),ie(te))}),onPointerMove:Ee(n.onPointerMove,ie),onPointerUp:Ee(n.onPointerUp,te=>{const ne=te.target;ne.hasPointerCapture(te.pointerId)&&ne.releasePointerCapture(te.pointerId),document.body.style.webkitUserSelect=L.current,_.viewport&&(_.viewport.style.scrollBehavior=""),A.current=null})})})}),Vl="ScrollAreaThumb",yp=g.forwardRef((n,l)=>{const{forceMount:i,...a}=n,c=gp(Vl,n.__scopeScrollArea);return h.jsx(Rt,{present:i||c.hasThumb,children:h.jsx(ry,{ref:l,...a})})}),ry=g.forwardRef((n,l)=>{const{__scopeScrollArea:i,style:a,...c}=n,d=xt(Vl,i),f=gp(Vl,i),{onThumbPositionChange:m}=f,v=We(l,S=>f.onThumbChange(S)),x=g.useRef(void 0),y=ti(()=>{x.current&&(x.current(),x.current=void 0)},100);return g.useEffect(()=>{const S=d.viewport;if(S){const C=()=>{if(y(),!x.current){const _=iy(S,m);x.current=_,m()}};return m(),S.addEventListener("scroll",C),()=>S.removeEventListener("scroll",C)}},[d.viewport,y,m]),h.jsx(Le.div,{"data-state":f.hasThumb?"visible":"hidden",...c,ref:v,style:{width:"var(--radix-scroll-area-thumb-width)",height:"var(--radix-scroll-area-thumb-height)",...a},onPointerDownCapture:Ee(n.onPointerDownCapture,S=>{const _=S.target.getBoundingClientRect(),b=S.clientX-_.left,k=S.clientY-_.top;f.onThumbPointerDown({x:b,y:k})}),onPointerUp:Ee(n.onPointerUp,f.onThumbPointerUp)})});yp.displayName=Vl;var Za="ScrollAreaCorner",xp=g.forwardRef((n,l)=>{const i=xt(Za,n.__scopeScrollArea),a=!!(i.scrollbarX&&i.scrollbarY);return i.type!=="scroll"&&a?h.jsx(oy,{...n,ref:l}):null});xp.displayName=Za;var oy=g.forwardRef((n,l)=>{const{__scopeScrollArea:i,...a}=n,c=xt(Za,i),[d,f]=g.useState(0),[m,v]=g.useState(0),x=!!(d&&m);return Sr(c.scrollbarX,()=>{const y=c.scrollbarX?.offsetHeight||0;c.onCornerHeightChange(y),v(y)}),Sr(c.scrollbarY,()=>{const y=c.scrollbarY?.offsetWidth||0;c.onCornerWidthChange(y),f(y)}),x?h.jsx(Le.div,{...a,ref:l,style:{width:d,height:m,position:"absolute",right:c.dir==="ltr"?0:void 0,left:c.dir==="rtl"?0:void 0,bottom:0,...n.style}}):null});function Yl(n){return n?parseInt(n,10):0}function wp(n,l){const i=n/l;return isNaN(i)?0:i}function ei(n){const l=wp(n.viewport,n.content),i=n.scrollbar.paddingStart+n.scrollbar.paddingEnd,a=(n.scrollbar.size-i)*l;return Math.max(a,18)}function ly(n,l,i,a="ltr"){const c=ei(i),d=c/2,f=l||d,m=c-f,v=i.scrollbar.paddingStart+f,x=i.scrollbar.size-i.scrollbar.paddingEnd-m,y=i.content-i.viewport,S=a==="ltr"?[0,y]:[y*-1,0];return Sp([v,x],S)(n)}function Cf(n,l,i="ltr"){const a=ei(l),c=l.scrollbar.paddingStart+l.scrollbar.paddingEnd,d=l.scrollbar.size-c,f=l.content-l.viewport,m=d-a,v=i==="ltr"?[0,f]:[f*-1,0],x=Xv(n,v);return Sp([0,f],[0,m])(x)}function Sp(n,l){return i=>{if(n[0]===n[1]||l[0]===l[1])return l[0];const a=(l[1]-l[0])/(n[1]-n[0]);return l[0]+a*(i-n[0])}}function Cp(n,l){return n>0&&n{})=>{let i={left:n.scrollLeft,top:n.scrollTop},a=0;return(function c(){const d={left:n.scrollLeft,top:n.scrollTop},f=i.left!==d.left,m=i.top!==d.top;(f||m)&&l(),i=d,a=window.requestAnimationFrame(c)})(),()=>window.cancelAnimationFrame(a)};function ti(n,l){const i=dt(n),a=g.useRef(0);return g.useEffect(()=>()=>window.clearTimeout(a.current),[]),g.useCallback(()=>{window.clearTimeout(a.current),a.current=window.setTimeout(i,l)},[i,l])}function Sr(n,l){const i=dt(l);Ft(()=>{let a=0;if(n){const c=new ResizeObserver(()=>{cancelAnimationFrame(a),a=window.requestAnimationFrame(i)});return c.observe(n),()=>{window.cancelAnimationFrame(a),c.unobserve(n)}}},[n,i])}var Ep=fp,sy=mp,ay=xp;function kp(n){var l,i,a="";if(typeof n=="string"||typeof n=="number")a+=n;else if(typeof n=="object")if(Array.isArray(n)){var c=n.length;for(l=0;l{const l=dy(n),{conflictingClassGroups:i,conflictingClassGroupModifiers:a}=n;return{getClassGroupId:f=>{const m=f.split(qa);return m[0]===""&&m.length!==1&&m.shift(),Np(m,l)||cy(f)},getConflictingClassGroupIds:(f,m)=>{const v=i[f]||[];return m&&a[f]?[...v,...a[f]]:v}}},Np=(n,l)=>{if(n.length===0)return l.classGroupId;const i=n[0],a=l.nextPart.get(i),c=a?Np(n.slice(1),a):void 0;if(c)return c;if(l.validators.length===0)return;const d=n.join(qa);return l.validators.find(({validator:f})=>f(d))?.classGroupId},Ef=/^\[(.+)\]$/,cy=n=>{if(Ef.test(n)){const l=Ef.exec(n)[1],i=l?.substring(0,l.indexOf(":"));if(i)return"arbitrary.."+i}},dy=n=>{const{theme:l,prefix:i}=n,a={nextPart:new Map,validators:[]};return py(Object.entries(n.classGroups),i).forEach(([d,f])=>{Ma(f,a,d,l)}),a},Ma=(n,l,i,a)=>{n.forEach(c=>{if(typeof c=="string"){const d=c===""?l:kf(l,c);d.classGroupId=i;return}if(typeof c=="function"){if(fy(c)){Ma(c(a),l,i,a);return}l.validators.push({validator:c,classGroupId:i});return}Object.entries(c).forEach(([d,f])=>{Ma(f,kf(l,d),i,a)})})},kf=(n,l)=>{let i=n;return l.split(qa).forEach(a=>{i.nextPart.has(a)||i.nextPart.set(a,{nextPart:new Map,validators:[]}),i=i.nextPart.get(a)}),i},fy=n=>n.isThemeGetter,py=(n,l)=>l?n.map(([i,a])=>{const c=a.map(d=>typeof d=="string"?l+d:typeof d=="object"?Object.fromEntries(Object.entries(d).map(([f,m])=>[l+f,m])):d);return[i,c]}):n,my=n=>{if(n<1)return{get:()=>{},set:()=>{}};let l=0,i=new Map,a=new Map;const c=(d,f)=>{i.set(d,f),l++,l>n&&(l=0,a=i,i=new Map)};return{get(d){let f=i.get(d);if(f!==void 0)return f;if((f=a.get(d))!==void 0)return c(d,f),f},set(d,f){i.has(d)?i.set(d,f):c(d,f)}}},Pp="!",hy=n=>{const{separator:l,experimentalParseClassName:i}=n,a=l.length===1,c=l[0],d=l.length,f=m=>{const v=[];let x=0,y=0,S;for(let T=0;Ty?S-y:void 0;return{modifiers:v,hasImportantModifier:_,baseClassName:b,maybePostfixModifierPosition:k}};return i?m=>i({className:m,parseClassName:f}):f},gy=n=>{if(n.length<=1)return n;const l=[];let i=[];return n.forEach(a=>{a[0]==="["?(l.push(...i.sort(),a),i=[]):i.push(a)}),l.push(...i.sort()),l},vy=n=>({cache:my(n.cacheSize),parseClassName:hy(n),...uy(n)}),yy=/\s+/,xy=(n,l)=>{const{parseClassName:i,getClassGroupId:a,getConflictingClassGroupIds:c}=l,d=[],f=n.trim().split(yy);let m="";for(let v=f.length-1;v>=0;v-=1){const x=f[v],{modifiers:y,hasImportantModifier:S,baseClassName:C,maybePostfixModifierPosition:_}=i(x);let b=!!_,k=a(b?C.substring(0,_):C);if(!k){if(!b){m=x+(m.length>0?" "+m:m);continue}if(k=a(C),!k){m=x+(m.length>0?" "+m:m);continue}b=!1}const T=gy(y).join(":"),A=S?T+Pp:T,L=A+k;if(d.includes(L))continue;d.push(L);const $=c(k,b);for(let M=0;M<$.length;++M){const U=$[M];d.push(A+U)}m=x+(m.length>0?" "+m:m)}return m};function wy(){let n=0,l,i,a="";for(;n{if(typeof n=="string")return n;let l,i="";for(let a=0;aS(y),n());return i=vy(x),a=i.cache.get,c=i.cache.set,d=m,m(v)}function m(v){const x=a(v);if(x)return x;const y=xy(v,i);return c(v,y),y}return function(){return d(wy.apply(null,arguments))}}const Te=n=>{const l=i=>i[n]||[];return l.isThemeGetter=!0,l},Rp=/^\[(?:([a-z-]+):)?(.+)\]$/i,Cy=/^\d+\/\d+$/,Ey=new Set(["px","full","screen"]),ky=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,_y=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,Ny=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,Py=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,by=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,Zt=n=>yr(n)||Ey.has(n)||Cy.test(n),Sn=n=>Nr(n,"length",My),yr=n=>!!n&&!Number.isNaN(Number(n)),wa=n=>Nr(n,"number",yr),go=n=>!!n&&Number.isInteger(Number(n)),Ry=n=>n.endsWith("%")&&yr(n.slice(0,-1)),fe=n=>Rp.test(n),Cn=n=>ky.test(n),Ty=new Set(["length","size","percentage"]),jy=n=>Nr(n,Ty,Tp),Oy=n=>Nr(n,"position",Tp),Ay=new Set(["image","url"]),Ly=n=>Nr(n,Ay,zy),Dy=n=>Nr(n,"",Iy),vo=()=>!0,Nr=(n,l,i)=>{const a=Rp.exec(n);return a?a[1]?typeof l=="string"?a[1]===l:l.has(a[1]):i(a[2]):!1},My=n=>_y.test(n)&&!Ny.test(n),Tp=()=>!1,Iy=n=>Py.test(n),zy=n=>by.test(n),Fy=()=>{const n=Te("colors"),l=Te("spacing"),i=Te("blur"),a=Te("brightness"),c=Te("borderColor"),d=Te("borderRadius"),f=Te("borderSpacing"),m=Te("borderWidth"),v=Te("contrast"),x=Te("grayscale"),y=Te("hueRotate"),S=Te("invert"),C=Te("gap"),_=Te("gradientColorStops"),b=Te("gradientColorStopPositions"),k=Te("inset"),T=Te("margin"),A=Te("opacity"),L=Te("padding"),$=Te("saturate"),M=Te("scale"),U=Te("sepia"),Y=Te("skew"),B=Te("space"),ie=Te("translate"),te=()=>["auto","contain","none"],ne=()=>["auto","hidden","clip","visible","scroll"],ue=()=>["auto",fe,l],J=()=>[fe,l],he=()=>["",Zt,Sn],ce=()=>["auto",yr,fe],ee=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],le=()=>["solid","dashed","dotted","double","none"],se=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],D=()=>["start","end","center","between","around","evenly","stretch"],Q=()=>["","0",fe],V=()=>["auto","avoid","all","avoid-page","page","left","right","column"],P=()=>[yr,fe];return{cacheSize:500,separator:":",theme:{colors:[vo],spacing:[Zt,Sn],blur:["none","",Cn,fe],brightness:P(),borderColor:[n],borderRadius:["none","","full",Cn,fe],borderSpacing:J(),borderWidth:he(),contrast:P(),grayscale:Q(),hueRotate:P(),invert:Q(),gap:J(),gradientColorStops:[n],gradientColorStopPositions:[Ry,Sn],inset:ue(),margin:ue(),opacity:P(),padding:J(),saturate:P(),scale:P(),sepia:Q(),skew:P(),space:J(),translate:J()},classGroups:{aspect:[{aspect:["auto","square","video",fe]}],container:["container"],columns:[{columns:[Cn]}],"break-after":[{"break-after":V()}],"break-before":[{"break-before":V()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...ee(),fe]}],overflow:[{overflow:ne()}],"overflow-x":[{"overflow-x":ne()}],"overflow-y":[{"overflow-y":ne()}],overscroll:[{overscroll:te()}],"overscroll-x":[{"overscroll-x":te()}],"overscroll-y":[{"overscroll-y":te()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[k]}],"inset-x":[{"inset-x":[k]}],"inset-y":[{"inset-y":[k]}],start:[{start:[k]}],end:[{end:[k]}],top:[{top:[k]}],right:[{right:[k]}],bottom:[{bottom:[k]}],left:[{left:[k]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",go,fe]}],basis:[{basis:ue()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",fe]}],grow:[{grow:Q()}],shrink:[{shrink:Q()}],order:[{order:["first","last","none",go,fe]}],"grid-cols":[{"grid-cols":[vo]}],"col-start-end":[{col:["auto",{span:["full",go,fe]},fe]}],"col-start":[{"col-start":ce()}],"col-end":[{"col-end":ce()}],"grid-rows":[{"grid-rows":[vo]}],"row-start-end":[{row:["auto",{span:[go,fe]},fe]}],"row-start":[{"row-start":ce()}],"row-end":[{"row-end":ce()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",fe]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",fe]}],gap:[{gap:[C]}],"gap-x":[{"gap-x":[C]}],"gap-y":[{"gap-y":[C]}],"justify-content":[{justify:["normal",...D()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...D(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...D(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[L]}],px:[{px:[L]}],py:[{py:[L]}],ps:[{ps:[L]}],pe:[{pe:[L]}],pt:[{pt:[L]}],pr:[{pr:[L]}],pb:[{pb:[L]}],pl:[{pl:[L]}],m:[{m:[T]}],mx:[{mx:[T]}],my:[{my:[T]}],ms:[{ms:[T]}],me:[{me:[T]}],mt:[{mt:[T]}],mr:[{mr:[T]}],mb:[{mb:[T]}],ml:[{ml:[T]}],"space-x":[{"space-x":[B]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[B]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",fe,l]}],"min-w":[{"min-w":[fe,l,"min","max","fit"]}],"max-w":[{"max-w":[fe,l,"none","full","min","max","fit","prose",{screen:[Cn]},Cn]}],h:[{h:[fe,l,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[fe,l,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[fe,l,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[fe,l,"auto","min","max","fit"]}],"font-size":[{text:["base",Cn,Sn]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",wa]}],"font-family":[{font:[vo]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",fe]}],"line-clamp":[{"line-clamp":["none",yr,wa]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",Zt,fe]}],"list-image":[{"list-image":["none",fe]}],"list-style-type":[{list:["none","disc","decimal",fe]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[n]}],"placeholder-opacity":[{"placeholder-opacity":[A]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[n]}],"text-opacity":[{"text-opacity":[A]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...le(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",Zt,Sn]}],"underline-offset":[{"underline-offset":["auto",Zt,fe]}],"text-decoration-color":[{decoration:[n]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:J()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",fe]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",fe]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[A]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...ee(),Oy]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",jy]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},Ly]}],"bg-color":[{bg:[n]}],"gradient-from-pos":[{from:[b]}],"gradient-via-pos":[{via:[b]}],"gradient-to-pos":[{to:[b]}],"gradient-from":[{from:[_]}],"gradient-via":[{via:[_]}],"gradient-to":[{to:[_]}],rounded:[{rounded:[d]}],"rounded-s":[{"rounded-s":[d]}],"rounded-e":[{"rounded-e":[d]}],"rounded-t":[{"rounded-t":[d]}],"rounded-r":[{"rounded-r":[d]}],"rounded-b":[{"rounded-b":[d]}],"rounded-l":[{"rounded-l":[d]}],"rounded-ss":[{"rounded-ss":[d]}],"rounded-se":[{"rounded-se":[d]}],"rounded-ee":[{"rounded-ee":[d]}],"rounded-es":[{"rounded-es":[d]}],"rounded-tl":[{"rounded-tl":[d]}],"rounded-tr":[{"rounded-tr":[d]}],"rounded-br":[{"rounded-br":[d]}],"rounded-bl":[{"rounded-bl":[d]}],"border-w":[{border:[m]}],"border-w-x":[{"border-x":[m]}],"border-w-y":[{"border-y":[m]}],"border-w-s":[{"border-s":[m]}],"border-w-e":[{"border-e":[m]}],"border-w-t":[{"border-t":[m]}],"border-w-r":[{"border-r":[m]}],"border-w-b":[{"border-b":[m]}],"border-w-l":[{"border-l":[m]}],"border-opacity":[{"border-opacity":[A]}],"border-style":[{border:[...le(),"hidden"]}],"divide-x":[{"divide-x":[m]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[m]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[A]}],"divide-style":[{divide:le()}],"border-color":[{border:[c]}],"border-color-x":[{"border-x":[c]}],"border-color-y":[{"border-y":[c]}],"border-color-s":[{"border-s":[c]}],"border-color-e":[{"border-e":[c]}],"border-color-t":[{"border-t":[c]}],"border-color-r":[{"border-r":[c]}],"border-color-b":[{"border-b":[c]}],"border-color-l":[{"border-l":[c]}],"divide-color":[{divide:[c]}],"outline-style":[{outline:["",...le()]}],"outline-offset":[{"outline-offset":[Zt,fe]}],"outline-w":[{outline:[Zt,Sn]}],"outline-color":[{outline:[n]}],"ring-w":[{ring:he()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[n]}],"ring-opacity":[{"ring-opacity":[A]}],"ring-offset-w":[{"ring-offset":[Zt,Sn]}],"ring-offset-color":[{"ring-offset":[n]}],shadow:[{shadow:["","inner","none",Cn,Dy]}],"shadow-color":[{shadow:[vo]}],opacity:[{opacity:[A]}],"mix-blend":[{"mix-blend":[...se(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":se()}],filter:[{filter:["","none"]}],blur:[{blur:[i]}],brightness:[{brightness:[a]}],contrast:[{contrast:[v]}],"drop-shadow":[{"drop-shadow":["","none",Cn,fe]}],grayscale:[{grayscale:[x]}],"hue-rotate":[{"hue-rotate":[y]}],invert:[{invert:[S]}],saturate:[{saturate:[$]}],sepia:[{sepia:[U]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[i]}],"backdrop-brightness":[{"backdrop-brightness":[a]}],"backdrop-contrast":[{"backdrop-contrast":[v]}],"backdrop-grayscale":[{"backdrop-grayscale":[x]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[y]}],"backdrop-invert":[{"backdrop-invert":[S]}],"backdrop-opacity":[{"backdrop-opacity":[A]}],"backdrop-saturate":[{"backdrop-saturate":[$]}],"backdrop-sepia":[{"backdrop-sepia":[U]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[f]}],"border-spacing-x":[{"border-spacing-x":[f]}],"border-spacing-y":[{"border-spacing-y":[f]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",fe]}],duration:[{duration:P()}],ease:[{ease:["linear","in","out","in-out",fe]}],delay:[{delay:P()}],animate:[{animate:["none","spin","ping","pulse","bounce",fe]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[M]}],"scale-x":[{"scale-x":[M]}],"scale-y":[{"scale-y":[M]}],rotate:[{rotate:[go,fe]}],"translate-x":[{"translate-x":[ie]}],"translate-y":[{"translate-y":[ie]}],"skew-x":[{"skew-x":[Y]}],"skew-y":[{"skew-y":[Y]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",fe]}],accent:[{accent:["auto",n]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",fe]}],"caret-color":[{caret:[n]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":J()}],"scroll-mx":[{"scroll-mx":J()}],"scroll-my":[{"scroll-my":J()}],"scroll-ms":[{"scroll-ms":J()}],"scroll-me":[{"scroll-me":J()}],"scroll-mt":[{"scroll-mt":J()}],"scroll-mr":[{"scroll-mr":J()}],"scroll-mb":[{"scroll-mb":J()}],"scroll-ml":[{"scroll-ml":J()}],"scroll-p":[{"scroll-p":J()}],"scroll-px":[{"scroll-px":J()}],"scroll-py":[{"scroll-py":J()}],"scroll-ps":[{"scroll-ps":J()}],"scroll-pe":[{"scroll-pe":J()}],"scroll-pt":[{"scroll-pt":J()}],"scroll-pr":[{"scroll-pr":J()}],"scroll-pb":[{"scroll-pb":J()}],"scroll-pl":[{"scroll-pl":J()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",fe]}],fill:[{fill:[n,"none"]}],"stroke-w":[{stroke:[Zt,Sn,wa]}],stroke:[{stroke:[n,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},$y=Sy(Fy);function pe(...n){return $y(_p(n))}const ni=g.forwardRef(({className:n,children:l,...i},a)=>h.jsxs(Ep,{ref:a,className:pe("relative overflow-hidden",n),...i,children:[h.jsx(sy,{className:"h-full w-full rounded-[inherit]",children:l}),h.jsx(jp,{}),h.jsx(ay,{})]}));ni.displayName=Ep.displayName;const jp=g.forwardRef(({className:n,orientation:l="vertical",...i},a)=>h.jsx(Xa,{ref:a,orientation:l,className:pe("flex touch-none select-none transition-colors",l==="vertical"&&"h-full w-2.5 border-l border-l-transparent p-[1px]",l==="horizontal"&&"h-2.5 flex-col border-t border-t-transparent p-[1px]",n),...i,children:h.jsx(yp,{className:"relative flex-1 rounded-full bg-border"})}));jp.displayName=Xa.displayName;var Wy=rp[" useId ".trim().toString()]||(()=>{}),Hy=0;function xo(n){const[l,i]=g.useState(Wy());return Ft(()=>{i(a=>a??String(Hy++))},[n]),n||(l?`radix-${l}`:"")}var Uy=rp[" useInsertionEffect ".trim().toString()]||Ft;function ri({prop:n,defaultProp:l,onChange:i=()=>{},caller:a}){const[c,d,f]=By({defaultProp:l,onChange:i}),m=n!==void 0,v=m?n:c;{const y=g.useRef(n!==void 0);g.useEffect(()=>{const S=y.current;S!==m&&console.warn(`${a} is changing from ${S?"controlled":"uncontrolled"} to ${m?"controlled":"uncontrolled"}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),y.current=m},[m,a])}const x=g.useCallback(y=>{if(m){const S=Vy(y)?y(n):y;S!==n&&f.current?.(S)}else d(y)},[m,n,d,f]);return[v,x]}function By({defaultProp:n,onChange:l}){const[i,a]=g.useState(n),c=g.useRef(i),d=g.useRef(l);return Uy(()=>{d.current=l},[l]),g.useEffect(()=>{c.current!==i&&(d.current?.(i),c.current=i)},[i,c]),[i,a,d]}function Vy(n){return typeof n=="function"}function Yy(n,l=globalThis?.document){const i=dt(n);g.useEffect(()=>{const a=c=>{c.key==="Escape"&&i(c)};return l.addEventListener("keydown",a,{capture:!0}),()=>l.removeEventListener("keydown",a,{capture:!0})},[i,l])}var Qy="DismissableLayer",Ia="dismissableLayer.update",Gy="dismissableLayer.pointerDownOutside",Xy="dismissableLayer.focusOutside",_f,Op=g.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),oi=g.forwardRef((n,l)=>{const{disableOutsidePointerEvents:i=!1,onEscapeKeyDown:a,onPointerDownOutside:c,onFocusOutside:d,onInteractOutside:f,onDismiss:m,...v}=n,x=g.useContext(Op),[y,S]=g.useState(null),C=y?.ownerDocument??globalThis?.document,[,_]=g.useState({}),b=We(l,B=>S(B)),k=Array.from(x.layers),[T]=[...x.layersWithOutsidePointerEventsDisabled].slice(-1),A=k.indexOf(T),L=y?k.indexOf(y):-1,$=x.layersWithOutsidePointerEventsDisabled.size>0,M=L>=A,U=qy(B=>{const ie=B.target,te=[...x.branches].some(ne=>ne.contains(ie));!M||te||(c?.(B),f?.(B),B.defaultPrevented||m?.())},C),Y=Jy(B=>{const ie=B.target;[...x.branches].some(ne=>ne.contains(ie))||(d?.(B),f?.(B),B.defaultPrevented||m?.())},C);return Yy(B=>{L===x.layers.size-1&&(a?.(B),!B.defaultPrevented&&m&&(B.preventDefault(),m()))},C),g.useEffect(()=>{if(y)return i&&(x.layersWithOutsidePointerEventsDisabled.size===0&&(_f=C.body.style.pointerEvents,C.body.style.pointerEvents="none"),x.layersWithOutsidePointerEventsDisabled.add(y)),x.layers.add(y),Nf(),()=>{i&&x.layersWithOutsidePointerEventsDisabled.size===1&&(C.body.style.pointerEvents=_f)}},[y,C,i,x]),g.useEffect(()=>()=>{y&&(x.layers.delete(y),x.layersWithOutsidePointerEventsDisabled.delete(y),Nf())},[y,x]),g.useEffect(()=>{const B=()=>_({});return document.addEventListener(Ia,B),()=>document.removeEventListener(Ia,B)},[]),h.jsx(Le.div,{...v,ref:b,style:{pointerEvents:$?M?"auto":"none":void 0,...n.style},onFocusCapture:Ee(n.onFocusCapture,Y.onFocusCapture),onBlurCapture:Ee(n.onBlurCapture,Y.onBlurCapture),onPointerDownCapture:Ee(n.onPointerDownCapture,U.onPointerDownCapture)})});oi.displayName=Qy;var Ky="DismissableLayerBranch",Zy=g.forwardRef((n,l)=>{const i=g.useContext(Op),a=g.useRef(null),c=We(l,a);return g.useEffect(()=>{const d=a.current;if(d)return i.branches.add(d),()=>{i.branches.delete(d)}},[i.branches]),h.jsx(Le.div,{...n,ref:c})});Zy.displayName=Ky;function qy(n,l=globalThis?.document){const i=dt(n),a=g.useRef(!1),c=g.useRef(()=>{});return g.useEffect(()=>{const d=m=>{if(m.target&&!a.current){let v=function(){Ap(Gy,i,x,{discrete:!0})};const x={originalEvent:m};m.pointerType==="touch"?(l.removeEventListener("click",c.current),c.current=v,l.addEventListener("click",c.current,{once:!0})):v()}else l.removeEventListener("click",c.current);a.current=!1},f=window.setTimeout(()=>{l.addEventListener("pointerdown",d)},0);return()=>{window.clearTimeout(f),l.removeEventListener("pointerdown",d),l.removeEventListener("click",c.current)}},[l,i]),{onPointerDownCapture:()=>a.current=!0}}function Jy(n,l=globalThis?.document){const i=dt(n),a=g.useRef(!1);return g.useEffect(()=>{const c=d=>{d.target&&!a.current&&Ap(Xy,i,{originalEvent:d},{discrete:!1})};return l.addEventListener("focusin",c),()=>l.removeEventListener("focusin",c)},[l,i]),{onFocusCapture:()=>a.current=!0,onBlurCapture:()=>a.current=!1}}function Nf(){const n=new CustomEvent(Ia);document.dispatchEvent(n)}function Ap(n,l,i,{discrete:a}){const c=i.originalEvent.target,d=new CustomEvent(n,{bubbles:!1,cancelable:!0,detail:i});l&&c.addEventListener(n,l,{once:!0}),a?Wv(c,d):c.dispatchEvent(d)}var Sa="focusScope.autoFocusOnMount",Ca="focusScope.autoFocusOnUnmount",Pf={bubbles:!1,cancelable:!0},ex="FocusScope",Lp=g.forwardRef((n,l)=>{const{loop:i=!1,trapped:a=!1,onMountAutoFocus:c,onUnmountAutoFocus:d,...f}=n,[m,v]=g.useState(null),x=dt(c),y=dt(d),S=g.useRef(null),C=We(l,k=>v(k)),_=g.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;g.useEffect(()=>{if(a){let k=function($){if(_.paused||!m)return;const M=$.target;m.contains(M)?S.current=M:En(S.current,{select:!0})},T=function($){if(_.paused||!m)return;const M=$.relatedTarget;M!==null&&(m.contains(M)||En(S.current,{select:!0}))},A=function($){if(document.activeElement===document.body)for(const U of $)U.removedNodes.length>0&&En(m)};document.addEventListener("focusin",k),document.addEventListener("focusout",T);const L=new MutationObserver(A);return m&&L.observe(m,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",k),document.removeEventListener("focusout",T),L.disconnect()}}},[a,m,_.paused]),g.useEffect(()=>{if(m){Rf.add(_);const k=document.activeElement;if(!m.contains(k)){const A=new CustomEvent(Sa,Pf);m.addEventListener(Sa,x),m.dispatchEvent(A),A.defaultPrevented||(tx(ix(Dp(m)),{select:!0}),document.activeElement===k&&En(m))}return()=>{m.removeEventListener(Sa,x),setTimeout(()=>{const A=new CustomEvent(Ca,Pf);m.addEventListener(Ca,y),m.dispatchEvent(A),A.defaultPrevented||En(k??document.body,{select:!0}),m.removeEventListener(Ca,y),Rf.remove(_)},0)}}},[m,x,y,_]);const b=g.useCallback(k=>{if(!i&&!a||_.paused)return;const T=k.key==="Tab"&&!k.altKey&&!k.ctrlKey&&!k.metaKey,A=document.activeElement;if(T&&A){const L=k.currentTarget,[$,M]=nx(L);$&&M?!k.shiftKey&&A===M?(k.preventDefault(),i&&En($,{select:!0})):k.shiftKey&&A===$&&(k.preventDefault(),i&&En(M,{select:!0})):A===L&&k.preventDefault()}},[i,a,_.paused]);return h.jsx(Le.div,{tabIndex:-1,...f,ref:C,onKeyDown:b})});Lp.displayName=ex;function tx(n,{select:l=!1}={}){const i=document.activeElement;for(const a of n)if(En(a,{select:l}),document.activeElement!==i)return}function nx(n){const l=Dp(n),i=bf(l,n),a=bf(l.reverse(),n);return[i,a]}function Dp(n){const l=[],i=document.createTreeWalker(n,NodeFilter.SHOW_ELEMENT,{acceptNode:a=>{const c=a.tagName==="INPUT"&&a.type==="hidden";return a.disabled||a.hidden||c?NodeFilter.FILTER_SKIP:a.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;i.nextNode();)l.push(i.currentNode);return l}function bf(n,l){for(const i of n)if(!rx(i,{upTo:l}))return i}function rx(n,{upTo:l}){if(getComputedStyle(n).visibility==="hidden")return!0;for(;n;){if(l!==void 0&&n===l)return!1;if(getComputedStyle(n).display==="none")return!0;n=n.parentElement}return!1}function ox(n){return n instanceof HTMLInputElement&&"select"in n}function En(n,{select:l=!1}={}){if(n&&n.focus){const i=document.activeElement;n.focus({preventScroll:!0}),n!==i&&ox(n)&&l&&n.select()}}var Rf=lx();function lx(){let n=[];return{add(l){const i=n[0];l!==i&&i?.pause(),n=Tf(n,l),n.unshift(l)},remove(l){n=Tf(n,l),n[0]?.resume()}}}function Tf(n,l){const i=[...n],a=i.indexOf(l);return a!==-1&&i.splice(a,1),i}function ix(n){return n.filter(l=>l.tagName!=="A")}var sx="Portal",Mp=g.forwardRef((n,l)=>{const{container:i,...a}=n,[c,d]=g.useState(!1);Ft(()=>d(!0),[]);const f=i||c&&globalThis?.document?.body;return f?Lv.createPortal(h.jsx(Le.div,{...a,ref:l}),f):null});Mp.displayName=sx;var Ea=0;function ax(){g.useEffect(()=>{const n=document.querySelectorAll("[data-radix-focus-guard]");return document.body.insertAdjacentElement("afterbegin",n[0]??jf()),document.body.insertAdjacentElement("beforeend",n[1]??jf()),Ea++,()=>{Ea===1&&document.querySelectorAll("[data-radix-focus-guard]").forEach(l=>l.remove()),Ea--}},[])}function jf(){const n=document.createElement("span");return n.setAttribute("data-radix-focus-guard",""),n.tabIndex=0,n.style.outline="none",n.style.opacity="0",n.style.position="fixed",n.style.pointerEvents="none",n}var Mt=function(){return Mt=Object.assign||function(l){for(var i,a=1,c=arguments.length;a"u")return _x;var l=Nx(n),i=document.documentElement.clientWidth,a=window.innerWidth;return{left:l[0],top:l[1],right:l[2],gap:Math.max(0,a-i+l[2]-l[0])}},bx=$p(),xr="data-scroll-locked",Rx=function(n,l,i,a){var c=n.left,d=n.top,f=n.right,m=n.gap;return i===void 0&&(i="margin"),` - .`.concat(cx,` { - overflow: hidden `).concat(a,`; - padding-right: `).concat(m,"px ").concat(a,`; - } - body[`).concat(xr,`] { - overflow: hidden `).concat(a,`; - overscroll-behavior: contain; - `).concat([l&&"position: relative ".concat(a,";"),i==="margin"&&` - padding-left: `.concat(c,`px; - padding-top: `).concat(d,`px; - padding-right: `).concat(f,`px; - margin-left:0; - margin-top:0; - margin-right: `).concat(m,"px ").concat(a,`; - `),i==="padding"&&"padding-right: ".concat(m,"px ").concat(a,";")].filter(Boolean).join(""),` - } - - .`).concat(Hl,` { - right: `).concat(m,"px ").concat(a,`; - } - - .`).concat(Ul,` { - margin-right: `).concat(m,"px ").concat(a,`; - } - - .`).concat(Hl," .").concat(Hl,` { - right: 0 `).concat(a,`; - } - - .`).concat(Ul," .").concat(Ul,` { - margin-right: 0 `).concat(a,`; - } - - body[`).concat(xr,`] { - `).concat(dx,": ").concat(m,`px; - } -`)},Af=function(){var n=parseInt(document.body.getAttribute(xr)||"0",10);return isFinite(n)?n:0},Tx=function(){g.useEffect(function(){return document.body.setAttribute(xr,(Af()+1).toString()),function(){var n=Af()-1;n<=0?document.body.removeAttribute(xr):document.body.setAttribute(xr,n.toString())}},[])},jx=function(n){var l=n.noRelative,i=n.noImportant,a=n.gapMode,c=a===void 0?"margin":a;Tx();var d=g.useMemo(function(){return Px(c)},[c]);return g.createElement(bx,{styles:Rx(d,!l,c,i?"":"!important")})},za=!1;if(typeof window<"u")try{var Il=Object.defineProperty({},"passive",{get:function(){return za=!0,!0}});window.addEventListener("test",Il,Il),window.removeEventListener("test",Il,Il)}catch{za=!1}var hr=za?{passive:!1}:!1,Ox=function(n){return n.tagName==="TEXTAREA"},Wp=function(n,l){if(!(n instanceof Element))return!1;var i=window.getComputedStyle(n);return i[l]!=="hidden"&&!(i.overflowY===i.overflowX&&!Ox(n)&&i[l]==="visible")},Ax=function(n){return Wp(n,"overflowY")},Lx=function(n){return Wp(n,"overflowX")},Lf=function(n,l){var i=l.ownerDocument,a=l;do{typeof ShadowRoot<"u"&&a instanceof ShadowRoot&&(a=a.host);var c=Hp(n,a);if(c){var d=Up(n,a),f=d[1],m=d[2];if(f>m)return!0}a=a.parentNode}while(a&&a!==i.body);return!1},Dx=function(n){var l=n.scrollTop,i=n.scrollHeight,a=n.clientHeight;return[l,i,a]},Mx=function(n){var l=n.scrollLeft,i=n.scrollWidth,a=n.clientWidth;return[l,i,a]},Hp=function(n,l){return n==="v"?Ax(l):Lx(l)},Up=function(n,l){return n==="v"?Dx(l):Mx(l)},Ix=function(n,l){return n==="h"&&l==="rtl"?-1:1},zx=function(n,l,i,a,c){var d=Ix(n,window.getComputedStyle(l).direction),f=d*a,m=i.target,v=l.contains(m),x=!1,y=f>0,S=0,C=0;do{if(!m)break;var _=Up(n,m),b=_[0],k=_[1],T=_[2],A=k-T-d*b;(b||A)&&Hp(n,m)&&(S+=A,C+=b);var L=m.parentNode;m=L&&L.nodeType===Node.DOCUMENT_FRAGMENT_NODE?L.host:L}while(!v&&m!==document.body||v&&(l.contains(m)||l===m));return(y&&Math.abs(S)<1||!y&&Math.abs(C)<1)&&(x=!0),x},zl=function(n){return"changedTouches"in n?[n.changedTouches[0].clientX,n.changedTouches[0].clientY]:[0,0]},Df=function(n){return[n.deltaX,n.deltaY]},Mf=function(n){return n&&"current"in n?n.current:n},Fx=function(n,l){return n[0]===l[0]&&n[1]===l[1]},$x=function(n){return` - .block-interactivity-`.concat(n,` {pointer-events: none;} - .allow-interactivity-`).concat(n,` {pointer-events: all;} -`)},Wx=0,gr=[];function Hx(n){var l=g.useRef([]),i=g.useRef([0,0]),a=g.useRef(),c=g.useState(Wx++)[0],d=g.useState($p)[0],f=g.useRef(n);g.useEffect(function(){f.current=n},[n]),g.useEffect(function(){if(n.inert){document.body.classList.add("block-interactivity-".concat(c));var k=ux([n.lockRef.current],(n.shards||[]).map(Mf),!0).filter(Boolean);return k.forEach(function(T){return T.classList.add("allow-interactivity-".concat(c))}),function(){document.body.classList.remove("block-interactivity-".concat(c)),k.forEach(function(T){return T.classList.remove("allow-interactivity-".concat(c))})}}},[n.inert,n.lockRef.current,n.shards]);var m=g.useCallback(function(k,T){if("touches"in k&&k.touches.length===2||k.type==="wheel"&&k.ctrlKey)return!f.current.allowPinchZoom;var A=zl(k),L=i.current,$="deltaX"in k?k.deltaX:L[0]-A[0],M="deltaY"in k?k.deltaY:L[1]-A[1],U,Y=k.target,B=Math.abs($)>Math.abs(M)?"h":"v";if("touches"in k&&B==="h"&&Y.type==="range")return!1;var ie=window.getSelection(),te=ie&&ie.anchorNode,ne=te?te===Y||te.contains(Y):!1;if(ne)return!1;var ue=Lf(B,Y);if(!ue)return!0;if(ue?U=B:(U=B==="v"?"h":"v",ue=Lf(B,Y)),!ue)return!1;if(!a.current&&"changedTouches"in k&&($||M)&&(a.current=U),!U)return!0;var J=a.current||U;return zx(J,T,k,J==="h"?$:M)},[]),v=g.useCallback(function(k){var T=k;if(!(!gr.length||gr[gr.length-1]!==d)){var A="deltaY"in T?Df(T):zl(T),L=l.current.filter(function(U){return U.name===T.type&&(U.target===T.target||T.target===U.shadowParent)&&Fx(U.delta,A)})[0];if(L&&L.should){T.cancelable&&T.preventDefault();return}if(!L){var $=(f.current.shards||[]).map(Mf).filter(Boolean).filter(function(U){return U.contains(T.target)}),M=$.length>0?m(T,$[0]):!f.current.noIsolation;M&&T.cancelable&&T.preventDefault()}}},[]),x=g.useCallback(function(k,T,A,L){var $={name:k,delta:T,target:A,should:L,shadowParent:Ux(A)};l.current.push($),setTimeout(function(){l.current=l.current.filter(function(M){return M!==$})},1)},[]),y=g.useCallback(function(k){i.current=zl(k),a.current=void 0},[]),S=g.useCallback(function(k){x(k.type,Df(k),k.target,m(k,n.lockRef.current))},[]),C=g.useCallback(function(k){x(k.type,zl(k),k.target,m(k,n.lockRef.current))},[]);g.useEffect(function(){return gr.push(d),n.setCallbacks({onScrollCapture:S,onWheelCapture:S,onTouchMoveCapture:C}),document.addEventListener("wheel",v,hr),document.addEventListener("touchmove",v,hr),document.addEventListener("touchstart",y,hr),function(){gr=gr.filter(function(k){return k!==d}),document.removeEventListener("wheel",v,hr),document.removeEventListener("touchmove",v,hr),document.removeEventListener("touchstart",y,hr)}},[]);var _=n.removeScrollBar,b=n.inert;return g.createElement(g.Fragment,null,b?g.createElement(d,{styles:$x(c)}):null,_?g.createElement(jx,{noRelative:n.noRelative,gapMode:n.gapMode}):null)}function Ux(n){for(var l=null;n!==null;)n instanceof ShadowRoot&&(l=n.host,n=n.host),n=n.parentNode;return l}const Bx=yx(Fp,Hx);var Bp=g.forwardRef(function(n,l){return g.createElement(li,Mt({},n,{ref:l,sideCar:Bx}))});Bp.classNames=li.classNames;var Vx=function(n){if(typeof document>"u")return null;var l=Array.isArray(n)?n[0]:n;return l.ownerDocument.body},vr=new WeakMap,Fl=new WeakMap,$l={},Pa=0,Vp=function(n){return n&&(n.host||Vp(n.parentNode))},Yx=function(n,l){return l.map(function(i){if(n.contains(i))return i;var a=Vp(i);return a&&n.contains(a)?a:(console.error("aria-hidden",i,"in not contained inside",n,". Doing nothing"),null)}).filter(function(i){return!!i})},Qx=function(n,l,i,a){var c=Yx(l,Array.isArray(n)?n:[n]);$l[i]||($l[i]=new WeakMap);var d=$l[i],f=[],m=new Set,v=new Set(c),x=function(S){!S||m.has(S)||(m.add(S),x(S.parentNode))};c.forEach(x);var y=function(S){!S||v.has(S)||Array.prototype.forEach.call(S.children,function(C){if(m.has(C))y(C);else try{var _=C.getAttribute(a),b=_!==null&&_!=="false",k=(vr.get(C)||0)+1,T=(d.get(C)||0)+1;vr.set(C,k),d.set(C,T),f.push(C),k===1&&b&&Fl.set(C,!0),T===1&&C.setAttribute(i,"true"),b||C.setAttribute(a,"true")}catch(A){console.error("aria-hidden: cannot operate on ",C,A)}})};return y(l),m.clear(),Pa++,function(){f.forEach(function(S){var C=vr.get(S)-1,_=d.get(S)-1;vr.set(S,C),d.set(S,_),C||(Fl.has(S)||S.removeAttribute(a),Fl.delete(S)),_||S.removeAttribute(i)}),Pa--,Pa||(vr=new WeakMap,vr=new WeakMap,Fl=new WeakMap,$l={})}},Gx=function(n,l,i){i===void 0&&(i="data-aria-hidden");var a=Array.from(Array.isArray(n)?n:[n]),c=Vx(n);return c?(a.push.apply(a,Array.from(c.querySelectorAll("[aria-live], script"))),Qx(a,c,i,"aria-hidden")):function(){return null}},ii="Dialog",[Yp]=_r(ii),[Xx,Tt]=Yp(ii),Qp=n=>{const{__scopeDialog:l,children:i,open:a,defaultOpen:c,onOpenChange:d,modal:f=!0}=n,m=g.useRef(null),v=g.useRef(null),[x,y]=ri({prop:a,defaultProp:c??!1,onChange:d,caller:ii});return h.jsx(Xx,{scope:l,triggerRef:m,contentRef:v,contentId:xo(),titleId:xo(),descriptionId:xo(),open:x,onOpenChange:y,onOpenToggle:g.useCallback(()=>y(S=>!S),[y]),modal:f,children:i})};Qp.displayName=ii;var Gp="DialogTrigger",Kx=g.forwardRef((n,l)=>{const{__scopeDialog:i,...a}=n,c=Tt(Gp,i),d=We(l,c.triggerRef);return h.jsx(Le.button,{type:"button","aria-haspopup":"dialog","aria-expanded":c.open,"aria-controls":c.contentId,"data-state":tu(c.open),...a,ref:d,onClick:Ee(n.onClick,c.onOpenToggle)})});Kx.displayName=Gp;var Ja="DialogPortal",[Zx,Xp]=Yp(Ja,{forceMount:void 0}),Kp=n=>{const{__scopeDialog:l,forceMount:i,children:a,container:c}=n,d=Tt(Ja,l);return h.jsx(Zx,{scope:l,forceMount:i,children:g.Children.map(a,f=>h.jsx(Rt,{present:i||d.open,children:h.jsx(Mp,{asChild:!0,container:c,children:f})}))})};Kp.displayName=Ja;var Ql="DialogOverlay",Zp=g.forwardRef((n,l)=>{const i=Xp(Ql,n.__scopeDialog),{forceMount:a=i.forceMount,...c}=n,d=Tt(Ql,n.__scopeDialog);return d.modal?h.jsx(Rt,{present:a||d.open,children:h.jsx(Jx,{...c,ref:l})}):null});Zp.displayName=Ql;var qx=up("DialogOverlay.RemoveScroll"),Jx=g.forwardRef((n,l)=>{const{__scopeDialog:i,...a}=n,c=Tt(Ql,i);return h.jsx(Bp,{as:qx,allowPinchZoom:!0,shards:[c.contentRef],children:h.jsx(Le.div,{"data-state":tu(c.open),...a,ref:l,style:{pointerEvents:"auto",...a.style}})})}),Wn="DialogContent",qp=g.forwardRef((n,l)=>{const i=Xp(Wn,n.__scopeDialog),{forceMount:a=i.forceMount,...c}=n,d=Tt(Wn,n.__scopeDialog);return h.jsx(Rt,{present:a||d.open,children:d.modal?h.jsx(e0,{...c,ref:l}):h.jsx(t0,{...c,ref:l})})});qp.displayName=Wn;var e0=g.forwardRef((n,l)=>{const i=Tt(Wn,n.__scopeDialog),a=g.useRef(null),c=We(l,i.contentRef,a);return g.useEffect(()=>{const d=a.current;if(d)return Gx(d)},[]),h.jsx(Jp,{...n,ref:c,trapFocus:i.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:Ee(n.onCloseAutoFocus,d=>{d.preventDefault(),i.triggerRef.current?.focus()}),onPointerDownOutside:Ee(n.onPointerDownOutside,d=>{const f=d.detail.originalEvent,m=f.button===0&&f.ctrlKey===!0;(f.button===2||m)&&d.preventDefault()}),onFocusOutside:Ee(n.onFocusOutside,d=>d.preventDefault())})}),t0=g.forwardRef((n,l)=>{const i=Tt(Wn,n.__scopeDialog),a=g.useRef(!1),c=g.useRef(!1);return h.jsx(Jp,{...n,ref:l,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:d=>{n.onCloseAutoFocus?.(d),d.defaultPrevented||(a.current||i.triggerRef.current?.focus(),d.preventDefault()),a.current=!1,c.current=!1},onInteractOutside:d=>{n.onInteractOutside?.(d),d.defaultPrevented||(a.current=!0,d.detail.originalEvent.type==="pointerdown"&&(c.current=!0));const f=d.target;i.triggerRef.current?.contains(f)&&d.preventDefault(),d.detail.originalEvent.type==="focusin"&&c.current&&d.preventDefault()}})}),Jp=g.forwardRef((n,l)=>{const{__scopeDialog:i,trapFocus:a,onOpenAutoFocus:c,onCloseAutoFocus:d,...f}=n,m=Tt(Wn,i),v=g.useRef(null),x=We(l,v);return ax(),h.jsxs(h.Fragment,{children:[h.jsx(Lp,{asChild:!0,loop:!0,trapped:a,onMountAutoFocus:c,onUnmountAutoFocus:d,children:h.jsx(oi,{role:"dialog",id:m.contentId,"aria-describedby":m.descriptionId,"aria-labelledby":m.titleId,"data-state":tu(m.open),...f,ref:x,onDismiss:()=>m.onOpenChange(!1)})}),h.jsxs(h.Fragment,{children:[h.jsx(n0,{titleId:m.titleId}),h.jsx(o0,{contentRef:v,descriptionId:m.descriptionId})]})]})}),eu="DialogTitle",em=g.forwardRef((n,l)=>{const{__scopeDialog:i,...a}=n,c=Tt(eu,i);return h.jsx(Le.h2,{id:c.titleId,...a,ref:l})});em.displayName=eu;var tm="DialogDescription",nm=g.forwardRef((n,l)=>{const{__scopeDialog:i,...a}=n,c=Tt(tm,i);return h.jsx(Le.p,{id:c.descriptionId,...a,ref:l})});nm.displayName=tm;var rm="DialogClose",om=g.forwardRef((n,l)=>{const{__scopeDialog:i,...a}=n,c=Tt(rm,i);return h.jsx(Le.button,{type:"button",...a,ref:l,onClick:Ee(n.onClick,()=>c.onOpenChange(!1))})});om.displayName=rm;function tu(n){return n?"open":"closed"}var lm="DialogTitleWarning",[oS,im]=Vv(lm,{contentName:Wn,titleName:eu,docsSlug:"dialog"}),n0=({titleId:n})=>{const l=im(lm),i=`\`${l.contentName}\` requires a \`${l.titleName}\` for the component to be accessible for screen reader users. - -If you want to hide the \`${l.titleName}\`, you can wrap it with our VisuallyHidden component. - -For more information, see https://radix-ui.com/primitives/docs/components/${l.docsSlug}`;return g.useEffect(()=>{n&&(document.getElementById(n)||console.error(i))},[i,n]),null},r0="DialogDescriptionWarning",o0=({contentRef:n,descriptionId:l})=>{const a=`Warning: Missing \`Description\` or \`aria-describedby={undefined}\` for {${im(r0).contentName}}.`;return g.useEffect(()=>{const c=n.current?.getAttribute("aria-describedby");l&&c&&(document.getElementById(l)||console.warn(a))},[a,n,l]),null},l0=Qp,i0=Kp,sm=Zp,am=qp,um=em,cm=nm,s0=om;const If=n=>typeof n=="boolean"?`${n}`:n===0?"0":n,zf=_p,a0=(n,l)=>i=>{var a;if(l?.variants==null)return zf(n,i?.class,i?.className);const{variants:c,defaultVariants:d}=l,f=Object.keys(c).map(x=>{const y=i?.[x],S=d?.[x];if(y===null)return null;const C=If(y)||If(S);return c[x][C]}),m=i&&Object.entries(i).reduce((x,y)=>{let[S,C]=y;return C===void 0||(x[S]=C),x},{}),v=l==null||(a=l.compoundVariants)===null||a===void 0?void 0:a.reduce((x,y)=>{let{class:S,className:C,..._}=y;return Object.entries(_).every(b=>{let[k,T]=b;return Array.isArray(T)?T.includes({...d,...m}[k]):{...d,...m}[k]===T})?[...x,S,C]:x},[]);return zf(n,f,v,i?.class,i?.className)},u0=l0,c0=i0,dm=g.forwardRef(({className:n,...l},i)=>h.jsx(sm,{className:pe("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",n),...l,ref:i}));dm.displayName=sm.displayName;const d0=a0("fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500",{variants:{side:{top:"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",bottom:"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",left:"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",right:"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm"}},defaultVariants:{side:"right"}}),fm=g.forwardRef(({side:n="right",className:l,children:i,...a},c)=>h.jsxs(c0,{children:[h.jsx(dm,{}),h.jsxs(am,{ref:c,className:pe(d0({side:n}),l),...a,children:[i,h.jsxs(s0,{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary",children:[h.jsx(Av,{className:"h-4 w-4"}),h.jsx("span",{className:"sr-only",children:"Close"})]})]})]}));fm.displayName=am.displayName;const pm=({className:n,...l})=>h.jsx("div",{className:pe("flex flex-col space-y-2 text-center sm:text-left",n),...l});pm.displayName="SheetHeader";const mm=g.forwardRef(({className:n,...l},i)=>h.jsx(um,{ref:i,className:pe("text-lg font-semibold text-foreground",n),...l}));mm.displayName=um.displayName;const f0=g.forwardRef(({className:n,...l},i)=>h.jsx(cm,{ref:i,className:pe("text-sm text-muted-foreground",n),...l}));f0.displayName=cm.displayName;const p0=["top","right","bottom","left"],kn=Math.min,ct=Math.max,Gl=Math.round,Wl=Math.floor,zt=n=>({x:n,y:n}),m0={left:"right",right:"left",bottom:"top",top:"bottom"};function Fa(n,l,i){return ct(n,kn(l,i))}function qt(n,l){return typeof n=="function"?n(l):n}function Jt(n){return n.split("-")[0]}function Pr(n){return n.split("-")[1]}function nu(n){return n==="x"?"y":"x"}function ru(n){return n==="y"?"height":"width"}function It(n){const l=n[0];return l==="t"||l==="b"?"y":"x"}function ou(n){return nu(It(n))}function h0(n,l,i){i===void 0&&(i=!1);const a=Pr(n),c=ou(n),d=ru(c);let f=c==="x"?a===(i?"end":"start")?"right":"left":a==="start"?"bottom":"top";return l.reference[d]>l.floating[d]&&(f=Xl(f)),[f,Xl(f)]}function g0(n){const l=Xl(n);return[$a(n),l,$a(l)]}function $a(n){return n.includes("start")?n.replace("start","end"):n.replace("end","start")}const Ff=["left","right"],$f=["right","left"],v0=["top","bottom"],y0=["bottom","top"];function x0(n,l,i){switch(n){case"top":case"bottom":return i?l?$f:Ff:l?Ff:$f;case"left":case"right":return l?v0:y0;default:return[]}}function w0(n,l,i,a){const c=Pr(n);let d=x0(Jt(n),i==="start",a);return c&&(d=d.map(f=>f+"-"+c),l&&(d=d.concat(d.map($a)))),d}function Xl(n){const l=Jt(n);return m0[l]+n.slice(l.length)}function S0(n){return{top:0,right:0,bottom:0,left:0,...n}}function hm(n){return typeof n!="number"?S0(n):{top:n,right:n,bottom:n,left:n}}function Kl(n){const{x:l,y:i,width:a,height:c}=n;return{width:a,height:c,top:i,left:l,right:l+a,bottom:i+c,x:l,y:i}}function Wf(n,l,i){let{reference:a,floating:c}=n;const d=It(l),f=ou(l),m=ru(f),v=Jt(l),x=d==="y",y=a.x+a.width/2-c.width/2,S=a.y+a.height/2-c.height/2,C=a[m]/2-c[m]/2;let _;switch(v){case"top":_={x:y,y:a.y-c.height};break;case"bottom":_={x:y,y:a.y+a.height};break;case"right":_={x:a.x+a.width,y:S};break;case"left":_={x:a.x-c.width,y:S};break;default:_={x:a.x,y:a.y}}switch(Pr(l)){case"start":_[f]-=C*(i&&x?-1:1);break;case"end":_[f]+=C*(i&&x?-1:1);break}return _}async function C0(n,l){var i;l===void 0&&(l={});const{x:a,y:c,platform:d,rects:f,elements:m,strategy:v}=n,{boundary:x="clippingAncestors",rootBoundary:y="viewport",elementContext:S="floating",altBoundary:C=!1,padding:_=0}=qt(l,n),b=hm(_),T=m[C?S==="floating"?"reference":"floating":S],A=Kl(await d.getClippingRect({element:(i=await(d.isElement==null?void 0:d.isElement(T)))==null||i?T:T.contextElement||await(d.getDocumentElement==null?void 0:d.getDocumentElement(m.floating)),boundary:x,rootBoundary:y,strategy:v})),L=S==="floating"?{x:a,y:c,width:f.floating.width,height:f.floating.height}:f.reference,$=await(d.getOffsetParent==null?void 0:d.getOffsetParent(m.floating)),M=await(d.isElement==null?void 0:d.isElement($))?await(d.getScale==null?void 0:d.getScale($))||{x:1,y:1}:{x:1,y:1},U=Kl(d.convertOffsetParentRelativeRectToViewportRelativeRect?await d.convertOffsetParentRelativeRectToViewportRelativeRect({elements:m,rect:L,offsetParent:$,strategy:v}):L);return{top:(A.top-U.top+b.top)/M.y,bottom:(U.bottom-A.bottom+b.bottom)/M.y,left:(A.left-U.left+b.left)/M.x,right:(U.right-A.right+b.right)/M.x}}const E0=50,k0=async(n,l,i)=>{const{placement:a="bottom",strategy:c="absolute",middleware:d=[],platform:f}=i,m=f.detectOverflow?f:{...f,detectOverflow:C0},v=await(f.isRTL==null?void 0:f.isRTL(l));let x=await f.getElementRects({reference:n,floating:l,strategy:c}),{x:y,y:S}=Wf(x,a,v),C=a,_=0;const b={};for(let k=0;k({name:"arrow",options:n,async fn(l){const{x:i,y:a,placement:c,rects:d,platform:f,elements:m,middlewareData:v}=l,{element:x,padding:y=0}=qt(n,l)||{};if(x==null)return{};const S=hm(y),C={x:i,y:a},_=ou(c),b=ru(_),k=await f.getDimensions(x),T=_==="y",A=T?"top":"left",L=T?"bottom":"right",$=T?"clientHeight":"clientWidth",M=d.reference[b]+d.reference[_]-C[_]-d.floating[b],U=C[_]-d.reference[_],Y=await(f.getOffsetParent==null?void 0:f.getOffsetParent(x));let B=Y?Y[$]:0;(!B||!await(f.isElement==null?void 0:f.isElement(Y)))&&(B=m.floating[$]||d.floating[b]);const ie=M/2-U/2,te=B/2-k[b]/2-1,ne=kn(S[A],te),ue=kn(S[L],te),J=ne,he=B-k[b]-ue,ce=B/2-k[b]/2+ie,ee=Fa(J,ce,he),le=!v.arrow&&Pr(c)!=null&&ce!==ee&&d.reference[b]/2-(cece<=0)){var ue,J;const ce=(((ue=d.flip)==null?void 0:ue.index)||0)+1,ee=B[ce];if(ee&&(!(S==="alignment"?L!==It(ee):!1)||ne.every(D=>It(D.placement)===L?D.overflows[0]>0:!0)))return{data:{index:ce,overflows:ne},reset:{placement:ee}};let le=(J=ne.filter(se=>se.overflows[0]<=0).sort((se,D)=>se.overflows[1]-D.overflows[1])[0])==null?void 0:J.placement;if(!le)switch(_){case"bestFit":{var he;const se=(he=ne.filter(D=>{if(Y){const Q=It(D.placement);return Q===L||Q==="y"}return!0}).map(D=>[D.placement,D.overflows.filter(Q=>Q>0).reduce((Q,V)=>Q+V,0)]).sort((D,Q)=>D[1]-Q[1])[0])==null?void 0:he[0];se&&(le=se);break}case"initialPlacement":le=m;break}if(c!==le)return{reset:{placement:le}}}return{}}}};function Hf(n,l){return{top:n.top-l.height,right:n.right-l.width,bottom:n.bottom-l.height,left:n.left-l.width}}function Uf(n){return p0.some(l=>n[l]>=0)}const P0=function(n){return n===void 0&&(n={}),{name:"hide",options:n,async fn(l){const{rects:i,platform:a}=l,{strategy:c="referenceHidden",...d}=qt(n,l);switch(c){case"referenceHidden":{const f=await a.detectOverflow(l,{...d,elementContext:"reference"}),m=Hf(f,i.reference);return{data:{referenceHiddenOffsets:m,referenceHidden:Uf(m)}}}case"escaped":{const f=await a.detectOverflow(l,{...d,altBoundary:!0}),m=Hf(f,i.floating);return{data:{escapedOffsets:m,escaped:Uf(m)}}}default:return{}}}}},gm=new Set(["left","top"]);async function b0(n,l){const{placement:i,platform:a,elements:c}=n,d=await(a.isRTL==null?void 0:a.isRTL(c.floating)),f=Jt(i),m=Pr(i),v=It(i)==="y",x=gm.has(f)?-1:1,y=d&&v?-1:1,S=qt(l,n);let{mainAxis:C,crossAxis:_,alignmentAxis:b}=typeof S=="number"?{mainAxis:S,crossAxis:0,alignmentAxis:null}:{mainAxis:S.mainAxis||0,crossAxis:S.crossAxis||0,alignmentAxis:S.alignmentAxis};return m&&typeof b=="number"&&(_=m==="end"?b*-1:b),v?{x:_*y,y:C*x}:{x:C*x,y:_*y}}const R0=function(n){return n===void 0&&(n=0),{name:"offset",options:n,async fn(l){var i,a;const{x:c,y:d,placement:f,middlewareData:m}=l,v=await b0(l,n);return f===((i=m.offset)==null?void 0:i.placement)&&(a=m.arrow)!=null&&a.alignmentOffset?{}:{x:c+v.x,y:d+v.y,data:{...v,placement:f}}}}},T0=function(n){return n===void 0&&(n={}),{name:"shift",options:n,async fn(l){const{x:i,y:a,placement:c,platform:d}=l,{mainAxis:f=!0,crossAxis:m=!1,limiter:v={fn:A=>{let{x:L,y:$}=A;return{x:L,y:$}}},...x}=qt(n,l),y={x:i,y:a},S=await d.detectOverflow(l,x),C=It(Jt(c)),_=nu(C);let b=y[_],k=y[C];if(f){const A=_==="y"?"top":"left",L=_==="y"?"bottom":"right",$=b+S[A],M=b-S[L];b=Fa($,b,M)}if(m){const A=C==="y"?"top":"left",L=C==="y"?"bottom":"right",$=k+S[A],M=k-S[L];k=Fa($,k,M)}const T=v.fn({...l,[_]:b,[C]:k});return{...T,data:{x:T.x-i,y:T.y-a,enabled:{[_]:f,[C]:m}}}}}},j0=function(n){return n===void 0&&(n={}),{options:n,fn(l){const{x:i,y:a,placement:c,rects:d,middlewareData:f}=l,{offset:m=0,mainAxis:v=!0,crossAxis:x=!0}=qt(n,l),y={x:i,y:a},S=It(c),C=nu(S);let _=y[C],b=y[S];const k=qt(m,l),T=typeof k=="number"?{mainAxis:k,crossAxis:0}:{mainAxis:0,crossAxis:0,...k};if(v){const $=C==="y"?"height":"width",M=d.reference[C]-d.floating[$]+T.mainAxis,U=d.reference[C]+d.reference[$]-T.mainAxis;_U&&(_=U)}if(x){var A,L;const $=C==="y"?"width":"height",M=gm.has(Jt(c)),U=d.reference[S]-d.floating[$]+(M&&((A=f.offset)==null?void 0:A[S])||0)+(M?0:T.crossAxis),Y=d.reference[S]+d.reference[$]+(M?0:((L=f.offset)==null?void 0:L[S])||0)-(M?T.crossAxis:0);bY&&(b=Y)}return{[C]:_,[S]:b}}}},O0=function(n){return n===void 0&&(n={}),{name:"size",options:n,async fn(l){var i,a;const{placement:c,rects:d,platform:f,elements:m}=l,{apply:v=()=>{},...x}=qt(n,l),y=await f.detectOverflow(l,x),S=Jt(c),C=Pr(c),_=It(c)==="y",{width:b,height:k}=d.floating;let T,A;S==="top"||S==="bottom"?(T=S,A=C===(await(f.isRTL==null?void 0:f.isRTL(m.floating))?"start":"end")?"left":"right"):(A=S,T=C==="end"?"top":"bottom");const L=k-y.top-y.bottom,$=b-y.left-y.right,M=kn(k-y[T],L),U=kn(b-y[A],$),Y=!l.middlewareData.shift;let B=M,ie=U;if((i=l.middlewareData.shift)!=null&&i.enabled.x&&(ie=$),(a=l.middlewareData.shift)!=null&&a.enabled.y&&(B=L),Y&&!C){const ne=ct(y.left,0),ue=ct(y.right,0),J=ct(y.top,0),he=ct(y.bottom,0);_?ie=b-2*(ne!==0||ue!==0?ne+ue:ct(y.left,y.right)):B=k-2*(J!==0||he!==0?J+he:ct(y.top,y.bottom))}await v({...l,availableWidth:ie,availableHeight:B});const te=await f.getDimensions(m.floating);return b!==te.width||k!==te.height?{reset:{rects:!0}}:{}}}};function si(){return typeof window<"u"}function br(n){return vm(n)?(n.nodeName||"").toLowerCase():"#document"}function ft(n){var l;return(n==null||(l=n.ownerDocument)==null?void 0:l.defaultView)||window}function Wt(n){var l;return(l=(vm(n)?n.ownerDocument:n.document)||window.document)==null?void 0:l.documentElement}function vm(n){return si()?n instanceof Node||n instanceof ft(n).Node:!1}function Pt(n){return si()?n instanceof Element||n instanceof ft(n).Element:!1}function en(n){return si()?n instanceof HTMLElement||n instanceof ft(n).HTMLElement:!1}function Bf(n){return!si()||typeof ShadowRoot>"u"?!1:n instanceof ShadowRoot||n instanceof ft(n).ShadowRoot}function Co(n){const{overflow:l,overflowX:i,overflowY:a,display:c}=bt(n);return/auto|scroll|overlay|hidden|clip/.test(l+a+i)&&c!=="inline"&&c!=="contents"}function A0(n){return/^(table|td|th)$/.test(br(n))}function ai(n){try{if(n.matches(":popover-open"))return!0}catch{}try{return n.matches(":modal")}catch{return!1}}const L0=/transform|translate|scale|rotate|perspective|filter/,D0=/paint|layout|strict|content/,Fn=n=>!!n&&n!=="none";let ba;function lu(n){const l=Pt(n)?bt(n):n;return Fn(l.transform)||Fn(l.translate)||Fn(l.scale)||Fn(l.rotate)||Fn(l.perspective)||!iu()&&(Fn(l.backdropFilter)||Fn(l.filter))||L0.test(l.willChange||"")||D0.test(l.contain||"")}function M0(n){let l=_n(n);for(;en(l)&&!Cr(l);){if(lu(l))return l;if(ai(l))return null;l=_n(l)}return null}function iu(){return ba==null&&(ba=typeof CSS<"u"&&CSS.supports&&CSS.supports("-webkit-backdrop-filter","none")),ba}function Cr(n){return/^(html|body|#document)$/.test(br(n))}function bt(n){return ft(n).getComputedStyle(n)}function ui(n){return Pt(n)?{scrollLeft:n.scrollLeft,scrollTop:n.scrollTop}:{scrollLeft:n.scrollX,scrollTop:n.scrollY}}function _n(n){if(br(n)==="html")return n;const l=n.assignedSlot||n.parentNode||Bf(n)&&n.host||Wt(n);return Bf(l)?l.host:l}function ym(n){const l=_n(n);return Cr(l)?n.ownerDocument?n.ownerDocument.body:n.body:en(l)&&Co(l)?l:ym(l)}function wo(n,l,i){var a;l===void 0&&(l=[]),i===void 0&&(i=!0);const c=ym(n),d=c===((a=n.ownerDocument)==null?void 0:a.body),f=ft(c);if(d){const m=Wa(f);return l.concat(f,f.visualViewport||[],Co(c)?c:[],m&&i?wo(m):[])}else return l.concat(c,wo(c,[],i))}function Wa(n){return n.parent&&Object.getPrototypeOf(n.parent)?n.frameElement:null}function xm(n){const l=bt(n);let i=parseFloat(l.width)||0,a=parseFloat(l.height)||0;const c=en(n),d=c?n.offsetWidth:i,f=c?n.offsetHeight:a,m=Gl(i)!==d||Gl(a)!==f;return m&&(i=d,a=f),{width:i,height:a,$:m}}function su(n){return Pt(n)?n:n.contextElement}function wr(n){const l=su(n);if(!en(l))return zt(1);const i=l.getBoundingClientRect(),{width:a,height:c,$:d}=xm(l);let f=(d?Gl(i.width):i.width)/a,m=(d?Gl(i.height):i.height)/c;return(!f||!Number.isFinite(f))&&(f=1),(!m||!Number.isFinite(m))&&(m=1),{x:f,y:m}}const I0=zt(0);function wm(n){const l=ft(n);return!iu()||!l.visualViewport?I0:{x:l.visualViewport.offsetLeft,y:l.visualViewport.offsetTop}}function z0(n,l,i){return l===void 0&&(l=!1),!i||l&&i!==ft(n)?!1:l}function Hn(n,l,i,a){l===void 0&&(l=!1),i===void 0&&(i=!1);const c=n.getBoundingClientRect(),d=su(n);let f=zt(1);l&&(a?Pt(a)&&(f=wr(a)):f=wr(n));const m=z0(d,i,a)?wm(d):zt(0);let v=(c.left+m.x)/f.x,x=(c.top+m.y)/f.y,y=c.width/f.x,S=c.height/f.y;if(d){const C=ft(d),_=a&&Pt(a)?ft(a):a;let b=C,k=Wa(b);for(;k&&a&&_!==b;){const T=wr(k),A=k.getBoundingClientRect(),L=bt(k),$=A.left+(k.clientLeft+parseFloat(L.paddingLeft))*T.x,M=A.top+(k.clientTop+parseFloat(L.paddingTop))*T.y;v*=T.x,x*=T.y,y*=T.x,S*=T.y,v+=$,x+=M,b=ft(k),k=Wa(b)}}return Kl({width:y,height:S,x:v,y:x})}function ci(n,l){const i=ui(n).scrollLeft;return l?l.left+i:Hn(Wt(n)).left+i}function Sm(n,l){const i=n.getBoundingClientRect(),a=i.left+l.scrollLeft-ci(n,i),c=i.top+l.scrollTop;return{x:a,y:c}}function F0(n){let{elements:l,rect:i,offsetParent:a,strategy:c}=n;const d=c==="fixed",f=Wt(a),m=l?ai(l.floating):!1;if(a===f||m&&d)return i;let v={scrollLeft:0,scrollTop:0},x=zt(1);const y=zt(0),S=en(a);if((S||!S&&!d)&&((br(a)!=="body"||Co(f))&&(v=ui(a)),S)){const _=Hn(a);x=wr(a),y.x=_.x+a.clientLeft,y.y=_.y+a.clientTop}const C=f&&!S&&!d?Sm(f,v):zt(0);return{width:i.width*x.x,height:i.height*x.y,x:i.x*x.x-v.scrollLeft*x.x+y.x+C.x,y:i.y*x.y-v.scrollTop*x.y+y.y+C.y}}function $0(n){return Array.from(n.getClientRects())}function W0(n){const l=Wt(n),i=ui(n),a=n.ownerDocument.body,c=ct(l.scrollWidth,l.clientWidth,a.scrollWidth,a.clientWidth),d=ct(l.scrollHeight,l.clientHeight,a.scrollHeight,a.clientHeight);let f=-i.scrollLeft+ci(n);const m=-i.scrollTop;return bt(a).direction==="rtl"&&(f+=ct(l.clientWidth,a.clientWidth)-c),{width:c,height:d,x:f,y:m}}const Vf=25;function H0(n,l){const i=ft(n),a=Wt(n),c=i.visualViewport;let d=a.clientWidth,f=a.clientHeight,m=0,v=0;if(c){d=c.width,f=c.height;const y=iu();(!y||y&&l==="fixed")&&(m=c.offsetLeft,v=c.offsetTop)}const x=ci(a);if(x<=0){const y=a.ownerDocument,S=y.body,C=getComputedStyle(S),_=y.compatMode==="CSS1Compat"&&parseFloat(C.marginLeft)+parseFloat(C.marginRight)||0,b=Math.abs(a.clientWidth-S.clientWidth-_);b<=Vf&&(d-=b)}else x<=Vf&&(d+=x);return{width:d,height:f,x:m,y:v}}function U0(n,l){const i=Hn(n,!0,l==="fixed"),a=i.top+n.clientTop,c=i.left+n.clientLeft,d=en(n)?wr(n):zt(1),f=n.clientWidth*d.x,m=n.clientHeight*d.y,v=c*d.x,x=a*d.y;return{width:f,height:m,x:v,y:x}}function Yf(n,l,i){let a;if(l==="viewport")a=H0(n,i);else if(l==="document")a=W0(Wt(n));else if(Pt(l))a=U0(l,i);else{const c=wm(n);a={x:l.x-c.x,y:l.y-c.y,width:l.width,height:l.height}}return Kl(a)}function Cm(n,l){const i=_n(n);return i===l||!Pt(i)||Cr(i)?!1:bt(i).position==="fixed"||Cm(i,l)}function B0(n,l){const i=l.get(n);if(i)return i;let a=wo(n,[],!1).filter(m=>Pt(m)&&br(m)!=="body"),c=null;const d=bt(n).position==="fixed";let f=d?_n(n):n;for(;Pt(f)&&!Cr(f);){const m=bt(f),v=lu(f);!v&&m.position==="fixed"&&(c=null),(d?!v&&!c:!v&&m.position==="static"&&!!c&&(c.position==="absolute"||c.position==="fixed")||Co(f)&&!v&&Cm(n,f))?a=a.filter(y=>y!==f):c=m,f=_n(f)}return l.set(n,a),a}function V0(n){let{element:l,boundary:i,rootBoundary:a,strategy:c}=n;const f=[...i==="clippingAncestors"?ai(l)?[]:B0(l,this._c):[].concat(i),a],m=Yf(l,f[0],c);let v=m.top,x=m.right,y=m.bottom,S=m.left;for(let C=1;C{f(!1,1e-7)},1e3)}B===1&&!km(x,n.getBoundingClientRect())&&f(),M=!1}try{i=new IntersectionObserver(U,{...$,root:c.ownerDocument})}catch{i=new IntersectionObserver(U,$)}i.observe(n)}return f(!0),d}function q0(n,l,i,a){a===void 0&&(a={});const{ancestorScroll:c=!0,ancestorResize:d=!0,elementResize:f=typeof ResizeObserver=="function",layoutShift:m=typeof IntersectionObserver=="function",animationFrame:v=!1}=a,x=su(n),y=c||d?[...x?wo(x):[],...l?wo(l):[]]:[];y.forEach(A=>{c&&A.addEventListener("scroll",i,{passive:!0}),d&&A.addEventListener("resize",i)});const S=x&&m?Z0(x,i):null;let C=-1,_=null;f&&(_=new ResizeObserver(A=>{let[L]=A;L&&L.target===x&&_&&l&&(_.unobserve(l),cancelAnimationFrame(C),C=requestAnimationFrame(()=>{var $;($=_)==null||$.observe(l)})),i()}),x&&!v&&_.observe(x),l&&_.observe(l));let b,k=v?Hn(n):null;v&&T();function T(){const A=Hn(n);k&&!km(k,A)&&i(),k=A,b=requestAnimationFrame(T)}return i(),()=>{var A;y.forEach(L=>{c&&L.removeEventListener("scroll",i),d&&L.removeEventListener("resize",i)}),S?.(),(A=_)==null||A.disconnect(),_=null,v&&cancelAnimationFrame(b)}}const J0=R0,ew=T0,tw=N0,nw=O0,rw=P0,Gf=_0,ow=j0,lw=(n,l,i)=>{const a=new Map,c={platform:K0,...i},d={...c.platform,_c:a};return k0(n,l,{...c,platform:d})};var iw=typeof document<"u",sw=function(){},Bl=iw?g.useLayoutEffect:sw;function Zl(n,l){if(n===l)return!0;if(typeof n!=typeof l)return!1;if(typeof n=="function"&&n.toString()===l.toString())return!0;let i,a,c;if(n&&l&&typeof n=="object"){if(Array.isArray(n)){if(i=n.length,i!==l.length)return!1;for(a=i;a--!==0;)if(!Zl(n[a],l[a]))return!1;return!0}if(c=Object.keys(n),i=c.length,i!==Object.keys(l).length)return!1;for(a=i;a--!==0;)if(!{}.hasOwnProperty.call(l,c[a]))return!1;for(a=i;a--!==0;){const d=c[a];if(!(d==="_owner"&&n.$$typeof)&&!Zl(n[d],l[d]))return!1}return!0}return n!==n&&l!==l}function _m(n){return typeof window>"u"?1:(n.ownerDocument.defaultView||window).devicePixelRatio||1}function Xf(n,l){const i=_m(n);return Math.round(l*i)/i}function Ta(n){const l=g.useRef(n);return Bl(()=>{l.current=n}),l}function aw(n){n===void 0&&(n={});const{placement:l="bottom",strategy:i="absolute",middleware:a=[],platform:c,elements:{reference:d,floating:f}={},transform:m=!0,whileElementsMounted:v,open:x}=n,[y,S]=g.useState({x:0,y:0,strategy:i,placement:l,middlewareData:{},isPositioned:!1}),[C,_]=g.useState(a);Zl(C,a)||_(a);const[b,k]=g.useState(null),[T,A]=g.useState(null),L=g.useCallback(D=>{D!==Y.current&&(Y.current=D,k(D))},[]),$=g.useCallback(D=>{D!==B.current&&(B.current=D,A(D))},[]),M=d||b,U=f||T,Y=g.useRef(null),B=g.useRef(null),ie=g.useRef(y),te=v!=null,ne=Ta(v),ue=Ta(c),J=Ta(x),he=g.useCallback(()=>{if(!Y.current||!B.current)return;const D={placement:l,strategy:i,middleware:C};ue.current&&(D.platform=ue.current),lw(Y.current,B.current,D).then(Q=>{const V={...Q,isPositioned:J.current!==!1};ce.current&&!Zl(ie.current,V)&&(ie.current=V,Qa.flushSync(()=>{S(V)}))})},[C,l,i,ue,J]);Bl(()=>{x===!1&&ie.current.isPositioned&&(ie.current.isPositioned=!1,S(D=>({...D,isPositioned:!1})))},[x]);const ce=g.useRef(!1);Bl(()=>(ce.current=!0,()=>{ce.current=!1}),[]),Bl(()=>{if(M&&(Y.current=M),U&&(B.current=U),M&&U){if(ne.current)return ne.current(M,U,he);he()}},[M,U,he,ne,te]);const ee=g.useMemo(()=>({reference:Y,floating:B,setReference:L,setFloating:$}),[L,$]),le=g.useMemo(()=>({reference:M,floating:U}),[M,U]),se=g.useMemo(()=>{const D={position:i,left:0,top:0};if(!le.floating)return D;const Q=Xf(le.floating,y.x),V=Xf(le.floating,y.y);return m?{...D,transform:"translate("+Q+"px, "+V+"px)",..._m(le.floating)>=1.5&&{willChange:"transform"}}:{position:i,left:Q,top:V}},[i,m,le.floating,y.x,y.y]);return g.useMemo(()=>({...y,update:he,refs:ee,elements:le,floatingStyles:se}),[y,he,ee,le,se])}const uw=n=>{function l(i){return{}.hasOwnProperty.call(i,"current")}return{name:"arrow",options:n,fn(i){const{element:a,padding:c}=typeof n=="function"?n(i):n;return a&&l(a)?a.current!=null?Gf({element:a.current,padding:c}).fn(i):{}:a?Gf({element:a,padding:c}).fn(i):{}}}},cw=(n,l)=>{const i=J0(n);return{name:i.name,fn:i.fn,options:[n,l]}},dw=(n,l)=>{const i=ew(n);return{name:i.name,fn:i.fn,options:[n,l]}},fw=(n,l)=>({fn:ow(n).fn,options:[n,l]}),pw=(n,l)=>{const i=tw(n);return{name:i.name,fn:i.fn,options:[n,l]}},mw=(n,l)=>{const i=nw(n);return{name:i.name,fn:i.fn,options:[n,l]}},hw=(n,l)=>{const i=rw(n);return{name:i.name,fn:i.fn,options:[n,l]}},gw=(n,l)=>{const i=uw(n);return{name:i.name,fn:i.fn,options:[n,l]}};var vw="Arrow",Nm=g.forwardRef((n,l)=>{const{children:i,width:a=10,height:c=5,...d}=n;return h.jsx(Le.svg,{...d,ref:l,width:a,height:c,viewBox:"0 0 30 10",preserveAspectRatio:"none",children:n.asChild?i:h.jsx("polygon",{points:"0,0 30,0 15,10"})})});Nm.displayName=vw;var yw=Nm;function xw(n){const[l,i]=g.useState(void 0);return Ft(()=>{if(n){i({width:n.offsetWidth,height:n.offsetHeight});const a=new ResizeObserver(c=>{if(!Array.isArray(c)||!c.length)return;const d=c[0];let f,m;if("borderBoxSize"in d){const v=d.borderBoxSize,x=Array.isArray(v)?v[0]:v;f=x.inlineSize,m=x.blockSize}else f=n.offsetWidth,m=n.offsetHeight;i({width:f,height:m})});return a.observe(n,{box:"border-box"}),()=>a.unobserve(n)}else i(void 0)},[n]),l}var au="Popper",[Pm,di]=_r(au),[ww,bm]=Pm(au),Rm=n=>{const{__scopePopper:l,children:i}=n,[a,c]=g.useState(null);return h.jsx(ww,{scope:l,anchor:a,onAnchorChange:c,children:i})};Rm.displayName=au;var Tm="PopperAnchor",jm=g.forwardRef((n,l)=>{const{__scopePopper:i,virtualRef:a,...c}=n,d=bm(Tm,i),f=g.useRef(null),m=We(l,f),v=g.useRef(null);return g.useEffect(()=>{const x=v.current;v.current=a?.current||f.current,x!==v.current&&d.onAnchorChange(v.current)}),a?null:h.jsx(Le.div,{...c,ref:m})});jm.displayName=Tm;var uu="PopperContent",[Sw,Cw]=Pm(uu),Om=g.forwardRef((n,l)=>{const{__scopePopper:i,side:a="bottom",sideOffset:c=0,align:d="center",alignOffset:f=0,arrowPadding:m=0,avoidCollisions:v=!0,collisionBoundary:x=[],collisionPadding:y=0,sticky:S="partial",hideWhenDetached:C=!1,updatePositionStrategy:_="optimized",onPlaced:b,...k}=n,T=bm(uu,i),[A,L]=g.useState(null),$=We(l,we=>L(we)),[M,U]=g.useState(null),Y=xw(M),B=Y?.width??0,ie=Y?.height??0,te=a+(d!=="center"?"-"+d:""),ne=typeof y=="number"?y:{top:0,right:0,bottom:0,left:0,...y},ue=Array.isArray(x)?x:[x],J=ue.length>0,he={padding:ne,boundary:ue.filter(kw),altBoundary:J},{refs:ce,floatingStyles:ee,placement:le,isPositioned:se,middlewareData:D}=aw({strategy:"fixed",placement:te,whileElementsMounted:(...we)=>q0(...we,{animationFrame:_==="always"}),elements:{reference:T.anchor},middleware:[cw({mainAxis:c+ie,alignmentAxis:f}),v&&dw({mainAxis:!0,crossAxis:!1,limiter:S==="partial"?fw():void 0,...he}),v&&pw({...he}),mw({...he,apply:({elements:we,rects:Se,availableWidth:_e,availableHeight:Ze})=>{const{width:Un,height:No}=Se.reference,Ht=we.floating.style;Ht.setProperty("--radix-popper-available-width",`${_e}px`),Ht.setProperty("--radix-popper-available-height",`${Ze}px`),Ht.setProperty("--radix-popper-anchor-width",`${Un}px`),Ht.setProperty("--radix-popper-anchor-height",`${No}px`)}}),M&&gw({element:M,padding:m}),_w({arrowWidth:B,arrowHeight:ie}),C&&hw({strategy:"referenceHidden",...he})]}),[Q,V]=Dm(le),P=dt(b);Ft(()=>{se&&P?.()},[se,P]);const I=D.arrow?.x,de=D.arrow?.y,me=D.arrow?.centerOffset!==0,[ve,ye]=g.useState();return Ft(()=>{A&&ye(window.getComputedStyle(A).zIndex)},[A]),h.jsx("div",{ref:ce.setFloating,"data-radix-popper-content-wrapper":"",style:{...ee,transform:se?ee.transform:"translate(0, -200%)",minWidth:"max-content",zIndex:ve,"--radix-popper-transform-origin":[D.transformOrigin?.x,D.transformOrigin?.y].join(" "),...D.hide?.referenceHidden&&{visibility:"hidden",pointerEvents:"none"}},dir:n.dir,children:h.jsx(Sw,{scope:i,placedSide:Q,onArrowChange:U,arrowX:I,arrowY:de,shouldHideArrow:me,children:h.jsx(Le.div,{"data-side":Q,"data-align":V,...k,ref:$,style:{...k.style,animation:se?void 0:"none"}})})})});Om.displayName=uu;var Am="PopperArrow",Ew={top:"bottom",right:"left",bottom:"top",left:"right"},Lm=g.forwardRef(function(l,i){const{__scopePopper:a,...c}=l,d=Cw(Am,a),f=Ew[d.placedSide];return h.jsx("span",{ref:d.onArrowChange,style:{position:"absolute",left:d.arrowX,top:d.arrowY,[f]:0,transformOrigin:{top:"",right:"0 0",bottom:"center 0",left:"100% 0"}[d.placedSide],transform:{top:"translateY(100%)",right:"translateY(50%) rotate(90deg) translateX(-50%)",bottom:"rotate(180deg)",left:"translateY(50%) rotate(-90deg) translateX(50%)"}[d.placedSide],visibility:d.shouldHideArrow?"hidden":void 0},children:h.jsx(yw,{...c,ref:i,style:{...c.style,display:"block"}})})});Lm.displayName=Am;function kw(n){return n!==null}var _w=n=>({name:"transformOrigin",options:n,fn(l){const{placement:i,rects:a,middlewareData:c}=l,f=c.arrow?.centerOffset!==0,m=f?0:n.arrowWidth,v=f?0:n.arrowHeight,[x,y]=Dm(i),S={start:"0%",center:"50%",end:"100%"}[y],C=(c.arrow?.x??0)+m/2,_=(c.arrow?.y??0)+v/2;let b="",k="";return x==="bottom"?(b=f?S:`${C}px`,k=`${-v}px`):x==="top"?(b=f?S:`${C}px`,k=`${a.floating.height+v}px`):x==="right"?(b=`${-v}px`,k=f?S:`${_}px`):x==="left"&&(b=`${a.floating.width+v}px`,k=f?S:`${_}px`),{data:{x:b,y:k}}}});function Dm(n){const[l,i="center"]=n.split("-");return[l,i]}var Mm=Rm,Im=jm,zm=Om,Fm=Lm,Nw=Object.freeze({position:"absolute",border:0,width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",wordWrap:"normal"}),Pw="VisuallyHidden",$m=g.forwardRef((n,l)=>h.jsx(Le.span,{...n,ref:l,style:{...Nw,...n.style}}));$m.displayName=Pw;var bw=$m,[fi]=_r("Tooltip",[di]),pi=di(),Wm="TooltipProvider",Rw=700,Ha="tooltip.open",[Tw,cu]=fi(Wm),Hm=n=>{const{__scopeTooltip:l,delayDuration:i=Rw,skipDelayDuration:a=300,disableHoverableContent:c=!1,children:d}=n,f=g.useRef(!0),m=g.useRef(!1),v=g.useRef(0);return g.useEffect(()=>{const x=v.current;return()=>window.clearTimeout(x)},[]),h.jsx(Tw,{scope:l,isOpenDelayedRef:f,delayDuration:i,onOpen:g.useCallback(()=>{window.clearTimeout(v.current),f.current=!1},[]),onClose:g.useCallback(()=>{window.clearTimeout(v.current),v.current=window.setTimeout(()=>f.current=!0,a)},[a]),isPointerInTransitRef:m,onPointerInTransitChange:g.useCallback(x=>{m.current=x},[]),disableHoverableContent:c,children:d})};Hm.displayName=Wm;var So="Tooltip",[jw,mi]=fi(So),Um=n=>{const{__scopeTooltip:l,children:i,open:a,defaultOpen:c,onOpenChange:d,disableHoverableContent:f,delayDuration:m}=n,v=cu(So,n.__scopeTooltip),x=pi(l),[y,S]=g.useState(null),C=xo(),_=g.useRef(0),b=f??v.disableHoverableContent,k=m??v.delayDuration,T=g.useRef(!1),[A,L]=ri({prop:a,defaultProp:c??!1,onChange:B=>{B?(v.onOpen(),document.dispatchEvent(new CustomEvent(Ha))):v.onClose(),d?.(B)},caller:So}),$=g.useMemo(()=>A?T.current?"delayed-open":"instant-open":"closed",[A]),M=g.useCallback(()=>{window.clearTimeout(_.current),_.current=0,T.current=!1,L(!0)},[L]),U=g.useCallback(()=>{window.clearTimeout(_.current),_.current=0,L(!1)},[L]),Y=g.useCallback(()=>{window.clearTimeout(_.current),_.current=window.setTimeout(()=>{T.current=!0,L(!0),_.current=0},k)},[k,L]);return g.useEffect(()=>()=>{_.current&&(window.clearTimeout(_.current),_.current=0)},[]),h.jsx(Mm,{...x,children:h.jsx(jw,{scope:l,contentId:C,open:A,stateAttribute:$,trigger:y,onTriggerChange:S,onTriggerEnter:g.useCallback(()=>{v.isOpenDelayedRef.current?Y():M()},[v.isOpenDelayedRef,Y,M]),onTriggerLeave:g.useCallback(()=>{b?U():(window.clearTimeout(_.current),_.current=0)},[U,b]),onOpen:M,onClose:U,disableHoverableContent:b,children:i})})};Um.displayName=So;var Ua="TooltipTrigger",Bm=g.forwardRef((n,l)=>{const{__scopeTooltip:i,...a}=n,c=mi(Ua,i),d=cu(Ua,i),f=pi(i),m=g.useRef(null),v=We(l,m,c.onTriggerChange),x=g.useRef(!1),y=g.useRef(!1),S=g.useCallback(()=>x.current=!1,[]);return g.useEffect(()=>()=>document.removeEventListener("pointerup",S),[S]),h.jsx(Im,{asChild:!0,...f,children:h.jsx(Le.button,{"aria-describedby":c.open?c.contentId:void 0,"data-state":c.stateAttribute,...a,ref:v,onPointerMove:Ee(n.onPointerMove,C=>{C.pointerType!=="touch"&&!y.current&&!d.isPointerInTransitRef.current&&(c.onTriggerEnter(),y.current=!0)}),onPointerLeave:Ee(n.onPointerLeave,()=>{c.onTriggerLeave(),y.current=!1}),onPointerDown:Ee(n.onPointerDown,()=>{c.open&&c.onClose(),x.current=!0,document.addEventListener("pointerup",S,{once:!0})}),onFocus:Ee(n.onFocus,()=>{x.current||c.onOpen()}),onBlur:Ee(n.onBlur,c.onClose),onClick:Ee(n.onClick,c.onClose)})})});Bm.displayName=Ua;var Ow="TooltipPortal",[lS,Aw]=fi(Ow,{forceMount:void 0}),Er="TooltipContent",Vm=g.forwardRef((n,l)=>{const i=Aw(Er,n.__scopeTooltip),{forceMount:a=i.forceMount,side:c="top",...d}=n,f=mi(Er,n.__scopeTooltip);return h.jsx(Rt,{present:a||f.open,children:f.disableHoverableContent?h.jsx(Ym,{side:c,...d,ref:l}):h.jsx(Lw,{side:c,...d,ref:l})})}),Lw=g.forwardRef((n,l)=>{const i=mi(Er,n.__scopeTooltip),a=cu(Er,n.__scopeTooltip),c=g.useRef(null),d=We(l,c),[f,m]=g.useState(null),{trigger:v,onClose:x}=i,y=c.current,{onPointerInTransitChange:S}=a,C=g.useCallback(()=>{m(null),S(!1)},[S]),_=g.useCallback((b,k)=>{const T=b.currentTarget,A={x:b.clientX,y:b.clientY},L=Fw(A,T.getBoundingClientRect()),$=$w(A,L),M=Ww(k.getBoundingClientRect()),U=Uw([...$,...M]);m(U),S(!0)},[S]);return g.useEffect(()=>()=>C(),[C]),g.useEffect(()=>{if(v&&y){const b=T=>_(T,y),k=T=>_(T,v);return v.addEventListener("pointerleave",b),y.addEventListener("pointerleave",k),()=>{v.removeEventListener("pointerleave",b),y.removeEventListener("pointerleave",k)}}},[v,y,_,C]),g.useEffect(()=>{if(f){const b=k=>{const T=k.target,A={x:k.clientX,y:k.clientY},L=v?.contains(T)||y?.contains(T),$=!Hw(A,f);L?C():$&&(C(),x())};return document.addEventListener("pointermove",b),()=>document.removeEventListener("pointermove",b)}},[v,y,f,x,C]),h.jsx(Ym,{...n,ref:d})}),[Dw,Mw]=fi(So,{isInside:!1}),Iw=Mv("TooltipContent"),Ym=g.forwardRef((n,l)=>{const{__scopeTooltip:i,children:a,"aria-label":c,onEscapeKeyDown:d,onPointerDownOutside:f,...m}=n,v=mi(Er,i),x=pi(i),{onClose:y}=v;return g.useEffect(()=>(document.addEventListener(Ha,y),()=>document.removeEventListener(Ha,y)),[y]),g.useEffect(()=>{if(v.trigger){const S=C=>{C.target?.contains(v.trigger)&&y()};return window.addEventListener("scroll",S,{capture:!0}),()=>window.removeEventListener("scroll",S,{capture:!0})}},[v.trigger,y]),h.jsx(oi,{asChild:!0,disableOutsidePointerEvents:!1,onEscapeKeyDown:d,onPointerDownOutside:f,onFocusOutside:S=>S.preventDefault(),onDismiss:y,children:h.jsxs(zm,{"data-state":v.stateAttribute,...x,...m,ref:l,style:{...m.style,"--radix-tooltip-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-tooltip-content-available-width":"var(--radix-popper-available-width)","--radix-tooltip-content-available-height":"var(--radix-popper-available-height)","--radix-tooltip-trigger-width":"var(--radix-popper-anchor-width)","--radix-tooltip-trigger-height":"var(--radix-popper-anchor-height)"},children:[h.jsx(Iw,{children:a}),h.jsx(Dw,{scope:i,isInside:!0,children:h.jsx(bw,{id:v.contentId,role:"tooltip",children:c||a})})]})})});Vm.displayName=Er;var Qm="TooltipArrow",zw=g.forwardRef((n,l)=>{const{__scopeTooltip:i,...a}=n,c=pi(i);return Mw(Qm,i).isInside?null:h.jsx(Fm,{...c,...a,ref:l})});zw.displayName=Qm;function Fw(n,l){const i=Math.abs(l.top-n.y),a=Math.abs(l.bottom-n.y),c=Math.abs(l.right-n.x),d=Math.abs(l.left-n.x);switch(Math.min(i,a,c,d)){case d:return"left";case c:return"right";case i:return"top";case a:return"bottom";default:throw new Error("unreachable")}}function $w(n,l,i=5){const a=[];switch(l){case"top":a.push({x:n.x-i,y:n.y+i},{x:n.x+i,y:n.y+i});break;case"bottom":a.push({x:n.x-i,y:n.y-i},{x:n.x+i,y:n.y-i});break;case"left":a.push({x:n.x+i,y:n.y-i},{x:n.x+i,y:n.y+i});break;case"right":a.push({x:n.x-i,y:n.y-i},{x:n.x-i,y:n.y+i});break}return a}function Ww(n){const{top:l,right:i,bottom:a,left:c}=n;return[{x:c,y:l},{x:i,y:l},{x:i,y:a},{x:c,y:a}]}function Hw(n,l){const{x:i,y:a}=n;let c=!1;for(let d=0,f=l.length-1;da!=C>a&&i<(S-x)*(a-y)/(C-y)+x&&(c=!c)}return c}function Uw(n){const l=n.slice();return l.sort((i,a)=>i.xa.x?1:i.ya.y?1:0),Bw(l)}function Bw(n){if(n.length<=1)return n.slice();const l=[];for(let a=0;a=2;){const d=l[l.length-1],f=l[l.length-2];if((d.x-f.x)*(c.y-f.y)>=(d.y-f.y)*(c.x-f.x))l.pop();else break}l.push(c)}l.pop();const i=[];for(let a=n.length-1;a>=0;a--){const c=n[a];for(;i.length>=2;){const d=i[i.length-1],f=i[i.length-2];if((d.x-f.x)*(c.y-f.y)>=(d.y-f.y)*(c.x-f.x))i.pop();else break}i.push(c)}return i.pop(),l.length===1&&i.length===1&&l[0].x===i[0].x&&l[0].y===i[0].y?l:l.concat(i)}var Vw=Hm,Yw=Um,Qw=Bm,Gm=Vm;const Gw=Vw,hi=Yw,gi=Qw,Eo=g.forwardRef(({className:n,sideOffset:l=4,...i},a)=>h.jsx(Gm,{ref:a,sideOffset:l,className:pe("z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]",n),...i}));Eo.displayName=Gm.displayName;var vi="Collapsible",[Xw]=_r(vi),[Kw,du]=Xw(vi),Xm=g.forwardRef((n,l)=>{const{__scopeCollapsible:i,open:a,defaultOpen:c,disabled:d,onOpenChange:f,...m}=n,[v,x]=ri({prop:a,defaultProp:c??!1,onChange:f,caller:vi});return h.jsx(Kw,{scope:i,disabled:d,contentId:xo(),open:v,onOpenToggle:g.useCallback(()=>x(y=>!y),[x]),children:h.jsx(Le.div,{"data-state":pu(v),"data-disabled":d?"":void 0,...m,ref:l})})});Xm.displayName=vi;var Km="CollapsibleTrigger",Zm=g.forwardRef((n,l)=>{const{__scopeCollapsible:i,...a}=n,c=du(Km,i);return h.jsx(Le.button,{type:"button","aria-controls":c.contentId,"aria-expanded":c.open||!1,"data-state":pu(c.open),"data-disabled":c.disabled?"":void 0,disabled:c.disabled,...a,ref:l,onClick:Ee(n.onClick,c.onOpenToggle)})});Zm.displayName=Km;var fu="CollapsibleContent",qm=g.forwardRef((n,l)=>{const{forceMount:i,...a}=n,c=du(fu,n.__scopeCollapsible);return h.jsx(Rt,{present:i||c.open,children:({present:d})=>h.jsx(Zw,{...a,ref:l,present:d})})});qm.displayName=fu;var Zw=g.forwardRef((n,l)=>{const{__scopeCollapsible:i,present:a,children:c,...d}=n,f=du(fu,i),[m,v]=g.useState(a),x=g.useRef(null),y=We(l,x),S=g.useRef(0),C=S.current,_=g.useRef(0),b=_.current,k=f.open||m,T=g.useRef(k),A=g.useRef(void 0);return g.useEffect(()=>{const L=requestAnimationFrame(()=>T.current=!1);return()=>cancelAnimationFrame(L)},[]),Ft(()=>{const L=x.current;if(L){A.current=A.current||{transitionDuration:L.style.transitionDuration,animationName:L.style.animationName},L.style.transitionDuration="0s",L.style.animationName="none";const $=L.getBoundingClientRect();S.current=$.height,_.current=$.width,T.current||(L.style.transitionDuration=A.current.transitionDuration,L.style.animationName=A.current.animationName),v(a)}},[f.open,a]),h.jsx(Le.div,{"data-state":pu(f.open),"data-disabled":f.disabled?"":void 0,id:f.contentId,hidden:!k,...d,ref:y,style:{"--radix-collapsible-content-height":C?`${C}px`:void 0,"--radix-collapsible-content-width":b?`${b}px`:void 0,...n.style},children:k&&c})});function pu(n){return n?"open":"closed"}var qw=Xm;const Jw=qw,e1=Zm,t1=qm,n1=new Set(["production_mutation","credential_access_without_intent","destructive_operation_without_intent","direct_infra_api_with_credential","unknown_high_risk_command"]);function r1(n){const l={deny:[],ask:[],allow:[]};for(const i of n)l[i.decision]?.push(i);return{counts:{all:n.length,deny:l.deny.length,ask:l.ask.length,allow:l.allow.length},groups:l}}function mu(n,l="—"){const i=n.risk_event??{};return i.command_summary||i.request_summary||i.path_class||i.type||l}function Jm(n){return n.replace(/_/g," ")}function o1(n,l){if(n===l)return!0;if(n.length!==l.length)return!1;for(let i=0;il.toUpperCase()):"tool"}function th(n){return!!n.risk_event?.guard_id||n1.has(n.reason_code??"")}function l1(n){return n.reason_code==="async_telemetry"?"Recorded after execution.":n.reason_code==="model_risk_threshold"?"Markov sequence risk crossed the local threshold.":n.reason||n.reason_code||"No explanation captured."}function i1(n){const l=n.risk_event??{},i=nh(n),a=u1(n);return n.reason_code==="model_risk_threshold"?`The Markov-chain model scored this normalized action at ${i}, at or above threshold ${a}.`:n.reason_code==="async_telemetry"?"Not a live gate. Recorded after execution to improve future model parameters.":th(n)?`A deterministic rule fired before the model decision mattered. Markov score is ${i} against threshold ${a}.`:l.type==="normal_tool_call"?`Model score is ${i} against threshold ${a}. Routine coding-agent behavior.`:`Normalized as ${l.type||"unknown"} with model score ${i} against threshold ${a}.`}function s1(n){return n.reason_code==="model_risk_threshold"?"Markov-chain model":n.reason_code==="async_telemetry"?"Trace history":th(n)?"Deterministic rule":"Normal scoring"}function a1(n){return mu(n,"No command summary stored.")}function nh(n){return n.risk_score==null?"n/a":n.risk_score.toFixed(3)}function u1(n){return n.threshold==null?"n/a":n.threshold.toFixed(3)}function c1(n){return n==="deny"?"Would deny":n==="ask"?"Would ask":"Allow"}const ko={deny:{text:"text-destructive",bg:"bg-destructive",ring:"ring-destructive/10",border:"border-destructive/20"},ask:{text:"text-amber-700",bg:"bg-amber-500",ring:"ring-amber-500/10",border:"border-amber-300/40"},allow:{text:"text-brand",bg:"bg-brand",ring:"ring-brand/10",border:"border-border"}};function hu({kind:n,className:l}){const i=ko[n];return h.jsx("span",{className:pe("h-2 w-2 shrink-0 rounded-full ring-4",i.bg,i.ring,l)})}function Kf({label:n,description:l,children:i}){return h.jsxs("section",{className:"mt-8 first:mt-0",children:[(n||l)&&h.jsxs("div",{className:"mb-3.5 flex items-baseline gap-3",children:[n&&h.jsx("h2",{className:"text-[15px] font-semibold tracking-tight",children:n}),l&&h.jsx("p",{className:"text-[12.5px] text-muted-foreground",children:l})]}),i]})}function Zf({k:n,v:l}){return h.jsxs("div",{className:"flex justify-between gap-2",children:[h.jsx("span",{className:"text-muted-foreground",children:n}),h.jsx("span",{className:"font-mono",children:l})]})}function ja({children:n}){return h.jsx("dt",{className:"self-center text-[10.5px] font-medium uppercase tracking-wider text-muted-foreground",children:n})}function Oa({children:n,className:l}){return h.jsx("dd",{className:pe("text-foreground/90",l),children:n})}const d1={all:"All actions",deny:"Denied · this session",ask:"Needs ask · this session",allow:"Allowed · this session"},f1={deny:"Would deny",ask:"Needs ask",allow:"Allow"},p1={all:["deny","ask","allow"],deny:["deny"],ask:["ask"],allow:["allow"]};function m1({tab:n,groups:l,openId:i,onOpen:a,hasAny:c}){return h.jsxs("section",{className:"overflow-hidden rounded-xl border bg-card shadow-[inset_0_1px_0_rgba(255,255,255,0.8),0_1px_2px_rgba(0,0,0,0.04)]",children:[h.jsx("div",{className:"flex items-center justify-between gap-3 border-b px-5 py-3",children:h.jsxs("div",{className:"flex items-baseline gap-2.5",children:[h.jsx("h3",{className:"font-mono text-[10.5px] font-medium uppercase tracking-[0.22em] text-muted-foreground",children:d1[n]}),n!=="all"&&h.jsxs("span",{className:"text-[11px] text-muted-foreground/80",children:["Click ",h.jsx("span",{className:"text-foreground",children:"Total"})," to clear"]})]})}),c?h.jsx("div",{children:p1[n].map(d=>({kind:d,items:l[d]})).filter(({items:d})=>d.length>0).map(({kind:d,items:f},m)=>h.jsx(g1,{label:f1[d],kind:d,count:f.length,separated:m>0,children:f.map(v=>h.jsx(v1,{event:v,active:i===v.id,onClick:()=>a(v.id)},v.id))},d))}):h.jsx(h1,{})]})}function h1(){return h.jsxs("div",{className:"flex flex-col items-center gap-2 px-8 py-16 text-center text-muted-foreground",children:[h.jsx(jv,{className:"h-5 w-5 text-muted-foreground/50"}),h.jsx("p",{className:"text-[13px]",children:"No actions captured yet."}),h.jsx("p",{className:"text-[12px] text-muted-foreground/70",children:"Start Claude Code to populate this view."})]})}function g1({label:n,kind:l,count:i,separated:a,children:c}){const[d,f]=g.useState(!0);return h.jsxs(Jw,{open:d,onOpenChange:f,children:[h.jsxs(e1,{className:pe("flex w-full items-center gap-2 border-b bg-muted/40 px-5 py-2 text-left text-[12px] font-medium text-muted-foreground transition-colors hover:bg-muted/40",a&&"border-t"),children:[h.jsx(ip,{className:pe("h-3 w-3 transition-transform",!d&&"-rotate-90")}),h.jsx(hu,{kind:l}),h.jsx("span",{className:"text-foreground",children:n}),h.jsx("span",{className:"tabular-nums text-[11px] text-muted-foreground",children:i})]}),h.jsx(t1,{className:"overflow-hidden data-[state=closed]:animate-collapsible-up data-[state=open]:animate-collapsible-down",children:h.jsx("div",{children:c})})]})}function v1({event:n,active:l,onClick:i}){const a=mu(n),c=n.risk_event?.signals?.[0]?.replace(/_/g," "),d=ko[n.decision];return h.jsxs("button",{onClick:i,className:pe("group relative grid w-full grid-cols-[10px_minmax(0,1fr)_auto] items-center gap-4 border-b px-8 py-3 text-left transition-colors last:border-b-0","hover:bg-muted/40",l&&"bg-accent"),children:[l&&h.jsx("span",{className:"absolute inset-y-0 left-0 w-[2px] bg-brand"}),h.jsx(hu,{kind:n.decision}),h.jsxs("span",{className:"flex min-w-0 items-baseline gap-2.5",children:[h.jsx("span",{className:"text-[13px] font-medium text-foreground",children:eh(n.tool_name)}),h.jsx("span",{className:"truncate font-mono text-[12px] text-muted-foreground",children:a})]}),h.jsxs("span",{className:"flex items-center gap-3",children:[c&&h.jsxs(hi,{children:[h.jsx(gi,{asChild:!0,children:h.jsx("span",{className:"hidden max-w-[180px] truncate text-[11px] text-muted-foreground md:inline",children:c})}),h.jsxs(Eo,{side:"top",children:["Primary signal: ",c]})]}),h.jsx("span",{className:pe("rounded-md border bg-background/60 px-1.5 py-0.5 font-mono text-[11px] font-medium tabular-nums",d.border,n.decision==="allow"?"text-muted-foreground":d.text),children:nh(n)}),h.jsx(ip,{className:pe("h-3 w-3 -rotate-90 text-muted-foreground/0 transition-all group-hover:text-muted-foreground/70",l&&"text-muted-foreground/70")})]})]})}const y1={},x1=y1,yi=x1.VITE_KONTEXT_API??"";function yo(n){return n instanceof Error?n.message:String(n)}async function qf(n){return n.json()}async function xi(n){if(n.ok)return qf(n);const l=`${n.status} ${n.statusText}`.trim();if(!(n.headers.get("content-type")??"").includes("application/json"))throw new Error(l);let a;try{a=await qf(n)}catch(d){throw new Error(`API error response was not valid JSON: ${l}; ${yo(d)}`)}const c=_o(a)&&typeof a.error=="string"?a.error:l;throw new Error(c)}function _o(n){return n!==null&&typeof n=="object"&&!Array.isArray(n)}function Pe(n){return typeof n=="string"?n:void 0}function Aa(n){return typeof n=="boolean"?n:void 0}function rh(n){return typeof n=="number"&&Number.isFinite(n)?n:void 0}function Ba(n){return n===null?null:rh(n)}function w1(n){if(!Array.isArray(n))return;const l=n.filter(i=>typeof i=="string");return l.length>0?l:void 0}function oh(n){switch(n){case"allow":case"ask":case"deny":return n;default:return}}function Jf(n){switch(n){case"relaxed":case"balanced":case"strict":return n;default:return}}function S1(n){if(_o(n))return{type:Pe(n.type),provider:Pe(n.provider),provider_category:Pe(n.provider_category),operation:Pe(n.operation),operation_class:Pe(n.operation_class),resource_class:Pe(n.resource_class),environment:Pe(n.environment),credential_observed:Aa(n.credential_observed),credential_source:Pe(n.credential_source),direct_api_call:Aa(n.direct_api_call),explicit_user_intent:Aa(n.explicit_user_intent),command_summary:Pe(n.command_summary),request_summary:Pe(n.request_summary),path_class:Pe(n.path_class),decision:oh(n.decision),reason_code:Pe(n.reason_code),model_version:Pe(n.model_version),signals:w1(n.signals),guard_id:Pe(n.guard_id),risk_score:Ba(n.risk_score),confidence:rh(n.confidence)}}function C1(n){if(!(!_o(n)||typeof n.session_id!="string"||typeof n.actions!="number"))return{session_id:n.session_id,actions:n.actions}}function E1(n){if(!_o(n)||typeof n.id!="string")return;const l=oh(n.decision);if(l)return{id:n.id,session_id:Pe(n.session_id),tool_name:Pe(n.tool_name),decision:l,reason:Pe(n.reason),reason_code:Pe(n.reason_code),risk_score:Ba(n.risk_score),threshold:Ba(n.threshold),risk_event:S1(n.risk_event)}}function lh(n){if(!_o(n))throw new Error("invalid policy profile response");const l=Jf(n.profile);if(!l)throw new Error("invalid policy profile response");return{profile:l,recommended_profile:Jf(n.recommended_profile),version:Pe(n.version),rule_pack:Pe(n.rule_pack),rule_pack_version:Pe(n.rule_pack_version),config_digest:Pe(n.config_digest),activation_id:Pe(n.activation_id),source:Pe(n.source),status:Pe(n.status),loaded_at:Pe(n.loaded_at)}}function ih(n,l){if(n==null)return[];if(!Array.isArray(n))throw new Error("invalid API response");const i=[];for(const a of n){const c=l(a);if(!c)throw new Error("invalid API response");i.push(c)}return i}async function k1(){return ih(await fetch(`${yi}/api/sessions`).then(xi),C1)}async function _1(n){return ih(await fetch(`${yi}/api/sessions/${encodeURIComponent(n)}/events`).then(xi),E1)}async function N1(){return lh(await fetch(`${yi}/api/policy/profile`).then(xi))}async function P1(n){const l=await fetch(`${yi}/api/policy/profile`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({profile:n})}).then(xi);return lh(l)}function b1({event:n}){const l=n.risk_event??{},i=n.risk_score??null,a=n.threshold??null,c=i!=null&&a!=null&&a>0?Math.min(1.2,i/a):null,d=ko[n.decision];return h.jsxs("div",{className:"flex h-full flex-col bg-background",children:[h.jsxs(pm,{className:"flex flex-row items-center gap-2 border-b bg-background px-6 py-3.5 pr-14 space-y-0",children:[h.jsx(hu,{kind:n.decision}),h.jsx(mm,{className:pe("text-[13px] font-medium",d.text),children:c1(n.decision)}),h.jsx("span",{className:"ml-2 font-mono text-[10.5px] uppercase tracking-[0.2em] text-muted-foreground",children:eh(n.tool_name)})]}),h.jsx(ni,{className:"flex-1",children:h.jsxs("div",{className:"space-y-7 px-7 py-7",children:[h.jsxs("div",{className:"space-y-3",children:[h.jsx("pre",{className:"whitespace-pre-wrap break-words font-mono text-[15px] font-medium leading-snug tracking-tight text-foreground",children:mu(n)}),h.jsx("p",{className:"text-[13.5px] leading-relaxed text-foreground/75",children:l1(n)})]}),i!=null&&a!=null&&h.jsx(R1,{tone:d,score:i,threshold:a,ratio:c}),h.jsxs("dl",{className:"grid grid-cols-[120px_1fr] gap-y-3 text-[13px]",children:[h.jsx(ja,{children:"Operation"}),h.jsx(Oa,{children:l.operation||l.operation_class||"unknown"}),h.jsx(ja,{children:"Source"}),h.jsx(Oa,{children:s1(n)}),h.jsx(ja,{children:"Environment"}),h.jsx(Oa,{children:h.jsx("span",{className:"font-mono text-[12.5px]",children:l.environment||"unknown"})})]}),h.jsx(La,{title:"Analysis",children:h.jsx("p",{className:"text-[13px] leading-relaxed text-foreground/80",children:i1(n)})}),h.jsx(La,{title:"Command",children:h.jsx("pre",{className:"overflow-x-auto rounded-md border bg-muted/40 px-3 py-2.5 font-mono text-[12px] leading-relaxed text-foreground/90",children:a1(n)})}),(l.signals??[]).length>0&&h.jsx(La,{title:"Signals",children:h.jsx("div",{className:"flex flex-wrap gap-1.5",children:(l.signals??[]).map(f=>h.jsxs("span",{className:"inline-flex items-center gap-1.5 rounded-md border bg-card px-2 py-1 font-mono text-[11px] text-foreground/80 shadow-[inset_0_1px_0_rgba(255,255,255,0.7)]",children:[h.jsx("span",{className:pe("h-1 w-1 rounded-full",d.bg)}),Jm(f)]},f))})}),n.reason_code&&h.jsxs("div",{className:"border-t pt-4 font-mono text-[10.5px] uppercase tracking-[0.2em] text-muted-foreground",children:["reason · ",h.jsx("span",{className:"text-foreground/70",children:n.reason_code})]})]})})]})}function R1({tone:n,score:l,threshold:i,ratio:a}){return h.jsxs(hi,{children:[h.jsx(gi,{asChild:!0,children:h.jsxs("div",{className:"cursor-default rounded-xl border bg-card p-4 shadow-[inset_0_1px_0_rgba(255,255,255,0.8),0_1px_2px_rgba(0,0,0,0.04)]",children:[h.jsxs("div",{className:"flex items-baseline justify-between gap-3",children:[h.jsxs("div",{className:"flex flex-col",children:[h.jsx("span",{className:"font-mono text-[10px] font-medium uppercase tracking-[0.22em] text-muted-foreground",children:"Risk score"}),h.jsx("span",{className:pe("mt-1 font-mono text-[28px] font-semibold leading-none tracking-tight tabular-nums",n.text),children:l.toFixed(3)})]}),h.jsxs("div",{className:"text-right",children:[h.jsx("span",{className:"font-mono text-[10px] font-medium uppercase tracking-[0.22em] text-muted-foreground",children:"Threshold"}),h.jsx("div",{className:"mt-1 font-mono text-[13px] tabular-nums text-foreground/70",children:i.toFixed(3)})]})]}),a!=null&&h.jsx("div",{className:"mt-3 h-1 overflow-hidden rounded-full bg-muted",children:h.jsx("div",{className:pe("h-full rounded-full transition-all",n.bg),style:{width:`${Math.min(100,a*100)}%`}})})]})}),h.jsx(Eo,{side:"left",children:"Risk score relative to threshold"})]})}function La({title:n,children:l}){return h.jsxs("div",{className:"space-y-2.5",children:[h.jsx("h3",{className:"font-mono text-[10px] font-medium uppercase tracking-[0.22em] text-muted-foreground",children:n}),l]})}var Da,wi="HoverCard",[sh]=_r(wi,[di]),Si=di(),[T1,gu]=sh(wi),ah=n=>{const{__scopeHoverCard:l,children:i,open:a,defaultOpen:c,onOpenChange:d,openDelay:f=700,closeDelay:m=300}=n,v=Si(l),x=g.useRef(0),y=g.useRef(0),S=g.useRef(!1),C=g.useRef(!1),[_,b]=ri({prop:a,defaultProp:c??!1,onChange:d,caller:wi}),k=g.useCallback(()=>{clearTimeout(y.current),x.current=window.setTimeout(()=>b(!0),f)},[f,b]),T=g.useCallback(()=>{clearTimeout(x.current),!S.current&&!C.current&&(y.current=window.setTimeout(()=>b(!1),m))},[m,b]),A=g.useCallback(()=>b(!1),[b]);return g.useEffect(()=>()=>{clearTimeout(x.current),clearTimeout(y.current)},[]),h.jsx(T1,{scope:l,open:_,onOpenChange:b,onOpen:k,onClose:T,onDismiss:A,hasSelectionRef:S,isPointerDownOnContentRef:C,children:h.jsx(Mm,{...v,children:i})})};ah.displayName=wi;var uh="HoverCardTrigger",ch=g.forwardRef((n,l)=>{const{__scopeHoverCard:i,...a}=n,c=gu(uh,i),d=Si(i);return h.jsx(Im,{asChild:!0,...d,children:h.jsx(Le.a,{"data-state":c.open?"open":"closed",...a,ref:l,onPointerEnter:Ee(n.onPointerEnter,Jl(c.onOpen)),onPointerLeave:Ee(n.onPointerLeave,Jl(c.onClose)),onFocus:Ee(n.onFocus,c.onOpen),onBlur:Ee(n.onBlur,c.onClose),onTouchStart:Ee(n.onTouchStart,f=>f.preventDefault())})})});ch.displayName=uh;var j1="HoverCardPortal",[iS,O1]=sh(j1,{forceMount:void 0}),ql="HoverCardContent",dh=g.forwardRef((n,l)=>{const i=O1(ql,n.__scopeHoverCard),{forceMount:a=i.forceMount,...c}=n,d=gu(ql,n.__scopeHoverCard);return h.jsx(Rt,{present:a||d.open,children:h.jsx(A1,{"data-state":d.open?"open":"closed",...c,onPointerEnter:Ee(n.onPointerEnter,Jl(d.onOpen)),onPointerLeave:Ee(n.onPointerLeave,Jl(d.onClose)),ref:l})})});dh.displayName=ql;var A1=g.forwardRef((n,l)=>{const{__scopeHoverCard:i,onEscapeKeyDown:a,onPointerDownOutside:c,onFocusOutside:d,onInteractOutside:f,...m}=n,v=gu(ql,i),x=Si(i),y=g.useRef(null),S=We(l,y),[C,_]=g.useState(!1);return g.useEffect(()=>{if(C){const b=document.body;return Da=b.style.userSelect||b.style.webkitUserSelect,b.style.userSelect="none",b.style.webkitUserSelect="none",()=>{b.style.userSelect=Da,b.style.webkitUserSelect=Da}}},[C]),g.useEffect(()=>{if(y.current){const b=()=>{_(!1),v.isPointerDownOnContentRef.current=!1,setTimeout(()=>{document.getSelection()?.toString()!==""&&(v.hasSelectionRef.current=!0)})};return document.addEventListener("pointerup",b),()=>{document.removeEventListener("pointerup",b),v.hasSelectionRef.current=!1,v.isPointerDownOnContentRef.current=!1}}},[v.isPointerDownOnContentRef,v.hasSelectionRef]),g.useEffect(()=>{y.current&&M1(y.current).forEach(k=>k.setAttribute("tabindex","-1"))}),h.jsx(oi,{asChild:!0,disableOutsidePointerEvents:!1,onInteractOutside:f,onEscapeKeyDown:a,onPointerDownOutside:c,onFocusOutside:Ee(d,b=>{b.preventDefault()}),onDismiss:v.onDismiss,children:h.jsx(zm,{...x,...m,onPointerDown:Ee(m.onPointerDown,b=>{b.currentTarget.contains(b.target)&&_(!0),v.hasSelectionRef.current=!1,v.isPointerDownOnContentRef.current=!0}),ref:S,style:{...m.style,userSelect:C?"text":void 0,WebkitUserSelect:C?"text":void 0,"--radix-hover-card-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-hover-card-content-available-width":"var(--radix-popper-available-width)","--radix-hover-card-content-available-height":"var(--radix-popper-available-height)","--radix-hover-card-trigger-width":"var(--radix-popper-anchor-width)","--radix-hover-card-trigger-height":"var(--radix-popper-anchor-height)"}})})}),L1="HoverCardArrow",D1=g.forwardRef((n,l)=>{const{__scopeHoverCard:i,...a}=n,c=Si(i);return h.jsx(Fm,{...c,...a,ref:l})});D1.displayName=L1;function Jl(n){return l=>l.pointerType==="touch"?void 0:n()}function M1(n){const l=[],i=document.createTreeWalker(n,NodeFilter.SHOW_ELEMENT,{acceptNode:a=>a.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP});for(;i.nextNode();)l.push(i.currentNode);return l}var I1=ah,z1=ch,fh=dh;const F1=I1,$1=z1,ph=g.forwardRef(({className:n,align:l="center",sideOffset:i=4,...a},c)=>h.jsx(fh,{ref:c,align:l,sideOffset:i,className:pe("z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-hover-card-content-transform-origin]",n),...a}));ph.displayName=fh.displayName;function $n({className:n,...l}){return h.jsx("div",{className:pe("animate-pulse rounded-md bg-muted",n),...l})}const Va=[{id:"relaxed",label:"Relaxed",lede:"Fewer blocks, more compatibility.",hint:"Use when iterating on agent behavior."},{id:"balanced",label:"Balanced",recommended:!0,lede:"Good protection with fewer false positives.",hint:"Best default for local development."},{id:"strict",label:"Strict",lede:"Maximum protection, more false positives.",hint:"Use when you can accept breakage."}];function W1(n){return Va.find(l=>l.id===n)?.label??"Balanced"}const H1={relaxed:1,balanced:2,strict:3};function U1({profile:n,pending:l,error:i,onActivate:a,onRetry:c}){const d=n?.profile??"balanced",f=!n&&!i;return h.jsxs("section",{className:"space-y-3.5",children:[h.jsxs("div",{className:"flex items-baseline justify-between gap-3",children:[h.jsxs("div",{className:"flex items-baseline gap-3",children:[h.jsx("h2",{className:"text-[15px] font-semibold tracking-tight",children:"Policy profile"}),n&&h.jsxs("span",{className:"font-mono text-[11px] text-muted-foreground",children:[W1(n.profile)," profile"]})]}),n&&h.jsx(B1,{profile:n})]}),h.jsx("div",{className:"grid grid-cols-1 gap-2.5 md:grid-cols-3",children:f?Va.map(m=>h.jsx(V1,{},m.id)):Va.map(m=>h.jsx(Y1,{profile:m,active:m.id===d,pending:m.id===l,disabled:!n||!!l,onActivate:()=>a(m.id)},m.id))}),i&&h.jsxs("div",{className:"flex items-center justify-between gap-3 rounded-md border border-destructive/30 bg-destructive/5 px-3 py-2 text-[12px] text-destructive",children:[h.jsxs("span",{className:"flex min-w-0 items-center gap-2",children:[h.jsx(sp,{className:"h-3.5 w-3.5 shrink-0"}),h.jsx("span",{children:i})]}),h.jsx("button",{type:"button",onClick:c,className:"shrink-0 font-mono text-[10.5px] uppercase tracking-[0.18em] text-destructive underline-offset-4 hover:underline",children:"Retry"})]})]})}function B1({profile:n}){return h.jsxs(F1,{openDelay:120,children:[h.jsx($1,{asChild:!0,children:h.jsxs("button",{type:"button",className:"inline-flex items-center gap-1.5 font-mono text-[10.5px] uppercase tracking-[0.18em] text-muted-foreground transition-colors hover:text-foreground",children:[h.jsx(Pv,{className:"h-3 w-3"}),n.version]})}),h.jsx(ph,{side:"left",align:"end",className:"w-[280px] text-[12.5px]",children:h.jsxs("div",{className:"space-y-1.5",children:[h.jsx(Zf,{k:"Version",v:n.version??"—"}),h.jsx(Zf,{k:"Rule pack",v:n.rule_pack??"—"})]})})]})}function V1(){return h.jsxs("div",{className:"rounded-xl border bg-card p-4",children:[h.jsx($n,{className:"h-3 w-16"}),h.jsx($n,{className:"mt-3 h-7 w-24"}),h.jsx($n,{className:"mt-3 h-3 w-full"}),h.jsx($n,{className:"mt-1.5 h-3 w-3/4"})]})}function Y1({profile:n,active:l,pending:i,disabled:a,onActivate:c}){const d=H1[n.id];return h.jsxs("button",{type:"button",onClick:c,disabled:a,className:pe("group relative flex flex-col overflow-hidden rounded-xl border text-left transition-shadow duration-200","disabled:pointer-events-none disabled:opacity-60",l?pe("bg-brand-gradient border-brand-dark text-brand-foreground","shadow-[inset_0_1px_0_rgba(255,255,255,0.10),inset_0_0_0_1px_rgba(255,255,255,0.04),0_10px_30px_-8px_rgba(21,40,34,0.45)]","hover:shadow-[inset_0_1px_0_rgba(255,255,255,0.14),inset_0_0_0_1px_rgba(255,255,255,0.06),0_18px_48px_-10px_rgba(21,40,34,0.55)]"):pe("bg-card","shadow-[inset_0_1px_0_rgba(255,255,255,0.8),0_1px_2px_rgba(15,17,21,0.04)]","hover:border-foreground/15 hover:shadow-[inset_0_1px_0_rgba(255,255,255,0.8),0_6px_18px_-6px_rgba(15,17,21,0.10)]")),children:[i&&h.jsx("span",{className:"absolute inset-x-0 bottom-0 h-px overflow-hidden",children:h.jsx("span",{className:pe("block h-full w-1/3 animate-[shimmer_1.2s_linear_infinite]",l?"bg-white":"bg-foreground")})}),h.jsxs("div",{className:"flex items-center justify-between px-5 pt-4",children:[h.jsx(Q1,{filled:d,active:l}),h.jsxs("div",{className:"flex items-center gap-2",children:[n.recommended&&!i&&h.jsx("span",{className:pe("font-mono text-[9.5px] font-medium uppercase tracking-[0.18em]",l?"text-white/70":"text-muted-foreground"),children:"Recommended"}),i&&h.jsxs("span",{className:pe("inline-flex items-center gap-1 font-mono text-[9.5px] uppercase tracking-[0.18em]",l?"text-white/70":"text-muted-foreground"),children:[h.jsx(Rv,{className:"h-3 w-3 animate-spin"}),"Activating"]})]})]}),h.jsxs("div",{className:"px-5 pt-2.5",children:[h.jsx("div",{className:"text-[22px] font-semibold leading-tight tracking-tight",children:n.label}),h.jsx("p",{className:pe("mt-1 text-[12.5px] leading-snug",l?"text-white/85":"text-foreground/80"),children:n.lede}),h.jsx("p",{className:pe("mt-0.5 text-[11.5px] leading-snug",l?"text-white/55":"text-muted-foreground"),children:n.hint})]}),h.jsx("div",{className:pe("mt-3 border-t px-5 py-2.5 font-mono text-[10px] uppercase tracking-[0.22em]",l?"border-white/15 text-white":"border-border text-muted-foreground/70"),children:l?"Active profile":"Tap to activate"})]})}function Q1({filled:n,active:l}){return h.jsx("div",{className:"flex items-center gap-1","aria-hidden":"true",children:[1,2,3].map(i=>h.jsx("span",{className:pe("h-1 w-2.5 rounded-full transition-colors",i<=n?l?"bg-white":"bg-foreground":l?"bg-white/25":"bg-muted-foreground/25")},i))})}new Date(Date.now()-120*1e3).toISOString();function G1({session:n,loading:l}){return h.jsxs("header",{className:"flex items-center justify-between gap-4 border-b bg-background px-10 py-5",children:[h.jsx("div",{className:"flex min-w-0 items-center gap-3",children:l?h.jsx($n,{className:"h-6 w-60"}):h.jsxs(h.Fragment,{children:[h.jsxs("span",{className:"relative flex h-2 w-2 shrink-0",children:[h.jsx("span",{className:"absolute inline-flex h-full w-full animate-ping rounded-full bg-brand opacity-50"}),h.jsx("span",{className:"relative inline-flex h-2 w-2 rounded-full bg-brand"})]}),h.jsx("span",{className:"truncate font-mono text-[17px] font-medium tracking-tight text-foreground",children:n?.session_id??"-"})]})}),h.jsxs(hi,{children:[h.jsx(gi,{asChild:!0,children:h.jsx("span",{className:"cursor-default text-[11px] uppercase tracking-[0.18em] text-muted-foreground",children:"Observe mode"})}),h.jsx(Eo,{side:"bottom",children:"Recording decisions but not enforcing them."})]})]})}function X1({sessions:n,counts:l,selectedID:i,onSelect:a}){return h.jsxs("aside",{className:"flex min-h-0 flex-col border-r",children:[h.jsx("div",{className:"px-5 pb-6 pt-7",children:h.jsx("div",{className:"text-[18px] font-semibold tracking-tight",children:"Kontext"})}),h.jsxs(ni,{className:"flex-1 px-2",children:[h.jsx(K1,{label:"This session",count:l.all,active:!0}),n.length>1&&h.jsxs(h.Fragment,{children:[h.jsx("div",{className:"px-2.5 pb-1.5 pt-6 text-[10.5px] font-medium uppercase tracking-[0.18em] text-muted-foreground",children:"Recent"}),h.jsx("div",{className:"flex flex-col gap-0.5",children:n.slice(0,12).map(c=>h.jsxs("button",{type:"button",onClick:()=>a(c.session_id),className:pe("flex items-center justify-between gap-2 rounded-md px-2.5 py-1.5 text-left text-[12.5px] transition-colors hover:bg-accent/60",c.session_id===i&&"bg-accent text-foreground"),children:[h.jsx("span",{className:"truncate font-mono text-muted-foreground",children:c.session_id}),h.jsx("span",{className:"shrink-0 tabular-nums text-[11px] text-muted-foreground",children:c.actions})]},c.session_id))})]})]})]})}function K1({label:n,count:l,active:i}){return h.jsxs("button",{type:"button",className:pe("flex w-full items-center justify-between rounded-md px-2.5 py-1.5 text-left text-[13px] font-medium transition-colors",i?"bg-accent text-foreground":"text-muted-foreground hover:bg-accent/60 hover:text-foreground"),children:[h.jsx("span",{children:n}),h.jsx("span",{className:"font-mono text-[11px] text-muted-foreground",children:l})]})}const Z1=[{id:"deny",label:"Would deny"},{id:"ask",label:"Needs ask"},{id:"allow",label:"Allowed"}],q1=[{kind:"deny",label:"Would deny"},{kind:"ask",label:"Ask"},{kind:"allow",label:"Allow"}];function J1({counts:n,active:l,onSelect:i,loading:a}){return h.jsxs("section",{className:"overflow-hidden rounded-xl border bg-card shadow-[inset_0_1px_0_rgba(255,255,255,0.8),0_1px_2px_rgba(0,0,0,0.04)]",children:[h.jsx(eS,{count:n.all,active:l==="all",loading:a,onClick:()=>i("all")}),h.jsx("div",{className:"grid divide-y md:grid-cols-3 md:divide-x md:divide-y-0",children:Z1.map(c=>h.jsx(tS,{id:c.id,label:c.label,count:n[c.id],total:n.all,active:l===c.id,loading:a,onClick:()=>i(c.id)},c.id))}),h.jsx(nS,{counts:n})]})}function eS({count:n,active:l,loading:i,onClick:a}){return h.jsxs("button",{type:"button",onClick:a,"aria-label":"Show all decisions",className:pe("flex w-full items-center gap-3 border-b bg-muted/10 px-6 py-3 text-left transition-colors","hover:bg-muted/30",l&&"bg-muted/40"),children:[i?h.jsx($n,{className:"h-7 w-10"}):h.jsx("span",{className:"font-mono text-[26px] font-semibold leading-none tabular-nums text-foreground",children:n}),h.jsx("div",{className:"min-w-0",children:h.jsx("span",{className:pe("text-[13px] font-medium",l?"text-foreground":"text-muted-foreground"),children:"decisions captured"})})]})}function tS({id:n,label:l,count:i,total:a,active:c,loading:d,onClick:f}){const m=Math.round(i/Math.max(1,a)*100),v=i===0?"text-muted-foreground/40":ko[n].text;return h.jsxs("button",{type:"button",onClick:f,className:pe("group relative flex items-baseline gap-4 px-6 py-5 text-left transition-colors","hover:bg-muted/30",c&&"bg-muted/40"),children:[d?h.jsx($n,{className:"h-9 w-12"}):h.jsx("span",{className:pe("font-mono text-[36px] font-semibold leading-none tracking-tight tabular-nums",v),children:i}),h.jsxs("div",{className:"flex flex-col leading-tight",children:[h.jsx("span",{className:pe("font-mono text-[10px] font-medium uppercase tracking-[0.22em]",c?"text-foreground":"text-muted-foreground"),children:l}),h.jsxs("span",{className:"mt-1 text-[11px] text-muted-foreground/70",children:[m,"% of session"]})]})]})}function nS({counts:n}){const l=q1.map(i=>({count:n[i.kind],color:ko[i.kind].bg,label:i.label})).filter(i=>i.count>0);return h.jsx("div",{className:"border-t bg-muted/20 px-6 py-3",children:h.jsxs("div",{className:"flex items-center gap-4",children:[h.jsx("div",{className:"flex h-1.5 flex-1 gap-0.5 overflow-hidden rounded-full bg-muted/60",children:l.length===0?h.jsx("div",{className:"w-full bg-muted-foreground/15"}):l.map(i=>h.jsxs(hi,{children:[h.jsx(gi,{asChild:!0,children:h.jsx("div",{className:pe("transition-opacity hover:opacity-80",i.color),style:{flex:i.count},"aria-label":`${i.count} ${i.label}`})}),h.jsxs(Eo,{side:"top",children:[i.count," ",i.label.toLowerCase()]})]},i.label))}),h.jsx("div",{className:"flex items-center gap-3 font-mono text-[10px] uppercase tracking-[0.18em] text-muted-foreground",children:l.length===0?h.jsx("span",{children:"No activity yet"}):l.map(i=>h.jsxs("span",{className:"inline-flex items-center gap-1.5",children:[h.jsx("span",{className:pe("h-1.5 w-1.5 rounded-full",i.color)}),i.label,h.jsx("span",{className:"tabular-nums text-foreground/70",children:i.count})]},i.label))})]})})}function rS(){const[n,l]=g.useState([]),[i,a]=g.useState(""),[c,d]=g.useState([]),[f,m]=g.useState("all"),[v,x]=g.useState(null),[y,S]=g.useState(""),[C,_]=g.useState(null),[b,k]=g.useState(null),[T,A]=g.useState(""),L=g.useRef("");g.useEffect(()=>{Y(),ie();const ee=setInterval(Y,3e3);return()=>clearInterval(ee)},[]),g.useEffect(()=>{i&&B(i),L.current=i},[i]);function $(ee){L.current=ee,a(ee)}function M(ee){return l(le=>o1(le,ee)?le:ee),S(""),ee}function U(ee){d(ee),S("")}function Y(){k1().then(ee=>{const le=M(ee),se=L.current,D=le.some(Q=>Q.session_id===se)?se:le[0]?.session_id;D?D!==se?$(D):B(D):(L.current="",a(""),d([]),x(null))}).catch(ee=>S(yo(ee)))}function B(ee){_1(ee).then(le=>{L.current===ee&&U(le)}).catch(le=>S(yo(le)))}function ie(){N1().then(ee=>{_(ee),A("")}).catch(ee=>{A(`Couldn't load policy profile. ${yo(ee)}`)})}function te(ee){ee===C?.profile||b||(k(ee),A(""),P1(ee).then(_).catch(le=>A(`Couldn't update policy profile. ${yo(le)}`)).finally(()=>k(null)))}const{counts:ne,groups:ue}=g.useMemo(()=>r1(c),[c]),J=g.useMemo(()=>v?c.find(ee=>ee.id===v)??null:null,[v,c]),he=g.useMemo(()=>n.find(ee=>ee.session_id===i),[n,i]),ce=n.length===0&&!y;return h.jsx(Gw,{delayDuration:150,children:h.jsxs("div",{className:"grid h-screen grid-cols-[252px_1fr] bg-background text-foreground",children:[h.jsx(X1,{sessions:n,counts:ne,selectedID:i,onSelect:$}),h.jsxs("main",{className:"flex min-h-0 flex-col overflow-hidden",children:[h.jsx(G1,{session:he,loading:ce}),h.jsx(ni,{className:"flex-1",children:h.jsxs("div",{className:"px-10 pb-10 pt-8",children:[h.jsx(U1,{profile:C,pending:b,error:T,onActivate:te,onRetry:ie}),h.jsx(Kf,{label:"Activity",description:"What was decided this session.",children:h.jsx(J1,{counts:ne,active:f,onSelect:m,loading:ce})}),y&&h.jsxs("div",{className:"mt-4 flex items-center gap-2 rounded-md border border-destructive/30 bg-destructive/5 px-3 py-2 text-[12px] text-destructive",children:[h.jsx(sp,{className:"h-3.5 w-3.5 shrink-0"}),h.jsx("span",{children:y})]}),h.jsx(Kf,{label:"Log",description:"Tool calls in chronological order.",children:h.jsx(m1,{tab:f,groups:ue,openId:v,onOpen:x,hasAny:c.length>0})})]})})]}),h.jsx(u0,{open:!!J,onOpenChange:ee=>!ee&&x(null),children:h.jsx(fm,{side:"right",className:"w-[540px] max-w-[92vw] p-0 sm:max-w-[540px]",children:J&&h.jsx(b1,{event:J})})})]})})}const ep=document.getElementById("root");ep&&yv.createRoot(ep).render(h.jsx(np.StrictMode,{children:h.jsx(rS,{})})); diff --git a/internal/guard/web/assets/dist/assets/index-Cg4Hjls9.css b/internal/guard/web/assets/dist/assets/index-CleXL0pS.css similarity index 56% rename from internal/guard/web/assets/dist/assets/index-Cg4Hjls9.css rename to internal/guard/web/assets/dist/assets/index-CleXL0pS.css index 31a104a..e5aa7ac 100644 --- a/internal/guard/web/assets/dist/assets/index-Cg4Hjls9.css +++ b/internal/guard/web/assets/dist/assets/index-CleXL0pS.css @@ -1 +1 @@ -@font-face{font-family:Geist Sans;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/geist-sans-latin-400-normal-gapTbOY8.woff2) format("woff2"),url(/assets/geist-sans-latin-400-normal-BOaIZNA2.woff) format("woff")}@font-face{font-family:Geist Sans;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/geist-sans-latin-500-normal-uokXdC-Q.woff2) format("woff2"),url(/assets/geist-sans-latin-500-normal-CN2lyvyL.woff) format("woff")}@font-face{font-family:Geist Sans;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/geist-sans-latin-600-normal-DFOURf8L.woff2) format("woff2"),url(/assets/geist-sans-latin-600-normal-CA1yjETN.woff) format("woff")}@font-face{font-family:Geist Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/geist-mono-cyrillic-400-normal-Ce5q_31Z.woff2) format("woff2"),url(/assets/geist-mono-cyrillic-400-normal-BPBWmzPh.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Geist Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/geist-mono-latin-ext-400-normal-Cgks_Qgx.woff2) format("woff2"),url(/assets/geist-mono-latin-ext-400-normal-CxNRRMGd.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,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 Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/geist-mono-latin-400-normal-LC9RFr9I.woff2) format("woff2"),url(/assets/geist-mono-latin-400-normal-CoULgQGM.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}@font-face{font-family:Geist Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/geist-mono-cyrillic-500-normal-CJBLNVQT.woff2) format("woff2"),url(/assets/geist-mono-cyrillic-500-normal-mNhfPmgl.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Geist Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/geist-mono-latin-ext-500-normal-CQcGuCNt.woff2) format("woff2"),url(/assets/geist-mono-latin-ext-500-normal-diTenJ8L.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,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 Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/geist-mono-latin-500-normal-D3o2eNa9.woff2) format("woff2"),url(/assets/geist-mono-latin-500-normal-DOxI7kZ4.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:Geist Sans,-apple-system,BlinkMacSystemFont,system-ui,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:Geist Mono,ui-monospace,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{--radius: .625rem;--radius-sm: .375rem;--radius-lg: .875rem;--background: 40 11% 97%;--foreground: 24 10% 10%;--card: 0 0% 100%;--card-foreground: 24 10% 10%;--popover: 0 0% 100%;--popover-foreground: 24 10% 10%;--primary: 24 10% 10%;--primary-foreground: 40 11% 97%;--secondary: 40 8% 93%;--secondary-foreground: 24 10% 10%;--muted: 40 8% 93%;--muted-foreground: 30 6% 44%;--accent: 40 8% 91%;--accent-foreground: 24 10% 10%;--destructive: 0 72% 51%;--destructive-foreground: 0 0% 100%;--border: 36 8% 89%;--input: 36 8% 89%;--ring: 161 48% 12%;--brand: 161 48% 12%;--brand-foreground: 0 0% 100%;--brand-light: 161 33% 94%;--brand-dark: 161 53% 9%}*{border-color:hsl(var(--border))}html,body,#root{height:100%}body{background-color:hsl(var(--background));font-family:Geist Sans,-apple-system,BlinkMacSystemFont,system-ui,sans-serif;color:hsl(var(--foreground));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-feature-settings:"cv11","ss01","ss03"}.bg-brand-gradient{background:radial-gradient(120% 90% at 0% 0%,rgba(255,255,255,.1),transparent 55%),linear-gradient(135deg,#102d24,#1c4035,#244c3f)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.bottom-0{bottom:0}.left-0{left:0}.left-2{left:.5rem}.right-0{right:0}.right-4{right:1rem}.top-0{top:0}.top-4{top:1rem}.z-50{z-index:50}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mb-3\.5{margin-bottom:.875rem}.ml-2{margin-left:.5rem}.ml-auto{margin-left:auto}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-8{margin-top:2rem}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-9{height:2.25rem}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-\[var\(--radix-dropdown-menu-content-available-height\)\]{max-height:var(--radix-dropdown-menu-content-available-height)}.min-h-0{min-height:0px}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-1\/3{width:33.333333%}.w-10{width:2.5rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-4{width:1rem}.w-5{width:1.25rem}.w-60{width:15rem}.w-64{width:16rem}.w-\[280px\]{width:280px}.w-\[2px\]{width:2px}.w-\[540px\]{width:540px}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[8rem\]{min-width:8rem}.max-w-\[180px\]{max-width:180px}.max-w-\[92vw\]{max-width:92vw}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.origin-\[--radix-dropdown-menu-content-transform-origin\]{transform-origin:var(--radix-dropdown-menu-content-transform-origin)}.origin-\[--radix-hover-card-content-transform-origin\]{transform-origin:var(--radix-hover-card-content-transform-origin)}.origin-\[--radix-tooltip-content-transform-origin\]{transform-origin:var(--radix-tooltip-content-transform-origin)}.-rotate-90{--tw-rotate: -90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes shimmer{0%{transform:translate(-100%)}to{transform:translate(400%)}}.animate-\[shimmer_1\.2s_linear_infinite\]{animation:shimmer 1.2s linear infinite}@keyframes ping{75%,to{transform:scale(2);opacity:0}}.animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}@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-default{cursor:default}.touch-none{touch-action:none}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-\[10px_minmax\(0\,1fr\)_auto\]{grid-template-columns:10px minmax(0,1fr) auto}.grid-cols-\[120px_1fr\]{grid-template-columns:120px 1fr}.grid-cols-\[252px_1fr\]{grid-template-columns:252px 1fr}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-y-3{row-gap:.75rem}.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-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-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.875rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem * var(--tw-space-y-reverse))}.space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.75rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.self-center{align-self:center}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:9999px}.rounded-md{border-radius:var(--radius)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-amber-300\/40{border-color:#fcd34d66}.border-border{border-color:hsl(var(--border))}.border-brand-dark{--tw-border-opacity: 1;border-color:hsl(var(--brand-dark) / var(--tw-border-opacity, 1))}.border-destructive\/20{border-color:hsl(var(--destructive) / .2)}.border-destructive\/30{border-color:hsl(var(--destructive) / .3)}.border-white\/15{border-color:#ffffff26}.border-l-transparent{border-left-color:transparent}.border-t-transparent{border-top-color:transparent}.bg-accent{background-color:hsl(var(--accent))}.bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-background{background-color:hsl(var(--background))}.bg-background\/60{background-color:hsl(var(--background) / .6)}.bg-black\/80{background-color:#000c}.bg-border{background-color:hsl(var(--border))}.bg-brand{--tw-bg-opacity: 1;background-color:hsl(var(--brand) / var(--tw-bg-opacity, 1))}.bg-card{background-color:hsl(var(--card))}.bg-destructive{background-color:hsl(var(--destructive))}.bg-destructive\/5{background-color:hsl(var(--destructive) / .05)}.bg-foreground{background-color:hsl(var(--foreground))}.bg-muted{background-color:hsl(var(--muted))}.bg-muted-foreground\/15{background-color:hsl(var(--muted-foreground) / .15)}.bg-muted-foreground\/25{background-color:hsl(var(--muted-foreground) / .25)}.bg-muted\/10{background-color:hsl(var(--muted) / .1)}.bg-muted\/20{background-color:hsl(var(--muted) / .2)}.bg-muted\/40{background-color:hsl(var(--muted) / .4)}.bg-muted\/60{background-color:hsl(var(--muted) / .6)}.bg-popover{background-color:hsl(var(--popover))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/25{background-color:#ffffff40}.fill-current{fill:currentColor}.p-0{padding:0}.p-1{padding:.25rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-\[1px\]{padding:1px}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.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-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-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-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-7{padding-top:1.75rem;padding-bottom:1.75rem}.pb-1\.5{padding-bottom:.375rem}.pb-10{padding-bottom:2.5rem}.pb-6{padding-bottom:1.5rem}.pl-8{padding-left:2rem}.pr-14{padding-right:3.5rem}.pr-2{padding-right:.5rem}.pt-2\.5{padding-top:.625rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.pt-7{padding-top:1.75rem}.pt-8{padding-top:2rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:Geist Mono,ui-monospace,monospace}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[12px\]{font-size:12px}.text-\[13\.5px\]{font-size:13.5px}.text-\[13px\]{font-size:13px}.text-\[15px\]{font-size:15px}.text-\[17px\]{font-size:17px}.text-\[18px\]{font-size:18px}.text-\[22px\]{font-size:22px}.text-\[26px\]{font-size:26px}.text-\[28px\]{font-size:28px}.text-\[36px\]{font-size:36px}.text-\[9\.5px\]{font-size:9.5px}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-semibold{font-weight:600}.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)}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-\[0\.18em\]{letter-spacing:.18em}.tracking-\[0\.22em\]{letter-spacing:.22em}.tracking-\[0\.2em\]{letter-spacing:.2em}.tracking-tight{letter-spacing:-.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-brand{--tw-text-opacity: 1;color:hsl(var(--brand) / var(--tw-text-opacity, 1))}.text-brand-foreground{--tw-text-opacity: 1;color:hsl(var(--brand-foreground) / var(--tw-text-opacity, 1))}.text-destructive{color:hsl(var(--destructive))}.text-foreground{color:hsl(var(--foreground))}.text-foreground\/70{color:hsl(var(--foreground) / .7)}.text-foreground\/75{color:hsl(var(--foreground) / .75)}.text-foreground\/80{color:hsl(var(--foreground) / .8)}.text-foreground\/90{color:hsl(var(--foreground) / .9)}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-muted-foreground\/0{color:hsl(var(--muted-foreground) / 0)}.text-muted-foreground\/40{color:hsl(var(--muted-foreground) / .4)}.text-muted-foreground\/50{color:hsl(var(--muted-foreground) / .5)}.text-muted-foreground\/70{color:hsl(var(--muted-foreground) / .7)}.text-muted-foreground\/80{color:hsl(var(--muted-foreground) / .8)}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-white\/55{color:#ffffff8c}.text-white\/70{color:#ffffffb3}.text-white\/85{color:#ffffffd9}.underline-offset-4{text-underline-offset:4px}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow-\[inset_0_1px_0_rgba\(255\,255\,255\,0\.10\)\,inset_0_0_0_1px_rgba\(255\,255\,255\,0\.04\)\,0_10px_30px_-8px_rgba\(21\,40\,34\,0\.45\)\]{--tw-shadow: inset 0 1px 0 rgba(255,255,255,.1),inset 0 0 0 1px rgba(255,255,255,.04),0 10px 30px -8px rgba(21,40,34,.45);--tw-shadow-colored: inset 0 1px 0 var(--tw-shadow-color), inset 0 0 0 1px var(--tw-shadow-color), 0 10px 30px -8px 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-\[inset_0_1px_0_rgba\(255\,255\,255\,0\.7\)\]{--tw-shadow: inset 0 1px 0 rgba(255,255,255,.7);--tw-shadow-colored: inset 0 1px 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-\[inset_0_1px_0_rgba\(255\,255\,255\,0\.8\)\,0_1px_2px_rgba\(0\,0\,0\,0\.04\)\]{--tw-shadow: inset 0 1px 0 rgba(255,255,255,.8),0 1px 2px rgba(0,0,0,.04);--tw-shadow-colored: inset 0 1px 0 var(--tw-shadow-color), 0 1px 2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[inset_0_1px_0_rgba\(255\,255\,255\,0\.8\)\,0_1px_2px_rgba\(15\,17\,21\,0\.04\)\]{--tw-shadow: inset 0 1px 0 rgba(255,255,255,.8),0 1px 2px rgba(15,17,21,.04);--tw-shadow-colored: inset 0 1px 0 var(--tw-shadow-color), 0 1px 2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.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-4{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-amber-500\/10{--tw-ring-color: rgb(245 158 11 / .1)}.ring-brand\/10{--tw-ring-color: hsl(var(--brand) / .1)}.ring-destructive\/10{--tw-ring-color: hsl(var(--destructive) / .1)}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.animate-in{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.fade-in-0{--tw-enter-opacity: 0}.zoom-in-95{--tw-enter-scale: .95}.duration-200{animation-duration:.2s}.ease-in-out{animation-timing-function:cubic-bezier(.4,0,.2,1)}.first\:mt-0:first-child{margin-top:0}.last\:border-b-0:last-child{border-bottom-width:0px}.hover\:border-foreground\/15:hover{border-color:hsl(var(--foreground) / .15)}.hover\:bg-accent\/60:hover{background-color:hsl(var(--accent) / .6)}.hover\:bg-muted\/30:hover{background-color:hsl(var(--muted) / .3)}.hover\:bg-muted\/40:hover{background-color:hsl(var(--muted) / .4)}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:opacity-80:hover{opacity:.8}.hover\:shadow-\[inset_0_1px_0_rgba\(255\,255\,255\,0\.14\)\,inset_0_0_0_1px_rgba\(255\,255\,255\,0\.06\)\,0_18px_48px_-10px_rgba\(21\,40\,34\,0\.55\)\]:hover{--tw-shadow: inset 0 1px 0 rgba(255,255,255,.14),inset 0 0 0 1px rgba(255,255,255,.06),0 18px 48px -10px rgba(21,40,34,.55);--tw-shadow-colored: inset 0 1px 0 var(--tw-shadow-color), inset 0 0 0 1px var(--tw-shadow-color), 0 18px 48px -10px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:shadow-\[inset_0_1px_0_rgba\(255\,255\,255\,0\.8\)\,0_6px_18px_-6px_rgba\(15\,17\,21\,0\.10\)\]:hover{--tw-shadow: inset 0 1px 0 rgba(255,255,255,.8),0 6px 18px -6px rgba(15,17,21,.1);--tw-shadow-colored: inset 0 1px 0 var(--tw-shadow-color), 0 6px 18px -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)}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.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-ring:focus{--tw-ring-color: hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-60:disabled{opacity:.6}.group:hover .group-hover\:text-muted-foreground\/70{color:hsl(var(--muted-foreground) / .7)}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}@keyframes collapsible-up{0%{height:var(--radix-collapsible-content-height)}to{height:0}}.data-\[state\=closed\]\:animate-collapsible-up[data-state=closed]{animation:collapsible-up .2s ease-out}@keyframes collapsible-down{0%{height:0}to{height:var(--radix-collapsible-content-height)}}.data-\[state\=open\]\:animate-collapsible-down[data-state=open]{animation:collapsible-down .2s ease-out}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\[state\=open\]\:bg-secondary[data-state=open]{background-color:hsl(var(--secondary))}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[state\=closed\]\:duration-300[data-state=closed]{transition-duration:.3s}.data-\[state\=open\]\:duration-500[data-state=open]{transition-duration:.5s}.data-\[state\=open\]\:animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity: initial;--tw-exit-scale: initial;--tw-exit-rotate: initial;--tw-exit-translate-x: initial;--tw-exit-translate-y: initial}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity: 0}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity: 0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale: .95}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale: .95}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y: -.5rem}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x: .5rem}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x: -.5rem}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y: .5rem}.data-\[state\=closed\]\:slide-out-to-bottom[data-state=closed]{--tw-exit-translate-y: 100%}.data-\[state\=closed\]\:slide-out-to-left[data-state=closed]{--tw-exit-translate-x: -100%}.data-\[state\=closed\]\:slide-out-to-right[data-state=closed]{--tw-exit-translate-x: 100%}.data-\[state\=closed\]\:slide-out-to-top[data-state=closed]{--tw-exit-translate-y: -100%}.data-\[state\=open\]\:slide-in-from-bottom[data-state=open]{--tw-enter-translate-y: 100%}.data-\[state\=open\]\:slide-in-from-left[data-state=open]{--tw-enter-translate-x: -100%}.data-\[state\=open\]\:slide-in-from-right[data-state=open]{--tw-enter-translate-x: 100%}.data-\[state\=open\]\:slide-in-from-top[data-state=open]{--tw-enter-translate-y: -100%}.data-\[state\=closed\]\:duration-300[data-state=closed]{animation-duration:.3s}.data-\[state\=open\]\:duration-500[data-state=open]{animation-duration:.5s}@media(min-width:640px){.sm\:max-w-\[540px\]{max-width:540px}.sm\:max-w-sm{max-width:24rem}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.sm\:text-left{text-align:left}}@media(min-width:768px){.md\:inline{display:inline}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse: 0;border-right-width:calc(1px * var(--tw-divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}.md\:divide-y-0>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(0px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(0px * var(--tw-divide-y-reverse))}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:1rem;height:1rem}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0} +@font-face{font-family:Geist Sans;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/geist-sans-latin-400-normal-gapTbOY8.woff2) format("woff2"),url(/assets/geist-sans-latin-400-normal-BOaIZNA2.woff) format("woff")}@font-face{font-family:Geist Sans;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/geist-sans-latin-500-normal-uokXdC-Q.woff2) format("woff2"),url(/assets/geist-sans-latin-500-normal-CN2lyvyL.woff) format("woff")}@font-face{font-family:Geist Sans;font-style:normal;font-display:swap;font-weight:600;src:url(/assets/geist-sans-latin-600-normal-DFOURf8L.woff2) format("woff2"),url(/assets/geist-sans-latin-600-normal-CA1yjETN.woff) format("woff")}@font-face{font-family:Geist Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/geist-mono-cyrillic-400-normal-Ce5q_31Z.woff2) format("woff2"),url(/assets/geist-mono-cyrillic-400-normal-BPBWmzPh.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Geist Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/geist-mono-latin-ext-400-normal-Cgks_Qgx.woff2) format("woff2"),url(/assets/geist-mono-latin-ext-400-normal-CxNRRMGd.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,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 Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/geist-mono-latin-400-normal-LC9RFr9I.woff2) format("woff2"),url(/assets/geist-mono-latin-400-normal-CoULgQGM.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}@font-face{font-family:Geist Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/geist-mono-cyrillic-500-normal-CJBLNVQT.woff2) format("woff2"),url(/assets/geist-mono-cyrillic-500-normal-mNhfPmgl.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Geist Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/geist-mono-latin-ext-500-normal-CQcGuCNt.woff2) format("woff2"),url(/assets/geist-mono-latin-ext-500-normal-diTenJ8L.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,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 Mono;font-style:normal;font-display:swap;font-weight:500;src:url(/assets/geist-mono-latin-500-normal-D3o2eNa9.woff2) format("woff2"),url(/assets/geist-mono-latin-500-normal-DOxI7kZ4.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:Geist Sans,-apple-system,BlinkMacSystemFont,system-ui,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:Geist Mono,ui-monospace,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{--radius: .625rem;--radius-sm: .375rem;--radius-lg: .875rem;--background: 40 11% 97%;--foreground: 24 10% 10%;--card: 0 0% 100%;--card-foreground: 24 10% 10%;--popover: 0 0% 100%;--popover-foreground: 24 10% 10%;--primary: 24 10% 10%;--primary-foreground: 40 11% 97%;--secondary: 40 8% 93%;--secondary-foreground: 24 10% 10%;--muted: 40 8% 93%;--muted-foreground: 30 6% 44%;--accent: 40 8% 91%;--accent-foreground: 24 10% 10%;--destructive: 0 72% 51%;--destructive-foreground: 0 0% 100%;--border: 36 8% 89%;--input: 36 8% 89%;--ring: 161 48% 12%;--brand: 161 48% 12%;--brand-foreground: 0 0% 100%;--brand-light: 161 33% 94%;--brand-dark: 161 53% 9%}*{border-color:hsl(var(--border))}html,body,#root{height:100%}body{background-color:hsl(var(--background));font-family:Geist Sans,-apple-system,BlinkMacSystemFont,system-ui,sans-serif;color:hsl(var(--foreground));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-feature-settings:"cv11","ss01","ss03"}.bg-brand-gradient{background:radial-gradient(120% 90% at 0% 0%,rgba(255,255,255,.1),transparent 55%),linear-gradient(135deg,#102d24,#1c4035,#244c3f)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.bottom-0{bottom:0}.left-0{left:0}.left-2{left:.5rem}.right-0{right:0}.right-4{right:1rem}.top-0{top:0}.top-4{top:1rem}.z-50{z-index:50}.-mx-1{margin-left:-.25rem;margin-right:-.25rem}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mb-3\.5{margin-bottom:.875rem}.ml-2{margin-left:.5rem}.ml-auto{margin-left:auto}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-8{margin-top:2rem}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-9{height:2.25rem}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-\[var\(--radix-dropdown-menu-content-available-height\)\]{max-height:var(--radix-dropdown-menu-content-available-height)}.min-h-0{min-height:0px}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-1\/3{width:33.333333%}.w-10{width:2.5rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-4{width:1rem}.w-5{width:1.25rem}.w-60{width:15rem}.w-64{width:16rem}.w-\[280px\]{width:280px}.w-\[2px\]{width:2px}.w-\[540px\]{width:540px}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[8rem\]{min-width:8rem}.max-w-\[180px\]{max-width:180px}.max-w-\[92vw\]{max-width:92vw}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.origin-\[--radix-dropdown-menu-content-transform-origin\]{transform-origin:var(--radix-dropdown-menu-content-transform-origin)}.origin-\[--radix-hover-card-content-transform-origin\]{transform-origin:var(--radix-hover-card-content-transform-origin)}.origin-\[--radix-tooltip-content-transform-origin\]{transform-origin:var(--radix-tooltip-content-transform-origin)}.-rotate-90{--tw-rotate: -90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes shimmer{0%{transform:translate(-100%)}to{transform:translate(400%)}}.animate-\[shimmer_1\.2s_linear_infinite\]{animation:shimmer 1.2s linear infinite}@keyframes ping{75%,to{transform:scale(2);opacity:0}}.animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}@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-default{cursor:default}.touch-none{touch-action:none}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-\[10px_minmax\(0\,1fr\)_auto\]{grid-template-columns:10px minmax(0,1fr) auto}.grid-cols-\[120px_1fr\]{grid-template-columns:120px 1fr}.grid-cols-\[252px_1fr\]{grid-template-columns:252px 1fr}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-y-3{row-gap:.75rem}.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-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-3\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.875rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.875rem * var(--tw-space-y-reverse))}.space-y-7>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.75rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.self-center{align-self:center}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded-\[inherit\]{border-radius:inherit}.rounded-full{border-radius:9999px}.rounded-md{border-radius:var(--radius)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-amber-300\/40{border-color:#fcd34d66}.border-border{border-color:hsl(var(--border))}.border-brand-dark{--tw-border-opacity: 1;border-color:hsl(var(--brand-dark) / var(--tw-border-opacity, 1))}.border-destructive\/20{border-color:hsl(var(--destructive) / .2)}.border-destructive\/30{border-color:hsl(var(--destructive) / .3)}.border-white\/15{border-color:#ffffff26}.border-l-transparent{border-left-color:transparent}.border-t-transparent{border-top-color:transparent}.bg-accent{background-color:hsl(var(--accent))}.bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-background{background-color:hsl(var(--background))}.bg-background\/60{background-color:hsl(var(--background) / .6)}.bg-black\/80{background-color:#000c}.bg-border{background-color:hsl(var(--border))}.bg-brand{--tw-bg-opacity: 1;background-color:hsl(var(--brand) / var(--tw-bg-opacity, 1))}.bg-card{background-color:hsl(var(--card))}.bg-destructive{background-color:hsl(var(--destructive))}.bg-destructive\/5{background-color:hsl(var(--destructive) / .05)}.bg-foreground{background-color:hsl(var(--foreground))}.bg-muted{background-color:hsl(var(--muted))}.bg-muted-foreground\/15{background-color:hsl(var(--muted-foreground) / .15)}.bg-muted-foreground\/25{background-color:hsl(var(--muted-foreground) / .25)}.bg-muted\/10{background-color:hsl(var(--muted) / .1)}.bg-muted\/20{background-color:hsl(var(--muted) / .2)}.bg-muted\/40{background-color:hsl(var(--muted) / .4)}.bg-muted\/60{background-color:hsl(var(--muted) / .6)}.bg-popover{background-color:hsl(var(--popover))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/25{background-color:#ffffff40}.fill-current{fill:currentColor}.p-0{padding:0}.p-1{padding:.25rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-\[1px\]{padding:1px}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.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-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-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-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-7{padding-top:1.75rem;padding-bottom:1.75rem}.pb-1\.5{padding-bottom:.375rem}.pb-10{padding-bottom:2.5rem}.pb-6{padding-bottom:1.5rem}.pl-8{padding-left:2rem}.pr-14{padding-right:3.5rem}.pr-2{padding-right:.5rem}.pt-2\.5{padding-top:.625rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.pt-7{padding-top:1.75rem}.pt-8{padding-top:2rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:Geist Mono,ui-monospace,monospace}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[12px\]{font-size:12px}.text-\[13\.5px\]{font-size:13.5px}.text-\[13px\]{font-size:13px}.text-\[15px\]{font-size:15px}.text-\[17px\]{font-size:17px}.text-\[18px\]{font-size:18px}.text-\[22px\]{font-size:22px}.text-\[26px\]{font-size:26px}.text-\[36px\]{font-size:36px}.text-\[9\.5px\]{font-size:9.5px}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-semibold{font-weight:600}.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)}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-\[0\.18em\]{letter-spacing:.18em}.tracking-\[0\.22em\]{letter-spacing:.22em}.tracking-\[0\.2em\]{letter-spacing:.2em}.tracking-tight{letter-spacing:-.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-brand{--tw-text-opacity: 1;color:hsl(var(--brand) / var(--tw-text-opacity, 1))}.text-brand-foreground{--tw-text-opacity: 1;color:hsl(var(--brand-foreground) / var(--tw-text-opacity, 1))}.text-destructive{color:hsl(var(--destructive))}.text-foreground{color:hsl(var(--foreground))}.text-foreground\/70{color:hsl(var(--foreground) / .7)}.text-foreground\/75{color:hsl(var(--foreground) / .75)}.text-foreground\/80{color:hsl(var(--foreground) / .8)}.text-foreground\/90{color:hsl(var(--foreground) / .9)}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-muted-foreground\/0{color:hsl(var(--muted-foreground) / 0)}.text-muted-foreground\/40{color:hsl(var(--muted-foreground) / .4)}.text-muted-foreground\/50{color:hsl(var(--muted-foreground) / .5)}.text-muted-foreground\/70{color:hsl(var(--muted-foreground) / .7)}.text-muted-foreground\/80{color:hsl(var(--muted-foreground) / .8)}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-white\/55{color:#ffffff8c}.text-white\/70{color:#ffffffb3}.text-white\/85{color:#ffffffd9}.underline-offset-4{text-underline-offset:4px}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow-\[inset_0_1px_0_rgba\(255\,255\,255\,0\.10\)\,inset_0_0_0_1px_rgba\(255\,255\,255\,0\.04\)\,0_10px_30px_-8px_rgba\(21\,40\,34\,0\.45\)\]{--tw-shadow: inset 0 1px 0 rgba(255,255,255,.1),inset 0 0 0 1px rgba(255,255,255,.04),0 10px 30px -8px rgba(21,40,34,.45);--tw-shadow-colored: inset 0 1px 0 var(--tw-shadow-color), inset 0 0 0 1px var(--tw-shadow-color), 0 10px 30px -8px 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-\[inset_0_1px_0_rgba\(255\,255\,255\,0\.7\)\]{--tw-shadow: inset 0 1px 0 rgba(255,255,255,.7);--tw-shadow-colored: inset 0 1px 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-\[inset_0_1px_0_rgba\(255\,255\,255\,0\.8\)\,0_1px_2px_rgba\(0\,0\,0\,0\.04\)\]{--tw-shadow: inset 0 1px 0 rgba(255,255,255,.8),0 1px 2px rgba(0,0,0,.04);--tw-shadow-colored: inset 0 1px 0 var(--tw-shadow-color), 0 1px 2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[inset_0_1px_0_rgba\(255\,255\,255\,0\.8\)\,0_1px_2px_rgba\(15\,17\,21\,0\.04\)\]{--tw-shadow: inset 0 1px 0 rgba(255,255,255,.8),0 1px 2px rgba(15,17,21,.04);--tw-shadow-colored: inset 0 1px 0 var(--tw-shadow-color), 0 1px 2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.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-4{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-amber-500\/10{--tw-ring-color: rgb(245 158 11 / .1)}.ring-brand\/10{--tw-ring-color: hsl(var(--brand) / .1)}.ring-destructive\/10{--tw-ring-color: hsl(var(--destructive) / .1)}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.animate-in{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.fade-in-0{--tw-enter-opacity: 0}.zoom-in-95{--tw-enter-scale: .95}.duration-200{animation-duration:.2s}.ease-in-out{animation-timing-function:cubic-bezier(.4,0,.2,1)}.first\:mt-0:first-child{margin-top:0}.last\:border-b-0:last-child{border-bottom-width:0px}.hover\:border-foreground\/15:hover{border-color:hsl(var(--foreground) / .15)}.hover\:bg-accent\/60:hover{background-color:hsl(var(--accent) / .6)}.hover\:bg-muted\/30:hover{background-color:hsl(var(--muted) / .3)}.hover\:bg-muted\/40:hover{background-color:hsl(var(--muted) / .4)}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:opacity-80:hover{opacity:.8}.hover\:shadow-\[inset_0_1px_0_rgba\(255\,255\,255\,0\.14\)\,inset_0_0_0_1px_rgba\(255\,255\,255\,0\.06\)\,0_18px_48px_-10px_rgba\(21\,40\,34\,0\.55\)\]:hover{--tw-shadow: inset 0 1px 0 rgba(255,255,255,.14),inset 0 0 0 1px rgba(255,255,255,.06),0 18px 48px -10px rgba(21,40,34,.55);--tw-shadow-colored: inset 0 1px 0 var(--tw-shadow-color), inset 0 0 0 1px var(--tw-shadow-color), 0 18px 48px -10px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:shadow-\[inset_0_1px_0_rgba\(255\,255\,255\,0\.8\)\,0_6px_18px_-6px_rgba\(15\,17\,21\,0\.10\)\]:hover{--tw-shadow: inset 0 1px 0 rgba(255,255,255,.8),0 6px 18px -6px rgba(15,17,21,.1);--tw-shadow-colored: inset 0 1px 0 var(--tw-shadow-color), 0 6px 18px -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)}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.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-ring:focus{--tw-ring-color: hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-60:disabled{opacity:.6}.group:hover .group-hover\:text-muted-foreground\/70{color:hsl(var(--muted-foreground) / .7)}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}@keyframes collapsible-up{0%{height:var(--radix-collapsible-content-height)}to{height:0}}.data-\[state\=closed\]\:animate-collapsible-up[data-state=closed]{animation:collapsible-up .2s ease-out}@keyframes collapsible-down{0%{height:0}to{height:var(--radix-collapsible-content-height)}}.data-\[state\=open\]\:animate-collapsible-down[data-state=open]{animation:collapsible-down .2s ease-out}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\[state\=open\]\:bg-secondary[data-state=open]{background-color:hsl(var(--secondary))}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.data-\[state\=closed\]\:duration-300[data-state=closed]{transition-duration:.3s}.data-\[state\=open\]\:duration-500[data-state=open]{transition-duration:.5s}.data-\[state\=open\]\:animate-in[data-state=open]{animation-name:enter;animation-duration:.15s;--tw-enter-opacity: initial;--tw-enter-scale: initial;--tw-enter-rotate: initial;--tw-enter-translate-x: initial;--tw-enter-translate-y: initial}.data-\[state\=closed\]\:animate-out[data-state=closed]{animation-name:exit;animation-duration:.15s;--tw-exit-opacity: initial;--tw-exit-scale: initial;--tw-exit-rotate: initial;--tw-exit-translate-x: initial;--tw-exit-translate-y: initial}.data-\[state\=closed\]\:fade-out-0[data-state=closed]{--tw-exit-opacity: 0}.data-\[state\=open\]\:fade-in-0[data-state=open]{--tw-enter-opacity: 0}.data-\[state\=closed\]\:zoom-out-95[data-state=closed]{--tw-exit-scale: .95}.data-\[state\=open\]\:zoom-in-95[data-state=open]{--tw-enter-scale: .95}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y: -.5rem}.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x: .5rem}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x: -.5rem}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y: .5rem}.data-\[state\=closed\]\:slide-out-to-bottom[data-state=closed]{--tw-exit-translate-y: 100%}.data-\[state\=closed\]\:slide-out-to-left[data-state=closed]{--tw-exit-translate-x: -100%}.data-\[state\=closed\]\:slide-out-to-right[data-state=closed]{--tw-exit-translate-x: 100%}.data-\[state\=closed\]\:slide-out-to-top[data-state=closed]{--tw-exit-translate-y: -100%}.data-\[state\=open\]\:slide-in-from-bottom[data-state=open]{--tw-enter-translate-y: 100%}.data-\[state\=open\]\:slide-in-from-left[data-state=open]{--tw-enter-translate-x: -100%}.data-\[state\=open\]\:slide-in-from-right[data-state=open]{--tw-enter-translate-x: 100%}.data-\[state\=open\]\:slide-in-from-top[data-state=open]{--tw-enter-translate-y: -100%}.data-\[state\=closed\]\:duration-300[data-state=closed]{animation-duration:.3s}.data-\[state\=open\]\:duration-500[data-state=open]{animation-duration:.5s}@media(min-width:640px){.sm\:max-w-\[540px\]{max-width:540px}.sm\:max-w-sm{max-width:24rem}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.sm\:text-left{text-align:left}}@media(min-width:768px){.md\:inline{display:inline}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse: 0;border-right-width:calc(1px * var(--tw-divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}.md\:divide-y-0>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(0px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(0px * var(--tw-divide-y-reverse))}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:size-4 svg{width:1rem;height:1rem}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0} diff --git a/internal/guard/web/assets/dist/assets/index-DBoOM-Il.js b/internal/guard/web/assets/dist/assets/index-DBoOM-Il.js new file mode 100644 index 0000000..c269a5d --- /dev/null +++ b/internal/guard/web/assets/dist/assets/index-DBoOM-Il.js @@ -0,0 +1,52 @@ +function uv(r,l){for(var i=0;ia[c]})}}}return Object.freeze(Object.defineProperty(r,Symbol.toStringTag,{value:"Module"}))}(function(){const l=document.createElement("link").relList;if(l&&l.supports&&l.supports("modulepreload"))return;for(const c of document.querySelectorAll('link[rel="modulepreload"]'))a(c);new MutationObserver(c=>{for(const d of c)if(d.type==="childList")for(const m of d.addedNodes)m.tagName==="LINK"&&m.rel==="modulepreload"&&a(m)}).observe(document,{childList:!0,subtree:!0});function i(c){const d={};return c.integrity&&(d.integrity=c.integrity),c.referrerPolicy&&(d.referrerPolicy=c.referrerPolicy),c.crossOrigin==="use-credentials"?d.credentials="include":c.crossOrigin==="anonymous"?d.credentials="omit":d.credentials="same-origin",d}function a(c){if(c.ep)return;c.ep=!0;const d=i(c);fetch(c.href,d)}})();function np(r){return r&&r.__esModule&&Object.prototype.hasOwnProperty.call(r,"default")?r.default:r}var ga={exports:{}},vo={},va={exports:{}},he={};var df;function cv(){if(df)return he;df=1;var r=Symbol.for("react.element"),l=Symbol.for("react.portal"),i=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),c=Symbol.for("react.profiler"),d=Symbol.for("react.provider"),m=Symbol.for("react.context"),p=Symbol.for("react.forward_ref"),v=Symbol.for("react.suspense"),x=Symbol.for("react.memo"),y=Symbol.for("react.lazy"),S=Symbol.iterator;function C(P){return P===null||typeof P!="object"?null:(P=S&&P[S]||P["@@iterator"],typeof P=="function"?P:null)}var k={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},b=Object.assign,_={};function T(P,I,de){this.props=P,this.context=I,this.refs=_,this.updater=de||k}T.prototype.isReactComponent={},T.prototype.setState=function(P,I){if(typeof P!="object"&&typeof P!="function"&&P!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,P,I,"setState")},T.prototype.forceUpdate=function(P){this.updater.enqueueForceUpdate(this,P,"forceUpdate")};function A(){}A.prototype=T.prototype;function L(P,I,de){this.props=P,this.context=I,this.refs=_,this.updater=de||k}var $=L.prototype=new A;$.constructor=L,b($,T.prototype),$.isPureReactComponent=!0;var M=Array.isArray,U=Object.prototype.hasOwnProperty,G={current:null},B={key:!0,ref:!0,__self:!0,__source:!0};function ie(P,I,de){var pe,ve={},ye=null,Se=null;if(I!=null)for(pe in I.ref!==void 0&&(Se=I.ref),I.key!==void 0&&(ye=""+I.key),I)U.call(I,pe)&&!B.hasOwnProperty(pe)&&(ve[pe]=I[pe]);var Ce=arguments.length-2;if(Ce===1)ve.children=de;else if(1>>1,I=D[P];if(0>>1;Pc(ve,V))yec(Se,ve)?(D[P]=Se,D[ye]=V,P=ye):(D[P]=ve,D[pe]=V,P=pe);else if(yec(Se,V))D[P]=Se,D[ye]=V,P=ye;else break e}}return Y}function c(D,Y){var V=D.sortIndex-Y.sortIndex;return V!==0?V:D.id-Y.id}if(typeof performance=="object"&&typeof performance.now=="function"){var d=performance;r.unstable_now=function(){return d.now()}}else{var m=Date,p=m.now();r.unstable_now=function(){return m.now()-p}}var v=[],x=[],y=1,S=null,C=3,k=!1,b=!1,_=!1,T=typeof setTimeout=="function"?setTimeout:null,A=typeof clearTimeout=="function"?clearTimeout:null,L=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function $(D){for(var Y=i(x);Y!==null;){if(Y.callback===null)a(x);else if(Y.startTime<=D)a(x),Y.sortIndex=Y.expirationTime,l(v,Y);else break;Y=i(x)}}function M(D){if(_=!1,$(D),!b)if(i(v)!==null)b=!0,le(U);else{var Y=i(x);Y!==null&&se(M,Y.startTime-D)}}function U(D,Y){b=!1,_&&(_=!1,A(ie),ie=-1),k=!0;var V=C;try{for($(Y),S=i(v);S!==null&&(!(S.expirationTime>Y)||D&&!ue());){var P=S.callback;if(typeof P=="function"){S.callback=null,C=S.priorityLevel;var I=P(S.expirationTime<=Y);Y=r.unstable_now(),typeof I=="function"?S.callback=I:S===i(v)&&a(v),$(Y)}else a(v);S=i(v)}if(S!==null)var de=!0;else{var pe=i(x);pe!==null&&se(M,pe.startTime-Y),de=!1}return de}finally{S=null,C=V,k=!1}}var G=!1,B=null,ie=-1,te=5,ne=-1;function ue(){return!(r.unstable_now()-neD||125P?(D.sortIndex=V,l(x,D),i(v)===null&&D===i(x)&&(_?(A(ie),ie=-1):_=!0,se(M,V-P))):(D.sortIndex=I,l(v,D),b||k||(b=!0,le(U))),D},r.unstable_shouldYield=ue,r.unstable_wrapCallback=function(D){var Y=C;return function(){var V=C;C=Y;try{return D.apply(this,arguments)}finally{C=V}}}})(wa)),wa}var gf;function mv(){return gf||(gf=1,xa.exports=pv()),xa.exports}var vf;function hv(){if(vf)return lt;vf=1;var r=Ba(),l=mv();function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),v=Object.prototype.hasOwnProperty,x=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,y={},S={};function C(e){return v.call(S,e)?!0:v.call(y,e)?!1:x.test(e)?S[e]=!0:(y[e]=!0,!1)}function k(e,t,n,o){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return o?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function b(e,t,n,o){if(t===null||typeof t>"u"||k(e,t,n,o))return!0;if(o)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function _(e,t,n,o,s,u,f){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=o,this.attributeNamespace=s,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=u,this.removeEmptyString=f}var T={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){T[e]=new _(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];T[t]=new _(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){T[e]=new _(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){T[e]=new _(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){T[e]=new _(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){T[e]=new _(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){T[e]=new _(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){T[e]=new _(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){T[e]=new _(e,5,!1,e.toLowerCase(),null,!1,!1)});var A=/[\-:]([a-z])/g;function L(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(A,L);T[t]=new _(t,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(A,L);T[t]=new _(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(A,L);T[t]=new _(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){T[e]=new _(e,1,!1,e.toLowerCase(),null,!1,!1)}),T.xlinkHref=new _("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){T[e]=new _(e,1,!1,e.toLowerCase(),null,!0,!0)});function $(e,t,n,o){var s=T.hasOwnProperty(t)?T[t]:null;(s!==null?s.type!==0:o||!(2w||s[f]!==u[w]){var E=` +`+s[f].replace(" at new "," at ");return e.displayName&&E.includes("")&&(E=E.replace("",e.displayName)),E}while(1<=f&&0<=w);break}}}finally{de=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?I(e):""}function ve(e){switch(e.tag){case 5:return I(e.type);case 16:return I("Lazy");case 13:return I("Suspense");case 19:return I("SuspenseList");case 0:case 2:case 15:return e=pe(e.type,!1),e;case 11:return e=pe(e.type.render,!1),e;case 1:return e=pe(e.type,!0),e;default:return""}}function ye(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case B:return"Fragment";case G:return"Portal";case te:return"Profiler";case ie:return"StrictMode";case me:return"Suspense";case ce:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case ue:return(e.displayName||"Context")+".Consumer";case ne:return(e._context.displayName||"Context")+".Provider";case J:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case ee:return t=e.displayName||null,t!==null?t:ye(e.type)||"Memo";case le:t=e._payload,e=e._init;try{return ye(e(t))}catch{}}return null}function Se(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return ye(t);case 8:return t===ie?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function Ce(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Ne(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function Ze(e){var t=Ne(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),o=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var s=n.get,u=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return s.call(this)},set:function(f){o=""+f,u.call(this,f)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return o},setValue:function(f){o=""+f},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Un(e){e._valueTracker||(e._valueTracker=Ze(e))}function Po(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),o="";return e&&(o=Ne(e)?e.checked?"true":"false":e.value),e=o,e!==n?(t.setValue(e),!0):!1}function Ht(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Ei(e,t){var n=t.checked;return V({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function vu(e,t){var n=t.defaultValue==null?"":t.defaultValue,o=t.checked!=null?t.checked:t.defaultChecked;n=Ce(t.value!=null?t.value:n),e._wrapperState={initialChecked:o,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function yu(e,t){t=t.checked,t!=null&&$(e,"checked",t,!1)}function _i(e,t){yu(e,t);var n=Ce(t.value),o=t.type;if(n!=null)o==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(o==="submit"||o==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?ki(e,t.type,n):t.hasOwnProperty("defaultValue")&&ki(e,t.type,Ce(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function xu(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var o=t.type;if(!(o!=="submit"&&o!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function ki(e,t,n){(t!=="number"||Ht(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var jr=Array.isArray;function Bn(e,t,n,o){if(e=e.options,t){t={};for(var s=0;s"+t.valueOf().toString()+"",t=bo.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Or(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Ar={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},ph=["Webkit","ms","Moz","O"];Object.keys(Ar).forEach(function(e){ph.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Ar[t]=Ar[e]})});function ku(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||Ar.hasOwnProperty(e)&&Ar[e]?(""+t).trim():t+"px"}function Nu(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var o=n.indexOf("--")===0,s=ku(n,t[n],o);n==="float"&&(n="cssFloat"),o?e.setProperty(n,s):e[n]=s}}var mh=V({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function bi(e,t){if(t){if(mh[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(i(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(i(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(i(61))}if(t.style!=null&&typeof t.style!="object")throw Error(i(62))}}function Ri(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Ti=null;function ji(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Oi=null,Vn=null,Gn=null;function Pu(e){if(e=to(e)){if(typeof Oi!="function")throw Error(i(280));var t=e.stateNode;t&&(t=Zo(t),Oi(e.stateNode,e.type,t))}}function bu(e){Vn?Gn?Gn.push(e):Gn=[e]:Vn=e}function Ru(){if(Vn){var e=Vn,t=Gn;if(Gn=Vn=null,Pu(e),t)for(e=0;e>>=0,e===0?32:31-(kh(e)/Nh|0)|0}var Ao=64,Lo=4194304;function Ir(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Do(e,t){var n=e.pendingLanes;if(n===0)return 0;var o=0,s=e.suspendedLanes,u=e.pingedLanes,f=n&268435455;if(f!==0){var w=f&~s;w!==0?o=Ir(w):(u&=f,u!==0&&(o=Ir(u)))}else f=n&~s,f!==0?o=Ir(f):u!==0&&(o=Ir(u));if(o===0)return 0;if(t!==0&&t!==o&&(t&s)===0&&(s=o&-o,u=t&-t,s>=u||s===16&&(u&4194240)!==0))return t;if((o&4)!==0&&(o|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=o;0n;n++)t.push(e);return t}function zr(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-wt(t),e[t]=n}function Th(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var o=e.eventTimes;for(e=e.expirationTimes;0=Gr),rc=" ",oc=!1;function lc(e,t){switch(e){case"keyup":return og.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function ic(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Xn=!1;function ig(e,t){switch(e){case"compositionend":return ic(t);case"keypress":return t.which!==32?null:(oc=!0,rc);case"textInput":return e=t.data,e===rc&&oc?null:e;default:return null}}function sg(e,t){if(Xn)return e==="compositionend"||!Ki&&lc(e,t)?(e=Zu(),$o=Bi=ln=null,Xn=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=o}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=pc(n)}}function hc(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?hc(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function gc(){for(var e=window,t=Ht();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Ht(e.document)}return t}function Ji(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function gg(e){var t=gc(),n=e.focusedElem,o=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&hc(n.ownerDocument.documentElement,n)){if(o!==null&&Ji(n)){if(t=o.start,e=o.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var s=n.textContent.length,u=Math.min(o.start,s);o=o.end===void 0?u:Math.min(o.end,s),!e.extend&&u>o&&(s=o,o=u,u=s),s=mc(n,u);var f=mc(n,o);s&&f&&(e.rangeCount!==1||e.anchorNode!==s.node||e.anchorOffset!==s.offset||e.focusNode!==f.node||e.focusOffset!==f.offset)&&(t=t.createRange(),t.setStart(s.node,s.offset),e.removeAllRanges(),u>o?(e.addRange(t),e.extend(f.node,f.offset)):(t.setEnd(f.node,f.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,Kn=null,es=null,Kr=null,ts=!1;function vc(e,t,n){var o=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;ts||Kn==null||Kn!==Ht(o)||(o=Kn,"selectionStart"in o&&Ji(o)?o={start:o.selectionStart,end:o.selectionEnd}:(o=(o.ownerDocument&&o.ownerDocument.defaultView||window).getSelection(),o={anchorNode:o.anchorNode,anchorOffset:o.anchorOffset,focusNode:o.focusNode,focusOffset:o.focusOffset}),Kr&&Xr(Kr,o)||(Kr=o,o=Qo(es,"onSelect"),0tr||(e.current=ps[tr],ps[tr]=null,tr--)}function Pe(e,t){tr++,ps[tr]=e.current,e.current=t}var cn={},Ye=un(cn),et=un(!1),bn=cn;function nr(e,t){var n=e.type.contextTypes;if(!n)return cn;var o=e.stateNode;if(o&&o.__reactInternalMemoizedUnmaskedChildContext===t)return o.__reactInternalMemoizedMaskedChildContext;var s={},u;for(u in n)s[u]=t[u];return o&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=s),s}function tt(e){return e=e.childContextTypes,e!=null}function qo(){Re(et),Re(Ye)}function Oc(e,t,n){if(Ye.current!==cn)throw Error(i(168));Pe(Ye,t),Pe(et,n)}function Ac(e,t,n){var o=e.stateNode;if(t=t.childContextTypes,typeof o.getChildContext!="function")return n;o=o.getChildContext();for(var s in o)if(!(s in t))throw Error(i(108,Se(e)||"Unknown",s));return V({},n,o)}function Jo(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||cn,bn=Ye.current,Pe(Ye,e),Pe(et,et.current),!0}function Lc(e,t,n){var o=e.stateNode;if(!o)throw Error(i(169));n?(e=Ac(e,t,bn),o.__reactInternalMemoizedMergedChildContext=e,Re(et),Re(Ye),Pe(Ye,e)):Re(et),Pe(et,n)}var Bt=null,el=!1,ms=!1;function Dc(e){Bt===null?Bt=[e]:Bt.push(e)}function bg(e){el=!0,Dc(e)}function dn(){if(!ms&&Bt!==null){ms=!0;var e=0,t=ke;try{var n=Bt;for(ke=1;e>=f,s-=f,Vt=1<<32-wt(t)+s|n<ae?(Be=oe,oe=null):Be=oe.sibling;var Ee=z(R,oe,j[ae],H);if(Ee===null){oe===null&&(oe=Be);break}e&&oe&&Ee.alternate===null&&t(R,oe),N=u(Ee,N,ae),re===null?q=Ee:re.sibling=Ee,re=Ee,oe=Be}if(ae===j.length)return n(R,oe),je&&Tn(R,ae),q;if(oe===null){for(;aeae?(Be=oe,oe=null):Be=oe.sibling;var wn=z(R,oe,Ee.value,H);if(wn===null){oe===null&&(oe=Be);break}e&&oe&&wn.alternate===null&&t(R,oe),N=u(wn,N,ae),re===null?q=wn:re.sibling=wn,re=wn,oe=Be}if(Ee.done)return n(R,oe),je&&Tn(R,ae),q;if(oe===null){for(;!Ee.done;ae++,Ee=j.next())Ee=W(R,Ee.value,H),Ee!==null&&(N=u(Ee,N,ae),re===null?q=Ee:re.sibling=Ee,re=Ee);return je&&Tn(R,ae),q}for(oe=o(R,oe);!Ee.done;ae++,Ee=j.next())Ee=Q(oe,R,ae,Ee.value,H),Ee!==null&&(e&&Ee.alternate!==null&&oe.delete(Ee.key===null?ae:Ee.key),N=u(Ee,N,ae),re===null?q=Ee:re.sibling=Ee,re=Ee);return e&&oe.forEach(function(av){return t(R,av)}),je&&Tn(R,ae),q}function Ie(R,N,j,H){if(typeof j=="object"&&j!==null&&j.type===B&&j.key===null&&(j=j.props.children),typeof j=="object"&&j!==null){switch(j.$$typeof){case U:e:{for(var q=j.key,re=N;re!==null;){if(re.key===q){if(q=j.type,q===B){if(re.tag===7){n(R,re.sibling),N=s(re,j.props.children),N.return=R,R=N;break e}}else if(re.elementType===q||typeof q=="object"&&q!==null&&q.$$typeof===le&&Wc(q)===re.type){n(R,re.sibling),N=s(re,j.props),N.ref=no(R,re,j),N.return=R,R=N;break e}n(R,re);break}else t(R,re);re=re.sibling}j.type===B?(N=zn(j.props.children,R.mode,H,j.key),N.return=R,R=N):(H=bl(j.type,j.key,j.props,null,R.mode,H),H.ref=no(R,N,j),H.return=R,R=H)}return f(R);case G:e:{for(re=j.key;N!==null;){if(N.key===re)if(N.tag===4&&N.stateNode.containerInfo===j.containerInfo&&N.stateNode.implementation===j.implementation){n(R,N.sibling),N=s(N,j.children||[]),N.return=R,R=N;break e}else{n(R,N);break}else t(R,N);N=N.sibling}N=da(j,R.mode,H),N.return=R,R=N}return f(R);case le:return re=j._init,Ie(R,N,re(j._payload),H)}if(jr(j))return K(R,N,j,H);if(Y(j))return Z(R,N,j,H);ol(R,j)}return typeof j=="string"&&j!==""||typeof j=="number"?(j=""+j,N!==null&&N.tag===6?(n(R,N.sibling),N=s(N,j),N.return=R,R=N):(n(R,N),N=ca(j,R.mode,H),N.return=R,R=N),f(R)):n(R,N)}return Ie}var ir=Hc(!0),Uc=Hc(!1),ll=un(null),il=null,sr=null,ws=null;function Ss(){ws=sr=il=null}function Cs(e){var t=ll.current;Re(ll),e._currentValue=t}function Es(e,t,n){for(;e!==null;){var o=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,o!==null&&(o.childLanes|=t)):o!==null&&(o.childLanes&t)!==t&&(o.childLanes|=t),e===n)break;e=e.return}}function ar(e,t){il=e,ws=sr=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(nt=!0),e.firstContext=null)}function ht(e){var t=e._currentValue;if(ws!==e)if(e={context:e,memoizedValue:t,next:null},sr===null){if(il===null)throw Error(i(308));sr=e,il.dependencies={lanes:0,firstContext:e}}else sr=sr.next=e;return t}var jn=null;function _s(e){jn===null?jn=[e]:jn.push(e)}function Bc(e,t,n,o){var s=t.interleaved;return s===null?(n.next=n,_s(t)):(n.next=s.next,s.next=n),t.interleaved=n,Yt(e,o)}function Yt(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var fn=!1;function ks(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Vc(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Qt(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function pn(e,t,n){var o=e.updateQueue;if(o===null)return null;if(o=o.shared,(xe&2)!==0){var s=o.pending;return s===null?t.next=t:(t.next=s.next,s.next=t),o.pending=t,Yt(e,n)}return s=o.interleaved,s===null?(t.next=t,_s(o)):(t.next=s.next,s.next=t),o.interleaved=t,Yt(e,n)}function sl(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var o=t.lanes;o&=e.pendingLanes,n|=o,t.lanes=n,Fi(e,n)}}function Gc(e,t){var n=e.updateQueue,o=e.alternate;if(o!==null&&(o=o.updateQueue,n===o)){var s=null,u=null;if(n=n.firstBaseUpdate,n!==null){do{var f={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};u===null?s=u=f:u=u.next=f,n=n.next}while(n!==null);u===null?s=u=t:u=u.next=t}else s=u=t;n={baseState:o.baseState,firstBaseUpdate:s,lastBaseUpdate:u,shared:o.shared,effects:o.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function al(e,t,n,o){var s=e.updateQueue;fn=!1;var u=s.firstBaseUpdate,f=s.lastBaseUpdate,w=s.shared.pending;if(w!==null){s.shared.pending=null;var E=w,O=E.next;E.next=null,f===null?u=O:f.next=O,f=E;var F=e.alternate;F!==null&&(F=F.updateQueue,w=F.lastBaseUpdate,w!==f&&(w===null?F.firstBaseUpdate=O:w.next=O,F.lastBaseUpdate=E))}if(u!==null){var W=s.baseState;f=0,F=O=E=null,w=u;do{var z=w.lane,Q=w.eventTime;if((o&z)===z){F!==null&&(F=F.next={eventTime:Q,lane:0,tag:w.tag,payload:w.payload,callback:w.callback,next:null});e:{var K=e,Z=w;switch(z=t,Q=n,Z.tag){case 1:if(K=Z.payload,typeof K=="function"){W=K.call(Q,W,z);break e}W=K;break e;case 3:K.flags=K.flags&-65537|128;case 0:if(K=Z.payload,z=typeof K=="function"?K.call(Q,W,z):K,z==null)break e;W=V({},W,z);break e;case 2:fn=!0}}w.callback!==null&&w.lane!==0&&(e.flags|=64,z=s.effects,z===null?s.effects=[w]:z.push(w))}else Q={eventTime:Q,lane:z,tag:w.tag,payload:w.payload,callback:w.callback,next:null},F===null?(O=F=Q,E=W):F=F.next=Q,f|=z;if(w=w.next,w===null){if(w=s.shared.pending,w===null)break;z=w,w=z.next,z.next=null,s.lastBaseUpdate=z,s.shared.pending=null}}while(!0);if(F===null&&(E=W),s.baseState=E,s.firstBaseUpdate=O,s.lastBaseUpdate=F,t=s.shared.interleaved,t!==null){s=t;do f|=s.lane,s=s.next;while(s!==t)}else u===null&&(s.shared.lanes=0);Ln|=f,e.lanes=f,e.memoizedState=W}}function Yc(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var o=Ts.transition;Ts.transition={};try{e(!1),t()}finally{ke=n,Ts.transition=o}}function fd(){return gt().memoizedState}function Og(e,t,n){var o=vn(e);if(n={lane:o,action:n,hasEagerState:!1,eagerState:null,next:null},pd(e))md(t,n);else if(n=Bc(e,t,n,o),n!==null){var s=Je();Nt(n,e,o,s),hd(n,t,o)}}function Ag(e,t,n){var o=vn(e),s={lane:o,action:n,hasEagerState:!1,eagerState:null,next:null};if(pd(e))md(t,s);else{var u=e.alternate;if(e.lanes===0&&(u===null||u.lanes===0)&&(u=t.lastRenderedReducer,u!==null))try{var f=t.lastRenderedState,w=u(f,n);if(s.hasEagerState=!0,s.eagerState=w,St(w,f)){var E=t.interleaved;E===null?(s.next=s,_s(t)):(s.next=E.next,E.next=s),t.interleaved=s;return}}catch{}n=Bc(e,t,s,o),n!==null&&(s=Je(),Nt(n,e,o,s),hd(n,t,o))}}function pd(e){var t=e.alternate;return e===Ae||t!==null&&t===Ae}function md(e,t){io=dl=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function hd(e,t,n){if((n&4194240)!==0){var o=t.lanes;o&=e.pendingLanes,n|=o,t.lanes=n,Fi(e,n)}}var ml={readContext:ht,useCallback:Qe,useContext:Qe,useEffect:Qe,useImperativeHandle:Qe,useInsertionEffect:Qe,useLayoutEffect:Qe,useMemo:Qe,useReducer:Qe,useRef:Qe,useState:Qe,useDebugValue:Qe,useDeferredValue:Qe,useTransition:Qe,useMutableSource:Qe,useSyncExternalStore:Qe,useId:Qe,unstable_isNewReconciler:!1},Lg={readContext:ht,useCallback:function(e,t){return Lt().memoizedState=[e,t===void 0?null:t],e},useContext:ht,useEffect:od,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,fl(4194308,4,sd.bind(null,t,e),n)},useLayoutEffect:function(e,t){return fl(4194308,4,e,t)},useInsertionEffect:function(e,t){return fl(4,2,e,t)},useMemo:function(e,t){var n=Lt();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var o=Lt();return t=n!==void 0?n(t):t,o.memoizedState=o.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},o.queue=e,e=e.dispatch=Og.bind(null,Ae,e),[o.memoizedState,e]},useRef:function(e){var t=Lt();return e={current:e},t.memoizedState=e},useState:nd,useDebugValue:Is,useDeferredValue:function(e){return Lt().memoizedState=e},useTransition:function(){var e=nd(!1),t=e[0];return e=jg.bind(null,e[1]),Lt().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var o=Ae,s=Lt();if(je){if(n===void 0)throw Error(i(407));n=n()}else{if(n=t(),Ue===null)throw Error(i(349));(An&30)!==0||Zc(o,t,n)}s.memoizedState=n;var u={value:n,getSnapshot:t};return s.queue=u,od(Jc.bind(null,o,u,e),[e]),o.flags|=2048,uo(9,qc.bind(null,o,u,n,t),void 0,null),n},useId:function(){var e=Lt(),t=Ue.identifierPrefix;if(je){var n=Gt,o=Vt;n=(o&~(1<<32-wt(o)-1)).toString(32)+n,t=":"+t+"R"+n,n=so++,0<\/script>",e=e.removeChild(e.firstChild)):typeof o.is=="string"?e=f.createElement(n,{is:o.is}):(e=f.createElement(n),n==="select"&&(f=e,o.multiple?f.multiple=!0:o.size&&(f.size=o.size))):e=f.createElementNS(e,n),e[Ot]=t,e[eo]=o,Dd(e,t,!1,!1),t.stateNode=e;e:{switch(f=Ri(n,o),n){case"dialog":be("cancel",e),be("close",e),s=o;break;case"iframe":case"object":case"embed":be("load",e),s=o;break;case"video":case"audio":for(s=0;spr&&(t.flags|=128,o=!0,co(u,!1),t.lanes=4194304)}else{if(!o)if(e=ul(f),e!==null){if(t.flags|=128,o=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),co(u,!0),u.tail===null&&u.tailMode==="hidden"&&!f.alternate&&!je)return Xe(t),null}else 2*Me()-u.renderingStartTime>pr&&n!==1073741824&&(t.flags|=128,o=!0,co(u,!1),t.lanes=4194304);u.isBackwards?(f.sibling=t.child,t.child=f):(n=u.last,n!==null?n.sibling=f:t.child=f,u.last=f)}return u.tail!==null?(t=u.tail,u.rendering=t,u.tail=t.sibling,u.renderingStartTime=Me(),t.sibling=null,n=Oe.current,Pe(Oe,o?n&1|2:n&1),t):(Xe(t),null);case 22:case 23:return sa(),o=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==o&&(t.flags|=8192),o&&(t.mode&1)!==0?(ut&1073741824)!==0&&(Xe(t),t.subtreeFlags&6&&(t.flags|=8192)):Xe(t),null;case 24:return null;case 25:return null}throw Error(i(156,t.tag))}function Hg(e,t){switch(gs(t),t.tag){case 1:return tt(t.type)&&qo(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return ur(),Re(et),Re(Ye),Rs(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return Ps(t),null;case 13:if(Re(Oe),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));lr()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Re(Oe),null;case 4:return ur(),null;case 10:return Cs(t.type._context),null;case 22:case 23:return sa(),null;case 24:return null;default:return null}}var yl=!1,Ke=!1,Ug=typeof WeakSet=="function"?WeakSet:Set,X=null;function dr(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(o){De(e,t,o)}else n.current=null}function Xs(e,t,n){try{n()}catch(o){De(e,t,o)}}var zd=!1;function Bg(e,t){if(ss=zo,e=gc(),Ji(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var o=n.getSelection&&n.getSelection();if(o&&o.rangeCount!==0){n=o.anchorNode;var s=o.anchorOffset,u=o.focusNode;o=o.focusOffset;try{n.nodeType,u.nodeType}catch{n=null;break e}var f=0,w=-1,E=-1,O=0,F=0,W=e,z=null;t:for(;;){for(var Q;W!==n||s!==0&&W.nodeType!==3||(w=f+s),W!==u||o!==0&&W.nodeType!==3||(E=f+o),W.nodeType===3&&(f+=W.nodeValue.length),(Q=W.firstChild)!==null;)z=W,W=Q;for(;;){if(W===e)break t;if(z===n&&++O===s&&(w=f),z===u&&++F===o&&(E=f),(Q=W.nextSibling)!==null)break;W=z,z=W.parentNode}W=Q}n=w===-1||E===-1?null:{start:w,end:E}}else n=null}n=n||{start:0,end:0}}else n=null;for(as={focusedElem:e,selectionRange:n},zo=!1,X=t;X!==null;)if(t=X,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,X=e;else for(;X!==null;){t=X;try{var K=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if(K!==null){var Z=K.memoizedProps,Ie=K.memoizedState,R=t.stateNode,N=R.getSnapshotBeforeUpdate(t.elementType===t.type?Z:Et(t.type,Z),Ie);R.__reactInternalSnapshotBeforeUpdate=N}break;case 3:var j=t.stateNode.containerInfo;j.nodeType===1?j.textContent="":j.nodeType===9&&j.documentElement&&j.removeChild(j.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(i(163))}}catch(H){De(t,t.return,H)}if(e=t.sibling,e!==null){e.return=t.return,X=e;break}X=t.return}return K=zd,zd=!1,K}function fo(e,t,n){var o=t.updateQueue;if(o=o!==null?o.lastEffect:null,o!==null){var s=o=o.next;do{if((s.tag&e)===e){var u=s.destroy;s.destroy=void 0,u!==void 0&&Xs(t,n,u)}s=s.next}while(s!==o)}}function xl(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var o=n.create;n.destroy=o()}n=n.next}while(n!==t)}}function Ks(e){var t=e.ref;if(t!==null){var n=e.stateNode;e.tag,e=n,typeof t=="function"?t(e):t.current=e}}function Fd(e){var t=e.alternate;t!==null&&(e.alternate=null,Fd(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Ot],delete t[eo],delete t[fs],delete t[Ng],delete t[Pg])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function $d(e){return e.tag===5||e.tag===3||e.tag===4}function Wd(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||$d(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Zs(e,t,n){var o=e.tag;if(o===5||o===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=Ko));else if(o!==4&&(e=e.child,e!==null))for(Zs(e,t,n),e=e.sibling;e!==null;)Zs(e,t,n),e=e.sibling}function qs(e,t,n){var o=e.tag;if(o===5||o===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(o!==4&&(e=e.child,e!==null))for(qs(e,t,n),e=e.sibling;e!==null;)qs(e,t,n),e=e.sibling}var Ve=null,_t=!1;function mn(e,t,n){for(n=n.child;n!==null;)Hd(e,t,n),n=n.sibling}function Hd(e,t,n){if(jt&&typeof jt.onCommitFiberUnmount=="function")try{jt.onCommitFiberUnmount(Oo,n)}catch{}switch(n.tag){case 5:Ke||dr(n,t);case 6:var o=Ve,s=_t;Ve=null,mn(e,t,n),Ve=o,_t=s,Ve!==null&&(_t?(e=Ve,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):Ve.removeChild(n.stateNode));break;case 18:Ve!==null&&(_t?(e=Ve,n=n.stateNode,e.nodeType===8?ds(e.parentNode,n):e.nodeType===1&&ds(e,n),Ur(e)):ds(Ve,n.stateNode));break;case 4:o=Ve,s=_t,Ve=n.stateNode.containerInfo,_t=!0,mn(e,t,n),Ve=o,_t=s;break;case 0:case 11:case 14:case 15:if(!Ke&&(o=n.updateQueue,o!==null&&(o=o.lastEffect,o!==null))){s=o=o.next;do{var u=s,f=u.destroy;u=u.tag,f!==void 0&&((u&2)!==0||(u&4)!==0)&&Xs(n,t,f),s=s.next}while(s!==o)}mn(e,t,n);break;case 1:if(!Ke&&(dr(n,t),o=n.stateNode,typeof o.componentWillUnmount=="function"))try{o.props=n.memoizedProps,o.state=n.memoizedState,o.componentWillUnmount()}catch(w){De(n,t,w)}mn(e,t,n);break;case 21:mn(e,t,n);break;case 22:n.mode&1?(Ke=(o=Ke)||n.memoizedState!==null,mn(e,t,n),Ke=o):mn(e,t,n);break;default:mn(e,t,n)}}function Ud(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new Ug),t.forEach(function(o){var s=Jg.bind(null,e,o);n.has(o)||(n.add(o),o.then(s,s))})}}function kt(e,t){var n=t.deletions;if(n!==null)for(var o=0;os&&(s=f),o&=~u}if(o=s,o=Me()-o,o=(120>o?120:480>o?480:1080>o?1080:1920>o?1920:3e3>o?3e3:4320>o?4320:1960*Gg(o/1960))-o,10e?16:e,gn===null)var o=!1;else{if(e=gn,gn=null,_l=0,(xe&6)!==0)throw Error(i(331));var s=xe;for(xe|=4,X=e.current;X!==null;){var u=X,f=u.child;if((X.flags&16)!==0){var w=u.deletions;if(w!==null){for(var E=0;EMe()-ta?Mn(e,0):ea|=n),ot(e,t)}function nf(e,t){t===0&&((e.mode&1)===0?t=1:(t=Lo,Lo<<=1,(Lo&130023424)===0&&(Lo=4194304)));var n=Je();e=Yt(e,t),e!==null&&(zr(e,t,n),ot(e,n))}function qg(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),nf(e,n)}function Jg(e,t){var n=0;switch(e.tag){case 13:var o=e.stateNode,s=e.memoizedState;s!==null&&(n=s.retryLane);break;case 19:o=e.stateNode;break;default:throw Error(i(314))}o!==null&&o.delete(t),nf(e,n)}var rf;rf=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||et.current)nt=!0;else{if((e.lanes&n)===0&&(t.flags&128)===0)return nt=!1,$g(e,t,n);nt=(e.flags&131072)!==0}else nt=!1,je&&(t.flags&1048576)!==0&&Mc(t,nl,t.index);switch(t.lanes=0,t.tag){case 2:var o=t.type;vl(e,t),e=t.pendingProps;var s=nr(t,Ye.current);ar(t,n),s=Os(null,t,o,e,s,n);var u=As();return t.flags|=1,typeof s=="object"&&s!==null&&typeof s.render=="function"&&s.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,tt(o)?(u=!0,Jo(t)):u=!1,t.memoizedState=s.state!==null&&s.state!==void 0?s.state:null,ks(t),s.updater=hl,t.stateNode=s,s._reactInternals=t,Fs(t,o,e,n),t=Us(null,t,o,!0,u,n)):(t.tag=0,je&&u&&hs(t),qe(null,t,s,n),t=t.child),t;case 16:o=t.elementType;e:{switch(vl(e,t),e=t.pendingProps,s=o._init,o=s(o._payload),t.type=o,s=t.tag=tv(o),e=Et(o,e),s){case 0:t=Hs(null,t,o,e,n);break e;case 1:t=Rd(null,t,o,e,n);break e;case 11:t=_d(null,t,o,e,n);break e;case 14:t=kd(null,t,o,Et(o.type,e),n);break e}throw Error(i(306,o,""))}return t;case 0:return o=t.type,s=t.pendingProps,s=t.elementType===o?s:Et(o,s),Hs(e,t,o,s,n);case 1:return o=t.type,s=t.pendingProps,s=t.elementType===o?s:Et(o,s),Rd(e,t,o,s,n);case 3:e:{if(Td(t),e===null)throw Error(i(387));o=t.pendingProps,u=t.memoizedState,s=u.element,Vc(e,t),al(t,o,null,n);var f=t.memoizedState;if(o=f.element,u.isDehydrated)if(u={element:o,isDehydrated:!1,cache:f.cache,pendingSuspenseBoundaries:f.pendingSuspenseBoundaries,transitions:f.transitions},t.updateQueue.baseState=u,t.memoizedState=u,t.flags&256){s=cr(Error(i(423)),t),t=jd(e,t,o,n,s);break e}else if(o!==s){s=cr(Error(i(424)),t),t=jd(e,t,o,n,s);break e}else for(at=an(t.stateNode.containerInfo.firstChild),st=t,je=!0,Ct=null,n=Uc(t,null,o,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(lr(),o===s){t=Xt(e,t,n);break e}qe(e,t,o,n)}t=t.child}return t;case 5:return Qc(t),e===null&&ys(t),o=t.type,s=t.pendingProps,u=e!==null?e.memoizedProps:null,f=s.children,us(o,s)?f=null:u!==null&&us(o,u)&&(t.flags|=32),bd(e,t),qe(e,t,f,n),t.child;case 6:return e===null&&ys(t),null;case 13:return Od(e,t,n);case 4:return Ns(t,t.stateNode.containerInfo),o=t.pendingProps,e===null?t.child=ir(t,null,o,n):qe(e,t,o,n),t.child;case 11:return o=t.type,s=t.pendingProps,s=t.elementType===o?s:Et(o,s),_d(e,t,o,s,n);case 7:return qe(e,t,t.pendingProps,n),t.child;case 8:return qe(e,t,t.pendingProps.children,n),t.child;case 12:return qe(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(o=t.type._context,s=t.pendingProps,u=t.memoizedProps,f=s.value,Pe(ll,o._currentValue),o._currentValue=f,u!==null)if(St(u.value,f)){if(u.children===s.children&&!et.current){t=Xt(e,t,n);break e}}else for(u=t.child,u!==null&&(u.return=t);u!==null;){var w=u.dependencies;if(w!==null){f=u.child;for(var E=w.firstContext;E!==null;){if(E.context===o){if(u.tag===1){E=Qt(-1,n&-n),E.tag=2;var O=u.updateQueue;if(O!==null){O=O.shared;var F=O.pending;F===null?E.next=E:(E.next=F.next,F.next=E),O.pending=E}}u.lanes|=n,E=u.alternate,E!==null&&(E.lanes|=n),Es(u.return,n,t),w.lanes|=n;break}E=E.next}}else if(u.tag===10)f=u.type===t.type?null:u.child;else if(u.tag===18){if(f=u.return,f===null)throw Error(i(341));f.lanes|=n,w=f.alternate,w!==null&&(w.lanes|=n),Es(f,n,t),f=u.sibling}else f=u.child;if(f!==null)f.return=u;else for(f=u;f!==null;){if(f===t){f=null;break}if(u=f.sibling,u!==null){u.return=f.return,f=u;break}f=f.return}u=f}qe(e,t,s.children,n),t=t.child}return t;case 9:return s=t.type,o=t.pendingProps.children,ar(t,n),s=ht(s),o=o(s),t.flags|=1,qe(e,t,o,n),t.child;case 14:return o=t.type,s=Et(o,t.pendingProps),s=Et(o.type,s),kd(e,t,o,s,n);case 15:return Nd(e,t,t.type,t.pendingProps,n);case 17:return o=t.type,s=t.pendingProps,s=t.elementType===o?s:Et(o,s),vl(e,t),t.tag=1,tt(o)?(e=!0,Jo(t)):e=!1,ar(t,n),vd(t,o,s),Fs(t,o,s,n),Us(null,t,o,!0,e,n);case 19:return Ld(e,t,n);case 22:return Pd(e,t,n)}throw Error(i(156,t.tag))};function of(e,t){return Iu(e,t)}function ev(e,t,n,o){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=o,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function yt(e,t,n,o){return new ev(e,t,n,o)}function ua(e){return e=e.prototype,!(!e||!e.isReactComponent)}function tv(e){if(typeof e=="function")return ua(e)?1:0;if(e!=null){if(e=e.$$typeof,e===J)return 11;if(e===ee)return 14}return 2}function xn(e,t){var n=e.alternate;return n===null?(n=yt(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function bl(e,t,n,o,s,u){var f=2;if(o=e,typeof e=="function")ua(e)&&(f=1);else if(typeof e=="string")f=5;else e:switch(e){case B:return zn(n.children,s,u,t);case ie:f=8,s|=8;break;case te:return e=yt(12,n,t,s|2),e.elementType=te,e.lanes=u,e;case me:return e=yt(13,n,t,s),e.elementType=me,e.lanes=u,e;case ce:return e=yt(19,n,t,s),e.elementType=ce,e.lanes=u,e;case se:return Rl(n,s,u,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case ne:f=10;break e;case ue:f=9;break e;case J:f=11;break e;case ee:f=14;break e;case le:f=16,o=null;break e}throw Error(i(130,e==null?e:typeof e,""))}return t=yt(f,n,t,s),t.elementType=e,t.type=o,t.lanes=u,t}function zn(e,t,n,o){return e=yt(7,e,o,t),e.lanes=n,e}function Rl(e,t,n,o){return e=yt(22,e,o,t),e.elementType=se,e.lanes=n,e.stateNode={isHidden:!1},e}function ca(e,t,n){return e=yt(6,e,null,t),e.lanes=n,e}function da(e,t,n){return t=yt(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function nv(e,t,n,o,s){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=zi(0),this.expirationTimes=zi(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=zi(0),this.identifierPrefix=o,this.onRecoverableError=s,this.mutableSourceEagerHydrationData=null}function fa(e,t,n,o,s,u,f,w,E){return e=new nv(e,t,n,w,E),t===1?(t=1,u===!0&&(t|=8)):t=0,u=yt(3,null,null,t),e.current=u,u.stateNode=e,u.memoizedState={element:o,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},ks(u),e}function rv(e,t,n){var o=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(r)}catch(l){console.error(l)}}return r(),ya.exports=hv(),ya.exports}var xf;function gv(){if(xf)return Ml;xf=1;var r=lp();return Ml.createRoot=r.createRoot,Ml.hydrateRoot=r.hydrateRoot,Ml}var vv=gv();const yv=r=>r.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),xv=r=>r.replace(/^([A-Z])|[\s-_]+(\w)/g,(l,i,a)=>a?a.toUpperCase():i.toLowerCase()),wf=r=>{const l=xv(r);return l.charAt(0).toUpperCase()+l.slice(1)},ip=(...r)=>r.filter((l,i,a)=>!!l&&l.trim()!==""&&a.indexOf(l)===i).join(" ").trim(),wv=r=>{for(const l in r)if(l.startsWith("aria-")||l==="role"||l==="title")return!0};var Sv={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};const Cv=g.forwardRef(({color:r="currentColor",size:l=24,strokeWidth:i=2,absoluteStrokeWidth:a,className:c="",children:d,iconNode:m,...p},v)=>g.createElement("svg",{ref:v,...Sv,width:l,height:l,stroke:r,strokeWidth:a?Number(i)*24/Number(l):i,className:ip("lucide",c),...!d&&!wv(p)&&{"aria-hidden":"true"},...p},[...m.map(([x,y])=>g.createElement(x,y)),...Array.isArray(d)?d:[d]]));const Nr=(r,l)=>{const i=g.forwardRef(({className:a,...c},d)=>g.createElement(Cv,{ref:d,iconNode:l,className:ip(`lucide-${yv(wf(r))}`,`lucide-${r}`,a),...c}));return i.displayName=wf(r),i};const Ev=[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]],sp=Nr("chevron-down",Ev);const _v=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]],ap=Nr("circle-alert",_v);const kv=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]],Nv=Nr("info",kv);const Pv=[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]],bv=Nr("loader-circle",Pv);const Rv=[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}]],Tv=Nr("shield",Rv);const jv=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],Ov=Nr("x",jv);var Va=lp();const Av=np(Va);function Sf(r,l){if(typeof r=="function")return r(l);r!=null&&(r.current=l)}function up(...r){return l=>{let i=!1;const a=r.map(c=>{const d=Sf(c,l);return!i&&typeof d=="function"&&(i=!0),d});if(i)return()=>{for(let c=0;c{const{children:d,...m}=a,p=g.Children.toArray(d),v=p.find(Mv);if(v){const x=v.props.children,y=p.map(S=>S===v?g.Children.count(x)>1?g.Children.only(null):g.isValidElement(x)?x.props.children:null:S);return h.jsx(l,{...m,ref:c,children:g.isValidElement(x)?g.cloneElement(x,void 0,y):null})}return h.jsx(l,{...m,ref:c,children:d})});return i.displayName=`${r}.Slot`,i}function Lv(r){const l=g.forwardRef((i,a)=>{const{children:c,...d}=i;if(g.isValidElement(c)){const m=zv(c),p=Iv(d,c.props);return c.type!==g.Fragment&&(p.ref=a?up(a,m):m),g.cloneElement(c,p)}return g.Children.count(c)>1?g.Children.only(null):null});return l.displayName=`${r}.SlotClone`,l}var dp=Symbol("radix.slottable");function Dv(r){const l=({children:i})=>h.jsx(h.Fragment,{children:i});return l.displayName=`${r}.Slottable`,l.__radixId=dp,l}function Mv(r){return g.isValidElement(r)&&typeof r.type=="function"&&"__radixId"in r.type&&r.type.__radixId===dp}function Iv(r,l){const i={...l};for(const a in l){const c=r[a],d=l[a];/^on[A-Z]/.test(a)?c&&d?i[a]=(...p)=>{const v=d(...p);return c(...p),v}:c&&(i[a]=c):a==="style"?i[a]={...c,...d}:a==="className"&&(i[a]=[c,d].filter(Boolean).join(" "))}return{...r,...i}}function zv(r){let l=Object.getOwnPropertyDescriptor(r.props,"ref")?.get,i=l&&"isReactWarning"in l&&l.isReactWarning;return i?r.ref:(l=Object.getOwnPropertyDescriptor(r,"ref")?.get,i=l&&"isReactWarning"in l&&l.isReactWarning,i?r.props.ref:r.props.ref||r.ref)}var Fv=["a","button","div","form","h2","h3","img","input","label","li","nav","ol","p","select","span","svg","ul"],Le=Fv.reduce((r,l)=>{const i=cp(`Primitive.${l}`),a=g.forwardRef((c,d)=>{const{asChild:m,...p}=c,v=m?i:l;return typeof window<"u"&&(window[Symbol.for("radix-ui")]=!0),h.jsx(v,{...p,ref:d})});return a.displayName=`Primitive.${l}`,{...r,[l]:a}},{});function $v(r,l){r&&Va.flushSync(()=>r.dispatchEvent(l))}var Ft=globalThis?.document?g.useLayoutEffect:()=>{};function Wv(r,l){return g.useReducer((i,a)=>l[i][a]??i,r)}var Rt=r=>{const{present:l,children:i}=r,a=Hv(l),c=typeof i=="function"?i({present:a.isPresent}):g.Children.only(i),d=We(a.ref,Uv(c));return typeof i=="function"||a.isPresent?g.cloneElement(c,{ref:d}):null};Rt.displayName="Presence";function Hv(r){const[l,i]=g.useState(),a=g.useRef(null),c=g.useRef(r),d=g.useRef("none"),m=r?"mounted":"unmounted",[p,v]=Wv(m,{mounted:{UNMOUNT:"unmounted",ANIMATION_OUT:"unmountSuspended"},unmountSuspended:{MOUNT:"mounted",ANIMATION_END:"unmounted"},unmounted:{MOUNT:"mounted"}});return g.useEffect(()=>{const x=Il(a.current);d.current=p==="mounted"?x:"none"},[p]),Ft(()=>{const x=a.current,y=c.current;if(y!==r){const C=d.current,k=Il(x);r?v("MOUNT"):k==="none"||x?.display==="none"?v("UNMOUNT"):v(y&&C!==k?"ANIMATION_OUT":"UNMOUNT"),c.current=r}},[r,v]),Ft(()=>{if(l){let x;const y=l.ownerDocument.defaultView??window,S=k=>{const _=Il(a.current).includes(CSS.escape(k.animationName));if(k.target===l&&_&&(v("ANIMATION_END"),!c.current)){const T=l.style.animationFillMode;l.style.animationFillMode="forwards",x=y.setTimeout(()=>{l.style.animationFillMode==="forwards"&&(l.style.animationFillMode=T)})}},C=k=>{k.target===l&&(d.current=Il(a.current))};return l.addEventListener("animationstart",C),l.addEventListener("animationcancel",S),l.addEventListener("animationend",S),()=>{y.clearTimeout(x),l.removeEventListener("animationstart",C),l.removeEventListener("animationcancel",S),l.removeEventListener("animationend",S)}}else v("ANIMATION_END")},[l,v]),{isPresent:["mounted","unmountSuspended"].includes(p),ref:g.useCallback(x=>{a.current=x?getComputedStyle(x):null,i(x)},[])}}function Il(r){return r?.animationName||"none"}function Uv(r){let l=Object.getOwnPropertyDescriptor(r.props,"ref")?.get,i=l&&"isReactWarning"in l&&l.isReactWarning;return i?r.ref:(l=Object.getOwnPropertyDescriptor(r,"ref")?.get,i=l&&"isReactWarning"in l&&l.isReactWarning,i?r.props.ref:r.props.ref||r.ref)}function Bv(r,l){const i=g.createContext(l),a=d=>{const{children:m,...p}=d,v=g.useMemo(()=>p,Object.values(p));return h.jsx(i.Provider,{value:v,children:m})};a.displayName=r+"Provider";function c(d){const m=g.useContext(i);if(m)return m;if(l!==void 0)return l;throw new Error(`\`${d}\` must be used within \`${r}\``)}return[a,c]}function Pr(r,l=[]){let i=[];function a(d,m){const p=g.createContext(m),v=i.length;i=[...i,m];const x=S=>{const{scope:C,children:k,...b}=S,_=C?.[r]?.[v]||p,T=g.useMemo(()=>b,Object.values(b));return h.jsx(_.Provider,{value:T,children:k})};x.displayName=d+"Provider";function y(S,C){const k=C?.[r]?.[v]||p,b=g.useContext(k);if(b)return b;if(m!==void 0)return m;throw new Error(`\`${S}\` must be used within \`${d}\``)}return[x,y]}const c=()=>{const d=i.map(m=>g.createContext(m));return function(p){const v=p?.[r]||d;return g.useMemo(()=>({[`__scope${r}`]:{...p,[r]:v}}),[p,v])}};return c.scopeName=r,[a,Vv(c,...l)]}function Vv(...r){const l=r[0];if(r.length===1)return l;const i=()=>{const a=r.map(c=>({useScope:c(),scopeName:c.scopeName}));return function(d){const m=a.reduce((p,{useScope:v,scopeName:x})=>{const S=v(d)[`__scope${x}`];return{...p,...S}},{});return g.useMemo(()=>({[`__scope${l.scopeName}`]:m}),[m])}};return i.scopeName=l.scopeName,i}function dt(r){const l=g.useRef(r);return g.useEffect(()=>{l.current=r}),g.useMemo(()=>(...i)=>l.current?.(...i),[])}var Gv=g.createContext(void 0);function Yv(r){const l=g.useContext(Gv);return r||l||"ltr"}function Qv(r,[l,i]){return Math.min(i,Math.max(l,r))}function _e(r,l,{checkForDefaultPrevented:i=!0}={}){return function(c){if(r?.(c),i===!1||!c.defaultPrevented)return l?.(c)}}function Xv(r,l){return g.useReducer((i,a)=>l[i][a]??i,r)}var Ga="ScrollArea",[fp]=Pr(Ga),[Kv,xt]=fp(Ga),pp=g.forwardRef((r,l)=>{const{__scopeScrollArea:i,type:a="hover",dir:c,scrollHideDelay:d=600,...m}=r,[p,v]=g.useState(null),[x,y]=g.useState(null),[S,C]=g.useState(null),[k,b]=g.useState(null),[_,T]=g.useState(null),[A,L]=g.useState(0),[$,M]=g.useState(0),[U,G]=g.useState(!1),[B,ie]=g.useState(!1),te=We(l,ue=>v(ue)),ne=Yv(c);return h.jsx(Kv,{scope:i,type:a,dir:ne,scrollHideDelay:d,scrollArea:p,viewport:x,onViewportChange:y,content:S,onContentChange:C,scrollbarX:k,onScrollbarXChange:b,scrollbarXEnabled:U,onScrollbarXEnabledChange:G,scrollbarY:_,onScrollbarYChange:T,scrollbarYEnabled:B,onScrollbarYEnabledChange:ie,onCornerWidthChange:L,onCornerHeightChange:M,children:h.jsx(Le.div,{dir:ne,...m,ref:te,style:{position:"relative","--radix-scroll-area-corner-width":A+"px","--radix-scroll-area-corner-height":$+"px",...r.style}})})});pp.displayName=Ga;var mp="ScrollAreaViewport",hp=g.forwardRef((r,l)=>{const{__scopeScrollArea:i,children:a,nonce:c,...d}=r,m=xt(mp,i),p=g.useRef(null),v=We(l,p,m.onViewportChange);return h.jsxs(h.Fragment,{children:[h.jsx("style",{dangerouslySetInnerHTML:{__html:"[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}"},nonce:c}),h.jsx(Le.div,{"data-radix-scroll-area-viewport":"",...d,ref:v,style:{overflowX:m.scrollbarXEnabled?"scroll":"hidden",overflowY:m.scrollbarYEnabled?"scroll":"hidden",...r.style},children:h.jsx("div",{ref:m.onContentChange,style:{minWidth:"100%",display:"table"},children:a})})]})});hp.displayName=mp;var $t="ScrollAreaScrollbar",Ya=g.forwardRef((r,l)=>{const{forceMount:i,...a}=r,c=xt($t,r.__scopeScrollArea),{onScrollbarXEnabledChange:d,onScrollbarYEnabledChange:m}=c,p=r.orientation==="horizontal";return g.useEffect(()=>(p?d(!0):m(!0),()=>{p?d(!1):m(!1)}),[p,d,m]),c.type==="hover"?h.jsx(Zv,{...a,ref:l,forceMount:i}):c.type==="scroll"?h.jsx(qv,{...a,ref:l,forceMount:i}):c.type==="auto"?h.jsx(gp,{...a,ref:l,forceMount:i}):c.type==="always"?h.jsx(Qa,{...a,ref:l}):null});Ya.displayName=$t;var Zv=g.forwardRef((r,l)=>{const{forceMount:i,...a}=r,c=xt($t,r.__scopeScrollArea),[d,m]=g.useState(!1);return g.useEffect(()=>{const p=c.scrollArea;let v=0;if(p){const x=()=>{window.clearTimeout(v),m(!0)},y=()=>{v=window.setTimeout(()=>m(!1),c.scrollHideDelay)};return p.addEventListener("pointerenter",x),p.addEventListener("pointerleave",y),()=>{window.clearTimeout(v),p.removeEventListener("pointerenter",x),p.removeEventListener("pointerleave",y)}}},[c.scrollArea,c.scrollHideDelay]),h.jsx(Rt,{present:i||d,children:h.jsx(gp,{"data-state":d?"visible":"hidden",...a,ref:l})})}),qv=g.forwardRef((r,l)=>{const{forceMount:i,...a}=r,c=xt($t,r.__scopeScrollArea),d=r.orientation==="horizontal",m=ri(()=>v("SCROLL_END"),100),[p,v]=Xv("hidden",{hidden:{SCROLL:"scrolling"},scrolling:{SCROLL_END:"idle",POINTER_ENTER:"interacting"},interacting:{SCROLL:"interacting",POINTER_LEAVE:"idle"},idle:{HIDE:"hidden",SCROLL:"scrolling",POINTER_ENTER:"interacting"}});return g.useEffect(()=>{if(p==="idle"){const x=window.setTimeout(()=>v("HIDE"),c.scrollHideDelay);return()=>window.clearTimeout(x)}},[p,c.scrollHideDelay,v]),g.useEffect(()=>{const x=c.viewport,y=d?"scrollLeft":"scrollTop";if(x){let S=x[y];const C=()=>{const k=x[y];S!==k&&(v("SCROLL"),m()),S=k};return x.addEventListener("scroll",C),()=>x.removeEventListener("scroll",C)}},[c.viewport,d,v,m]),h.jsx(Rt,{present:i||p!=="hidden",children:h.jsx(Qa,{"data-state":p==="hidden"?"hidden":"visible",...a,ref:l,onPointerEnter:_e(r.onPointerEnter,()=>v("POINTER_ENTER")),onPointerLeave:_e(r.onPointerLeave,()=>v("POINTER_LEAVE"))})})}),gp=g.forwardRef((r,l)=>{const i=xt($t,r.__scopeScrollArea),{forceMount:a,...c}=r,[d,m]=g.useState(!1),p=r.orientation==="horizontal",v=ri(()=>{if(i.viewport){const x=i.viewport.offsetWidth{const{orientation:i="vertical",...a}=r,c=xt($t,r.__scopeScrollArea),d=g.useRef(null),m=g.useRef(0),[p,v]=g.useState({content:0,viewport:0,scrollbar:{size:0,paddingStart:0,paddingEnd:0}}),x=Sp(p.viewport,p.content),y={...a,sizes:p,onSizesChange:v,hasThumb:x>0&&x<1,onThumbChange:C=>d.current=C,onThumbPointerUp:()=>m.current=0,onThumbPointerDown:C=>m.current=C};function S(C,k){return oy(C,m.current,p,k)}return i==="horizontal"?h.jsx(Jv,{...y,ref:l,onThumbPositionChange:()=>{if(c.viewport&&d.current){const C=c.viewport.scrollLeft,k=Cf(C,p,c.dir);d.current.style.transform=`translate3d(${k}px, 0, 0)`}},onWheelScroll:C=>{c.viewport&&(c.viewport.scrollLeft=C)},onDragScroll:C=>{c.viewport&&(c.viewport.scrollLeft=S(C,c.dir))}}):i==="vertical"?h.jsx(ey,{...y,ref:l,onThumbPositionChange:()=>{if(c.viewport&&d.current){const C=c.viewport.scrollTop,k=Cf(C,p);d.current.style.transform=`translate3d(0, ${k}px, 0)`}},onWheelScroll:C=>{c.viewport&&(c.viewport.scrollTop=C)},onDragScroll:C=>{c.viewport&&(c.viewport.scrollTop=S(C))}}):null}),Jv=g.forwardRef((r,l)=>{const{sizes:i,onSizesChange:a,...c}=r,d=xt($t,r.__scopeScrollArea),[m,p]=g.useState(),v=g.useRef(null),x=We(l,v,d.onScrollbarXChange);return g.useEffect(()=>{v.current&&p(getComputedStyle(v.current))},[v]),h.jsx(yp,{"data-orientation":"horizontal",...c,ref:x,sizes:i,style:{bottom:0,left:d.dir==="rtl"?"var(--radix-scroll-area-corner-width)":0,right:d.dir==="ltr"?"var(--radix-scroll-area-corner-width)":0,"--radix-scroll-area-thumb-width":ni(i)+"px",...r.style},onThumbPointerDown:y=>r.onThumbPointerDown(y.x),onDragScroll:y=>r.onDragScroll(y.x),onWheelScroll:(y,S)=>{if(d.viewport){const C=d.viewport.scrollLeft+y.deltaX;r.onWheelScroll(C),Ep(C,S)&&y.preventDefault()}},onResize:()=>{v.current&&d.viewport&&m&&a({content:d.viewport.scrollWidth,viewport:d.viewport.offsetWidth,scrollbar:{size:v.current.clientWidth,paddingStart:Yl(m.paddingLeft),paddingEnd:Yl(m.paddingRight)}})}})}),ey=g.forwardRef((r,l)=>{const{sizes:i,onSizesChange:a,...c}=r,d=xt($t,r.__scopeScrollArea),[m,p]=g.useState(),v=g.useRef(null),x=We(l,v,d.onScrollbarYChange);return g.useEffect(()=>{v.current&&p(getComputedStyle(v.current))},[v]),h.jsx(yp,{"data-orientation":"vertical",...c,ref:x,sizes:i,style:{top:0,right:d.dir==="ltr"?0:void 0,left:d.dir==="rtl"?0:void 0,bottom:"var(--radix-scroll-area-corner-height)","--radix-scroll-area-thumb-height":ni(i)+"px",...r.style},onThumbPointerDown:y=>r.onThumbPointerDown(y.y),onDragScroll:y=>r.onDragScroll(y.y),onWheelScroll:(y,S)=>{if(d.viewport){const C=d.viewport.scrollTop+y.deltaY;r.onWheelScroll(C),Ep(C,S)&&y.preventDefault()}},onResize:()=>{v.current&&d.viewport&&m&&a({content:d.viewport.scrollHeight,viewport:d.viewport.offsetHeight,scrollbar:{size:v.current.clientHeight,paddingStart:Yl(m.paddingTop),paddingEnd:Yl(m.paddingBottom)}})}})}),[ty,vp]=fp($t),yp=g.forwardRef((r,l)=>{const{__scopeScrollArea:i,sizes:a,hasThumb:c,onThumbChange:d,onThumbPointerUp:m,onThumbPointerDown:p,onThumbPositionChange:v,onDragScroll:x,onWheelScroll:y,onResize:S,...C}=r,k=xt($t,i),[b,_]=g.useState(null),T=We(l,te=>_(te)),A=g.useRef(null),L=g.useRef(""),$=k.viewport,M=a.content-a.viewport,U=dt(y),G=dt(v),B=ri(S,10);function ie(te){if(A.current){const ne=te.clientX-A.current.left,ue=te.clientY-A.current.top;x({x:ne,y:ue})}}return g.useEffect(()=>{const te=ne=>{const ue=ne.target;b?.contains(ue)&&U(ne,M)};return document.addEventListener("wheel",te,{passive:!1}),()=>document.removeEventListener("wheel",te,{passive:!1})},[$,b,M,U]),g.useEffect(G,[a,G]),Er(b,B),Er(k.content,B),h.jsx(ty,{scope:i,scrollbar:b,hasThumb:c,onThumbChange:dt(d),onThumbPointerUp:dt(m),onThumbPositionChange:G,onThumbPointerDown:dt(p),children:h.jsx(Le.div,{...C,ref:T,style:{position:"absolute",...C.style},onPointerDown:_e(r.onPointerDown,te=>{te.button===0&&(te.target.setPointerCapture(te.pointerId),A.current=b.getBoundingClientRect(),L.current=document.body.style.webkitUserSelect,document.body.style.webkitUserSelect="none",k.viewport&&(k.viewport.style.scrollBehavior="auto"),ie(te))}),onPointerMove:_e(r.onPointerMove,ie),onPointerUp:_e(r.onPointerUp,te=>{const ne=te.target;ne.hasPointerCapture(te.pointerId)&&ne.releasePointerCapture(te.pointerId),document.body.style.webkitUserSelect=L.current,k.viewport&&(k.viewport.style.scrollBehavior=""),A.current=null})})})}),Gl="ScrollAreaThumb",xp=g.forwardRef((r,l)=>{const{forceMount:i,...a}=r,c=vp(Gl,r.__scopeScrollArea);return h.jsx(Rt,{present:i||c.hasThumb,children:h.jsx(ny,{ref:l,...a})})}),ny=g.forwardRef((r,l)=>{const{__scopeScrollArea:i,style:a,...c}=r,d=xt(Gl,i),m=vp(Gl,i),{onThumbPositionChange:p}=m,v=We(l,S=>m.onThumbChange(S)),x=g.useRef(void 0),y=ri(()=>{x.current&&(x.current(),x.current=void 0)},100);return g.useEffect(()=>{const S=d.viewport;if(S){const C=()=>{if(y(),!x.current){const k=ly(S,p);x.current=k,p()}};return p(),S.addEventListener("scroll",C),()=>S.removeEventListener("scroll",C)}},[d.viewport,y,p]),h.jsx(Le.div,{"data-state":m.hasThumb?"visible":"hidden",...c,ref:v,style:{width:"var(--radix-scroll-area-thumb-width)",height:"var(--radix-scroll-area-thumb-height)",...a},onPointerDownCapture:_e(r.onPointerDownCapture,S=>{const k=S.target.getBoundingClientRect(),b=S.clientX-k.left,_=S.clientY-k.top;m.onThumbPointerDown({x:b,y:_})}),onPointerUp:_e(r.onPointerUp,m.onThumbPointerUp)})});xp.displayName=Gl;var Xa="ScrollAreaCorner",wp=g.forwardRef((r,l)=>{const i=xt(Xa,r.__scopeScrollArea),a=!!(i.scrollbarX&&i.scrollbarY);return i.type!=="scroll"&&a?h.jsx(ry,{...r,ref:l}):null});wp.displayName=Xa;var ry=g.forwardRef((r,l)=>{const{__scopeScrollArea:i,...a}=r,c=xt(Xa,i),[d,m]=g.useState(0),[p,v]=g.useState(0),x=!!(d&&p);return Er(c.scrollbarX,()=>{const y=c.scrollbarX?.offsetHeight||0;c.onCornerHeightChange(y),v(y)}),Er(c.scrollbarY,()=>{const y=c.scrollbarY?.offsetWidth||0;c.onCornerWidthChange(y),m(y)}),x?h.jsx(Le.div,{...a,ref:l,style:{width:d,height:p,position:"absolute",right:c.dir==="ltr"?0:void 0,left:c.dir==="rtl"?0:void 0,bottom:0,...r.style}}):null});function Yl(r){return r?parseInt(r,10):0}function Sp(r,l){const i=r/l;return isNaN(i)?0:i}function ni(r){const l=Sp(r.viewport,r.content),i=r.scrollbar.paddingStart+r.scrollbar.paddingEnd,a=(r.scrollbar.size-i)*l;return Math.max(a,18)}function oy(r,l,i,a="ltr"){const c=ni(i),d=c/2,m=l||d,p=c-m,v=i.scrollbar.paddingStart+m,x=i.scrollbar.size-i.scrollbar.paddingEnd-p,y=i.content-i.viewport,S=a==="ltr"?[0,y]:[y*-1,0];return Cp([v,x],S)(r)}function Cf(r,l,i="ltr"){const a=ni(l),c=l.scrollbar.paddingStart+l.scrollbar.paddingEnd,d=l.scrollbar.size-c,m=l.content-l.viewport,p=d-a,v=i==="ltr"?[0,m]:[m*-1,0],x=Qv(r,v);return Cp([0,m],[0,p])(x)}function Cp(r,l){return i=>{if(r[0]===r[1]||l[0]===l[1])return l[0];const a=(l[1]-l[0])/(r[1]-r[0]);return l[0]+a*(i-r[0])}}function Ep(r,l){return r>0&&r{})=>{let i={left:r.scrollLeft,top:r.scrollTop},a=0;return(function c(){const d={left:r.scrollLeft,top:r.scrollTop},m=i.left!==d.left,p=i.top!==d.top;(m||p)&&l(),i=d,a=window.requestAnimationFrame(c)})(),()=>window.cancelAnimationFrame(a)};function ri(r,l){const i=dt(r),a=g.useRef(0);return g.useEffect(()=>()=>window.clearTimeout(a.current),[]),g.useCallback(()=>{window.clearTimeout(a.current),a.current=window.setTimeout(i,l)},[i,l])}function Er(r,l){const i=dt(l);Ft(()=>{let a=0;if(r){const c=new ResizeObserver(()=>{cancelAnimationFrame(a),a=window.requestAnimationFrame(i)});return c.observe(r),()=>{window.cancelAnimationFrame(a),c.unobserve(r)}}},[r,i])}var _p=pp,iy=hp,sy=wp;function kp(r){var l,i,a="";if(typeof r=="string"||typeof r=="number")a+=r;else if(typeof r=="object")if(Array.isArray(r)){var c=r.length;for(l=0;l{const l=cy(r),{conflictingClassGroups:i,conflictingClassGroupModifiers:a}=r;return{getClassGroupId:m=>{const p=m.split(Ka);return p[0]===""&&p.length!==1&&p.shift(),Pp(p,l)||uy(m)},getConflictingClassGroupIds:(m,p)=>{const v=i[m]||[];return p&&a[m]?[...v,...a[m]]:v}}},Pp=(r,l)=>{if(r.length===0)return l.classGroupId;const i=r[0],a=l.nextPart.get(i),c=a?Pp(r.slice(1),a):void 0;if(c)return c;if(l.validators.length===0)return;const d=r.join(Ka);return l.validators.find(({validator:m})=>m(d))?.classGroupId},Ef=/^\[(.+)\]$/,uy=r=>{if(Ef.test(r)){const l=Ef.exec(r)[1],i=l?.substring(0,l.indexOf(":"));if(i)return"arbitrary.."+i}},cy=r=>{const{theme:l,prefix:i}=r,a={nextPart:new Map,validators:[]};return fy(Object.entries(r.classGroups),i).forEach(([d,m])=>{Da(m,a,d,l)}),a},Da=(r,l,i,a)=>{r.forEach(c=>{if(typeof c=="string"){const d=c===""?l:_f(l,c);d.classGroupId=i;return}if(typeof c=="function"){if(dy(c)){Da(c(a),l,i,a);return}l.validators.push({validator:c,classGroupId:i});return}Object.entries(c).forEach(([d,m])=>{Da(m,_f(l,d),i,a)})})},_f=(r,l)=>{let i=r;return l.split(Ka).forEach(a=>{i.nextPart.has(a)||i.nextPart.set(a,{nextPart:new Map,validators:[]}),i=i.nextPart.get(a)}),i},dy=r=>r.isThemeGetter,fy=(r,l)=>l?r.map(([i,a])=>{const c=a.map(d=>typeof d=="string"?l+d:typeof d=="object"?Object.fromEntries(Object.entries(d).map(([m,p])=>[l+m,p])):d);return[i,c]}):r,py=r=>{if(r<1)return{get:()=>{},set:()=>{}};let l=0,i=new Map,a=new Map;const c=(d,m)=>{i.set(d,m),l++,l>r&&(l=0,a=i,i=new Map)};return{get(d){let m=i.get(d);if(m!==void 0)return m;if((m=a.get(d))!==void 0)return c(d,m),m},set(d,m){i.has(d)?i.set(d,m):c(d,m)}}},bp="!",my=r=>{const{separator:l,experimentalParseClassName:i}=r,a=l.length===1,c=l[0],d=l.length,m=p=>{const v=[];let x=0,y=0,S;for(let T=0;Ty?S-y:void 0;return{modifiers:v,hasImportantModifier:k,baseClassName:b,maybePostfixModifierPosition:_}};return i?p=>i({className:p,parseClassName:m}):m},hy=r=>{if(r.length<=1)return r;const l=[];let i=[];return r.forEach(a=>{a[0]==="["?(l.push(...i.sort(),a),i=[]):i.push(a)}),l.push(...i.sort()),l},gy=r=>({cache:py(r.cacheSize),parseClassName:my(r),...ay(r)}),vy=/\s+/,yy=(r,l)=>{const{parseClassName:i,getClassGroupId:a,getConflictingClassGroupIds:c}=l,d=[],m=r.trim().split(vy);let p="";for(let v=m.length-1;v>=0;v-=1){const x=m[v],{modifiers:y,hasImportantModifier:S,baseClassName:C,maybePostfixModifierPosition:k}=i(x);let b=!!k,_=a(b?C.substring(0,k):C);if(!_){if(!b){p=x+(p.length>0?" "+p:p);continue}if(_=a(C),!_){p=x+(p.length>0?" "+p:p);continue}b=!1}const T=hy(y).join(":"),A=S?T+bp:T,L=A+_;if(d.includes(L))continue;d.push(L);const $=c(_,b);for(let M=0;M<$.length;++M){const U=$[M];d.push(A+U)}p=x+(p.length>0?" "+p:p)}return p};function xy(){let r=0,l,i,a="";for(;r{if(typeof r=="string")return r;let l,i="";for(let a=0;aS(y),r());return i=gy(x),a=i.cache.get,c=i.cache.set,d=p,p(v)}function p(v){const x=a(v);if(x)return x;const y=yy(v,i);return c(v,y),y}return function(){return d(xy.apply(null,arguments))}}const Te=r=>{const l=i=>i[r]||[];return l.isThemeGetter=!0,l},Tp=/^\[(?:([a-z-]+):)?(.+)\]$/i,Sy=/^\d+\/\d+$/,Cy=new Set(["px","full","screen"]),Ey=/^(\d+(\.\d+)?)?(xs|sm|md|lg|xl)$/,_y=/\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\b(calc|min|max|clamp)\(.+\)|^0$/,ky=/^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\(.+\)$/,Ny=/^(inset_)?-?((\d+)?\.?(\d+)[a-z]+|0)_-?((\d+)?\.?(\d+)[a-z]+|0)/,Py=/^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\(.+\)$/,Zt=r=>wr(r)||Cy.has(r)||Sy.test(r),Sn=r=>br(r,"length",Dy),wr=r=>!!r&&!Number.isNaN(Number(r)),Sa=r=>br(r,"number",wr),yo=r=>!!r&&Number.isInteger(Number(r)),by=r=>r.endsWith("%")&&wr(r.slice(0,-1)),fe=r=>Tp.test(r),Cn=r=>Ey.test(r),Ry=new Set(["length","size","percentage"]),Ty=r=>br(r,Ry,jp),jy=r=>br(r,"position",jp),Oy=new Set(["image","url"]),Ay=r=>br(r,Oy,Iy),Ly=r=>br(r,"",My),xo=()=>!0,br=(r,l,i)=>{const a=Tp.exec(r);return a?a[1]?typeof l=="string"?a[1]===l:l.has(a[1]):i(a[2]):!1},Dy=r=>_y.test(r)&&!ky.test(r),jp=()=>!1,My=r=>Ny.test(r),Iy=r=>Py.test(r),zy=()=>{const r=Te("colors"),l=Te("spacing"),i=Te("blur"),a=Te("brightness"),c=Te("borderColor"),d=Te("borderRadius"),m=Te("borderSpacing"),p=Te("borderWidth"),v=Te("contrast"),x=Te("grayscale"),y=Te("hueRotate"),S=Te("invert"),C=Te("gap"),k=Te("gradientColorStops"),b=Te("gradientColorStopPositions"),_=Te("inset"),T=Te("margin"),A=Te("opacity"),L=Te("padding"),$=Te("saturate"),M=Te("scale"),U=Te("sepia"),G=Te("skew"),B=Te("space"),ie=Te("translate"),te=()=>["auto","contain","none"],ne=()=>["auto","hidden","clip","visible","scroll"],ue=()=>["auto",fe,l],J=()=>[fe,l],me=()=>["",Zt,Sn],ce=()=>["auto",wr,fe],ee=()=>["bottom","center","left","left-bottom","left-top","right","right-bottom","right-top","top"],le=()=>["solid","dashed","dotted","double","none"],se=()=>["normal","multiply","screen","overlay","darken","lighten","color-dodge","color-burn","hard-light","soft-light","difference","exclusion","hue","saturation","color","luminosity"],D=()=>["start","end","center","between","around","evenly","stretch"],Y=()=>["","0",fe],V=()=>["auto","avoid","all","avoid-page","page","left","right","column"],P=()=>[wr,fe];return{cacheSize:500,separator:":",theme:{colors:[xo],spacing:[Zt,Sn],blur:["none","",Cn,fe],brightness:P(),borderColor:[r],borderRadius:["none","","full",Cn,fe],borderSpacing:J(),borderWidth:me(),contrast:P(),grayscale:Y(),hueRotate:P(),invert:Y(),gap:J(),gradientColorStops:[r],gradientColorStopPositions:[by,Sn],inset:ue(),margin:ue(),opacity:P(),padding:J(),saturate:P(),scale:P(),sepia:Y(),skew:P(),space:J(),translate:J()},classGroups:{aspect:[{aspect:["auto","square","video",fe]}],container:["container"],columns:[{columns:[Cn]}],"break-after":[{"break-after":V()}],"break-before":[{"break-before":V()}],"break-inside":[{"break-inside":["auto","avoid","avoid-page","avoid-column"]}],"box-decoration":[{"box-decoration":["slice","clone"]}],box:[{box:["border","content"]}],display:["block","inline-block","inline","flex","inline-flex","table","inline-table","table-caption","table-cell","table-column","table-column-group","table-footer-group","table-header-group","table-row-group","table-row","flow-root","grid","inline-grid","contents","list-item","hidden"],float:[{float:["right","left","none","start","end"]}],clear:[{clear:["left","right","both","none","start","end"]}],isolation:["isolate","isolation-auto"],"object-fit":[{object:["contain","cover","fill","none","scale-down"]}],"object-position":[{object:[...ee(),fe]}],overflow:[{overflow:ne()}],"overflow-x":[{"overflow-x":ne()}],"overflow-y":[{"overflow-y":ne()}],overscroll:[{overscroll:te()}],"overscroll-x":[{"overscroll-x":te()}],"overscroll-y":[{"overscroll-y":te()}],position:["static","fixed","absolute","relative","sticky"],inset:[{inset:[_]}],"inset-x":[{"inset-x":[_]}],"inset-y":[{"inset-y":[_]}],start:[{start:[_]}],end:[{end:[_]}],top:[{top:[_]}],right:[{right:[_]}],bottom:[{bottom:[_]}],left:[{left:[_]}],visibility:["visible","invisible","collapse"],z:[{z:["auto",yo,fe]}],basis:[{basis:ue()}],"flex-direction":[{flex:["row","row-reverse","col","col-reverse"]}],"flex-wrap":[{flex:["wrap","wrap-reverse","nowrap"]}],flex:[{flex:["1","auto","initial","none",fe]}],grow:[{grow:Y()}],shrink:[{shrink:Y()}],order:[{order:["first","last","none",yo,fe]}],"grid-cols":[{"grid-cols":[xo]}],"col-start-end":[{col:["auto",{span:["full",yo,fe]},fe]}],"col-start":[{"col-start":ce()}],"col-end":[{"col-end":ce()}],"grid-rows":[{"grid-rows":[xo]}],"row-start-end":[{row:["auto",{span:[yo,fe]},fe]}],"row-start":[{"row-start":ce()}],"row-end":[{"row-end":ce()}],"grid-flow":[{"grid-flow":["row","col","dense","row-dense","col-dense"]}],"auto-cols":[{"auto-cols":["auto","min","max","fr",fe]}],"auto-rows":[{"auto-rows":["auto","min","max","fr",fe]}],gap:[{gap:[C]}],"gap-x":[{"gap-x":[C]}],"gap-y":[{"gap-y":[C]}],"justify-content":[{justify:["normal",...D()]}],"justify-items":[{"justify-items":["start","end","center","stretch"]}],"justify-self":[{"justify-self":["auto","start","end","center","stretch"]}],"align-content":[{content:["normal",...D(),"baseline"]}],"align-items":[{items:["start","end","center","baseline","stretch"]}],"align-self":[{self:["auto","start","end","center","stretch","baseline"]}],"place-content":[{"place-content":[...D(),"baseline"]}],"place-items":[{"place-items":["start","end","center","baseline","stretch"]}],"place-self":[{"place-self":["auto","start","end","center","stretch"]}],p:[{p:[L]}],px:[{px:[L]}],py:[{py:[L]}],ps:[{ps:[L]}],pe:[{pe:[L]}],pt:[{pt:[L]}],pr:[{pr:[L]}],pb:[{pb:[L]}],pl:[{pl:[L]}],m:[{m:[T]}],mx:[{mx:[T]}],my:[{my:[T]}],ms:[{ms:[T]}],me:[{me:[T]}],mt:[{mt:[T]}],mr:[{mr:[T]}],mb:[{mb:[T]}],ml:[{ml:[T]}],"space-x":[{"space-x":[B]}],"space-x-reverse":["space-x-reverse"],"space-y":[{"space-y":[B]}],"space-y-reverse":["space-y-reverse"],w:[{w:["auto","min","max","fit","svw","lvw","dvw",fe,l]}],"min-w":[{"min-w":[fe,l,"min","max","fit"]}],"max-w":[{"max-w":[fe,l,"none","full","min","max","fit","prose",{screen:[Cn]},Cn]}],h:[{h:[fe,l,"auto","min","max","fit","svh","lvh","dvh"]}],"min-h":[{"min-h":[fe,l,"min","max","fit","svh","lvh","dvh"]}],"max-h":[{"max-h":[fe,l,"min","max","fit","svh","lvh","dvh"]}],size:[{size:[fe,l,"auto","min","max","fit"]}],"font-size":[{text:["base",Cn,Sn]}],"font-smoothing":["antialiased","subpixel-antialiased"],"font-style":["italic","not-italic"],"font-weight":[{font:["thin","extralight","light","normal","medium","semibold","bold","extrabold","black",Sa]}],"font-family":[{font:[xo]}],"fvn-normal":["normal-nums"],"fvn-ordinal":["ordinal"],"fvn-slashed-zero":["slashed-zero"],"fvn-figure":["lining-nums","oldstyle-nums"],"fvn-spacing":["proportional-nums","tabular-nums"],"fvn-fraction":["diagonal-fractions","stacked-fractions"],tracking:[{tracking:["tighter","tight","normal","wide","wider","widest",fe]}],"line-clamp":[{"line-clamp":["none",wr,Sa]}],leading:[{leading:["none","tight","snug","normal","relaxed","loose",Zt,fe]}],"list-image":[{"list-image":["none",fe]}],"list-style-type":[{list:["none","disc","decimal",fe]}],"list-style-position":[{list:["inside","outside"]}],"placeholder-color":[{placeholder:[r]}],"placeholder-opacity":[{"placeholder-opacity":[A]}],"text-alignment":[{text:["left","center","right","justify","start","end"]}],"text-color":[{text:[r]}],"text-opacity":[{"text-opacity":[A]}],"text-decoration":["underline","overline","line-through","no-underline"],"text-decoration-style":[{decoration:[...le(),"wavy"]}],"text-decoration-thickness":[{decoration:["auto","from-font",Zt,Sn]}],"underline-offset":[{"underline-offset":["auto",Zt,fe]}],"text-decoration-color":[{decoration:[r]}],"text-transform":["uppercase","lowercase","capitalize","normal-case"],"text-overflow":["truncate","text-ellipsis","text-clip"],"text-wrap":[{text:["wrap","nowrap","balance","pretty"]}],indent:[{indent:J()}],"vertical-align":[{align:["baseline","top","middle","bottom","text-top","text-bottom","sub","super",fe]}],whitespace:[{whitespace:["normal","nowrap","pre","pre-line","pre-wrap","break-spaces"]}],break:[{break:["normal","words","all","keep"]}],hyphens:[{hyphens:["none","manual","auto"]}],content:[{content:["none",fe]}],"bg-attachment":[{bg:["fixed","local","scroll"]}],"bg-clip":[{"bg-clip":["border","padding","content","text"]}],"bg-opacity":[{"bg-opacity":[A]}],"bg-origin":[{"bg-origin":["border","padding","content"]}],"bg-position":[{bg:[...ee(),jy]}],"bg-repeat":[{bg:["no-repeat",{repeat:["","x","y","round","space"]}]}],"bg-size":[{bg:["auto","cover","contain",Ty]}],"bg-image":[{bg:["none",{"gradient-to":["t","tr","r","br","b","bl","l","tl"]},Ay]}],"bg-color":[{bg:[r]}],"gradient-from-pos":[{from:[b]}],"gradient-via-pos":[{via:[b]}],"gradient-to-pos":[{to:[b]}],"gradient-from":[{from:[k]}],"gradient-via":[{via:[k]}],"gradient-to":[{to:[k]}],rounded:[{rounded:[d]}],"rounded-s":[{"rounded-s":[d]}],"rounded-e":[{"rounded-e":[d]}],"rounded-t":[{"rounded-t":[d]}],"rounded-r":[{"rounded-r":[d]}],"rounded-b":[{"rounded-b":[d]}],"rounded-l":[{"rounded-l":[d]}],"rounded-ss":[{"rounded-ss":[d]}],"rounded-se":[{"rounded-se":[d]}],"rounded-ee":[{"rounded-ee":[d]}],"rounded-es":[{"rounded-es":[d]}],"rounded-tl":[{"rounded-tl":[d]}],"rounded-tr":[{"rounded-tr":[d]}],"rounded-br":[{"rounded-br":[d]}],"rounded-bl":[{"rounded-bl":[d]}],"border-w":[{border:[p]}],"border-w-x":[{"border-x":[p]}],"border-w-y":[{"border-y":[p]}],"border-w-s":[{"border-s":[p]}],"border-w-e":[{"border-e":[p]}],"border-w-t":[{"border-t":[p]}],"border-w-r":[{"border-r":[p]}],"border-w-b":[{"border-b":[p]}],"border-w-l":[{"border-l":[p]}],"border-opacity":[{"border-opacity":[A]}],"border-style":[{border:[...le(),"hidden"]}],"divide-x":[{"divide-x":[p]}],"divide-x-reverse":["divide-x-reverse"],"divide-y":[{"divide-y":[p]}],"divide-y-reverse":["divide-y-reverse"],"divide-opacity":[{"divide-opacity":[A]}],"divide-style":[{divide:le()}],"border-color":[{border:[c]}],"border-color-x":[{"border-x":[c]}],"border-color-y":[{"border-y":[c]}],"border-color-s":[{"border-s":[c]}],"border-color-e":[{"border-e":[c]}],"border-color-t":[{"border-t":[c]}],"border-color-r":[{"border-r":[c]}],"border-color-b":[{"border-b":[c]}],"border-color-l":[{"border-l":[c]}],"divide-color":[{divide:[c]}],"outline-style":[{outline:["",...le()]}],"outline-offset":[{"outline-offset":[Zt,fe]}],"outline-w":[{outline:[Zt,Sn]}],"outline-color":[{outline:[r]}],"ring-w":[{ring:me()}],"ring-w-inset":["ring-inset"],"ring-color":[{ring:[r]}],"ring-opacity":[{"ring-opacity":[A]}],"ring-offset-w":[{"ring-offset":[Zt,Sn]}],"ring-offset-color":[{"ring-offset":[r]}],shadow:[{shadow:["","inner","none",Cn,Ly]}],"shadow-color":[{shadow:[xo]}],opacity:[{opacity:[A]}],"mix-blend":[{"mix-blend":[...se(),"plus-lighter","plus-darker"]}],"bg-blend":[{"bg-blend":se()}],filter:[{filter:["","none"]}],blur:[{blur:[i]}],brightness:[{brightness:[a]}],contrast:[{contrast:[v]}],"drop-shadow":[{"drop-shadow":["","none",Cn,fe]}],grayscale:[{grayscale:[x]}],"hue-rotate":[{"hue-rotate":[y]}],invert:[{invert:[S]}],saturate:[{saturate:[$]}],sepia:[{sepia:[U]}],"backdrop-filter":[{"backdrop-filter":["","none"]}],"backdrop-blur":[{"backdrop-blur":[i]}],"backdrop-brightness":[{"backdrop-brightness":[a]}],"backdrop-contrast":[{"backdrop-contrast":[v]}],"backdrop-grayscale":[{"backdrop-grayscale":[x]}],"backdrop-hue-rotate":[{"backdrop-hue-rotate":[y]}],"backdrop-invert":[{"backdrop-invert":[S]}],"backdrop-opacity":[{"backdrop-opacity":[A]}],"backdrop-saturate":[{"backdrop-saturate":[$]}],"backdrop-sepia":[{"backdrop-sepia":[U]}],"border-collapse":[{border:["collapse","separate"]}],"border-spacing":[{"border-spacing":[m]}],"border-spacing-x":[{"border-spacing-x":[m]}],"border-spacing-y":[{"border-spacing-y":[m]}],"table-layout":[{table:["auto","fixed"]}],caption:[{caption:["top","bottom"]}],transition:[{transition:["none","all","","colors","opacity","shadow","transform",fe]}],duration:[{duration:P()}],ease:[{ease:["linear","in","out","in-out",fe]}],delay:[{delay:P()}],animate:[{animate:["none","spin","ping","pulse","bounce",fe]}],transform:[{transform:["","gpu","none"]}],scale:[{scale:[M]}],"scale-x":[{"scale-x":[M]}],"scale-y":[{"scale-y":[M]}],rotate:[{rotate:[yo,fe]}],"translate-x":[{"translate-x":[ie]}],"translate-y":[{"translate-y":[ie]}],"skew-x":[{"skew-x":[G]}],"skew-y":[{"skew-y":[G]}],"transform-origin":[{origin:["center","top","top-right","right","bottom-right","bottom","bottom-left","left","top-left",fe]}],accent:[{accent:["auto",r]}],appearance:[{appearance:["none","auto"]}],cursor:[{cursor:["auto","default","pointer","wait","text","move","help","not-allowed","none","context-menu","progress","cell","crosshair","vertical-text","alias","copy","no-drop","grab","grabbing","all-scroll","col-resize","row-resize","n-resize","e-resize","s-resize","w-resize","ne-resize","nw-resize","se-resize","sw-resize","ew-resize","ns-resize","nesw-resize","nwse-resize","zoom-in","zoom-out",fe]}],"caret-color":[{caret:[r]}],"pointer-events":[{"pointer-events":["none","auto"]}],resize:[{resize:["none","y","x",""]}],"scroll-behavior":[{scroll:["auto","smooth"]}],"scroll-m":[{"scroll-m":J()}],"scroll-mx":[{"scroll-mx":J()}],"scroll-my":[{"scroll-my":J()}],"scroll-ms":[{"scroll-ms":J()}],"scroll-me":[{"scroll-me":J()}],"scroll-mt":[{"scroll-mt":J()}],"scroll-mr":[{"scroll-mr":J()}],"scroll-mb":[{"scroll-mb":J()}],"scroll-ml":[{"scroll-ml":J()}],"scroll-p":[{"scroll-p":J()}],"scroll-px":[{"scroll-px":J()}],"scroll-py":[{"scroll-py":J()}],"scroll-ps":[{"scroll-ps":J()}],"scroll-pe":[{"scroll-pe":J()}],"scroll-pt":[{"scroll-pt":J()}],"scroll-pr":[{"scroll-pr":J()}],"scroll-pb":[{"scroll-pb":J()}],"scroll-pl":[{"scroll-pl":J()}],"snap-align":[{snap:["start","end","center","align-none"]}],"snap-stop":[{snap:["normal","always"]}],"snap-type":[{snap:["none","x","y","both"]}],"snap-strictness":[{snap:["mandatory","proximity"]}],touch:[{touch:["auto","none","manipulation"]}],"touch-x":[{"touch-pan":["x","left","right"]}],"touch-y":[{"touch-pan":["y","up","down"]}],"touch-pz":["touch-pinch-zoom"],select:[{select:["none","text","all","auto"]}],"will-change":[{"will-change":["auto","scroll","contents","transform",fe]}],fill:[{fill:[r,"none"]}],"stroke-w":[{stroke:[Zt,Sn,Sa]}],stroke:[{stroke:[r,"none"]}],sr:["sr-only","not-sr-only"],"forced-color-adjust":[{"forced-color-adjust":["auto","none"]}]},conflictingClassGroups:{overflow:["overflow-x","overflow-y"],overscroll:["overscroll-x","overscroll-y"],inset:["inset-x","inset-y","start","end","top","right","bottom","left"],"inset-x":["right","left"],"inset-y":["top","bottom"],flex:["basis","grow","shrink"],gap:["gap-x","gap-y"],p:["px","py","ps","pe","pt","pr","pb","pl"],px:["pr","pl"],py:["pt","pb"],m:["mx","my","ms","me","mt","mr","mb","ml"],mx:["mr","ml"],my:["mt","mb"],size:["w","h"],"font-size":["leading"],"fvn-normal":["fvn-ordinal","fvn-slashed-zero","fvn-figure","fvn-spacing","fvn-fraction"],"fvn-ordinal":["fvn-normal"],"fvn-slashed-zero":["fvn-normal"],"fvn-figure":["fvn-normal"],"fvn-spacing":["fvn-normal"],"fvn-fraction":["fvn-normal"],"line-clamp":["display","overflow"],rounded:["rounded-s","rounded-e","rounded-t","rounded-r","rounded-b","rounded-l","rounded-ss","rounded-se","rounded-ee","rounded-es","rounded-tl","rounded-tr","rounded-br","rounded-bl"],"rounded-s":["rounded-ss","rounded-es"],"rounded-e":["rounded-se","rounded-ee"],"rounded-t":["rounded-tl","rounded-tr"],"rounded-r":["rounded-tr","rounded-br"],"rounded-b":["rounded-br","rounded-bl"],"rounded-l":["rounded-tl","rounded-bl"],"border-spacing":["border-spacing-x","border-spacing-y"],"border-w":["border-w-s","border-w-e","border-w-t","border-w-r","border-w-b","border-w-l"],"border-w-x":["border-w-r","border-w-l"],"border-w-y":["border-w-t","border-w-b"],"border-color":["border-color-s","border-color-e","border-color-t","border-color-r","border-color-b","border-color-l"],"border-color-x":["border-color-r","border-color-l"],"border-color-y":["border-color-t","border-color-b"],"scroll-m":["scroll-mx","scroll-my","scroll-ms","scroll-me","scroll-mt","scroll-mr","scroll-mb","scroll-ml"],"scroll-mx":["scroll-mr","scroll-ml"],"scroll-my":["scroll-mt","scroll-mb"],"scroll-p":["scroll-px","scroll-py","scroll-ps","scroll-pe","scroll-pt","scroll-pr","scroll-pb","scroll-pl"],"scroll-px":["scroll-pr","scroll-pl"],"scroll-py":["scroll-pt","scroll-pb"],touch:["touch-x","touch-y","touch-pz"],"touch-x":["touch"],"touch-y":["touch"],"touch-pz":["touch"]},conflictingClassGroupModifiers:{"font-size":["leading"]}}},Fy=wy(zy);function ge(...r){return Fy(Np(r))}const oi=g.forwardRef(({className:r,children:l,...i},a)=>h.jsxs(_p,{ref:a,className:ge("relative overflow-hidden",r),...i,children:[h.jsx(iy,{className:"h-full w-full rounded-[inherit]",children:l}),h.jsx(Op,{}),h.jsx(sy,{})]}));oi.displayName=_p.displayName;const Op=g.forwardRef(({className:r,orientation:l="vertical",...i},a)=>h.jsx(Ya,{ref:a,orientation:l,className:ge("flex touch-none select-none transition-colors",l==="vertical"&&"h-full w-2.5 border-l border-l-transparent p-[1px]",l==="horizontal"&&"h-2.5 flex-col border-t border-t-transparent p-[1px]",r),...i,children:h.jsx(xp,{className:"relative flex-1 rounded-full bg-border"})}));Op.displayName=Ya.displayName;var $y=op[" useId ".trim().toString()]||(()=>{}),Wy=0;function So(r){const[l,i]=g.useState($y());return Ft(()=>{i(a=>a??String(Wy++))},[r]),r||(l?`radix-${l}`:"")}var Hy=op[" useInsertionEffect ".trim().toString()]||Ft;function li({prop:r,defaultProp:l,onChange:i=()=>{},caller:a}){const[c,d,m]=Uy({defaultProp:l,onChange:i}),p=r!==void 0,v=p?r:c;{const y=g.useRef(r!==void 0);g.useEffect(()=>{const S=y.current;S!==p&&console.warn(`${a} is changing from ${S?"controlled":"uncontrolled"} to ${p?"controlled":"uncontrolled"}. Components should not switch from controlled to uncontrolled (or vice versa). Decide between using a controlled or uncontrolled value for the lifetime of the component.`),y.current=p},[p,a])}const x=g.useCallback(y=>{if(p){const S=By(y)?y(r):y;S!==r&&m.current?.(S)}else d(y)},[p,r,d,m]);return[v,x]}function Uy({defaultProp:r,onChange:l}){const[i,a]=g.useState(r),c=g.useRef(i),d=g.useRef(l);return Hy(()=>{d.current=l},[l]),g.useEffect(()=>{c.current!==i&&(d.current?.(i),c.current=i)},[i,c]),[i,a,d]}function By(r){return typeof r=="function"}function Vy(r,l=globalThis?.document){const i=dt(r);g.useEffect(()=>{const a=c=>{c.key==="Escape"&&i(c)};return l.addEventListener("keydown",a,{capture:!0}),()=>l.removeEventListener("keydown",a,{capture:!0})},[i,l])}var Gy="DismissableLayer",Ma="dismissableLayer.update",Yy="dismissableLayer.pointerDownOutside",Qy="dismissableLayer.focusOutside",kf,Ap=g.createContext({layers:new Set,layersWithOutsidePointerEventsDisabled:new Set,branches:new Set}),ii=g.forwardRef((r,l)=>{const{disableOutsidePointerEvents:i=!1,onEscapeKeyDown:a,onPointerDownOutside:c,onFocusOutside:d,onInteractOutside:m,onDismiss:p,...v}=r,x=g.useContext(Ap),[y,S]=g.useState(null),C=y?.ownerDocument??globalThis?.document,[,k]=g.useState({}),b=We(l,B=>S(B)),_=Array.from(x.layers),[T]=[...x.layersWithOutsidePointerEventsDisabled].slice(-1),A=_.indexOf(T),L=y?_.indexOf(y):-1,$=x.layersWithOutsidePointerEventsDisabled.size>0,M=L>=A,U=Zy(B=>{const ie=B.target,te=[...x.branches].some(ne=>ne.contains(ie));!M||te||(c?.(B),m?.(B),B.defaultPrevented||p?.())},C),G=qy(B=>{const ie=B.target;[...x.branches].some(ne=>ne.contains(ie))||(d?.(B),m?.(B),B.defaultPrevented||p?.())},C);return Vy(B=>{L===x.layers.size-1&&(a?.(B),!B.defaultPrevented&&p&&(B.preventDefault(),p()))},C),g.useEffect(()=>{if(y)return i&&(x.layersWithOutsidePointerEventsDisabled.size===0&&(kf=C.body.style.pointerEvents,C.body.style.pointerEvents="none"),x.layersWithOutsidePointerEventsDisabled.add(y)),x.layers.add(y),Nf(),()=>{i&&x.layersWithOutsidePointerEventsDisabled.size===1&&(C.body.style.pointerEvents=kf)}},[y,C,i,x]),g.useEffect(()=>()=>{y&&(x.layers.delete(y),x.layersWithOutsidePointerEventsDisabled.delete(y),Nf())},[y,x]),g.useEffect(()=>{const B=()=>k({});return document.addEventListener(Ma,B),()=>document.removeEventListener(Ma,B)},[]),h.jsx(Le.div,{...v,ref:b,style:{pointerEvents:$?M?"auto":"none":void 0,...r.style},onFocusCapture:_e(r.onFocusCapture,G.onFocusCapture),onBlurCapture:_e(r.onBlurCapture,G.onBlurCapture),onPointerDownCapture:_e(r.onPointerDownCapture,U.onPointerDownCapture)})});ii.displayName=Gy;var Xy="DismissableLayerBranch",Ky=g.forwardRef((r,l)=>{const i=g.useContext(Ap),a=g.useRef(null),c=We(l,a);return g.useEffect(()=>{const d=a.current;if(d)return i.branches.add(d),()=>{i.branches.delete(d)}},[i.branches]),h.jsx(Le.div,{...r,ref:c})});Ky.displayName=Xy;function Zy(r,l=globalThis?.document){const i=dt(r),a=g.useRef(!1),c=g.useRef(()=>{});return g.useEffect(()=>{const d=p=>{if(p.target&&!a.current){let v=function(){Lp(Yy,i,x,{discrete:!0})};const x={originalEvent:p};p.pointerType==="touch"?(l.removeEventListener("click",c.current),c.current=v,l.addEventListener("click",c.current,{once:!0})):v()}else l.removeEventListener("click",c.current);a.current=!1},m=window.setTimeout(()=>{l.addEventListener("pointerdown",d)},0);return()=>{window.clearTimeout(m),l.removeEventListener("pointerdown",d),l.removeEventListener("click",c.current)}},[l,i]),{onPointerDownCapture:()=>a.current=!0}}function qy(r,l=globalThis?.document){const i=dt(r),a=g.useRef(!1);return g.useEffect(()=>{const c=d=>{d.target&&!a.current&&Lp(Qy,i,{originalEvent:d},{discrete:!1})};return l.addEventListener("focusin",c),()=>l.removeEventListener("focusin",c)},[l,i]),{onFocusCapture:()=>a.current=!0,onBlurCapture:()=>a.current=!1}}function Nf(){const r=new CustomEvent(Ma);document.dispatchEvent(r)}function Lp(r,l,i,{discrete:a}){const c=i.originalEvent.target,d=new CustomEvent(r,{bubbles:!1,cancelable:!0,detail:i});l&&c.addEventListener(r,l,{once:!0}),a?$v(c,d):c.dispatchEvent(d)}var Ca="focusScope.autoFocusOnMount",Ea="focusScope.autoFocusOnUnmount",Pf={bubbles:!1,cancelable:!0},Jy="FocusScope",Dp=g.forwardRef((r,l)=>{const{loop:i=!1,trapped:a=!1,onMountAutoFocus:c,onUnmountAutoFocus:d,...m}=r,[p,v]=g.useState(null),x=dt(c),y=dt(d),S=g.useRef(null),C=We(l,_=>v(_)),k=g.useRef({paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}}).current;g.useEffect(()=>{if(a){let _=function($){if(k.paused||!p)return;const M=$.target;p.contains(M)?S.current=M:En(S.current,{select:!0})},T=function($){if(k.paused||!p)return;const M=$.relatedTarget;M!==null&&(p.contains(M)||En(S.current,{select:!0}))},A=function($){if(document.activeElement===document.body)for(const U of $)U.removedNodes.length>0&&En(p)};document.addEventListener("focusin",_),document.addEventListener("focusout",T);const L=new MutationObserver(A);return p&&L.observe(p,{childList:!0,subtree:!0}),()=>{document.removeEventListener("focusin",_),document.removeEventListener("focusout",T),L.disconnect()}}},[a,p,k.paused]),g.useEffect(()=>{if(p){Rf.add(k);const _=document.activeElement;if(!p.contains(_)){const A=new CustomEvent(Ca,Pf);p.addEventListener(Ca,x),p.dispatchEvent(A),A.defaultPrevented||(ex(lx(Mp(p)),{select:!0}),document.activeElement===_&&En(p))}return()=>{p.removeEventListener(Ca,x),setTimeout(()=>{const A=new CustomEvent(Ea,Pf);p.addEventListener(Ea,y),p.dispatchEvent(A),A.defaultPrevented||En(_??document.body,{select:!0}),p.removeEventListener(Ea,y),Rf.remove(k)},0)}}},[p,x,y,k]);const b=g.useCallback(_=>{if(!i&&!a||k.paused)return;const T=_.key==="Tab"&&!_.altKey&&!_.ctrlKey&&!_.metaKey,A=document.activeElement;if(T&&A){const L=_.currentTarget,[$,M]=tx(L);$&&M?!_.shiftKey&&A===M?(_.preventDefault(),i&&En($,{select:!0})):_.shiftKey&&A===$&&(_.preventDefault(),i&&En(M,{select:!0})):A===L&&_.preventDefault()}},[i,a,k.paused]);return h.jsx(Le.div,{tabIndex:-1,...m,ref:C,onKeyDown:b})});Dp.displayName=Jy;function ex(r,{select:l=!1}={}){const i=document.activeElement;for(const a of r)if(En(a,{select:l}),document.activeElement!==i)return}function tx(r){const l=Mp(r),i=bf(l,r),a=bf(l.reverse(),r);return[i,a]}function Mp(r){const l=[],i=document.createTreeWalker(r,NodeFilter.SHOW_ELEMENT,{acceptNode:a=>{const c=a.tagName==="INPUT"&&a.type==="hidden";return a.disabled||a.hidden||c?NodeFilter.FILTER_SKIP:a.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;i.nextNode();)l.push(i.currentNode);return l}function bf(r,l){for(const i of r)if(!nx(i,{upTo:l}))return i}function nx(r,{upTo:l}){if(getComputedStyle(r).visibility==="hidden")return!0;for(;r;){if(l!==void 0&&r===l)return!1;if(getComputedStyle(r).display==="none")return!0;r=r.parentElement}return!1}function rx(r){return r instanceof HTMLInputElement&&"select"in r}function En(r,{select:l=!1}={}){if(r&&r.focus){const i=document.activeElement;r.focus({preventScroll:!0}),r!==i&&rx(r)&&l&&r.select()}}var Rf=ox();function ox(){let r=[];return{add(l){const i=r[0];l!==i&&i?.pause(),r=Tf(r,l),r.unshift(l)},remove(l){r=Tf(r,l),r[0]?.resume()}}}function Tf(r,l){const i=[...r],a=i.indexOf(l);return a!==-1&&i.splice(a,1),i}function lx(r){return r.filter(l=>l.tagName!=="A")}var ix="Portal",Ip=g.forwardRef((r,l)=>{const{container:i,...a}=r,[c,d]=g.useState(!1);Ft(()=>d(!0),[]);const m=i||c&&globalThis?.document?.body;return m?Av.createPortal(h.jsx(Le.div,{...a,ref:l}),m):null});Ip.displayName=ix;var _a=0;function sx(){g.useEffect(()=>{const r=document.querySelectorAll("[data-radix-focus-guard]");return document.body.insertAdjacentElement("afterbegin",r[0]??jf()),document.body.insertAdjacentElement("beforeend",r[1]??jf()),_a++,()=>{_a===1&&document.querySelectorAll("[data-radix-focus-guard]").forEach(l=>l.remove()),_a--}},[])}function jf(){const r=document.createElement("span");return r.setAttribute("data-radix-focus-guard",""),r.tabIndex=0,r.style.outline="none",r.style.opacity="0",r.style.position="fixed",r.style.pointerEvents="none",r}var Mt=function(){return Mt=Object.assign||function(l){for(var i,a=1,c=arguments.length;a"u")return _x;var l=kx(r),i=document.documentElement.clientWidth,a=window.innerWidth;return{left:l[0],top:l[1],right:l[2],gap:Math.max(0,a-i+l[2]-l[0])}},Px=Wp(),Sr="data-scroll-locked",bx=function(r,l,i,a){var c=r.left,d=r.top,m=r.right,p=r.gap;return i===void 0&&(i="margin"),` + .`.concat(ux,` { + overflow: hidden `).concat(a,`; + padding-right: `).concat(p,"px ").concat(a,`; + } + body[`).concat(Sr,`] { + overflow: hidden `).concat(a,`; + overscroll-behavior: contain; + `).concat([l&&"position: relative ".concat(a,";"),i==="margin"&&` + padding-left: `.concat(c,`px; + padding-top: `).concat(d,`px; + padding-right: `).concat(m,`px; + margin-left:0; + margin-top:0; + margin-right: `).concat(p,"px ").concat(a,`; + `),i==="padding"&&"padding-right: ".concat(p,"px ").concat(a,";")].filter(Boolean).join(""),` + } + + .`).concat(Ul,` { + right: `).concat(p,"px ").concat(a,`; + } + + .`).concat(Bl,` { + margin-right: `).concat(p,"px ").concat(a,`; + } + + .`).concat(Ul," .").concat(Ul,` { + right: 0 `).concat(a,`; + } + + .`).concat(Bl," .").concat(Bl,` { + margin-right: 0 `).concat(a,`; + } + + body[`).concat(Sr,`] { + `).concat(cx,": ").concat(p,`px; + } +`)},Af=function(){var r=parseInt(document.body.getAttribute(Sr)||"0",10);return isFinite(r)?r:0},Rx=function(){g.useEffect(function(){return document.body.setAttribute(Sr,(Af()+1).toString()),function(){var r=Af()-1;r<=0?document.body.removeAttribute(Sr):document.body.setAttribute(Sr,r.toString())}},[])},Tx=function(r){var l=r.noRelative,i=r.noImportant,a=r.gapMode,c=a===void 0?"margin":a;Rx();var d=g.useMemo(function(){return Nx(c)},[c]);return g.createElement(Px,{styles:bx(d,!l,c,i?"":"!important")})},Ia=!1;if(typeof window<"u")try{var zl=Object.defineProperty({},"passive",{get:function(){return Ia=!0,!0}});window.addEventListener("test",zl,zl),window.removeEventListener("test",zl,zl)}catch{Ia=!1}var hr=Ia?{passive:!1}:!1,jx=function(r){return r.tagName==="TEXTAREA"},Hp=function(r,l){if(!(r instanceof Element))return!1;var i=window.getComputedStyle(r);return i[l]!=="hidden"&&!(i.overflowY===i.overflowX&&!jx(r)&&i[l]==="visible")},Ox=function(r){return Hp(r,"overflowY")},Ax=function(r){return Hp(r,"overflowX")},Lf=function(r,l){var i=l.ownerDocument,a=l;do{typeof ShadowRoot<"u"&&a instanceof ShadowRoot&&(a=a.host);var c=Up(r,a);if(c){var d=Bp(r,a),m=d[1],p=d[2];if(m>p)return!0}a=a.parentNode}while(a&&a!==i.body);return!1},Lx=function(r){var l=r.scrollTop,i=r.scrollHeight,a=r.clientHeight;return[l,i,a]},Dx=function(r){var l=r.scrollLeft,i=r.scrollWidth,a=r.clientWidth;return[l,i,a]},Up=function(r,l){return r==="v"?Ox(l):Ax(l)},Bp=function(r,l){return r==="v"?Lx(l):Dx(l)},Mx=function(r,l){return r==="h"&&l==="rtl"?-1:1},Ix=function(r,l,i,a,c){var d=Mx(r,window.getComputedStyle(l).direction),m=d*a,p=i.target,v=l.contains(p),x=!1,y=m>0,S=0,C=0;do{if(!p)break;var k=Bp(r,p),b=k[0],_=k[1],T=k[2],A=_-T-d*b;(b||A)&&Up(r,p)&&(S+=A,C+=b);var L=p.parentNode;p=L&&L.nodeType===Node.DOCUMENT_FRAGMENT_NODE?L.host:L}while(!v&&p!==document.body||v&&(l.contains(p)||l===p));return(y&&Math.abs(S)<1||!y&&Math.abs(C)<1)&&(x=!0),x},Fl=function(r){return"changedTouches"in r?[r.changedTouches[0].clientX,r.changedTouches[0].clientY]:[0,0]},Df=function(r){return[r.deltaX,r.deltaY]},Mf=function(r){return r&&"current"in r?r.current:r},zx=function(r,l){return r[0]===l[0]&&r[1]===l[1]},Fx=function(r){return` + .block-interactivity-`.concat(r,` {pointer-events: none;} + .allow-interactivity-`).concat(r,` {pointer-events: all;} +`)},$x=0,gr=[];function Wx(r){var l=g.useRef([]),i=g.useRef([0,0]),a=g.useRef(),c=g.useState($x++)[0],d=g.useState(Wp)[0],m=g.useRef(r);g.useEffect(function(){m.current=r},[r]),g.useEffect(function(){if(r.inert){document.body.classList.add("block-interactivity-".concat(c));var _=ax([r.lockRef.current],(r.shards||[]).map(Mf),!0).filter(Boolean);return _.forEach(function(T){return T.classList.add("allow-interactivity-".concat(c))}),function(){document.body.classList.remove("block-interactivity-".concat(c)),_.forEach(function(T){return T.classList.remove("allow-interactivity-".concat(c))})}}},[r.inert,r.lockRef.current,r.shards]);var p=g.useCallback(function(_,T){if("touches"in _&&_.touches.length===2||_.type==="wheel"&&_.ctrlKey)return!m.current.allowPinchZoom;var A=Fl(_),L=i.current,$="deltaX"in _?_.deltaX:L[0]-A[0],M="deltaY"in _?_.deltaY:L[1]-A[1],U,G=_.target,B=Math.abs($)>Math.abs(M)?"h":"v";if("touches"in _&&B==="h"&&G.type==="range")return!1;var ie=window.getSelection(),te=ie&&ie.anchorNode,ne=te?te===G||te.contains(G):!1;if(ne)return!1;var ue=Lf(B,G);if(!ue)return!0;if(ue?U=B:(U=B==="v"?"h":"v",ue=Lf(B,G)),!ue)return!1;if(!a.current&&"changedTouches"in _&&($||M)&&(a.current=U),!U)return!0;var J=a.current||U;return Ix(J,T,_,J==="h"?$:M)},[]),v=g.useCallback(function(_){var T=_;if(!(!gr.length||gr[gr.length-1]!==d)){var A="deltaY"in T?Df(T):Fl(T),L=l.current.filter(function(U){return U.name===T.type&&(U.target===T.target||T.target===U.shadowParent)&&zx(U.delta,A)})[0];if(L&&L.should){T.cancelable&&T.preventDefault();return}if(!L){var $=(m.current.shards||[]).map(Mf).filter(Boolean).filter(function(U){return U.contains(T.target)}),M=$.length>0?p(T,$[0]):!m.current.noIsolation;M&&T.cancelable&&T.preventDefault()}}},[]),x=g.useCallback(function(_,T,A,L){var $={name:_,delta:T,target:A,should:L,shadowParent:Hx(A)};l.current.push($),setTimeout(function(){l.current=l.current.filter(function(M){return M!==$})},1)},[]),y=g.useCallback(function(_){i.current=Fl(_),a.current=void 0},[]),S=g.useCallback(function(_){x(_.type,Df(_),_.target,p(_,r.lockRef.current))},[]),C=g.useCallback(function(_){x(_.type,Fl(_),_.target,p(_,r.lockRef.current))},[]);g.useEffect(function(){return gr.push(d),r.setCallbacks({onScrollCapture:S,onWheelCapture:S,onTouchMoveCapture:C}),document.addEventListener("wheel",v,hr),document.addEventListener("touchmove",v,hr),document.addEventListener("touchstart",y,hr),function(){gr=gr.filter(function(_){return _!==d}),document.removeEventListener("wheel",v,hr),document.removeEventListener("touchmove",v,hr),document.removeEventListener("touchstart",y,hr)}},[]);var k=r.removeScrollBar,b=r.inert;return g.createElement(g.Fragment,null,b?g.createElement(d,{styles:Fx(c)}):null,k?g.createElement(Tx,{noRelative:r.noRelative,gapMode:r.gapMode}):null)}function Hx(r){for(var l=null;r!==null;)r instanceof ShadowRoot&&(l=r.host,r=r.host),r=r.parentNode;return l}const Ux=vx($p,Wx);var Vp=g.forwardRef(function(r,l){return g.createElement(si,Mt({},r,{ref:l,sideCar:Ux}))});Vp.classNames=si.classNames;var Bx=function(r){if(typeof document>"u")return null;var l=Array.isArray(r)?r[0]:r;return l.ownerDocument.body},vr=new WeakMap,$l=new WeakMap,Wl={},ba=0,Gp=function(r){return r&&(r.host||Gp(r.parentNode))},Vx=function(r,l){return l.map(function(i){if(r.contains(i))return i;var a=Gp(i);return a&&r.contains(a)?a:(console.error("aria-hidden",i,"in not contained inside",r,". Doing nothing"),null)}).filter(function(i){return!!i})},Gx=function(r,l,i,a){var c=Vx(l,Array.isArray(r)?r:[r]);Wl[i]||(Wl[i]=new WeakMap);var d=Wl[i],m=[],p=new Set,v=new Set(c),x=function(S){!S||p.has(S)||(p.add(S),x(S.parentNode))};c.forEach(x);var y=function(S){!S||v.has(S)||Array.prototype.forEach.call(S.children,function(C){if(p.has(C))y(C);else try{var k=C.getAttribute(a),b=k!==null&&k!=="false",_=(vr.get(C)||0)+1,T=(d.get(C)||0)+1;vr.set(C,_),d.set(C,T),m.push(C),_===1&&b&&$l.set(C,!0),T===1&&C.setAttribute(i,"true"),b||C.setAttribute(a,"true")}catch(A){console.error("aria-hidden: cannot operate on ",C,A)}})};return y(l),p.clear(),ba++,function(){m.forEach(function(S){var C=vr.get(S)-1,k=d.get(S)-1;vr.set(S,C),d.set(S,k),C||($l.has(S)||S.removeAttribute(a),$l.delete(S)),k||S.removeAttribute(i)}),ba--,ba||(vr=new WeakMap,vr=new WeakMap,$l=new WeakMap,Wl={})}},Yx=function(r,l,i){i===void 0&&(i="data-aria-hidden");var a=Array.from(Array.isArray(r)?r:[r]),c=Bx(r);return c?(a.push.apply(a,Array.from(c.querySelectorAll("[aria-live], script"))),Gx(a,c,i,"aria-hidden")):function(){return null}},ai="Dialog",[Yp]=Pr(ai),[Qx,Tt]=Yp(ai),Qp=r=>{const{__scopeDialog:l,children:i,open:a,defaultOpen:c,onOpenChange:d,modal:m=!0}=r,p=g.useRef(null),v=g.useRef(null),[x,y]=li({prop:a,defaultProp:c??!1,onChange:d,caller:ai});return h.jsx(Qx,{scope:l,triggerRef:p,contentRef:v,contentId:So(),titleId:So(),descriptionId:So(),open:x,onOpenChange:y,onOpenToggle:g.useCallback(()=>y(S=>!S),[y]),modal:m,children:i})};Qp.displayName=ai;var Xp="DialogTrigger",Xx=g.forwardRef((r,l)=>{const{__scopeDialog:i,...a}=r,c=Tt(Xp,i),d=We(l,c.triggerRef);return h.jsx(Le.button,{type:"button","aria-haspopup":"dialog","aria-expanded":c.open,"aria-controls":c.contentId,"data-state":Ja(c.open),...a,ref:d,onClick:_e(r.onClick,c.onOpenToggle)})});Xx.displayName=Xp;var Za="DialogPortal",[Kx,Kp]=Yp(Za,{forceMount:void 0}),Zp=r=>{const{__scopeDialog:l,forceMount:i,children:a,container:c}=r,d=Tt(Za,l);return h.jsx(Kx,{scope:l,forceMount:i,children:g.Children.map(a,m=>h.jsx(Rt,{present:i||d.open,children:h.jsx(Ip,{asChild:!0,container:c,children:m})}))})};Zp.displayName=Za;var Ql="DialogOverlay",qp=g.forwardRef((r,l)=>{const i=Kp(Ql,r.__scopeDialog),{forceMount:a=i.forceMount,...c}=r,d=Tt(Ql,r.__scopeDialog);return d.modal?h.jsx(Rt,{present:a||d.open,children:h.jsx(qx,{...c,ref:l})}):null});qp.displayName=Ql;var Zx=cp("DialogOverlay.RemoveScroll"),qx=g.forwardRef((r,l)=>{const{__scopeDialog:i,...a}=r,c=Tt(Ql,i);return h.jsx(Vp,{as:Zx,allowPinchZoom:!0,shards:[c.contentRef],children:h.jsx(Le.div,{"data-state":Ja(c.open),...a,ref:l,style:{pointerEvents:"auto",...a.style}})})}),Wn="DialogContent",Jp=g.forwardRef((r,l)=>{const i=Kp(Wn,r.__scopeDialog),{forceMount:a=i.forceMount,...c}=r,d=Tt(Wn,r.__scopeDialog);return h.jsx(Rt,{present:a||d.open,children:d.modal?h.jsx(Jx,{...c,ref:l}):h.jsx(e0,{...c,ref:l})})});Jp.displayName=Wn;var Jx=g.forwardRef((r,l)=>{const i=Tt(Wn,r.__scopeDialog),a=g.useRef(null),c=We(l,i.contentRef,a);return g.useEffect(()=>{const d=a.current;if(d)return Yx(d)},[]),h.jsx(em,{...r,ref:c,trapFocus:i.open,disableOutsidePointerEvents:!0,onCloseAutoFocus:_e(r.onCloseAutoFocus,d=>{d.preventDefault(),i.triggerRef.current?.focus()}),onPointerDownOutside:_e(r.onPointerDownOutside,d=>{const m=d.detail.originalEvent,p=m.button===0&&m.ctrlKey===!0;(m.button===2||p)&&d.preventDefault()}),onFocusOutside:_e(r.onFocusOutside,d=>d.preventDefault())})}),e0=g.forwardRef((r,l)=>{const i=Tt(Wn,r.__scopeDialog),a=g.useRef(!1),c=g.useRef(!1);return h.jsx(em,{...r,ref:l,trapFocus:!1,disableOutsidePointerEvents:!1,onCloseAutoFocus:d=>{r.onCloseAutoFocus?.(d),d.defaultPrevented||(a.current||i.triggerRef.current?.focus(),d.preventDefault()),a.current=!1,c.current=!1},onInteractOutside:d=>{r.onInteractOutside?.(d),d.defaultPrevented||(a.current=!0,d.detail.originalEvent.type==="pointerdown"&&(c.current=!0));const m=d.target;i.triggerRef.current?.contains(m)&&d.preventDefault(),d.detail.originalEvent.type==="focusin"&&c.current&&d.preventDefault()}})}),em=g.forwardRef((r,l)=>{const{__scopeDialog:i,trapFocus:a,onOpenAutoFocus:c,onCloseAutoFocus:d,...m}=r,p=Tt(Wn,i),v=g.useRef(null),x=We(l,v);return sx(),h.jsxs(h.Fragment,{children:[h.jsx(Dp,{asChild:!0,loop:!0,trapped:a,onMountAutoFocus:c,onUnmountAutoFocus:d,children:h.jsx(ii,{role:"dialog",id:p.contentId,"aria-describedby":p.descriptionId,"aria-labelledby":p.titleId,"data-state":Ja(p.open),...m,ref:x,onDismiss:()=>p.onOpenChange(!1)})}),h.jsxs(h.Fragment,{children:[h.jsx(t0,{titleId:p.titleId}),h.jsx(r0,{contentRef:v,descriptionId:p.descriptionId})]})]})}),qa="DialogTitle",tm=g.forwardRef((r,l)=>{const{__scopeDialog:i,...a}=r,c=Tt(qa,i);return h.jsx(Le.h2,{id:c.titleId,...a,ref:l})});tm.displayName=qa;var nm="DialogDescription",rm=g.forwardRef((r,l)=>{const{__scopeDialog:i,...a}=r,c=Tt(nm,i);return h.jsx(Le.p,{id:c.descriptionId,...a,ref:l})});rm.displayName=nm;var om="DialogClose",lm=g.forwardRef((r,l)=>{const{__scopeDialog:i,...a}=r,c=Tt(om,i);return h.jsx(Le.button,{type:"button",...a,ref:l,onClick:_e(r.onClick,()=>c.onOpenChange(!1))})});lm.displayName=om;function Ja(r){return r?"open":"closed"}var im="DialogTitleWarning",[nS,sm]=Bv(im,{contentName:Wn,titleName:qa,docsSlug:"dialog"}),t0=({titleId:r})=>{const l=sm(im),i=`\`${l.contentName}\` requires a \`${l.titleName}\` for the component to be accessible for screen reader users. + +If you want to hide the \`${l.titleName}\`, you can wrap it with our VisuallyHidden component. + +For more information, see https://radix-ui.com/primitives/docs/components/${l.docsSlug}`;return g.useEffect(()=>{r&&(document.getElementById(r)||console.error(i))},[i,r]),null},n0="DialogDescriptionWarning",r0=({contentRef:r,descriptionId:l})=>{const a=`Warning: Missing \`Description\` or \`aria-describedby={undefined}\` for {${sm(n0).contentName}}.`;return g.useEffect(()=>{const c=r.current?.getAttribute("aria-describedby");l&&c&&(document.getElementById(l)||console.warn(a))},[a,r,l]),null},o0=Qp,l0=Zp,am=qp,um=Jp,cm=tm,dm=rm,i0=lm;const If=r=>typeof r=="boolean"?`${r}`:r===0?"0":r,zf=Np,s0=(r,l)=>i=>{var a;if(l?.variants==null)return zf(r,i?.class,i?.className);const{variants:c,defaultVariants:d}=l,m=Object.keys(c).map(x=>{const y=i?.[x],S=d?.[x];if(y===null)return null;const C=If(y)||If(S);return c[x][C]}),p=i&&Object.entries(i).reduce((x,y)=>{let[S,C]=y;return C===void 0||(x[S]=C),x},{}),v=l==null||(a=l.compoundVariants)===null||a===void 0?void 0:a.reduce((x,y)=>{let{class:S,className:C,...k}=y;return Object.entries(k).every(b=>{let[_,T]=b;return Array.isArray(T)?T.includes({...d,...p}[_]):{...d,...p}[_]===T})?[...x,S,C]:x},[]);return zf(r,m,v,i?.class,i?.className)},a0=o0,u0=l0,fm=g.forwardRef(({className:r,...l},i)=>h.jsx(am,{className:ge("fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",r),...l,ref:i}));fm.displayName=am.displayName;const c0=s0("fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500",{variants:{side:{top:"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top",bottom:"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom",left:"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm",right:"inset-y-0 right-0 h-full w-3/4 border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm"}},defaultVariants:{side:"right"}}),pm=g.forwardRef(({side:r="right",className:l,children:i,...a},c)=>h.jsxs(u0,{children:[h.jsx(fm,{}),h.jsxs(um,{ref:c,className:ge(c0({side:r}),l),...a,children:[i,h.jsxs(i0,{className:"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary",children:[h.jsx(Ov,{className:"h-4 w-4"}),h.jsx("span",{className:"sr-only",children:"Close"})]})]})]}));pm.displayName=um.displayName;const mm=({className:r,...l})=>h.jsx("div",{className:ge("flex flex-col space-y-2 text-center sm:text-left",r),...l});mm.displayName="SheetHeader";const hm=g.forwardRef(({className:r,...l},i)=>h.jsx(cm,{ref:i,className:ge("text-lg font-semibold text-foreground",r),...l}));hm.displayName=cm.displayName;const d0=g.forwardRef(({className:r,...l},i)=>h.jsx(dm,{ref:i,className:ge("text-sm text-muted-foreground",r),...l}));d0.displayName=dm.displayName;const f0=["top","right","bottom","left"],_n=Math.min,ct=Math.max,Xl=Math.round,Hl=Math.floor,zt=r=>({x:r,y:r}),p0={left:"right",right:"left",bottom:"top",top:"bottom"};function za(r,l,i){return ct(r,_n(l,i))}function qt(r,l){return typeof r=="function"?r(l):r}function Jt(r){return r.split("-")[0]}function Rr(r){return r.split("-")[1]}function eu(r){return r==="x"?"y":"x"}function tu(r){return r==="y"?"height":"width"}function It(r){const l=r[0];return l==="t"||l==="b"?"y":"x"}function nu(r){return eu(It(r))}function m0(r,l,i){i===void 0&&(i=!1);const a=Rr(r),c=nu(r),d=tu(c);let m=c==="x"?a===(i?"end":"start")?"right":"left":a==="start"?"bottom":"top";return l.reference[d]>l.floating[d]&&(m=Kl(m)),[m,Kl(m)]}function h0(r){const l=Kl(r);return[Fa(r),l,Fa(l)]}function Fa(r){return r.includes("start")?r.replace("start","end"):r.replace("end","start")}const Ff=["left","right"],$f=["right","left"],g0=["top","bottom"],v0=["bottom","top"];function y0(r,l,i){switch(r){case"top":case"bottom":return i?l?$f:Ff:l?Ff:$f;case"left":case"right":return l?g0:v0;default:return[]}}function x0(r,l,i,a){const c=Rr(r);let d=y0(Jt(r),i==="start",a);return c&&(d=d.map(m=>m+"-"+c),l&&(d=d.concat(d.map(Fa)))),d}function Kl(r){const l=Jt(r);return p0[l]+r.slice(l.length)}function w0(r){return{top:0,right:0,bottom:0,left:0,...r}}function gm(r){return typeof r!="number"?w0(r):{top:r,right:r,bottom:r,left:r}}function Zl(r){const{x:l,y:i,width:a,height:c}=r;return{width:a,height:c,top:i,left:l,right:l+a,bottom:i+c,x:l,y:i}}function Wf(r,l,i){let{reference:a,floating:c}=r;const d=It(l),m=nu(l),p=tu(m),v=Jt(l),x=d==="y",y=a.x+a.width/2-c.width/2,S=a.y+a.height/2-c.height/2,C=a[p]/2-c[p]/2;let k;switch(v){case"top":k={x:y,y:a.y-c.height};break;case"bottom":k={x:y,y:a.y+a.height};break;case"right":k={x:a.x+a.width,y:S};break;case"left":k={x:a.x-c.width,y:S};break;default:k={x:a.x,y:a.y}}switch(Rr(l)){case"start":k[m]-=C*(i&&x?-1:1);break;case"end":k[m]+=C*(i&&x?-1:1);break}return k}async function S0(r,l){var i;l===void 0&&(l={});const{x:a,y:c,platform:d,rects:m,elements:p,strategy:v}=r,{boundary:x="clippingAncestors",rootBoundary:y="viewport",elementContext:S="floating",altBoundary:C=!1,padding:k=0}=qt(l,r),b=gm(k),T=p[C?S==="floating"?"reference":"floating":S],A=Zl(await d.getClippingRect({element:(i=await(d.isElement==null?void 0:d.isElement(T)))==null||i?T:T.contextElement||await(d.getDocumentElement==null?void 0:d.getDocumentElement(p.floating)),boundary:x,rootBoundary:y,strategy:v})),L=S==="floating"?{x:a,y:c,width:m.floating.width,height:m.floating.height}:m.reference,$=await(d.getOffsetParent==null?void 0:d.getOffsetParent(p.floating)),M=await(d.isElement==null?void 0:d.isElement($))?await(d.getScale==null?void 0:d.getScale($))||{x:1,y:1}:{x:1,y:1},U=Zl(d.convertOffsetParentRelativeRectToViewportRelativeRect?await d.convertOffsetParentRelativeRectToViewportRelativeRect({elements:p,rect:L,offsetParent:$,strategy:v}):L);return{top:(A.top-U.top+b.top)/M.y,bottom:(U.bottom-A.bottom+b.bottom)/M.y,left:(A.left-U.left+b.left)/M.x,right:(U.right-A.right+b.right)/M.x}}const C0=50,E0=async(r,l,i)=>{const{placement:a="bottom",strategy:c="absolute",middleware:d=[],platform:m}=i,p=m.detectOverflow?m:{...m,detectOverflow:S0},v=await(m.isRTL==null?void 0:m.isRTL(l));let x=await m.getElementRects({reference:r,floating:l,strategy:c}),{x:y,y:S}=Wf(x,a,v),C=a,k=0;const b={};for(let _=0;_({name:"arrow",options:r,async fn(l){const{x:i,y:a,placement:c,rects:d,platform:m,elements:p,middlewareData:v}=l,{element:x,padding:y=0}=qt(r,l)||{};if(x==null)return{};const S=gm(y),C={x:i,y:a},k=nu(c),b=tu(k),_=await m.getDimensions(x),T=k==="y",A=T?"top":"left",L=T?"bottom":"right",$=T?"clientHeight":"clientWidth",M=d.reference[b]+d.reference[k]-C[k]-d.floating[b],U=C[k]-d.reference[k],G=await(m.getOffsetParent==null?void 0:m.getOffsetParent(x));let B=G?G[$]:0;(!B||!await(m.isElement==null?void 0:m.isElement(G)))&&(B=p.floating[$]||d.floating[b]);const ie=M/2-U/2,te=B/2-_[b]/2-1,ne=_n(S[A],te),ue=_n(S[L],te),J=ne,me=B-_[b]-ue,ce=B/2-_[b]/2+ie,ee=za(J,ce,me),le=!v.arrow&&Rr(c)!=null&&ce!==ee&&d.reference[b]/2-(cece<=0)){var ue,J;const ce=(((ue=d.flip)==null?void 0:ue.index)||0)+1,ee=B[ce];if(ee&&(!(S==="alignment"?L!==It(ee):!1)||ne.every(D=>It(D.placement)===L?D.overflows[0]>0:!0)))return{data:{index:ce,overflows:ne},reset:{placement:ee}};let le=(J=ne.filter(se=>se.overflows[0]<=0).sort((se,D)=>se.overflows[1]-D.overflows[1])[0])==null?void 0:J.placement;if(!le)switch(k){case"bestFit":{var me;const se=(me=ne.filter(D=>{if(G){const Y=It(D.placement);return Y===L||Y==="y"}return!0}).map(D=>[D.placement,D.overflows.filter(Y=>Y>0).reduce((Y,V)=>Y+V,0)]).sort((D,Y)=>D[1]-Y[1])[0])==null?void 0:me[0];se&&(le=se);break}case"initialPlacement":le=p;break}if(c!==le)return{reset:{placement:le}}}return{}}}};function Hf(r,l){return{top:r.top-l.height,right:r.right-l.width,bottom:r.bottom-l.height,left:r.left-l.width}}function Uf(r){return f0.some(l=>r[l]>=0)}const N0=function(r){return r===void 0&&(r={}),{name:"hide",options:r,async fn(l){const{rects:i,platform:a}=l,{strategy:c="referenceHidden",...d}=qt(r,l);switch(c){case"referenceHidden":{const m=await a.detectOverflow(l,{...d,elementContext:"reference"}),p=Hf(m,i.reference);return{data:{referenceHiddenOffsets:p,referenceHidden:Uf(p)}}}case"escaped":{const m=await a.detectOverflow(l,{...d,altBoundary:!0}),p=Hf(m,i.floating);return{data:{escapedOffsets:p,escaped:Uf(p)}}}default:return{}}}}},vm=new Set(["left","top"]);async function P0(r,l){const{placement:i,platform:a,elements:c}=r,d=await(a.isRTL==null?void 0:a.isRTL(c.floating)),m=Jt(i),p=Rr(i),v=It(i)==="y",x=vm.has(m)?-1:1,y=d&&v?-1:1,S=qt(l,r);let{mainAxis:C,crossAxis:k,alignmentAxis:b}=typeof S=="number"?{mainAxis:S,crossAxis:0,alignmentAxis:null}:{mainAxis:S.mainAxis||0,crossAxis:S.crossAxis||0,alignmentAxis:S.alignmentAxis};return p&&typeof b=="number"&&(k=p==="end"?b*-1:b),v?{x:k*y,y:C*x}:{x:C*x,y:k*y}}const b0=function(r){return r===void 0&&(r=0),{name:"offset",options:r,async fn(l){var i,a;const{x:c,y:d,placement:m,middlewareData:p}=l,v=await P0(l,r);return m===((i=p.offset)==null?void 0:i.placement)&&(a=p.arrow)!=null&&a.alignmentOffset?{}:{x:c+v.x,y:d+v.y,data:{...v,placement:m}}}}},R0=function(r){return r===void 0&&(r={}),{name:"shift",options:r,async fn(l){const{x:i,y:a,placement:c,platform:d}=l,{mainAxis:m=!0,crossAxis:p=!1,limiter:v={fn:A=>{let{x:L,y:$}=A;return{x:L,y:$}}},...x}=qt(r,l),y={x:i,y:a},S=await d.detectOverflow(l,x),C=It(Jt(c)),k=eu(C);let b=y[k],_=y[C];if(m){const A=k==="y"?"top":"left",L=k==="y"?"bottom":"right",$=b+S[A],M=b-S[L];b=za($,b,M)}if(p){const A=C==="y"?"top":"left",L=C==="y"?"bottom":"right",$=_+S[A],M=_-S[L];_=za($,_,M)}const T=v.fn({...l,[k]:b,[C]:_});return{...T,data:{x:T.x-i,y:T.y-a,enabled:{[k]:m,[C]:p}}}}}},T0=function(r){return r===void 0&&(r={}),{options:r,fn(l){const{x:i,y:a,placement:c,rects:d,middlewareData:m}=l,{offset:p=0,mainAxis:v=!0,crossAxis:x=!0}=qt(r,l),y={x:i,y:a},S=It(c),C=eu(S);let k=y[C],b=y[S];const _=qt(p,l),T=typeof _=="number"?{mainAxis:_,crossAxis:0}:{mainAxis:0,crossAxis:0,..._};if(v){const $=C==="y"?"height":"width",M=d.reference[C]-d.floating[$]+T.mainAxis,U=d.reference[C]+d.reference[$]-T.mainAxis;kU&&(k=U)}if(x){var A,L;const $=C==="y"?"width":"height",M=vm.has(Jt(c)),U=d.reference[S]-d.floating[$]+(M&&((A=m.offset)==null?void 0:A[S])||0)+(M?0:T.crossAxis),G=d.reference[S]+d.reference[$]+(M?0:((L=m.offset)==null?void 0:L[S])||0)-(M?T.crossAxis:0);bG&&(b=G)}return{[C]:k,[S]:b}}}},j0=function(r){return r===void 0&&(r={}),{name:"size",options:r,async fn(l){var i,a;const{placement:c,rects:d,platform:m,elements:p}=l,{apply:v=()=>{},...x}=qt(r,l),y=await m.detectOverflow(l,x),S=Jt(c),C=Rr(c),k=It(c)==="y",{width:b,height:_}=d.floating;let T,A;S==="top"||S==="bottom"?(T=S,A=C===(await(m.isRTL==null?void 0:m.isRTL(p.floating))?"start":"end")?"left":"right"):(A=S,T=C==="end"?"top":"bottom");const L=_-y.top-y.bottom,$=b-y.left-y.right,M=_n(_-y[T],L),U=_n(b-y[A],$),G=!l.middlewareData.shift;let B=M,ie=U;if((i=l.middlewareData.shift)!=null&&i.enabled.x&&(ie=$),(a=l.middlewareData.shift)!=null&&a.enabled.y&&(B=L),G&&!C){const ne=ct(y.left,0),ue=ct(y.right,0),J=ct(y.top,0),me=ct(y.bottom,0);k?ie=b-2*(ne!==0||ue!==0?ne+ue:ct(y.left,y.right)):B=_-2*(J!==0||me!==0?J+me:ct(y.top,y.bottom))}await v({...l,availableWidth:ie,availableHeight:B});const te=await m.getDimensions(p.floating);return b!==te.width||_!==te.height?{reset:{rects:!0}}:{}}}};function ui(){return typeof window<"u"}function Tr(r){return ym(r)?(r.nodeName||"").toLowerCase():"#document"}function ft(r){var l;return(r==null||(l=r.ownerDocument)==null?void 0:l.defaultView)||window}function Wt(r){var l;return(l=(ym(r)?r.ownerDocument:r.document)||window.document)==null?void 0:l.documentElement}function ym(r){return ui()?r instanceof Node||r instanceof ft(r).Node:!1}function Pt(r){return ui()?r instanceof Element||r instanceof ft(r).Element:!1}function en(r){return ui()?r instanceof HTMLElement||r instanceof ft(r).HTMLElement:!1}function Bf(r){return!ui()||typeof ShadowRoot>"u"?!1:r instanceof ShadowRoot||r instanceof ft(r).ShadowRoot}function _o(r){const{overflow:l,overflowX:i,overflowY:a,display:c}=bt(r);return/auto|scroll|overlay|hidden|clip/.test(l+a+i)&&c!=="inline"&&c!=="contents"}function O0(r){return/^(table|td|th)$/.test(Tr(r))}function ci(r){try{if(r.matches(":popover-open"))return!0}catch{}try{return r.matches(":modal")}catch{return!1}}const A0=/transform|translate|scale|rotate|perspective|filter/,L0=/paint|layout|strict|content/,Fn=r=>!!r&&r!=="none";let Ra;function ru(r){const l=Pt(r)?bt(r):r;return Fn(l.transform)||Fn(l.translate)||Fn(l.scale)||Fn(l.rotate)||Fn(l.perspective)||!ou()&&(Fn(l.backdropFilter)||Fn(l.filter))||A0.test(l.willChange||"")||L0.test(l.contain||"")}function D0(r){let l=kn(r);for(;en(l)&&!_r(l);){if(ru(l))return l;if(ci(l))return null;l=kn(l)}return null}function ou(){return Ra==null&&(Ra=typeof CSS<"u"&&CSS.supports&&CSS.supports("-webkit-backdrop-filter","none")),Ra}function _r(r){return/^(html|body|#document)$/.test(Tr(r))}function bt(r){return ft(r).getComputedStyle(r)}function di(r){return Pt(r)?{scrollLeft:r.scrollLeft,scrollTop:r.scrollTop}:{scrollLeft:r.scrollX,scrollTop:r.scrollY}}function kn(r){if(Tr(r)==="html")return r;const l=r.assignedSlot||r.parentNode||Bf(r)&&r.host||Wt(r);return Bf(l)?l.host:l}function xm(r){const l=kn(r);return _r(l)?r.ownerDocument?r.ownerDocument.body:r.body:en(l)&&_o(l)?l:xm(l)}function Co(r,l,i){var a;l===void 0&&(l=[]),i===void 0&&(i=!0);const c=xm(r),d=c===((a=r.ownerDocument)==null?void 0:a.body),m=ft(c);if(d){const p=$a(m);return l.concat(m,m.visualViewport||[],_o(c)?c:[],p&&i?Co(p):[])}else return l.concat(c,Co(c,[],i))}function $a(r){return r.parent&&Object.getPrototypeOf(r.parent)?r.frameElement:null}function wm(r){const l=bt(r);let i=parseFloat(l.width)||0,a=parseFloat(l.height)||0;const c=en(r),d=c?r.offsetWidth:i,m=c?r.offsetHeight:a,p=Xl(i)!==d||Xl(a)!==m;return p&&(i=d,a=m),{width:i,height:a,$:p}}function lu(r){return Pt(r)?r:r.contextElement}function Cr(r){const l=lu(r);if(!en(l))return zt(1);const i=l.getBoundingClientRect(),{width:a,height:c,$:d}=wm(l);let m=(d?Xl(i.width):i.width)/a,p=(d?Xl(i.height):i.height)/c;return(!m||!Number.isFinite(m))&&(m=1),(!p||!Number.isFinite(p))&&(p=1),{x:m,y:p}}const M0=zt(0);function Sm(r){const l=ft(r);return!ou()||!l.visualViewport?M0:{x:l.visualViewport.offsetLeft,y:l.visualViewport.offsetTop}}function I0(r,l,i){return l===void 0&&(l=!1),!i||l&&i!==ft(r)?!1:l}function Hn(r,l,i,a){l===void 0&&(l=!1),i===void 0&&(i=!1);const c=r.getBoundingClientRect(),d=lu(r);let m=zt(1);l&&(a?Pt(a)&&(m=Cr(a)):m=Cr(r));const p=I0(d,i,a)?Sm(d):zt(0);let v=(c.left+p.x)/m.x,x=(c.top+p.y)/m.y,y=c.width/m.x,S=c.height/m.y;if(d){const C=ft(d),k=a&&Pt(a)?ft(a):a;let b=C,_=$a(b);for(;_&&a&&k!==b;){const T=Cr(_),A=_.getBoundingClientRect(),L=bt(_),$=A.left+(_.clientLeft+parseFloat(L.paddingLeft))*T.x,M=A.top+(_.clientTop+parseFloat(L.paddingTop))*T.y;v*=T.x,x*=T.y,y*=T.x,S*=T.y,v+=$,x+=M,b=ft(_),_=$a(b)}}return Zl({width:y,height:S,x:v,y:x})}function fi(r,l){const i=di(r).scrollLeft;return l?l.left+i:Hn(Wt(r)).left+i}function Cm(r,l){const i=r.getBoundingClientRect(),a=i.left+l.scrollLeft-fi(r,i),c=i.top+l.scrollTop;return{x:a,y:c}}function z0(r){let{elements:l,rect:i,offsetParent:a,strategy:c}=r;const d=c==="fixed",m=Wt(a),p=l?ci(l.floating):!1;if(a===m||p&&d)return i;let v={scrollLeft:0,scrollTop:0},x=zt(1);const y=zt(0),S=en(a);if((S||!S&&!d)&&((Tr(a)!=="body"||_o(m))&&(v=di(a)),S)){const k=Hn(a);x=Cr(a),y.x=k.x+a.clientLeft,y.y=k.y+a.clientTop}const C=m&&!S&&!d?Cm(m,v):zt(0);return{width:i.width*x.x,height:i.height*x.y,x:i.x*x.x-v.scrollLeft*x.x+y.x+C.x,y:i.y*x.y-v.scrollTop*x.y+y.y+C.y}}function F0(r){return Array.from(r.getClientRects())}function $0(r){const l=Wt(r),i=di(r),a=r.ownerDocument.body,c=ct(l.scrollWidth,l.clientWidth,a.scrollWidth,a.clientWidth),d=ct(l.scrollHeight,l.clientHeight,a.scrollHeight,a.clientHeight);let m=-i.scrollLeft+fi(r);const p=-i.scrollTop;return bt(a).direction==="rtl"&&(m+=ct(l.clientWidth,a.clientWidth)-c),{width:c,height:d,x:m,y:p}}const Vf=25;function W0(r,l){const i=ft(r),a=Wt(r),c=i.visualViewport;let d=a.clientWidth,m=a.clientHeight,p=0,v=0;if(c){d=c.width,m=c.height;const y=ou();(!y||y&&l==="fixed")&&(p=c.offsetLeft,v=c.offsetTop)}const x=fi(a);if(x<=0){const y=a.ownerDocument,S=y.body,C=getComputedStyle(S),k=y.compatMode==="CSS1Compat"&&parseFloat(C.marginLeft)+parseFloat(C.marginRight)||0,b=Math.abs(a.clientWidth-S.clientWidth-k);b<=Vf&&(d-=b)}else x<=Vf&&(d+=x);return{width:d,height:m,x:p,y:v}}function H0(r,l){const i=Hn(r,!0,l==="fixed"),a=i.top+r.clientTop,c=i.left+r.clientLeft,d=en(r)?Cr(r):zt(1),m=r.clientWidth*d.x,p=r.clientHeight*d.y,v=c*d.x,x=a*d.y;return{width:m,height:p,x:v,y:x}}function Gf(r,l,i){let a;if(l==="viewport")a=W0(r,i);else if(l==="document")a=$0(Wt(r));else if(Pt(l))a=H0(l,i);else{const c=Sm(r);a={x:l.x-c.x,y:l.y-c.y,width:l.width,height:l.height}}return Zl(a)}function Em(r,l){const i=kn(r);return i===l||!Pt(i)||_r(i)?!1:bt(i).position==="fixed"||Em(i,l)}function U0(r,l){const i=l.get(r);if(i)return i;let a=Co(r,[],!1).filter(p=>Pt(p)&&Tr(p)!=="body"),c=null;const d=bt(r).position==="fixed";let m=d?kn(r):r;for(;Pt(m)&&!_r(m);){const p=bt(m),v=ru(m);!v&&p.position==="fixed"&&(c=null),(d?!v&&!c:!v&&p.position==="static"&&!!c&&(c.position==="absolute"||c.position==="fixed")||_o(m)&&!v&&Em(r,m))?a=a.filter(y=>y!==m):c=p,m=kn(m)}return l.set(r,a),a}function B0(r){let{element:l,boundary:i,rootBoundary:a,strategy:c}=r;const m=[...i==="clippingAncestors"?ci(l)?[]:U0(l,this._c):[].concat(i),a],p=Gf(l,m[0],c);let v=p.top,x=p.right,y=p.bottom,S=p.left;for(let C=1;C{m(!1,1e-7)},1e3)}B===1&&!km(x,r.getBoundingClientRect())&&m(),M=!1}try{i=new IntersectionObserver(U,{...$,root:c.ownerDocument})}catch{i=new IntersectionObserver(U,$)}i.observe(r)}return m(!0),d}function Z0(r,l,i,a){a===void 0&&(a={});const{ancestorScroll:c=!0,ancestorResize:d=!0,elementResize:m=typeof ResizeObserver=="function",layoutShift:p=typeof IntersectionObserver=="function",animationFrame:v=!1}=a,x=lu(r),y=c||d?[...x?Co(x):[],...l?Co(l):[]]:[];y.forEach(A=>{c&&A.addEventListener("scroll",i,{passive:!0}),d&&A.addEventListener("resize",i)});const S=x&&p?K0(x,i):null;let C=-1,k=null;m&&(k=new ResizeObserver(A=>{let[L]=A;L&&L.target===x&&k&&l&&(k.unobserve(l),cancelAnimationFrame(C),C=requestAnimationFrame(()=>{var $;($=k)==null||$.observe(l)})),i()}),x&&!v&&k.observe(x),l&&k.observe(l));let b,_=v?Hn(r):null;v&&T();function T(){const A=Hn(r);_&&!km(_,A)&&i(),_=A,b=requestAnimationFrame(T)}return i(),()=>{var A;y.forEach(L=>{c&&L.removeEventListener("scroll",i),d&&L.removeEventListener("resize",i)}),S?.(),(A=k)==null||A.disconnect(),k=null,v&&cancelAnimationFrame(b)}}const q0=b0,J0=R0,ew=k0,tw=j0,nw=N0,Qf=_0,rw=T0,ow=(r,l,i)=>{const a=new Map,c={platform:X0,...i},d={...c.platform,_c:a};return E0(r,l,{...c,platform:d})};var lw=typeof document<"u",iw=function(){},Vl=lw?g.useLayoutEffect:iw;function ql(r,l){if(r===l)return!0;if(typeof r!=typeof l)return!1;if(typeof r=="function"&&r.toString()===l.toString())return!0;let i,a,c;if(r&&l&&typeof r=="object"){if(Array.isArray(r)){if(i=r.length,i!==l.length)return!1;for(a=i;a--!==0;)if(!ql(r[a],l[a]))return!1;return!0}if(c=Object.keys(r),i=c.length,i!==Object.keys(l).length)return!1;for(a=i;a--!==0;)if(!{}.hasOwnProperty.call(l,c[a]))return!1;for(a=i;a--!==0;){const d=c[a];if(!(d==="_owner"&&r.$$typeof)&&!ql(r[d],l[d]))return!1}return!0}return r!==r&&l!==l}function Nm(r){return typeof window>"u"?1:(r.ownerDocument.defaultView||window).devicePixelRatio||1}function Xf(r,l){const i=Nm(r);return Math.round(l*i)/i}function ja(r){const l=g.useRef(r);return Vl(()=>{l.current=r}),l}function sw(r){r===void 0&&(r={});const{placement:l="bottom",strategy:i="absolute",middleware:a=[],platform:c,elements:{reference:d,floating:m}={},transform:p=!0,whileElementsMounted:v,open:x}=r,[y,S]=g.useState({x:0,y:0,strategy:i,placement:l,middlewareData:{},isPositioned:!1}),[C,k]=g.useState(a);ql(C,a)||k(a);const[b,_]=g.useState(null),[T,A]=g.useState(null),L=g.useCallback(D=>{D!==G.current&&(G.current=D,_(D))},[]),$=g.useCallback(D=>{D!==B.current&&(B.current=D,A(D))},[]),M=d||b,U=m||T,G=g.useRef(null),B=g.useRef(null),ie=g.useRef(y),te=v!=null,ne=ja(v),ue=ja(c),J=ja(x),me=g.useCallback(()=>{if(!G.current||!B.current)return;const D={placement:l,strategy:i,middleware:C};ue.current&&(D.platform=ue.current),ow(G.current,B.current,D).then(Y=>{const V={...Y,isPositioned:J.current!==!1};ce.current&&!ql(ie.current,V)&&(ie.current=V,Va.flushSync(()=>{S(V)}))})},[C,l,i,ue,J]);Vl(()=>{x===!1&&ie.current.isPositioned&&(ie.current.isPositioned=!1,S(D=>({...D,isPositioned:!1})))},[x]);const ce=g.useRef(!1);Vl(()=>(ce.current=!0,()=>{ce.current=!1}),[]),Vl(()=>{if(M&&(G.current=M),U&&(B.current=U),M&&U){if(ne.current)return ne.current(M,U,me);me()}},[M,U,me,ne,te]);const ee=g.useMemo(()=>({reference:G,floating:B,setReference:L,setFloating:$}),[L,$]),le=g.useMemo(()=>({reference:M,floating:U}),[M,U]),se=g.useMemo(()=>{const D={position:i,left:0,top:0};if(!le.floating)return D;const Y=Xf(le.floating,y.x),V=Xf(le.floating,y.y);return p?{...D,transform:"translate("+Y+"px, "+V+"px)",...Nm(le.floating)>=1.5&&{willChange:"transform"}}:{position:i,left:Y,top:V}},[i,p,le.floating,y.x,y.y]);return g.useMemo(()=>({...y,update:me,refs:ee,elements:le,floatingStyles:se}),[y,me,ee,le,se])}const aw=r=>{function l(i){return{}.hasOwnProperty.call(i,"current")}return{name:"arrow",options:r,fn(i){const{element:a,padding:c}=typeof r=="function"?r(i):r;return a&&l(a)?a.current!=null?Qf({element:a.current,padding:c}).fn(i):{}:a?Qf({element:a,padding:c}).fn(i):{}}}},uw=(r,l)=>{const i=q0(r);return{name:i.name,fn:i.fn,options:[r,l]}},cw=(r,l)=>{const i=J0(r);return{name:i.name,fn:i.fn,options:[r,l]}},dw=(r,l)=>({fn:rw(r).fn,options:[r,l]}),fw=(r,l)=>{const i=ew(r);return{name:i.name,fn:i.fn,options:[r,l]}},pw=(r,l)=>{const i=tw(r);return{name:i.name,fn:i.fn,options:[r,l]}},mw=(r,l)=>{const i=nw(r);return{name:i.name,fn:i.fn,options:[r,l]}},hw=(r,l)=>{const i=aw(r);return{name:i.name,fn:i.fn,options:[r,l]}};var gw="Arrow",Pm=g.forwardRef((r,l)=>{const{children:i,width:a=10,height:c=5,...d}=r;return h.jsx(Le.svg,{...d,ref:l,width:a,height:c,viewBox:"0 0 30 10",preserveAspectRatio:"none",children:r.asChild?i:h.jsx("polygon",{points:"0,0 30,0 15,10"})})});Pm.displayName=gw;var vw=Pm;function yw(r){const[l,i]=g.useState(void 0);return Ft(()=>{if(r){i({width:r.offsetWidth,height:r.offsetHeight});const a=new ResizeObserver(c=>{if(!Array.isArray(c)||!c.length)return;const d=c[0];let m,p;if("borderBoxSize"in d){const v=d.borderBoxSize,x=Array.isArray(v)?v[0]:v;m=x.inlineSize,p=x.blockSize}else m=r.offsetWidth,p=r.offsetHeight;i({width:m,height:p})});return a.observe(r,{box:"border-box"}),()=>a.unobserve(r)}else i(void 0)},[r]),l}var iu="Popper",[bm,pi]=Pr(iu),[xw,Rm]=bm(iu),Tm=r=>{const{__scopePopper:l,children:i}=r,[a,c]=g.useState(null);return h.jsx(xw,{scope:l,anchor:a,onAnchorChange:c,children:i})};Tm.displayName=iu;var jm="PopperAnchor",Om=g.forwardRef((r,l)=>{const{__scopePopper:i,virtualRef:a,...c}=r,d=Rm(jm,i),m=g.useRef(null),p=We(l,m),v=g.useRef(null);return g.useEffect(()=>{const x=v.current;v.current=a?.current||m.current,x!==v.current&&d.onAnchorChange(v.current)}),a?null:h.jsx(Le.div,{...c,ref:p})});Om.displayName=jm;var su="PopperContent",[ww,Sw]=bm(su),Am=g.forwardRef((r,l)=>{const{__scopePopper:i,side:a="bottom",sideOffset:c=0,align:d="center",alignOffset:m=0,arrowPadding:p=0,avoidCollisions:v=!0,collisionBoundary:x=[],collisionPadding:y=0,sticky:S="partial",hideWhenDetached:C=!1,updatePositionStrategy:k="optimized",onPlaced:b,..._}=r,T=Rm(su,i),[A,L]=g.useState(null),$=We(l,Se=>L(Se)),[M,U]=g.useState(null),G=yw(M),B=G?.width??0,ie=G?.height??0,te=a+(d!=="center"?"-"+d:""),ne=typeof y=="number"?y:{top:0,right:0,bottom:0,left:0,...y},ue=Array.isArray(x)?x:[x],J=ue.length>0,me={padding:ne,boundary:ue.filter(Ew),altBoundary:J},{refs:ce,floatingStyles:ee,placement:le,isPositioned:se,middlewareData:D}=sw({strategy:"fixed",placement:te,whileElementsMounted:(...Se)=>Z0(...Se,{animationFrame:k==="always"}),elements:{reference:T.anchor},middleware:[uw({mainAxis:c+ie,alignmentAxis:m}),v&&cw({mainAxis:!0,crossAxis:!1,limiter:S==="partial"?dw():void 0,...me}),v&&fw({...me}),pw({...me,apply:({elements:Se,rects:Ce,availableWidth:Ne,availableHeight:Ze})=>{const{width:Un,height:Po}=Ce.reference,Ht=Se.floating.style;Ht.setProperty("--radix-popper-available-width",`${Ne}px`),Ht.setProperty("--radix-popper-available-height",`${Ze}px`),Ht.setProperty("--radix-popper-anchor-width",`${Un}px`),Ht.setProperty("--radix-popper-anchor-height",`${Po}px`)}}),M&&hw({element:M,padding:p}),_w({arrowWidth:B,arrowHeight:ie}),C&&mw({strategy:"referenceHidden",...me})]}),[Y,V]=Mm(le),P=dt(b);Ft(()=>{se&&P?.()},[se,P]);const I=D.arrow?.x,de=D.arrow?.y,pe=D.arrow?.centerOffset!==0,[ve,ye]=g.useState();return Ft(()=>{A&&ye(window.getComputedStyle(A).zIndex)},[A]),h.jsx("div",{ref:ce.setFloating,"data-radix-popper-content-wrapper":"",style:{...ee,transform:se?ee.transform:"translate(0, -200%)",minWidth:"max-content",zIndex:ve,"--radix-popper-transform-origin":[D.transformOrigin?.x,D.transformOrigin?.y].join(" "),...D.hide?.referenceHidden&&{visibility:"hidden",pointerEvents:"none"}},dir:r.dir,children:h.jsx(ww,{scope:i,placedSide:Y,onArrowChange:U,arrowX:I,arrowY:de,shouldHideArrow:pe,children:h.jsx(Le.div,{"data-side":Y,"data-align":V,..._,ref:$,style:{..._.style,animation:se?void 0:"none"}})})})});Am.displayName=su;var Lm="PopperArrow",Cw={top:"bottom",right:"left",bottom:"top",left:"right"},Dm=g.forwardRef(function(l,i){const{__scopePopper:a,...c}=l,d=Sw(Lm,a),m=Cw[d.placedSide];return h.jsx("span",{ref:d.onArrowChange,style:{position:"absolute",left:d.arrowX,top:d.arrowY,[m]:0,transformOrigin:{top:"",right:"0 0",bottom:"center 0",left:"100% 0"}[d.placedSide],transform:{top:"translateY(100%)",right:"translateY(50%) rotate(90deg) translateX(-50%)",bottom:"rotate(180deg)",left:"translateY(50%) rotate(-90deg) translateX(50%)"}[d.placedSide],visibility:d.shouldHideArrow?"hidden":void 0},children:h.jsx(vw,{...c,ref:i,style:{...c.style,display:"block"}})})});Dm.displayName=Lm;function Ew(r){return r!==null}var _w=r=>({name:"transformOrigin",options:r,fn(l){const{placement:i,rects:a,middlewareData:c}=l,m=c.arrow?.centerOffset!==0,p=m?0:r.arrowWidth,v=m?0:r.arrowHeight,[x,y]=Mm(i),S={start:"0%",center:"50%",end:"100%"}[y],C=(c.arrow?.x??0)+p/2,k=(c.arrow?.y??0)+v/2;let b="",_="";return x==="bottom"?(b=m?S:`${C}px`,_=`${-v}px`):x==="top"?(b=m?S:`${C}px`,_=`${a.floating.height+v}px`):x==="right"?(b=`${-v}px`,_=m?S:`${k}px`):x==="left"&&(b=`${a.floating.width+v}px`,_=m?S:`${k}px`),{data:{x:b,y:_}}}});function Mm(r){const[l,i="center"]=r.split("-");return[l,i]}var Im=Tm,zm=Om,Fm=Am,$m=Dm,kw=Object.freeze({position:"absolute",border:0,width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",wordWrap:"normal"}),Nw="VisuallyHidden",Wm=g.forwardRef((r,l)=>h.jsx(Le.span,{...r,ref:l,style:{...kw,...r.style}}));Wm.displayName=Nw;var Pw=Wm,[mi]=Pr("Tooltip",[pi]),hi=pi(),Hm="TooltipProvider",bw=700,Wa="tooltip.open",[Rw,au]=mi(Hm),Um=r=>{const{__scopeTooltip:l,delayDuration:i=bw,skipDelayDuration:a=300,disableHoverableContent:c=!1,children:d}=r,m=g.useRef(!0),p=g.useRef(!1),v=g.useRef(0);return g.useEffect(()=>{const x=v.current;return()=>window.clearTimeout(x)},[]),h.jsx(Rw,{scope:l,isOpenDelayedRef:m,delayDuration:i,onOpen:g.useCallback(()=>{window.clearTimeout(v.current),m.current=!1},[]),onClose:g.useCallback(()=>{window.clearTimeout(v.current),v.current=window.setTimeout(()=>m.current=!0,a)},[a]),isPointerInTransitRef:p,onPointerInTransitChange:g.useCallback(x=>{p.current=x},[]),disableHoverableContent:c,children:d})};Um.displayName=Hm;var Eo="Tooltip",[Tw,gi]=mi(Eo),Bm=r=>{const{__scopeTooltip:l,children:i,open:a,defaultOpen:c,onOpenChange:d,disableHoverableContent:m,delayDuration:p}=r,v=au(Eo,r.__scopeTooltip),x=hi(l),[y,S]=g.useState(null),C=So(),k=g.useRef(0),b=m??v.disableHoverableContent,_=p??v.delayDuration,T=g.useRef(!1),[A,L]=li({prop:a,defaultProp:c??!1,onChange:B=>{B?(v.onOpen(),document.dispatchEvent(new CustomEvent(Wa))):v.onClose(),d?.(B)},caller:Eo}),$=g.useMemo(()=>A?T.current?"delayed-open":"instant-open":"closed",[A]),M=g.useCallback(()=>{window.clearTimeout(k.current),k.current=0,T.current=!1,L(!0)},[L]),U=g.useCallback(()=>{window.clearTimeout(k.current),k.current=0,L(!1)},[L]),G=g.useCallback(()=>{window.clearTimeout(k.current),k.current=window.setTimeout(()=>{T.current=!0,L(!0),k.current=0},_)},[_,L]);return g.useEffect(()=>()=>{k.current&&(window.clearTimeout(k.current),k.current=0)},[]),h.jsx(Im,{...x,children:h.jsx(Tw,{scope:l,contentId:C,open:A,stateAttribute:$,trigger:y,onTriggerChange:S,onTriggerEnter:g.useCallback(()=>{v.isOpenDelayedRef.current?G():M()},[v.isOpenDelayedRef,G,M]),onTriggerLeave:g.useCallback(()=>{b?U():(window.clearTimeout(k.current),k.current=0)},[U,b]),onOpen:M,onClose:U,disableHoverableContent:b,children:i})})};Bm.displayName=Eo;var Ha="TooltipTrigger",Vm=g.forwardRef((r,l)=>{const{__scopeTooltip:i,...a}=r,c=gi(Ha,i),d=au(Ha,i),m=hi(i),p=g.useRef(null),v=We(l,p,c.onTriggerChange),x=g.useRef(!1),y=g.useRef(!1),S=g.useCallback(()=>x.current=!1,[]);return g.useEffect(()=>()=>document.removeEventListener("pointerup",S),[S]),h.jsx(zm,{asChild:!0,...m,children:h.jsx(Le.button,{"aria-describedby":c.open?c.contentId:void 0,"data-state":c.stateAttribute,...a,ref:v,onPointerMove:_e(r.onPointerMove,C=>{C.pointerType!=="touch"&&!y.current&&!d.isPointerInTransitRef.current&&(c.onTriggerEnter(),y.current=!0)}),onPointerLeave:_e(r.onPointerLeave,()=>{c.onTriggerLeave(),y.current=!1}),onPointerDown:_e(r.onPointerDown,()=>{c.open&&c.onClose(),x.current=!0,document.addEventListener("pointerup",S,{once:!0})}),onFocus:_e(r.onFocus,()=>{x.current||c.onOpen()}),onBlur:_e(r.onBlur,c.onClose),onClick:_e(r.onClick,c.onClose)})})});Vm.displayName=Ha;var jw="TooltipPortal",[rS,Ow]=mi(jw,{forceMount:void 0}),kr="TooltipContent",Gm=g.forwardRef((r,l)=>{const i=Ow(kr,r.__scopeTooltip),{forceMount:a=i.forceMount,side:c="top",...d}=r,m=gi(kr,r.__scopeTooltip);return h.jsx(Rt,{present:a||m.open,children:m.disableHoverableContent?h.jsx(Ym,{side:c,...d,ref:l}):h.jsx(Aw,{side:c,...d,ref:l})})}),Aw=g.forwardRef((r,l)=>{const i=gi(kr,r.__scopeTooltip),a=au(kr,r.__scopeTooltip),c=g.useRef(null),d=We(l,c),[m,p]=g.useState(null),{trigger:v,onClose:x}=i,y=c.current,{onPointerInTransitChange:S}=a,C=g.useCallback(()=>{p(null),S(!1)},[S]),k=g.useCallback((b,_)=>{const T=b.currentTarget,A={x:b.clientX,y:b.clientY},L=zw(A,T.getBoundingClientRect()),$=Fw(A,L),M=$w(_.getBoundingClientRect()),U=Hw([...$,...M]);p(U),S(!0)},[S]);return g.useEffect(()=>()=>C(),[C]),g.useEffect(()=>{if(v&&y){const b=T=>k(T,y),_=T=>k(T,v);return v.addEventListener("pointerleave",b),y.addEventListener("pointerleave",_),()=>{v.removeEventListener("pointerleave",b),y.removeEventListener("pointerleave",_)}}},[v,y,k,C]),g.useEffect(()=>{if(m){const b=_=>{const T=_.target,A={x:_.clientX,y:_.clientY},L=v?.contains(T)||y?.contains(T),$=!Ww(A,m);L?C():$&&(C(),x())};return document.addEventListener("pointermove",b),()=>document.removeEventListener("pointermove",b)}},[v,y,m,x,C]),h.jsx(Ym,{...r,ref:d})}),[Lw,Dw]=mi(Eo,{isInside:!1}),Mw=Dv("TooltipContent"),Ym=g.forwardRef((r,l)=>{const{__scopeTooltip:i,children:a,"aria-label":c,onEscapeKeyDown:d,onPointerDownOutside:m,...p}=r,v=gi(kr,i),x=hi(i),{onClose:y}=v;return g.useEffect(()=>(document.addEventListener(Wa,y),()=>document.removeEventListener(Wa,y)),[y]),g.useEffect(()=>{if(v.trigger){const S=C=>{C.target?.contains(v.trigger)&&y()};return window.addEventListener("scroll",S,{capture:!0}),()=>window.removeEventListener("scroll",S,{capture:!0})}},[v.trigger,y]),h.jsx(ii,{asChild:!0,disableOutsidePointerEvents:!1,onEscapeKeyDown:d,onPointerDownOutside:m,onFocusOutside:S=>S.preventDefault(),onDismiss:y,children:h.jsxs(Fm,{"data-state":v.stateAttribute,...x,...p,ref:l,style:{...p.style,"--radix-tooltip-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-tooltip-content-available-width":"var(--radix-popper-available-width)","--radix-tooltip-content-available-height":"var(--radix-popper-available-height)","--radix-tooltip-trigger-width":"var(--radix-popper-anchor-width)","--radix-tooltip-trigger-height":"var(--radix-popper-anchor-height)"},children:[h.jsx(Mw,{children:a}),h.jsx(Lw,{scope:i,isInside:!0,children:h.jsx(Pw,{id:v.contentId,role:"tooltip",children:c||a})})]})})});Gm.displayName=kr;var Qm="TooltipArrow",Iw=g.forwardRef((r,l)=>{const{__scopeTooltip:i,...a}=r,c=hi(i);return Dw(Qm,i).isInside?null:h.jsx($m,{...c,...a,ref:l})});Iw.displayName=Qm;function zw(r,l){const i=Math.abs(l.top-r.y),a=Math.abs(l.bottom-r.y),c=Math.abs(l.right-r.x),d=Math.abs(l.left-r.x);switch(Math.min(i,a,c,d)){case d:return"left";case c:return"right";case i:return"top";case a:return"bottom";default:throw new Error("unreachable")}}function Fw(r,l,i=5){const a=[];switch(l){case"top":a.push({x:r.x-i,y:r.y+i},{x:r.x+i,y:r.y+i});break;case"bottom":a.push({x:r.x-i,y:r.y-i},{x:r.x+i,y:r.y-i});break;case"left":a.push({x:r.x+i,y:r.y-i},{x:r.x+i,y:r.y+i});break;case"right":a.push({x:r.x-i,y:r.y-i},{x:r.x-i,y:r.y+i});break}return a}function $w(r){const{top:l,right:i,bottom:a,left:c}=r;return[{x:c,y:l},{x:i,y:l},{x:i,y:a},{x:c,y:a}]}function Ww(r,l){const{x:i,y:a}=r;let c=!1;for(let d=0,m=l.length-1;da!=C>a&&i<(S-x)*(a-y)/(C-y)+x&&(c=!c)}return c}function Hw(r){const l=r.slice();return l.sort((i,a)=>i.xa.x?1:i.ya.y?1:0),Uw(l)}function Uw(r){if(r.length<=1)return r.slice();const l=[];for(let a=0;a=2;){const d=l[l.length-1],m=l[l.length-2];if((d.x-m.x)*(c.y-m.y)>=(d.y-m.y)*(c.x-m.x))l.pop();else break}l.push(c)}l.pop();const i=[];for(let a=r.length-1;a>=0;a--){const c=r[a];for(;i.length>=2;){const d=i[i.length-1],m=i[i.length-2];if((d.x-m.x)*(c.y-m.y)>=(d.y-m.y)*(c.x-m.x))i.pop();else break}i.push(c)}return i.pop(),l.length===1&&i.length===1&&l[0].x===i[0].x&&l[0].y===i[0].y?l:l.concat(i)}var Bw=Um,Vw=Bm,Gw=Vm,Xm=Gm;const Yw=Bw,uu=Vw,cu=Gw,vi=g.forwardRef(({className:r,sideOffset:l=4,...i},a)=>h.jsx(Xm,{ref:a,sideOffset:l,className:ge("z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]",r),...i}));vi.displayName=Xm.displayName;var yi="Collapsible",[Qw]=Pr(yi),[Xw,du]=Qw(yi),Km=g.forwardRef((r,l)=>{const{__scopeCollapsible:i,open:a,defaultOpen:c,disabled:d,onOpenChange:m,...p}=r,[v,x]=li({prop:a,defaultProp:c??!1,onChange:m,caller:yi});return h.jsx(Xw,{scope:i,disabled:d,contentId:So(),open:v,onOpenToggle:g.useCallback(()=>x(y=>!y),[x]),children:h.jsx(Le.div,{"data-state":pu(v),"data-disabled":d?"":void 0,...p,ref:l})})});Km.displayName=yi;var Zm="CollapsibleTrigger",qm=g.forwardRef((r,l)=>{const{__scopeCollapsible:i,...a}=r,c=du(Zm,i);return h.jsx(Le.button,{type:"button","aria-controls":c.contentId,"aria-expanded":c.open||!1,"data-state":pu(c.open),"data-disabled":c.disabled?"":void 0,disabled:c.disabled,...a,ref:l,onClick:_e(r.onClick,c.onOpenToggle)})});qm.displayName=Zm;var fu="CollapsibleContent",Jm=g.forwardRef((r,l)=>{const{forceMount:i,...a}=r,c=du(fu,r.__scopeCollapsible);return h.jsx(Rt,{present:i||c.open,children:({present:d})=>h.jsx(Kw,{...a,ref:l,present:d})})});Jm.displayName=fu;var Kw=g.forwardRef((r,l)=>{const{__scopeCollapsible:i,present:a,children:c,...d}=r,m=du(fu,i),[p,v]=g.useState(a),x=g.useRef(null),y=We(l,x),S=g.useRef(0),C=S.current,k=g.useRef(0),b=k.current,_=m.open||p,T=g.useRef(_),A=g.useRef(void 0);return g.useEffect(()=>{const L=requestAnimationFrame(()=>T.current=!1);return()=>cancelAnimationFrame(L)},[]),Ft(()=>{const L=x.current;if(L){A.current=A.current||{transitionDuration:L.style.transitionDuration,animationName:L.style.animationName},L.style.transitionDuration="0s",L.style.animationName="none";const $=L.getBoundingClientRect();S.current=$.height,k.current=$.width,T.current||(L.style.transitionDuration=A.current.transitionDuration,L.style.animationName=A.current.animationName),v(a)}},[m.open,a]),h.jsx(Le.div,{"data-state":pu(m.open),"data-disabled":m.disabled?"":void 0,id:m.contentId,hidden:!_,...d,ref:y,style:{"--radix-collapsible-content-height":C?`${C}px`:void 0,"--radix-collapsible-content-width":b?`${b}px`:void 0,...r.style},children:_&&c})});function pu(r){return r?"open":"closed"}var Zw=Km;const qw=Zw,Jw=qm,e1=Jm,t1=new Set(["production_mutation","credential_access_without_intent","destructive_operation_without_intent","direct_infra_api_with_credential","unknown_high_risk_command","no_policy_rule_matched"]),n1=new Set(["judge_allow","judge_deny","judge_fail_open"]),r1=new Set(["deterministic_deny","deterministic_allow"]);function o1(r){const l={deny:[],ask:[],allow:[]};for(const i of r)l[i.decision]?.push(i);return{counts:{all:r.length,deny:l.deny.length,ask:l.ask.length,allow:l.allow.length},groups:l}}function mu(r,l="—"){const i=r.risk_event??{};return i.command_summary||i.request_summary||i.path_class||i.type||l}function Jl(r){return r.replace(/_/g," ")}function l1(r,l){if(r===l)return!0;if(r.length!==l.length)return!1;for(let i=0;il.toUpperCase()):"tool"}function th(r){const l=r.risk_event?.decision_stage;return!!(l&&r1.has(l))||t1.has(r.reason_code??"")}function i1(r){return r.reason_code==="async_telemetry"?"Recorded after execution.":r.risk_event?.decision_stage==="judge_fail_open"?"Local judge was unavailable, so Guard allowed by fail-open policy.":r.reason||r.reason_code||"No explanation captured."}function s1(r){const l=r.risk_event??{};return r.reason_code==="async_telemetry"?"Not a live gate. Recorded after execution for local session history.":l.decision_stage==="judge_allow"?`Deterministic policy allowed this action, then the local judge allowed it${l.judge_model?` using ${l.judge_model}`:""}.`:l.decision_stage==="judge_deny"?`Deterministic policy allowed this action, then the local judge denied it${l.judge_model?` using ${l.judge_model}`:""}.`:l.decision_stage==="judge_fail_open"?`Deterministic policy allowed this action, but the local judge failed${l.judge_failure_kind?` with ${Jl(l.judge_failure_kind)}`:""}.`:th(r)?l.policy_rule_id?`Deterministic policy matched ${l.policy_rule_id} before calling the local judge.`:"Deterministic policy allowed this action.":l.type==="normal_tool_call"?"Routine coding-agent behavior. No deterministic policy rule matched.":`Normalized as ${l.type||"unknown"}.`}function nh(r){const l=r.risk_event?.decision_stage;return l&&n1.has(l)?"Local LLM judge":r.reason_code==="async_telemetry"?"Trace history":th(r)?"Deterministic policy":"Guard policy"}function a1(r){return mu(r,"No command summary stored.")}function u1(r){return r==="deny"?"Would deny":r==="ask"?"Would ask":"Allow"}const ko={deny:{text:"text-destructive",bg:"bg-destructive",ring:"ring-destructive/10",border:"border-destructive/20"},ask:{text:"text-amber-700",bg:"bg-amber-500",ring:"ring-amber-500/10",border:"border-amber-300/40"},allow:{text:"text-brand",bg:"bg-brand",ring:"ring-brand/10",border:"border-border"}};function hu({kind:r,className:l}){const i=ko[r];return h.jsx("span",{className:ge("h-2 w-2 shrink-0 rounded-full ring-4",i.bg,i.ring,l)})}function Kf({label:r,description:l,children:i}){return h.jsxs("section",{className:"mt-8 first:mt-0",children:[(r||l)&&h.jsxs("div",{className:"mb-3.5 flex items-baseline gap-3",children:[r&&h.jsx("h2",{className:"text-[15px] font-semibold tracking-tight",children:r}),l&&h.jsx("p",{className:"text-[12.5px] text-muted-foreground",children:l})]}),i]})}function Zf({k:r,v:l}){return h.jsxs("div",{className:"flex justify-between gap-2",children:[h.jsx("span",{className:"text-muted-foreground",children:r}),h.jsx("span",{className:"font-mono",children:l})]})}function yr({children:r}){return h.jsx("dt",{className:"self-center text-[10.5px] font-medium uppercase tracking-wider text-muted-foreground",children:r})}function xr({children:r,className:l}){return h.jsx("dd",{className:ge("text-foreground/90",l),children:r})}const c1={all:"All actions",deny:"Denied · this session",ask:"Needs ask · this session",allow:"Allowed · this session"},d1={deny:"Would deny",ask:"Needs ask",allow:"Allow"},f1={all:["deny","ask","allow"],deny:["deny"],ask:["ask"],allow:["allow"]};function p1({tab:r,groups:l,openId:i,onOpen:a,hasAny:c}){return h.jsxs("section",{className:"overflow-hidden rounded-xl border bg-card shadow-[inset_0_1px_0_rgba(255,255,255,0.8),0_1px_2px_rgba(0,0,0,0.04)]",children:[h.jsx("div",{className:"flex items-center justify-between gap-3 border-b px-5 py-3",children:h.jsxs("div",{className:"flex items-baseline gap-2.5",children:[h.jsx("h3",{className:"font-mono text-[10.5px] font-medium uppercase tracking-[0.22em] text-muted-foreground",children:c1[r]}),r!=="all"&&h.jsxs("span",{className:"text-[11px] text-muted-foreground/80",children:["Click ",h.jsx("span",{className:"text-foreground",children:"Total"})," to clear"]})]})}),c?h.jsx("div",{children:f1[r].map(d=>({kind:d,items:l[d]})).filter(({items:d})=>d.length>0).map(({kind:d,items:m},p)=>h.jsx(h1,{label:d1[d],kind:d,count:m.length,separated:p>0,children:m.map(v=>h.jsx(g1,{event:v,active:i===v.id,onClick:()=>a(v.id)},v.id))},d))}):h.jsx(m1,{})]})}function m1(){return h.jsxs("div",{className:"flex flex-col items-center gap-2 px-8 py-16 text-center text-muted-foreground",children:[h.jsx(Tv,{className:"h-5 w-5 text-muted-foreground/50"}),h.jsx("p",{className:"text-[13px]",children:"No actions captured yet."}),h.jsx("p",{className:"text-[12px] text-muted-foreground/70",children:"Start Claude Code to populate this view."})]})}function h1({label:r,kind:l,count:i,separated:a,children:c}){const[d,m]=g.useState(!0);return h.jsxs(qw,{open:d,onOpenChange:m,children:[h.jsxs(Jw,{className:ge("flex w-full items-center gap-2 border-b bg-muted/40 px-5 py-2 text-left text-[12px] font-medium text-muted-foreground transition-colors hover:bg-muted/40",a&&"border-t"),children:[h.jsx(sp,{className:ge("h-3 w-3 transition-transform",!d&&"-rotate-90")}),h.jsx(hu,{kind:l}),h.jsx("span",{className:"text-foreground",children:r}),h.jsx("span",{className:"tabular-nums text-[11px] text-muted-foreground",children:i})]}),h.jsx(e1,{className:"overflow-hidden data-[state=closed]:animate-collapsible-up data-[state=open]:animate-collapsible-down",children:h.jsx("div",{children:c})})]})}function g1({event:r,active:l,onClick:i}){const a=mu(r),c=r.risk_event?.signals?.[0]?.replace(/_/g," "),d=ko[r.decision];return h.jsxs("button",{onClick:i,className:ge("group relative grid w-full grid-cols-[10px_minmax(0,1fr)_auto] items-center gap-4 border-b px-8 py-3 text-left transition-colors last:border-b-0","hover:bg-muted/40",l&&"bg-accent"),children:[l&&h.jsx("span",{className:"absolute inset-y-0 left-0 w-[2px] bg-brand"}),h.jsx(hu,{kind:r.decision}),h.jsxs("span",{className:"flex min-w-0 items-baseline gap-2.5",children:[h.jsx("span",{className:"text-[13px] font-medium text-foreground",children:eh(r.tool_name)}),h.jsx("span",{className:"truncate font-mono text-[12px] text-muted-foreground",children:a})]}),h.jsxs("span",{className:"flex items-center gap-3",children:[c&&h.jsxs(uu,{children:[h.jsx(cu,{asChild:!0,children:h.jsx("span",{className:"hidden max-w-[180px] truncate text-[11px] text-muted-foreground md:inline",children:c})}),h.jsxs(vi,{side:"top",children:["Primary signal: ",c]})]}),h.jsx("span",{className:ge("rounded-md border bg-background/60 px-1.5 py-0.5 font-mono text-[10.5px] font-medium",d.border,r.decision==="allow"?"text-muted-foreground":d.text),children:nh(r)}),h.jsx(sp,{className:ge("h-3 w-3 -rotate-90 text-muted-foreground/0 transition-all group-hover:text-muted-foreground/70",l&&"text-muted-foreground/70")})]})]})}const v1={},y1=v1,xi=y1.VITE_KONTEXT_API??"";function wo(r){return r instanceof Error?r.message:String(r)}async function qf(r){return r.json()}async function wi(r){if(r.ok)return qf(r);const l=`${r.status} ${r.statusText}`.trim();if(!(r.headers.get("content-type")??"").includes("application/json"))throw new Error(l);let a;try{a=await qf(r)}catch(d){throw new Error(`API error response was not valid JSON: ${l}; ${wo(d)}`)}const c=No(a)&&typeof a.error=="string"?a.error:l;throw new Error(c)}function No(r){return r!==null&&typeof r=="object"&&!Array.isArray(r)}function we(r){return typeof r=="string"?r:void 0}function Oa(r){return typeof r=="boolean"?r:void 0}function x1(r){return typeof r=="number"&&Number.isFinite(r)?r:void 0}function Jf(r){if(!Array.isArray(r))return;const l=r.filter(i=>typeof i=="string");return l.length>0?l:void 0}function rh(r){switch(r){case"allow":case"ask":case"deny":return r;default:return}}function ep(r){switch(r){case"relaxed":case"balanced":case"strict":return r;default:return}}function w1(r){if(No(r))return{type:we(r.type),provider:we(r.provider),provider_category:we(r.provider_category),operation:we(r.operation),operation_class:we(r.operation_class),resource_class:we(r.resource_class),environment:we(r.environment),credential_observed:Oa(r.credential_observed),credential_source:we(r.credential_source),direct_api_call:Oa(r.direct_api_call),explicit_user_intent:Oa(r.explicit_user_intent),command_summary:we(r.command_summary),request_summary:we(r.request_summary),path_class:we(r.path_class),decision:rh(r.decision),reason_code:we(r.reason_code),decision_stage:we(r.decision_stage),signals:Jf(r.signals),guard_id:we(r.guard_id),confidence:x1(r.confidence),policy_profile:we(r.policy_profile),policy_rule_id:we(r.policy_rule_id),policy_rule_category:we(r.policy_rule_category),judge_runtime:we(r.judge_runtime),judge_model:we(r.judge_model),judge_failure_kind:we(r.judge_failure_kind),judge_risk_level:we(r.judge_risk_level),judge_categories:Jf(r.judge_categories)}}function S1(r){if(!(!No(r)||typeof r.session_id!="string"||typeof r.actions!="number"))return{session_id:r.session_id,actions:r.actions}}function C1(r){if(!No(r)||typeof r.id!="string")return;const l=rh(r.decision);if(l)return{id:r.id,session_id:we(r.session_id),tool_name:we(r.tool_name),decision:l,reason:we(r.reason),reason_code:we(r.reason_code),risk_event:w1(r.risk_event)}}function oh(r){if(!No(r))throw new Error("invalid policy profile response");const l=ep(r.profile);if(!l)throw new Error("invalid policy profile response");return{profile:l,recommended_profile:ep(r.recommended_profile),version:we(r.version),rule_pack:we(r.rule_pack),rule_pack_version:we(r.rule_pack_version),config_digest:we(r.config_digest),activation_id:we(r.activation_id),source:we(r.source),status:we(r.status),loaded_at:we(r.loaded_at)}}function lh(r,l){if(r==null)return[];if(!Array.isArray(r))throw new Error("invalid API response");const i=[];for(const a of r){const c=l(a);if(!c)throw new Error("invalid API response");i.push(c)}return i}async function E1(){return lh(await fetch(`${xi}/api/sessions`).then(wi),S1)}async function _1(r){return lh(await fetch(`${xi}/api/sessions/${encodeURIComponent(r)}/events`).then(wi),C1)}async function k1(){return oh(await fetch(`${xi}/api/policy/profile`).then(wi))}async function N1(r){const l=await fetch(`${xi}/api/policy/profile`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({profile:r})}).then(wi);return oh(l)}function P1({event:r}){const l=r.risk_event??{},i=ko[r.decision];return h.jsxs("div",{className:"flex h-full flex-col bg-background",children:[h.jsxs(mm,{className:"flex flex-row items-center gap-2 border-b bg-background px-6 py-3.5 pr-14 space-y-0",children:[h.jsx(hu,{kind:r.decision}),h.jsx(hm,{className:ge("text-[13px] font-medium",i.text),children:u1(r.decision)}),h.jsx("span",{className:"ml-2 font-mono text-[10.5px] uppercase tracking-[0.2em] text-muted-foreground",children:eh(r.tool_name)})]}),h.jsx(oi,{className:"flex-1",children:h.jsxs("div",{className:"space-y-7 px-7 py-7",children:[h.jsxs("div",{className:"space-y-3",children:[h.jsx("pre",{className:"whitespace-pre-wrap break-words font-mono text-[15px] font-medium leading-snug tracking-tight text-foreground",children:mu(r)}),h.jsx("p",{className:"text-[13.5px] leading-relaxed text-foreground/75",children:i1(r)})]}),h.jsxs("dl",{className:"grid grid-cols-[120px_1fr] gap-y-3 text-[13px]",children:[h.jsx(yr,{children:"Operation"}),h.jsx(xr,{children:l.operation||l.operation_class||"unknown"}),h.jsx(yr,{children:"Source"}),h.jsx(xr,{children:nh(r)}),h.jsx(yr,{children:"Stage"}),h.jsx(xr,{children:l.decision_stage?Jl(l.decision_stage):"unknown"}),h.jsx(yr,{children:"Environment"}),h.jsx(xr,{children:h.jsx("span",{className:"font-mono text-[12.5px]",children:l.environment||"unknown"})}),l.judge_model&&h.jsxs(h.Fragment,{children:[h.jsx(yr,{children:"Judge"}),h.jsx(xr,{children:l.judge_model})]}),l.policy_rule_id&&h.jsxs(h.Fragment,{children:[h.jsx(yr,{children:"Policy rule"}),h.jsx(xr,{children:l.policy_rule_id})]})]}),h.jsx(Aa,{title:"Analysis",children:h.jsx("p",{className:"text-[13px] leading-relaxed text-foreground/80",children:s1(r)})}),h.jsx(Aa,{title:"Command",children:h.jsx("pre",{className:"overflow-x-auto rounded-md border bg-muted/40 px-3 py-2.5 font-mono text-[12px] leading-relaxed text-foreground/90",children:a1(r)})}),(l.signals??[]).length>0&&h.jsx(Aa,{title:"Signals",children:h.jsx("div",{className:"flex flex-wrap gap-1.5",children:(l.signals??[]).map(a=>h.jsxs("span",{className:"inline-flex items-center gap-1.5 rounded-md border bg-card px-2 py-1 font-mono text-[11px] text-foreground/80 shadow-[inset_0_1px_0_rgba(255,255,255,0.7)]",children:[h.jsx("span",{className:ge("h-1 w-1 rounded-full",i.bg)}),Jl(a)]},a))})}),r.reason_code&&h.jsxs("div",{className:"border-t pt-4 font-mono text-[10.5px] uppercase tracking-[0.2em] text-muted-foreground",children:["reason · ",h.jsx("span",{className:"text-foreground/70",children:r.reason_code})]})]})})]})}function Aa({title:r,children:l}){return h.jsxs("div",{className:"space-y-2.5",children:[h.jsx("h3",{className:"font-mono text-[10px] font-medium uppercase tracking-[0.22em] text-muted-foreground",children:r}),l]})}var La,Si="HoverCard",[ih]=Pr(Si,[pi]),Ci=pi(),[b1,gu]=ih(Si),sh=r=>{const{__scopeHoverCard:l,children:i,open:a,defaultOpen:c,onOpenChange:d,openDelay:m=700,closeDelay:p=300}=r,v=Ci(l),x=g.useRef(0),y=g.useRef(0),S=g.useRef(!1),C=g.useRef(!1),[k,b]=li({prop:a,defaultProp:c??!1,onChange:d,caller:Si}),_=g.useCallback(()=>{clearTimeout(y.current),x.current=window.setTimeout(()=>b(!0),m)},[m,b]),T=g.useCallback(()=>{clearTimeout(x.current),!S.current&&!C.current&&(y.current=window.setTimeout(()=>b(!1),p))},[p,b]),A=g.useCallback(()=>b(!1),[b]);return g.useEffect(()=>()=>{clearTimeout(x.current),clearTimeout(y.current)},[]),h.jsx(b1,{scope:l,open:k,onOpenChange:b,onOpen:_,onClose:T,onDismiss:A,hasSelectionRef:S,isPointerDownOnContentRef:C,children:h.jsx(Im,{...v,children:i})})};sh.displayName=Si;var ah="HoverCardTrigger",uh=g.forwardRef((r,l)=>{const{__scopeHoverCard:i,...a}=r,c=gu(ah,i),d=Ci(i);return h.jsx(zm,{asChild:!0,...d,children:h.jsx(Le.a,{"data-state":c.open?"open":"closed",...a,ref:l,onPointerEnter:_e(r.onPointerEnter,ti(c.onOpen)),onPointerLeave:_e(r.onPointerLeave,ti(c.onClose)),onFocus:_e(r.onFocus,c.onOpen),onBlur:_e(r.onBlur,c.onClose),onTouchStart:_e(r.onTouchStart,m=>m.preventDefault())})})});uh.displayName=ah;var R1="HoverCardPortal",[oS,T1]=ih(R1,{forceMount:void 0}),ei="HoverCardContent",ch=g.forwardRef((r,l)=>{const i=T1(ei,r.__scopeHoverCard),{forceMount:a=i.forceMount,...c}=r,d=gu(ei,r.__scopeHoverCard);return h.jsx(Rt,{present:a||d.open,children:h.jsx(j1,{"data-state":d.open?"open":"closed",...c,onPointerEnter:_e(r.onPointerEnter,ti(d.onOpen)),onPointerLeave:_e(r.onPointerLeave,ti(d.onClose)),ref:l})})});ch.displayName=ei;var j1=g.forwardRef((r,l)=>{const{__scopeHoverCard:i,onEscapeKeyDown:a,onPointerDownOutside:c,onFocusOutside:d,onInteractOutside:m,...p}=r,v=gu(ei,i),x=Ci(i),y=g.useRef(null),S=We(l,y),[C,k]=g.useState(!1);return g.useEffect(()=>{if(C){const b=document.body;return La=b.style.userSelect||b.style.webkitUserSelect,b.style.userSelect="none",b.style.webkitUserSelect="none",()=>{b.style.userSelect=La,b.style.webkitUserSelect=La}}},[C]),g.useEffect(()=>{if(y.current){const b=()=>{k(!1),v.isPointerDownOnContentRef.current=!1,setTimeout(()=>{document.getSelection()?.toString()!==""&&(v.hasSelectionRef.current=!0)})};return document.addEventListener("pointerup",b),()=>{document.removeEventListener("pointerup",b),v.hasSelectionRef.current=!1,v.isPointerDownOnContentRef.current=!1}}},[v.isPointerDownOnContentRef,v.hasSelectionRef]),g.useEffect(()=>{y.current&&L1(y.current).forEach(_=>_.setAttribute("tabindex","-1"))}),h.jsx(ii,{asChild:!0,disableOutsidePointerEvents:!1,onInteractOutside:m,onEscapeKeyDown:a,onPointerDownOutside:c,onFocusOutside:_e(d,b=>{b.preventDefault()}),onDismiss:v.onDismiss,children:h.jsx(Fm,{...x,...p,onPointerDown:_e(p.onPointerDown,b=>{b.currentTarget.contains(b.target)&&k(!0),v.hasSelectionRef.current=!1,v.isPointerDownOnContentRef.current=!0}),ref:S,style:{...p.style,userSelect:C?"text":void 0,WebkitUserSelect:C?"text":void 0,"--radix-hover-card-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-hover-card-content-available-width":"var(--radix-popper-available-width)","--radix-hover-card-content-available-height":"var(--radix-popper-available-height)","--radix-hover-card-trigger-width":"var(--radix-popper-anchor-width)","--radix-hover-card-trigger-height":"var(--radix-popper-anchor-height)"}})})}),O1="HoverCardArrow",A1=g.forwardRef((r,l)=>{const{__scopeHoverCard:i,...a}=r,c=Ci(i);return h.jsx($m,{...c,...a,ref:l})});A1.displayName=O1;function ti(r){return l=>l.pointerType==="touch"?void 0:r()}function L1(r){const l=[],i=document.createTreeWalker(r,NodeFilter.SHOW_ELEMENT,{acceptNode:a=>a.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP});for(;i.nextNode();)l.push(i.currentNode);return l}var D1=sh,M1=uh,dh=ch;const I1=D1,z1=M1,fh=g.forwardRef(({className:r,align:l="center",sideOffset:i=4,...a},c)=>h.jsx(dh,{ref:c,align:l,sideOffset:i,className:ge("z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-hover-card-content-transform-origin]",r),...a}));fh.displayName=dh.displayName;function $n({className:r,...l}){return h.jsx("div",{className:ge("animate-pulse rounded-md bg-muted",r),...l})}const Ua=[{id:"relaxed",label:"Relaxed",lede:"Fewer blocks, more compatibility.",hint:"Use when iterating on agent behavior."},{id:"balanced",label:"Balanced",recommended:!0,lede:"Good protection with fewer false positives.",hint:"Best default for local development."},{id:"strict",label:"Strict",lede:"Maximum protection, more false positives.",hint:"Use when you can accept breakage."}];function F1(r){return Ua.find(l=>l.id===r)?.label??"Balanced"}const $1={relaxed:1,balanced:2,strict:3};function W1({profile:r,pending:l,error:i,onActivate:a,onRetry:c}){const d=r?.profile??"balanced",m=!r&&!i;return h.jsxs("section",{className:"space-y-3.5",children:[h.jsxs("div",{className:"flex items-baseline justify-between gap-3",children:[h.jsxs("div",{className:"flex items-baseline gap-3",children:[h.jsx("h2",{className:"text-[15px] font-semibold tracking-tight",children:"Policy profile"}),r&&h.jsxs("span",{className:"font-mono text-[11px] text-muted-foreground",children:[F1(r.profile)," profile"]})]}),r&&h.jsx(H1,{profile:r})]}),h.jsx("div",{className:"grid grid-cols-1 gap-2.5 md:grid-cols-3",children:m?Ua.map(p=>h.jsx(U1,{},p.id)):Ua.map(p=>h.jsx(B1,{profile:p,active:p.id===d,pending:p.id===l,disabled:!r||!!l,onActivate:()=>a(p.id)},p.id))}),i&&h.jsxs("div",{className:"flex items-center justify-between gap-3 rounded-md border border-destructive/30 bg-destructive/5 px-3 py-2 text-[12px] text-destructive",children:[h.jsxs("span",{className:"flex min-w-0 items-center gap-2",children:[h.jsx(ap,{className:"h-3.5 w-3.5 shrink-0"}),h.jsx("span",{children:i})]}),h.jsx("button",{type:"button",onClick:c,className:"shrink-0 font-mono text-[10.5px] uppercase tracking-[0.18em] text-destructive underline-offset-4 hover:underline",children:"Retry"})]})]})}function H1({profile:r}){return h.jsxs(I1,{openDelay:120,children:[h.jsx(z1,{asChild:!0,children:h.jsxs("button",{type:"button",className:"inline-flex items-center gap-1.5 font-mono text-[10.5px] uppercase tracking-[0.18em] text-muted-foreground transition-colors hover:text-foreground",children:[h.jsx(Nv,{className:"h-3 w-3"}),r.version]})}),h.jsx(fh,{side:"left",align:"end",className:"w-[280px] text-[12.5px]",children:h.jsxs("div",{className:"space-y-1.5",children:[h.jsx(Zf,{k:"Version",v:r.version??"—"}),h.jsx(Zf,{k:"Rule pack",v:r.rule_pack??"—"})]})})]})}function U1(){return h.jsxs("div",{className:"rounded-xl border bg-card p-4",children:[h.jsx($n,{className:"h-3 w-16"}),h.jsx($n,{className:"mt-3 h-7 w-24"}),h.jsx($n,{className:"mt-3 h-3 w-full"}),h.jsx($n,{className:"mt-1.5 h-3 w-3/4"})]})}function B1({profile:r,active:l,pending:i,disabled:a,onActivate:c}){const d=$1[r.id];return h.jsxs("button",{type:"button",onClick:c,disabled:a,className:ge("group relative flex flex-col overflow-hidden rounded-xl border text-left transition-shadow duration-200","disabled:pointer-events-none disabled:opacity-60",l?ge("bg-brand-gradient border-brand-dark text-brand-foreground","shadow-[inset_0_1px_0_rgba(255,255,255,0.10),inset_0_0_0_1px_rgba(255,255,255,0.04),0_10px_30px_-8px_rgba(21,40,34,0.45)]","hover:shadow-[inset_0_1px_0_rgba(255,255,255,0.14),inset_0_0_0_1px_rgba(255,255,255,0.06),0_18px_48px_-10px_rgba(21,40,34,0.55)]"):ge("bg-card","shadow-[inset_0_1px_0_rgba(255,255,255,0.8),0_1px_2px_rgba(15,17,21,0.04)]","hover:border-foreground/15 hover:shadow-[inset_0_1px_0_rgba(255,255,255,0.8),0_6px_18px_-6px_rgba(15,17,21,0.10)]")),children:[i&&h.jsx("span",{className:"absolute inset-x-0 bottom-0 h-px overflow-hidden",children:h.jsx("span",{className:ge("block h-full w-1/3 animate-[shimmer_1.2s_linear_infinite]",l?"bg-white":"bg-foreground")})}),h.jsxs("div",{className:"flex items-center justify-between px-5 pt-4",children:[h.jsx(V1,{filled:d,active:l}),h.jsxs("div",{className:"flex items-center gap-2",children:[r.recommended&&!i&&h.jsx("span",{className:ge("font-mono text-[9.5px] font-medium uppercase tracking-[0.18em]",l?"text-white/70":"text-muted-foreground"),children:"Recommended"}),i&&h.jsxs("span",{className:ge("inline-flex items-center gap-1 font-mono text-[9.5px] uppercase tracking-[0.18em]",l?"text-white/70":"text-muted-foreground"),children:[h.jsx(bv,{className:"h-3 w-3 animate-spin"}),"Activating"]})]})]}),h.jsxs("div",{className:"px-5 pt-2.5",children:[h.jsx("div",{className:"text-[22px] font-semibold leading-tight tracking-tight",children:r.label}),h.jsx("p",{className:ge("mt-1 text-[12.5px] leading-snug",l?"text-white/85":"text-foreground/80"),children:r.lede}),h.jsx("p",{className:ge("mt-0.5 text-[11.5px] leading-snug",l?"text-white/55":"text-muted-foreground"),children:r.hint})]}),h.jsx("div",{className:ge("mt-3 border-t px-5 py-2.5 font-mono text-[10px] uppercase tracking-[0.22em]",l?"border-white/15 text-white":"border-border text-muted-foreground/70"),children:l?"Active profile":"Tap to activate"})]})}function V1({filled:r,active:l}){return h.jsx("div",{className:"flex items-center gap-1","aria-hidden":"true",children:[1,2,3].map(i=>h.jsx("span",{className:ge("h-1 w-2.5 rounded-full transition-colors",i<=r?l?"bg-white":"bg-foreground":l?"bg-white/25":"bg-muted-foreground/25")},i))})}new Date(Date.now()-120*1e3).toISOString();function G1({session:r,loading:l}){return h.jsxs("header",{className:"flex items-center justify-between gap-4 border-b bg-background px-10 py-5",children:[h.jsx("div",{className:"flex min-w-0 items-center gap-3",children:l?h.jsx($n,{className:"h-6 w-60"}):h.jsxs(h.Fragment,{children:[h.jsxs("span",{className:"relative flex h-2 w-2 shrink-0",children:[h.jsx("span",{className:"absolute inline-flex h-full w-full animate-ping rounded-full bg-brand opacity-50"}),h.jsx("span",{className:"relative inline-flex h-2 w-2 rounded-full bg-brand"})]}),h.jsx("span",{className:"truncate font-mono text-[17px] font-medium tracking-tight text-foreground",children:r?.session_id??"-"})]})}),h.jsxs(uu,{children:[h.jsx(cu,{asChild:!0,children:h.jsx("span",{className:"cursor-default text-[11px] uppercase tracking-[0.18em] text-muted-foreground",children:"Observe mode"})}),h.jsx(vi,{side:"bottom",children:"Recording decisions but not enforcing them."})]})]})}function Y1({sessions:r,counts:l,selectedID:i,onSelect:a}){return h.jsxs("aside",{className:"flex min-h-0 flex-col border-r",children:[h.jsx("div",{className:"px-5 pb-6 pt-7",children:h.jsx("div",{className:"text-[18px] font-semibold tracking-tight",children:"Kontext"})}),h.jsxs(oi,{className:"flex-1 px-2",children:[h.jsx(Q1,{label:"This session",count:l.all,active:!0}),r.length>1&&h.jsxs(h.Fragment,{children:[h.jsx("div",{className:"px-2.5 pb-1.5 pt-6 text-[10.5px] font-medium uppercase tracking-[0.18em] text-muted-foreground",children:"Recent"}),h.jsx("div",{className:"flex flex-col gap-0.5",children:r.slice(0,12).map(c=>h.jsxs("button",{type:"button",onClick:()=>a(c.session_id),className:ge("flex items-center justify-between gap-2 rounded-md px-2.5 py-1.5 text-left text-[12.5px] transition-colors hover:bg-accent/60",c.session_id===i&&"bg-accent text-foreground"),children:[h.jsx("span",{className:"truncate font-mono text-muted-foreground",children:c.session_id}),h.jsx("span",{className:"shrink-0 tabular-nums text-[11px] text-muted-foreground",children:c.actions})]},c.session_id))})]})]})]})}function Q1({label:r,count:l,active:i}){return h.jsxs("button",{type:"button",className:ge("flex w-full items-center justify-between rounded-md px-2.5 py-1.5 text-left text-[13px] font-medium transition-colors",i?"bg-accent text-foreground":"text-muted-foreground hover:bg-accent/60 hover:text-foreground"),children:[h.jsx("span",{children:r}),h.jsx("span",{className:"font-mono text-[11px] text-muted-foreground",children:l})]})}const X1=[{id:"deny",label:"Would deny"},{id:"ask",label:"Needs ask"},{id:"allow",label:"Allowed"}],K1=[{kind:"deny",label:"Would deny"},{kind:"ask",label:"Ask"},{kind:"allow",label:"Allow"}];function Z1({counts:r,active:l,onSelect:i,loading:a}){return h.jsxs("section",{className:"overflow-hidden rounded-xl border bg-card shadow-[inset_0_1px_0_rgba(255,255,255,0.8),0_1px_2px_rgba(0,0,0,0.04)]",children:[h.jsx(q1,{count:r.all,active:l==="all",loading:a,onClick:()=>i("all")}),h.jsx("div",{className:"grid divide-y md:grid-cols-3 md:divide-x md:divide-y-0",children:X1.map(c=>h.jsx(J1,{id:c.id,label:c.label,count:r[c.id],total:r.all,active:l===c.id,loading:a,onClick:()=>i(c.id)},c.id))}),h.jsx(eS,{counts:r})]})}function q1({count:r,active:l,loading:i,onClick:a}){return h.jsxs("button",{type:"button",onClick:a,"aria-label":"Show all decisions",className:ge("flex w-full items-center gap-3 border-b bg-muted/10 px-6 py-3 text-left transition-colors","hover:bg-muted/30",l&&"bg-muted/40"),children:[i?h.jsx($n,{className:"h-7 w-10"}):h.jsx("span",{className:"font-mono text-[26px] font-semibold leading-none tabular-nums text-foreground",children:r}),h.jsx("div",{className:"min-w-0",children:h.jsx("span",{className:ge("text-[13px] font-medium",l?"text-foreground":"text-muted-foreground"),children:"decisions captured"})})]})}function J1({id:r,label:l,count:i,total:a,active:c,loading:d,onClick:m}){const p=Math.round(i/Math.max(1,a)*100),v=i===0?"text-muted-foreground/40":ko[r].text;return h.jsxs("button",{type:"button",onClick:m,className:ge("group relative flex items-baseline gap-4 px-6 py-5 text-left transition-colors","hover:bg-muted/30",c&&"bg-muted/40"),children:[d?h.jsx($n,{className:"h-9 w-12"}):h.jsx("span",{className:ge("font-mono text-[36px] font-semibold leading-none tracking-tight tabular-nums",v),children:i}),h.jsxs("div",{className:"flex flex-col leading-tight",children:[h.jsx("span",{className:ge("font-mono text-[10px] font-medium uppercase tracking-[0.22em]",c?"text-foreground":"text-muted-foreground"),children:l}),h.jsxs("span",{className:"mt-1 text-[11px] text-muted-foreground/70",children:[p,"% of session"]})]})]})}function eS({counts:r}){const l=K1.map(i=>({count:r[i.kind],color:ko[i.kind].bg,label:i.label})).filter(i=>i.count>0);return h.jsx("div",{className:"border-t bg-muted/20 px-6 py-3",children:h.jsxs("div",{className:"flex items-center gap-4",children:[h.jsx("div",{className:"flex h-1.5 flex-1 gap-0.5 overflow-hidden rounded-full bg-muted/60",children:l.length===0?h.jsx("div",{className:"w-full bg-muted-foreground/15"}):l.map(i=>h.jsxs(uu,{children:[h.jsx(cu,{asChild:!0,children:h.jsx("div",{className:ge("transition-opacity hover:opacity-80",i.color),style:{flex:i.count},"aria-label":`${i.count} ${i.label}`})}),h.jsxs(vi,{side:"top",children:[i.count," ",i.label.toLowerCase()]})]},i.label))}),h.jsx("div",{className:"flex items-center gap-3 font-mono text-[10px] uppercase tracking-[0.18em] text-muted-foreground",children:l.length===0?h.jsx("span",{children:"No activity yet"}):l.map(i=>h.jsxs("span",{className:"inline-flex items-center gap-1.5",children:[h.jsx("span",{className:ge("h-1.5 w-1.5 rounded-full",i.color)}),i.label,h.jsx("span",{className:"tabular-nums text-foreground/70",children:i.count})]},i.label))})]})})}function tS(){const[r,l]=g.useState([]),[i,a]=g.useState(""),[c,d]=g.useState([]),[m,p]=g.useState("all"),[v,x]=g.useState(null),[y,S]=g.useState(""),[C,k]=g.useState(null),[b,_]=g.useState(null),[T,A]=g.useState(""),L=g.useRef("");g.useEffect(()=>{G(),ie();const ee=setInterval(G,3e3);return()=>clearInterval(ee)},[]),g.useEffect(()=>{i&&B(i),L.current=i},[i]);function $(ee){L.current=ee,a(ee)}function M(ee){return l(le=>l1(le,ee)?le:ee),S(""),ee}function U(ee){d(ee),S("")}function G(){E1().then(ee=>{const le=M(ee),se=L.current,D=le.some(Y=>Y.session_id===se)?se:le[0]?.session_id;D?D!==se?$(D):B(D):(L.current="",a(""),d([]),x(null))}).catch(ee=>S(wo(ee)))}function B(ee){_1(ee).then(le=>{L.current===ee&&U(le)}).catch(le=>S(wo(le)))}function ie(){k1().then(ee=>{k(ee),A("")}).catch(ee=>{A(`Couldn't load policy profile. ${wo(ee)}`)})}function te(ee){ee===C?.profile||b||(_(ee),A(""),N1(ee).then(k).catch(le=>A(`Couldn't update policy profile. ${wo(le)}`)).finally(()=>_(null)))}const{counts:ne,groups:ue}=g.useMemo(()=>o1(c),[c]),J=g.useMemo(()=>v?c.find(ee=>ee.id===v)??null:null,[v,c]),me=g.useMemo(()=>r.find(ee=>ee.session_id===i),[r,i]),ce=r.length===0&&!y;return h.jsx(Yw,{delayDuration:150,children:h.jsxs("div",{className:"grid h-screen grid-cols-[252px_1fr] bg-background text-foreground",children:[h.jsx(Y1,{sessions:r,counts:ne,selectedID:i,onSelect:$}),h.jsxs("main",{className:"flex min-h-0 flex-col overflow-hidden",children:[h.jsx(G1,{session:me,loading:ce}),h.jsx(oi,{className:"flex-1",children:h.jsxs("div",{className:"px-10 pb-10 pt-8",children:[h.jsx(W1,{profile:C,pending:b,error:T,onActivate:te,onRetry:ie}),h.jsx(Kf,{label:"Activity",description:"What was decided this session.",children:h.jsx(Z1,{counts:ne,active:m,onSelect:p,loading:ce})}),y&&h.jsxs("div",{className:"mt-4 flex items-center gap-2 rounded-md border border-destructive/30 bg-destructive/5 px-3 py-2 text-[12px] text-destructive",children:[h.jsx(ap,{className:"h-3.5 w-3.5 shrink-0"}),h.jsx("span",{children:y})]}),h.jsx(Kf,{label:"Log",description:"Tool calls in chronological order.",children:h.jsx(p1,{tab:m,groups:ue,openId:v,onOpen:x,hasAny:c.length>0})})]})})]}),h.jsx(a0,{open:!!J,onOpenChange:ee=>!ee&&x(null),children:h.jsx(pm,{side:"right",className:"w-[540px] max-w-[92vw] p-0 sm:max-w-[540px]",children:J&&h.jsx(P1,{event:J})})})]})})}const tp=document.getElementById("root");tp&&vv.createRoot(tp).render(h.jsx(rp.StrictMode,{children:h.jsx(tS,{})})); diff --git a/internal/guard/web/assets/dist/index.html b/internal/guard/web/assets/dist/index.html index 8eb7649..fd8a30c 100644 --- a/internal/guard/web/assets/dist/index.html +++ b/internal/guard/web/assets/dist/index.html @@ -4,8 +4,8 @@ Kontext Guard - - + +
diff --git a/internal/run/local.go b/internal/run/local.go index 952127a..0ba82f2 100644 --- a/internal/run/local.go +++ b/internal/run/local.go @@ -29,7 +29,6 @@ func StartLocal(ctx context.Context, opts Options) error { AgentName: opts.Agent, CWD: cwd, DBPath: os.Getenv("KONTEXT_DB"), - ModelPath: os.Getenv("KONTEXT_MODEL"), DashboardAddr: os.Getenv("KONTEXT_ADDR"), StartDashboard: true, JudgeConfigFromEnv: true, @@ -63,7 +62,6 @@ func StartLocal(ctx context.Context, opts Options) error { if host.DashboardURL != "" { fmt.Fprintf(os.Stderr, "✓ Dashboard: %s\n", host.DashboardURL) } - fmt.Fprintf(os.Stderr, "✓ Risk model: %s\n", host.ActiveModelPath) if host.LocalJudgeStatus != "" { fmt.Fprintf(os.Stderr, "✓ Local judge: %s\n", host.LocalJudgeStatus) } else { diff --git a/internal/runtimehost/host.go b/internal/runtimehost/host.go index e6dcf09..53aca87 100644 --- a/internal/runtimehost/host.go +++ b/internal/runtimehost/host.go @@ -20,17 +20,8 @@ import ( guardhookruntime "github.com/kontext-security/kontext-cli/internal/guard/hookruntime" "github.com/kontext-security/kontext-cli/internal/guard/judge" "github.com/kontext-security/kontext-cli/internal/guard/judgeruntime" - "github.com/kontext-security/kontext-cli/internal/guard/modelsnapshot" - "github.com/kontext-security/kontext-cli/internal/guard/risk" "github.com/kontext-security/kontext-cli/internal/localruntime" "github.com/kontext-security/kontext-cli/internal/runtimecore" - guardmodels "github.com/kontext-security/kontext-cli/models/guard" -) - -const ( - defaultModelSource = "embedded:models/guard/coding-agent-v0.json" - defaultThreshold = 0.5 - defaultHorizon = 5 ) type Options struct { @@ -38,8 +29,6 @@ type Options struct { SessionID string CWD string DBPath string - ModelPath string - ModelSnapshotDir string SocketPath string DashboardAddr string StartDashboard bool @@ -47,8 +36,6 @@ type Options struct { JudgeConfigFromEnv bool JudgeManagedDefault bool Mode string - Threshold float64 - Horizon int Diagnostic diagnostic.Logger Out io.Writer } @@ -60,7 +47,6 @@ type Host struct { DBPath string DashboardURL string DashboardErr error - ActiveModelPath string LocalJudgeStatus string Mode guardhookruntime.Mode @@ -91,17 +77,6 @@ func Start(ctx context.Context, opts Options) (*Host, error) { return nil, fmt.Errorf("create runtime data dir: %w", err) } - scorer, activeModelPath, err := loadScorer(loadScorerOptions{ - DBPath: dbPath, - ModelPath: opts.ModelPath, - ModelSnapshotDir: opts.ModelSnapshotDir, - Threshold: opts.Threshold, - Horizon: opts.Horizon, - }) - if err != nil { - return nil, err - } - closeJudge := func() {} var localJudge judge.Judge var judgeStatus string @@ -116,8 +91,7 @@ func Start(ctx context.Context, opts Options) (*Host, error) { } } localServer, closeStore, err := server.OpenDefaultServerWithOptions(dbPath, server.Options{ - Scorer: scorer, - Judge: localJudge, + Judge: localJudge, }) if err != nil { closeJudge() @@ -154,7 +128,6 @@ func Start(ctx context.Context, opts Options) (*Host, error) { SessionDir: sessionDir, SocketPath: socketPath, DBPath: dbPath, - ActiveModelPath: activeModelPath, LocalJudgeStatus: judgeStatus, Mode: mode, server: localServer, @@ -299,49 +272,6 @@ func DashboardAddr(value string, allowNonLoopback bool) (string, error) { return "", fmt.Errorf("dashboard address %q is not loopback; use 127.0.0.1 or localhost", addr) } -type loadScorerOptions struct { - DBPath string - ModelPath string - ModelSnapshotDir string - Threshold float64 - Horizon int -} - -func loadScorer(opts loadScorerOptions) (risk.Scorer, string, error) { - threshold, err := envFloat("KONTEXT_THRESHOLD", opts.Threshold, defaultThreshold) - if err != nil { - return nil, "", err - } - horizon, err := envInt("KONTEXT_HORIZON", opts.Horizon, defaultHorizon) - if err != nil { - return nil, "", err - } - snapshotDir := strings.TrimSpace(opts.ModelSnapshotDir) - if snapshotDir == "" { - snapshotDir = defaultModelSnapshotDir(opts.DBPath) - } - store := modelsnapshot.NewWithValidator(snapshotDir, risk.ValidateMarkovModel) - - modelPath := strings.TrimSpace(opts.ModelPath) - if modelPath == "" { - modelPath = strings.TrimSpace(os.Getenv("KONTEXT_MODEL")) - } - var snapshot modelsnapshot.Snapshot - if modelPath == "" { - snapshot, err = store.ActivateBytes(defaultModelSource, guardmodels.CodingAgentV0) - } else { - snapshot, err = store.ActivateFromFile(modelPath) - } - if err != nil { - return nil, "", fmt.Errorf("activate risk model: %w", err) - } - scorer, err := risk.LoadMarkovScorer(snapshot.Path, threshold, horizon) - if err != nil { - return nil, "", fmt.Errorf("load risk model: %w", err) - } - return scorer, snapshot.Path, nil -} - func startDashboard(addr string, handler http.Handler) (*http.Server, string, error) { ln, err := net.Listen("tcp", addr) if err != nil { @@ -385,41 +315,6 @@ func ensureRuntimeDataDir(path string, private bool) error { return os.Chmod(path, 0o700) } -func defaultModelSnapshotDir(dbPath string) string { - if dbPath != "" { - return filepath.Join(filepath.Dir(dbPath), "models") - } - return filepath.Join(".", "models") -} - -func envFloat(key string, explicit, fallback float64) (float64, error) { - if value := strings.TrimSpace(os.Getenv(key)); value != "" { - parsed, err := strconv.ParseFloat(value, 64) - if err != nil { - return 0, fmt.Errorf("%s must be a number: %w", key, err) - } - return parsed, nil - } - if explicit != 0 { - return explicit, nil - } - return fallback, nil -} - -func envInt(key string, explicit, fallback int) (int, error) { - if value := strings.TrimSpace(os.Getenv(key)); value != "" { - parsed, err := strconv.Atoi(value) - if err != nil { - return 0, fmt.Errorf("%s must be an integer: %w", key, err) - } - return parsed, nil - } - if explicit != 0 { - return explicit, nil - } - return fallback, nil -} - func isLoopbackHost(host string) bool { if strings.EqualFold(host, "localhost") { return true diff --git a/internal/runtimehost/host_test.go b/internal/runtimehost/host_test.go index f1864be..bff9d32 100644 --- a/internal/runtimehost/host_test.go +++ b/internal/runtimehost/host_test.go @@ -16,10 +16,7 @@ import ( "github.com/kontext-security/kontext-cli/internal/localruntime" ) -func TestStartLoadsEmbeddedModelOutsideRepoCWD(t *testing.T) { - t.Setenv("KONTEXT_MODEL", "") - t.Setenv("KONTEXT_THRESHOLD", "") - t.Setenv("KONTEXT_HORIZON", "") +func TestStartWorksOutsideRepoCWD(t *testing.T) { t.Chdir(t.TempDir()) host, err := Start(context.Background(), Options{ @@ -31,13 +28,6 @@ func TestStartLoadsEmbeddedModelOutsideRepoCWD(t *testing.T) { t.Fatalf("Start() error = %v", err) } defer host.Close(context.Background()) - - if host.ActiveModelPath == "" { - t.Fatal("ActiveModelPath is empty") - } - if _, err := os.Stat(host.ActiveModelPath); err != nil { - t.Fatalf("active model stat error = %v", err) - } } func TestStartUsesFullSessionIDForSessionDir(t *testing.T) { diff --git a/models/guard/README.md b/models/guard/README.md deleted file mode 100644 index 5a5eff0..0000000 --- a/models/guard/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Baseline Model - -`coding-agent-v0.json` is the initial Markov-chain risk model shipped with Kontext Guard. - -Scope: - -- Claude Code and coding-agent workflows -- normal coding actions -- normal source-control flows such as `git` and `gh` -- redacted event sequences, not raw prompts or secrets - -The model estimates sequence risk. Deterministic rules remain authoritative for obvious security risk such as credential access, direct provider API calls with observed credentials, and destructive infrastructure operations. - -Future versions can be shipped as updated parameter files and promoted only after local evaluation improves. diff --git a/models/guard/coding-agent-v0.json b/models/guard/coding-agent-v0.json deleted file mode 100644 index 967f2c4..0000000 --- a/models/guard/coding-agent-v0.json +++ /dev/null @@ -1,3153 +0,0 @@ -{ - "states": [ - "000000000000001100010000", - "001000000000000000000000", - "001000000000000000000001", - "001000000000000000000010", - "001000000000000000000100", - "001000000000000000000101", - "001000000000000000000110", - "001000000000001000000000", - "001000000001000000000000", - "001000000001000000000100", - "001000000001000000000101", - "001000000010000000000000", - "001000000010000000000100", - "001000000100000000000000", - "001000000100000000000100", - "001000000100000000000110", - "001000001010000000000000", - "001001000000000000000000", - "001001000000000000000010", - "001001000000000000000100", - "001001000000000000000110", - "001001000001000000000100", - "001010000000000000000000", - "001010000000000000000010", - "001010000000000000000100", - "001010000000001000000000", - "001010000001000000000010", - "001100000000000000000000", - "001100000000000000000001", - "001100000000000000000010", - "001100000000000000000011", - "001100000000000000010000", - "001100000000000000010001", - "001100000000000000010010", - "001100000001000000000000", - "001100000001000000000001", - "001100000001000000000010", - "001100000010000000000000", - "001100000010000000000010", - "001100000011000000000000", - "001100000100000000000000", - "001100000100000000000001", - "001100000100000000000010", - "001100001010000000000000", - "001100001110000000000000", - "001100001110000000000011", - "001100010000000000000000", - "001100010000000000000001", - "001100010000000000000010", - "001100010010000000000000", - "001101000000000000000000", - "001101000000000000000001", - "001101000000000000000010", - "001110000000000000000000", - "001110000000000000000001", - "001110000000000000000010", - "001110000100000000000000", - "001110000100000000000010", - "001110000101000000000010", - "001110001010000000000000", - "001110001010000000000010", - "001110010000000000000000", - "001110010000000000000001", - "001110010000000000000010", - "001110010101000000000001", - "001110011010000000000001", - "001111000000000000000010", - "001111010001000000000001", - "001111010001000000000011", - "010000000000000000000000", - "010000000000001000000000", - "100000000000000000010000" - ], - "state_index": { - "000000000000001100010000": 0, - "001000000000000000000000": 1, - "001000000000000000000001": 2, - "001000000000000000000010": 3, - "001000000000000000000100": 4, - "001000000000000000000101": 5, - "001000000000000000000110": 6, - "001000000000001000000000": 7, - "001000000001000000000000": 8, - "001000000001000000000100": 9, - "001000000001000000000101": 10, - "001000000010000000000000": 11, - "001000000010000000000100": 12, - "001000000100000000000000": 13, - "001000000100000000000100": 14, - "001000000100000000000110": 15, - "001000001010000000000000": 16, - "001001000000000000000000": 17, - "001001000000000000000010": 18, - "001001000000000000000100": 19, - "001001000000000000000110": 20, - "001001000001000000000100": 21, - "001010000000000000000000": 22, - "001010000000000000000010": 23, - "001010000000000000000100": 24, - "001010000000001000000000": 25, - "001010000001000000000010": 26, - "001100000000000000000000": 27, - "001100000000000000000001": 28, - "001100000000000000000010": 29, - "001100000000000000000011": 30, - "001100000000000000010000": 31, - "001100000000000000010001": 32, - "001100000000000000010010": 33, - "001100000001000000000000": 34, - "001100000001000000000001": 35, - "001100000001000000000010": 36, - "001100000010000000000000": 37, - "001100000010000000000010": 38, - "001100000011000000000000": 39, - "001100000100000000000000": 40, - "001100000100000000000001": 41, - "001100000100000000000010": 42, - "001100001010000000000000": 43, - "001100001110000000000000": 44, - "001100001110000000000011": 45, - "001100010000000000000000": 46, - "001100010000000000000001": 47, - "001100010000000000000010": 48, - "001100010010000000000000": 49, - "001101000000000000000000": 50, - "001101000000000000000001": 51, - "001101000000000000000010": 52, - "001110000000000000000000": 53, - "001110000000000000000001": 54, - "001110000000000000000010": 55, - "001110000100000000000000": 56, - "001110000100000000000010": 57, - "001110000101000000000010": 58, - "001110001010000000000000": 59, - "001110001010000000000010": 60, - "001110010000000000000000": 61, - "001110010000000000000001": 62, - "001110010000000000000010": 63, - "001110010101000000000001": 64, - "001110011010000000000001": 65, - "001111000000000000000010": 66, - "001111010001000000000001": 67, - "001111010001000000000011": 68, - "010000000000000000000000": 69, - "010000000000001000000000": 70, - "100000000000000000010000": 71 - }, - "state_interpret": { - "000000000000001100010000": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": true, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": true, - "production_environment": false, - "shell_operation": false, - "source_control_provider": false, - "tool_call": false, - "unknown_or_low_confidence": true, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001000000000000000000000": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": false, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001000000000000000000001": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": true, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": false, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001000000000000000000010": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": false, - "source_control_provider": true, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001000000000000000000100": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": false, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": true - }, - "001000000000000000000101": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": true, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": false, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": true - }, - "001000000000000000000110": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": false, - "source_control_provider": true, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": true - }, - "001000000000001000000000": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": true, - "production_environment": false, - "shell_operation": false, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001000000001000000000000": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": true, - "shell_operation": false, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001000000001000000000100": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": true, - "shell_operation": false, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": true - }, - "001000000001000000000101": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": true, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": true, - "shell_operation": false, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": true - }, - "001000000010000000000000": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": true, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": false, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001000000010000000000100": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": true, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": false, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": true - }, - "001000000100000000000000": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": true, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": false, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001000000100000000000100": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": true, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": false, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": true - }, - "001000000100000000000110": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": true, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": false, - "source_control_provider": true, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": true - }, - "001000001010000000000000": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": true, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": true, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": false, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001001000000000000000000": { - "agent_reply": false, - "credential_access": true, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": false, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001001000000000000000010": { - "agent_reply": false, - "credential_access": true, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": false, - "source_control_provider": true, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001001000000000000000100": { - "agent_reply": false, - "credential_access": true, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": false, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": true - }, - "001001000000000000000110": { - "agent_reply": false, - "credential_access": true, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": false, - "source_control_provider": true, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": true - }, - "001001000001000000000100": { - "agent_reply": false, - "credential_access": true, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": true, - "shell_operation": false, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": true - }, - "001010000000000000000000": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": true, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": false, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001010000000000000000010": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": true, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": false, - "source_control_provider": true, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001010000000000000000100": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": true, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": false, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": true - }, - "001010000000001000000000": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": true, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": true, - "production_environment": false, - "shell_operation": false, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001010000001000000000010": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": true, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": true, - "shell_operation": false, - "source_control_provider": true, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001100000000000000000000": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001100000000000000000001": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": true, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001100000000000000000010": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": true, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001100000000000000000011": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": true, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": true, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001100000000000000010000": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": true, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001100000000000000010001": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": true, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": true, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001100000000000000010010": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": true, - "tool_call": true, - "unknown_or_low_confidence": true, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001100000001000000000000": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": true, - "shell_operation": true, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001100000001000000000001": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": true, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": true, - "shell_operation": true, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001100000001000000000010": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": true, - "shell_operation": true, - "source_control_provider": true, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001100000010000000000000": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": true, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001100000010000000000010": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": true, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": true, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001100000011000000000000": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": true, - "policy_ask": false, - "policy_block": false, - "production_environment": true, - "shell_operation": true, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001100000100000000000000": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": true, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001100000100000000000001": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": true, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": true, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001100000100000000000010": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": true, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": true, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001100001010000000000000": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": true, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": true, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001100001110000000000000": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": true, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": true, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": true, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001100001110000000000011": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": true, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": true, - "infrastructure_provider": true, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": true, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": true, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001100010000000000000000": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": true, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001100010000000000000001": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": true, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": true, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001100010000000000000010": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": true, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": true, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001100010010000000000000": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": true, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": true, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001101000000000000000000": { - "agent_reply": false, - "credential_access": true, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001101000000000000000001": { - "agent_reply": false, - "credential_access": true, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": true, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001101000000000000000010": { - "agent_reply": false, - "credential_access": true, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": true, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001110000000000000000000": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": true, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001110000000000000000001": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": true, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": true, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001110000000000000000010": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": true, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": true, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001110000100000000000000": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": true, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": true, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001110000100000000000010": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": true, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": true, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": true, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001110000101000000000010": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": true, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": true, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": true, - "shell_operation": true, - "source_control_provider": true, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001110001010000000000000": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": true, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": true, - "persistent_data_resource": true, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001110001010000000000010": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": true, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": true, - "persistent_data_resource": true, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": true, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001110010000000000000000": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": true, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": true, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001110010000000000000001": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": true, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": true, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": true, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001110010000000000000010": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": true, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": true, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": true, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001110010101000000000001": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": true, - "direct_provider_api_call": true, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": true, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": true, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": true, - "shell_operation": true, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001110011010000000000001": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": true, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": true, - "infrastructure_provider": true, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": true, - "persistent_data_resource": true, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001111000000000000000010": { - "agent_reply": false, - "credential_access": true, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": true, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": true, - "source_control_provider": true, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001111010001000000000001": { - "agent_reply": false, - "credential_access": true, - "destructive_operation": false, - "direct_provider_api_call": true, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": true, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": true, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": true, - "shell_operation": true, - "source_control_provider": false, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "001111010001000000000011": { - "agent_reply": false, - "credential_access": true, - "destructive_operation": false, - "direct_provider_api_call": true, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": true, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": true, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": true, - "shell_operation": true, - "source_control_provider": true, - "tool_call": true, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "010000000000000000000000": { - "agent_reply": true, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": false, - "source_control_provider": false, - "tool_call": false, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "010000000000001000000000": { - "agent_reply": true, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": true, - "production_environment": false, - "shell_operation": false, - "source_control_provider": false, - "tool_call": false, - "unknown_or_low_confidence": false, - "user_prompt": false, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - }, - "100000000000000000010000": { - "agent_reply": false, - "credential_access": false, - "destructive_operation": false, - "direct_provider_api_call": false, - "explicit_user_approval": false, - "failed_tool": false, - "hard_interruption": false, - "identity_or_docs_provider": false, - "infrastructure_provider": false, - "managed_credential_use": false, - "managed_tool_call": false, - "network_operation": false, - "persistent_data_resource": false, - "policy_ask": false, - "policy_block": false, - "production_environment": false, - "shell_operation": false, - "source_control_provider": false, - "tool_call": false, - "unknown_or_low_confidence": true, - "user_prompt": true, - "user_pushback": false, - "vulnerability_introduced": false, - "write_operation": false - } - }, - "state_counts": { - "0": 2885, - "1": 38859, - "10": 2, - "11": 12, - "12": 4, - "13": 40, - "14": 3, - "15": 1, - "16": 5, - "17": 53, - "18": 2, - "19": 58, - "2": 389, - "20": 2, - "21": 5, - "22": 14936, - "23": 11, - "24": 9, - "25": 2324, - "26": 1, - "27": 5616, - "28": 127, - "29": 392, - "3": 90, - "30": 4, - "31": 12, - "32": 2, - "33": 1, - "34": 26, - "35": 2, - "36": 5, - "37": 140, - "38": 1, - "39": 1, - "4": 5551, - "40": 104, - "41": 3, - "42": 5, - "43": 10, - "44": 1, - "45": 5, - "46": 20, - "47": 1, - "48": 2, - "49": 1, - "5": 70, - "50": 6, - "51": 1, - "52": 1, - "53": 34, - "54": 5, - "55": 17, - "56": 2, - "57": 2, - "58": 1, - "59": 2, - "6": 27, - "60": 1, - "61": 9, - "62": 2, - "63": 1, - "64": 1, - "65": 1, - "66": 1, - "67": 2, - "68": 1, - "69": 90517, - "7": 716, - "70": 6913, - "71": 760, - "8": 135, - "9": 48 - }, - "transition_counts": { - "1": { - "1": 21859, - "11": 8, - "13": 18, - "15": 1, - "16": 1, - "17": 20, - "19": 34, - "2": 162, - "21": 2, - "22": 32, - "23": 4, - "24": 1, - "26": 1, - "27": 2104, - "28": 24, - "29": 133, - "3": 48, - "31": 5, - "32": 1, - "34": 3, - "37": 29, - "4": 3279, - "40": 31, - "41": 2, - "43": 4, - "46": 7, - "5": 7, - "50": 2, - "53": 13, - "54": 1, - "55": 1, - "59": 1, - "6": 11, - "61": 3, - "62": 1, - "67": 1, - "69": 10618, - "70": 9, - "8": 49, - "9": 14 - }, - "10": { - "1": 1, - "2": 1 - }, - "11": { - "1": 8, - "11": 3, - "4": 1 - }, - "12": { - "12": 1, - "27": 1, - "37": 1, - "4": 1 - }, - "13": { - "1": 17, - "13": 17, - "14": 1, - "27": 2, - "4": 1, - "40": 1 - }, - "14": { - "13": 1, - "4": 1, - "40": 1 - }, - "15": { - "1": 1 - }, - "16": { - "1": 2, - "16": 3 - }, - "17": { - "1": 27, - "17": 9, - "18": 1, - "19": 5, - "27": 1, - "29": 3, - "3": 2, - "4": 2, - "52": 1, - "6": 1 - }, - "18": { - "1": 2 - }, - "19": { - "1": 29, - "17": 8, - "19": 13, - "27": 2, - "3": 2, - "4": 2, - "50": 1, - "51": 1 - }, - "2": { - "1": 153, - "10": 2, - "2": 156, - "27": 16, - "28": 16, - "30": 2, - "4": 5, - "5": 35, - "54": 1, - "8": 1 - }, - "20": { - "50": 2 - }, - "21": { - "1": 2, - "21": 1, - "27": 1, - "68": 1 - }, - "22": { - "1": 2923, - "22": 5497, - "23": 1, - "24": 4, - "25": 1278, - "27": 3, - "29": 1, - "3": 1, - "4": 1, - "69": 4622, - "7": 1, - "70": 604 - }, - "23": { - "1": 6, - "2": 1, - "23": 1, - "27": 3 - }, - "24": { - "1": 4, - "22": 2, - "24": 2, - "28": 1 - }, - "25": { - "22": 268, - "25": 389, - "69": 380, - "70": 1287 - }, - "26": { - "8": 1 - }, - "27": { - "1": 2167, - "12": 1, - "16": 1, - "17": 2, - "19": 1, - "2": 19, - "21": 1, - "22": 4, - "23": 2, - "27": 2729, - "28": 32, - "29": 125, - "3": 3, - "30": 2, - "31": 5, - "33": 1, - "34": 10, - "36": 2, - "37": 51, - "4": 333, - "40": 24, - "42": 4, - "43": 3, - "44": 1, - "46": 7, - "48": 1, - "49": 1, - "5": 1, - "53": 6, - "54": 1, - "55": 12, - "57": 2, - "6": 1, - "60": 1, - "64": 1, - "65": 1, - "66": 1, - "67": 1, - "8": 5, - "9": 1 - }, - "28": { - "1": 29, - "2": 18, - "27": 27, - "28": 34, - "29": 1, - "35": 1, - "37": 2, - "4": 8, - "46": 1, - "47": 1, - "5": 2, - "54": 1 - }, - "29": { - "1": 106, - "17": 3, - "2": 1, - "27": 123, - "29": 107, - "3": 4, - "34": 1, - "36": 1, - "4": 29, - "40": 2, - "45": 2, - "55": 2, - "61": 1, - "8": 2 - }, - "3": { - "1": 52, - "17": 1, - "18": 1, - "20": 2, - "27": 2, - "29": 1, - "3": 20, - "6": 11 - }, - "30": { - "27": 2, - "28": 1, - "29": 1 - }, - "31": { - "1": 6, - "2": 1, - "27": 2, - "4": 3 - }, - "32": { - "1": 1, - "31": 1 - }, - "33": { - "4": 1 - }, - "34": { - "1": 4, - "27": 7, - "34": 6, - "36": 2, - "39": 1, - "58": 1, - "8": 4, - "9": 1 - }, - "35": { - "2": 1, - "34": 1 - }, - "36": { - "27": 2, - "29": 1, - "4": 1, - "8": 1 - }, - "37": { - "1": 49, - "12": 1, - "27": 43, - "28": 2, - "29": 1, - "37": 24, - "4": 16, - "40": 2, - "61": 1 - }, - "38": { - "3": 1 - }, - "39": { - "34": 1 - }, - "4": { - "1": 2720, - "11": 1, - "12": 1, - "13": 4, - "14": 2, - "17": 1, - "19": 4, - "2": 8, - "22": 1, - "23": 1, - "27": 472, - "28": 13, - "29": 6, - "31": 1, - "32": 1, - "34": 2, - "37": 30, - "4": 1821, - "40": 21, - "41": 1, - "43": 3, - "46": 3, - "5": 1, - "53": 11, - "54": 1, - "56": 1, - "61": 1, - "63": 1, - "8": 12, - "9": 6 - }, - "40": { - "1": 39, - "27": 20, - "28": 1, - "4": 19, - "40": 21, - "42": 1 - }, - "41": { - "2": 1, - "27": 1, - "4": 1 - }, - "42": { - "1": 4, - "27": 1 - }, - "43": { - "1": 4, - "27": 5, - "4": 1 - }, - "44": { - "27": 1 - }, - "45": { - "29": 1, - "38": 1, - "45": 3 - }, - "46": { - "1": 3, - "27": 10, - "37": 2, - "4": 2, - "46": 2, - "48": 1 - }, - "47": { - "27": 1 - }, - "48": { - "1": 1, - "27": 1 - }, - "49": { - "4": 1 - }, - "5": { - "1": 23, - "2": 19, - "27": 1, - "29": 1, - "4": 2, - "5": 24 - }, - "50": { - "1": 2, - "17": 1, - "19": 1, - "3": 1, - "50": 1 - }, - "51": { - "27": 1 - }, - "53": { - "1": 15, - "27": 9, - "4": 6, - "53": 4 - }, - "54": { - "1": 4, - "62": 1 - }, - "55": { - "1": 6, - "27": 2, - "29": 5, - "4": 2, - "55": 2 - }, - "56": { - "27": 1, - "56": 1 - }, - "57": { - "27": 2 - }, - "58": { - "27": 1 - }, - "59": { - "4": 1, - "59": 1 - }, - "6": { - "1": 11, - "17": 1, - "27": 3, - "29": 2, - "3": 6, - "40": 1, - "6": 3 - }, - "60": { - "29": 1 - }, - "61": { - "1": 5, - "23": 1, - "27": 1, - "28": 1, - "61": 1 - }, - "62": { - "27": 1, - "61": 1 - }, - "64": { - "2": 1 - }, - "65": { - "61": 1 - }, - "66": { - "29": 1 - }, - "67": { - "1": 2 - }, - "68": { - "21": 1 - }, - "69": { - "0": 2885, - "1": 6325, - "22": 1304, - "69": 71179, - "7": 258, - "70": 4002 - }, - "7": { - "69": 713, - "70": 3 - }, - "70": { - "1": 1434, - "69": 3005, - "7": 457, - "70": 1008 - }, - "71": { - "1": 741, - "17": 7, - "27": 2, - "3": 2, - "4": 2, - "8": 6 - }, - "8": { - "1": 48, - "23": 1, - "27": 7, - "28": 1, - "29": 1, - "34": 1, - "37": 1, - "4": 6, - "8": 46, - "9": 21 - }, - "9": { - "1": 24, - "24": 2, - "27": 3, - "28": 1, - "34": 1, - "35": 1, - "4": 3, - "8": 8, - "9": 5 - } - }, - "transition_probs": { - "0": { - "0": 1 - }, - "1": { - "1": 0.567118098796181, - "11": 0.00020755500207555002, - "13": 0.00046699875466998757, - "15": 0.000025944375259443752, - "16": 0.000025944375259443752, - "17": 0.0005188875051888751, - "19": 0.0008821087588210876, - "2": 0.004202988792029888, - "21": 0.000051888750518887505, - "22": 0.0008302200083022001, - "23": 0.00010377750103777501, - "24": 0.000025944375259443752, - "26": 0.000025944375259443752, - "27": 0.054586965545869656, - "28": 0.0006226650062266501, - "29": 0.0034506019095060193, - "3": 0.0012453300124533001, - "31": 0.00012972187629721878, - "32": 0.000025944375259443752, - "34": 0.00007783312577833126, - "37": 0.0007523868825238688, - "4": 0.08507160647571606, - "40": 0.0008042756330427564, - "41": 0.000051888750518887505, - "43": 0.00010377750103777501, - "46": 0.00018161062681610628, - "5": 0.00018161062681610628, - "50": 0.000051888750518887505, - "53": 0.0003372768783727688, - "54": 0.000025944375259443752, - "55": 0.000025944375259443752, - "59": 0.000025944375259443752, - "6": 0.00028538812785388126, - "61": 0.00007783312577833126, - "62": 0.000025944375259443752, - "67": 0.000025944375259443752, - "69": 0.2754773765047738, - "70": 0.00023349937733499379, - "8": 0.0012712743877127438, - "9": 0.00036322125363221256 - }, - "10": { - "1": 0.5, - "2": 0.5 - }, - "11": { - "1": 0.6666666666666666, - "11": 0.25, - "4": 0.08333333333333333 - }, - "12": { - "12": 0.25, - "27": 0.25, - "37": 0.25, - "4": 0.25 - }, - "13": { - "1": 0.4358974358974359, - "13": 0.4358974358974359, - "14": 0.02564102564102564, - "27": 0.05128205128205128, - "4": 0.02564102564102564, - "40": 0.02564102564102564 - }, - "14": { - "13": 0.3333333333333333, - "4": 0.3333333333333333, - "40": 0.3333333333333333 - }, - "15": { - "1": 1 - }, - "16": { - "1": 0.4, - "16": 0.6 - }, - "17": { - "1": 0.5192307692307693, - "17": 0.17307692307692307, - "18": 0.019230769230769232, - "19": 0.09615384615384616, - "27": 0.019230769230769232, - "29": 0.057692307692307696, - "3": 0.038461538461538464, - "4": 0.038461538461538464, - "52": 0.019230769230769232, - "6": 0.019230769230769232 - }, - "18": { - "1": 1 - }, - "19": { - "1": 0.5, - "17": 0.13793103448275862, - "19": 0.22413793103448276, - "27": 0.034482758620689655, - "3": 0.034482758620689655, - "4": 0.034482758620689655, - "50": 0.017241379310344827, - "51": 0.017241379310344827 - }, - "2": { - "1": 0.3953488372093023, - "10": 0.00516795865633075, - "2": 0.40310077519379844, - "27": 0.041343669250646, - "28": 0.041343669250646, - "30": 0.00516795865633075, - "4": 0.012919896640826873, - "5": 0.09043927648578812, - "54": 0.002583979328165375, - "8": 0.002583979328165375 - }, - "20": { - "50": 1 - }, - "21": { - "1": 0.4, - "21": 0.2, - "27": 0.2, - "68": 0.2 - }, - "22": { - "1": 0.19570166041778253, - "22": 0.3680369576861275, - "23": 0.00006695232994108195, - "24": 0.0002678093197643278, - "25": 0.08556507766470273, - "27": 0.00020085698982324584, - "29": 0.00006695232994108195, - "3": 0.00006695232994108195, - "4": 0.00006695232994108195, - "69": 0.3094536689876808, - "7": 0.00006695232994108195, - "70": 0.0404392072844135 - }, - "23": { - "1": 0.5454545454545454, - "2": 0.09090909090909091, - "23": 0.09090909090909091, - "27": 0.2727272727272727 - }, - "24": { - "1": 0.4444444444444444, - "22": 0.2222222222222222, - "24": 0.2222222222222222, - "28": 0.1111111111111111 - }, - "25": { - "22": 0.1153184165232358, - "25": 0.16738382099827884, - "69": 0.16351118760757316, - "70": 0.5537865748709122 - }, - "26": { - "8": 1 - }, - "27": { - "1": 0.3893280632411067, - "12": 0.00017966223499820338, - "16": 0.00017966223499820338, - "17": 0.00035932446999640676, - "19": 0.00017966223499820338, - "2": 0.003413582464965864, - "21": 0.00017966223499820338, - "22": 0.0007186489399928135, - "23": 0.00035932446999640676, - "27": 0.49029823931009703, - "28": 0.005749191519942508, - "29": 0.022457779374775423, - "3": 0.0005389867049946101, - "30": 0.00035932446999640676, - "31": 0.0008983111749910168, - "33": 0.00017966223499820338, - "34": 0.0017966223499820337, - "36": 0.00035932446999640676, - "37": 0.009162773984908373, - "4": 0.05982752425440172, - "40": 0.004311893639956881, - "42": 0.0007186489399928135, - "43": 0.0005389867049946101, - "44": 0.00017966223499820338, - "46": 0.0012576356449874237, - "48": 0.00017966223499820338, - "49": 0.00017966223499820338, - "5": 0.00017966223499820338, - "53": 0.0010779734099892202, - "54": 0.00017966223499820338, - "55": 0.0021559468199784403, - "57": 0.00035932446999640676, - "6": 0.00017966223499820338, - "60": 0.00017966223499820338, - "64": 0.00017966223499820338, - "65": 0.00017966223499820338, - "66": 0.00017966223499820338, - "67": 0.00017966223499820338, - "8": 0.0008983111749910168, - "9": 0.00017966223499820338 - }, - "28": { - "1": 0.232, - "2": 0.144, - "27": 0.216, - "28": 0.272, - "29": 0.008, - "35": 0.008, - "37": 0.016, - "4": 0.064, - "46": 0.008, - "47": 0.008, - "5": 0.016, - "54": 0.008 - }, - "29": { - "1": 0.2760416666666667, - "17": 0.0078125, - "2": 0.0026041666666666665, - "27": 0.3203125, - "29": 0.2786458333333333, - "3": 0.010416666666666666, - "34": 0.0026041666666666665, - "36": 0.0026041666666666665, - "4": 0.07552083333333333, - "40": 0.005208333333333333, - "45": 0.005208333333333333, - "55": 0.005208333333333333, - "61": 0.0026041666666666665, - "8": 0.005208333333333333 - }, - "3": { - "1": 0.5777777777777777, - "17": 0.011111111111111112, - "18": 0.011111111111111112, - "20": 0.022222222222222223, - "27": 0.022222222222222223, - "29": 0.011111111111111112, - "3": 0.2222222222222222, - "6": 0.12222222222222222 - }, - "30": { - "27": 0.5, - "28": 0.25, - "29": 0.25 - }, - "31": { - "1": 0.5, - "2": 0.08333333333333333, - "27": 0.16666666666666666, - "4": 0.25 - }, - "32": { - "1": 0.5, - "31": 0.5 - }, - "33": { - "4": 1 - }, - "34": { - "1": 0.15384615384615385, - "27": 0.2692307692307692, - "34": 0.23076923076923078, - "36": 0.07692307692307693, - "39": 0.038461538461538464, - "58": 0.038461538461538464, - "8": 0.15384615384615385, - "9": 0.038461538461538464 - }, - "35": { - "2": 0.5, - "34": 0.5 - }, - "36": { - "27": 0.4, - "29": 0.2, - "4": 0.2, - "8": 0.2 - }, - "37": { - "1": 0.35251798561151076, - "12": 0.007194244604316547, - "27": 0.30935251798561153, - "28": 0.014388489208633094, - "29": 0.007194244604316547, - "37": 0.17266187050359713, - "4": 0.11510791366906475, - "40": 0.014388489208633094, - "61": 0.007194244604316547 - }, - "38": { - "3": 1 - }, - "39": { - "34": 1 - }, - "4": { - "1": 0.528052805280528, - "11": 0.00019413706076490002, - "12": 0.00019413706076490002, - "13": 0.0007765482430596001, - "14": 0.00038827412152980003, - "17": 0.00019413706076490002, - "19": 0.0007765482430596001, - "2": 0.0015530964861192001, - "22": 0.00019413706076490002, - "23": 0.00019413706076490002, - "27": 0.09163269268103282, - "28": 0.0025237817899437004, - "29": 0.0011648223645894002, - "31": 0.00019413706076490002, - "32": 0.00019413706076490002, - "34": 0.00038827412152980003, - "37": 0.005824111822947, - "4": 0.35352358765288294, - "40": 0.004076878276062901, - "41": 0.00019413706076490002, - "43": 0.0005824111822947001, - "46": 0.0005824111822947001, - "5": 0.00019413706076490002, - "53": 0.0021355076684139, - "54": 0.00019413706076490002, - "56": 0.00019413706076490002, - "61": 0.00019413706076490002, - "63": 0.00019413706076490002, - "8": 0.0023296447291788003, - "9": 0.0011648223645894002 - }, - "40": { - "1": 0.38613861386138615, - "27": 0.19801980198019803, - "28": 0.009900990099009901, - "4": 0.18811881188118812, - "40": 0.2079207920792079, - "42": 0.009900990099009901 - }, - "41": { - "2": 0.3333333333333333, - "27": 0.3333333333333333, - "4": 0.3333333333333333 - }, - "42": { - "1": 0.8, - "27": 0.2 - }, - "43": { - "1": 0.4, - "27": 0.5, - "4": 0.1 - }, - "44": { - "27": 1 - }, - "45": { - "29": 0.2, - "38": 0.2, - "45": 0.6 - }, - "46": { - "1": 0.15, - "27": 0.5, - "37": 0.1, - "4": 0.1, - "46": 0.1, - "48": 0.05 - }, - "47": { - "27": 1 - }, - "48": { - "1": 0.5, - "27": 0.5 - }, - "49": { - "4": 1 - }, - "5": { - "1": 0.32857142857142857, - "2": 0.2714285714285714, - "27": 0.014285714285714285, - "29": 0.014285714285714285, - "4": 0.02857142857142857, - "5": 0.34285714285714286 - }, - "50": { - "1": 0.3333333333333333, - "17": 0.16666666666666666, - "19": 0.16666666666666666, - "3": 0.16666666666666666, - "50": 0.16666666666666666 - }, - "51": { - "27": 1 - }, - "52": { - "52": 1 - }, - "53": { - "1": 0.4411764705882353, - "27": 0.2647058823529412, - "4": 0.17647058823529413, - "53": 0.11764705882352941 - }, - "54": { - "1": 0.8, - "62": 0.2 - }, - "55": { - "1": 0.35294117647058826, - "27": 0.11764705882352941, - "29": 0.29411764705882354, - "4": 0.11764705882352941, - "55": 0.11764705882352941 - }, - "56": { - "27": 0.5, - "56": 0.5 - }, - "57": { - "27": 1 - }, - "58": { - "27": 1 - }, - "59": { - "4": 0.5, - "59": 0.5 - }, - "6": { - "1": 0.4074074074074074, - "17": 0.037037037037037035, - "27": 0.1111111111111111, - "29": 0.07407407407407407, - "3": 0.2222222222222222, - "40": 0.037037037037037035, - "6": 0.1111111111111111 - }, - "60": { - "29": 1 - }, - "61": { - "1": 0.5555555555555556, - "23": 0.1111111111111111, - "27": 0.1111111111111111, - "28": 0.1111111111111111, - "61": 0.1111111111111111 - }, - "62": { - "27": 0.5, - "61": 0.5 - }, - "63": { - "63": 1 - }, - "64": { - "2": 1 - }, - "65": { - "61": 1 - }, - "66": { - "29": 1 - }, - "67": { - "1": 1 - }, - "68": { - "21": 1 - }, - "69": { - "0": 0.033564855211569114, - "1": 0.07358672763021651, - "22": 0.01517108187032448, - "69": 0.8281153653740998, - "7": 0.003001640431398555, - "70": 0.04656032948239154 - }, - "7": { - "69": 0.9958100558659218, - "70": 0.004189944134078212 - }, - "70": { - "1": 0.24288617886178862, - "69": 0.5089769647696477, - "7": 0.07740514905149051, - "70": 0.17073170731707318 - }, - "71": { - "1": 0.975, - "17": 0.009210526315789473, - "27": 0.002631578947368421, - "3": 0.002631578947368421, - "4": 0.002631578947368421, - "8": 0.007894736842105263 - }, - "8": { - "1": 0.3609022556390977, - "23": 0.007518796992481203, - "27": 0.05263157894736842, - "28": 0.007518796992481203, - "29": 0.007518796992481203, - "34": 0.007518796992481203, - "37": 0.007518796992481203, - "4": 0.045112781954887216, - "8": 0.3458646616541353, - "9": 0.15789473684210525 - }, - "9": { - "1": 0.5, - "24": 0.041666666666666664, - "27": 0.0625, - "28": 0.020833333333333332, - "34": 0.020833333333333332, - "35": 0.020833333333333332, - "4": 0.0625, - "8": 0.16666666666666666, - "9": 0.10416666666666667 - } - }, - "metadata": { - "abstraction_version": "coding-risk-v2", - "alpha": 0, - "eval_sessions": 2311, - "events": 209705, - "generated_at": "2026-04-27T14:18:10.657133Z", - "horizon": 5, - "sessions": 11556, - "source": "combined-hf-nemotron-full", - "train_sessions": 9245, - "unsafe_definition": [ - "policy_block", - "failed_tool", - "hard_interruption", - "vulnerability_introduced", - "direct_infrastructure_api_with_managed_credential", - "unapproved_destructive_persistent_or_production_operation" - ], - "version": "v0.1.0" - } -} diff --git a/models/guard/coding-risk-v2.schema.json b/models/guard/coding-risk-v2.schema.json deleted file mode 100644 index d84d4b2..0000000 --- a/models/guard/coding-risk-v2.schema.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "abstraction_version": "coding-risk-v2", - "signals": [ - "user_prompt", - "agent_reply", - "tool_call", - "shell_operation", - "network_operation", - "credential_access", - "managed_credential_use", - "direct_provider_api_call", - "infrastructure_provider", - "destructive_operation", - "persistent_data_resource", - "production_environment", - "explicit_user_approval", - "policy_ask", - "policy_block", - "failed_tool", - "user_pushback", - "hard_interruption", - "vulnerability_introduced", - "unknown_or_low_confidence", - "managed_tool_call", - "write_operation", - "source_control_provider", - "identity_or_docs_provider" - ], - "unsafe_definition": [ - "policy_block", - "failed_tool", - "hard_interruption", - "vulnerability_introduced", - "direct_infrastructure_api_with_managed_credential", - "unapproved_destructive_persistent_or_production_operation" - ] -} diff --git a/models/guard/embed.go b/models/guard/embed.go deleted file mode 100644 index a4b98d2..0000000 --- a/models/guard/embed.go +++ /dev/null @@ -1,8 +0,0 @@ -package guardmodels - -import _ "embed" - -// CodingAgentV0 is the default local risk model shipped inside release builds. -// -//go:embed coding-agent-v0.json -var CodingAgentV0 []byte diff --git a/scripts/guard-e2e-local.sh b/scripts/guard-e2e-local.sh index 38154f0..e3d4eab 100755 --- a/scripts/guard-e2e-local.sh +++ b/scripts/guard-e2e-local.sh @@ -25,9 +25,7 @@ echo "==> starting local daemon on ${BASE_URL}" KONTEXT_NOTIFY=0 go run ./cmd/kontext guard start --skip-hook-install --no-open \ --addr "127.0.0.1:${PORT}" \ --db "$DB_PATH" \ - --model models/guard/coding-agent-v0.json \ - --socket "$SOCKET_PATH" \ - --threshold 0.3 >"$LOG_PATH" 2>&1 & + --socket "$SOCKET_PATH" >"$LOG_PATH" 2>&1 & DAEMON_PID=$! for _ in $(seq 1 80); do @@ -102,14 +100,14 @@ process.stdin.on("end", () => { assert_hook \ "safe read" \ "{\"session_id\":\"${SESSION_ID}\",\"hook_event_name\":\"PreToolUse\",\"tool_name\":\"Read\",\"tool_input\":{\"file_path\":\"README.md\"}}" \ - "normal tool call" \ + "no deterministic policy rule matched" \ "would allow" assert_hook \ "credential read" \ "{\"session_id\":\"${SESSION_ID}\",\"hook_event_name\":\"PreToolUse\",\"tool_name\":\"Read\",\"tool_input\":{\"file_path\":\".env\"}}" \ - "credential access requires approval" \ - "would ask" + "credential access blocked by deterministic policy" \ + "would deny" assert_hook \ "provider credential" \ @@ -128,7 +126,7 @@ let raw = ""; process.stdin.on("data", (chunk) => raw += chunk); process.stdin.on("end", () => { const summary = JSON.parse(raw); - if (summary.critical !== 1 || summary.warnings !== 1 || summary.actions !== 4 || summary.sessions !== 1) { + if (summary.critical !== 2 || summary.warnings !== 0 || summary.actions !== 4 || summary.sessions !== 1) { throw new Error(`unexpected summary ${JSON.stringify(summary)}`); } }); @@ -143,7 +141,7 @@ let raw = ""; process.stdin.on("data", (chunk) => raw += chunk); process.stdin.on("end", () => { const summary = JSON.parse(raw); - if (summary.critical !== 1 || summary.warnings !== 1 || summary.actions !== 4 || summary.sessions !== 1) { + if (summary.critical !== 2 || summary.warnings !== 0 || summary.actions !== 4 || summary.sessions !== 1) { throw new Error(`unexpected summary ${JSON.stringify(summary)}`); } }); @@ -155,21 +153,16 @@ process.stdin.on("data", (chunk) => raw += chunk); process.stdin.on("end", () => { const events = JSON.parse(raw); const decisions = events.map((event) => event.decision).sort().join(","); - if (events.length !== 4 || decisions !== "allow,allow,ask,deny") { + if (events.length !== 4 || decisions !== "allow,allow,deny,deny") { throw new Error(`unexpected decisions ${decisions} in ${JSON.stringify(events)}`); } - for (const event of events) { - if (event.risk_score == null) { - throw new Error(`missing risk score for ${event.id}`); - } - } }); ' echo "==> checking served dashboard" curl -fsS "$BASE_URL" | grep -q "Kontext Guard" -go run ./cmd/kontext guard status --daemon-url "$BASE_URL" | grep -q "1 critical" +go run ./cmd/kontext guard status --daemon-url "$BASE_URL" | grep -q "2 critical" go run ./cmd/kontext guard doctor --daemon-url "$BASE_URL" | grep -q "daemon healthy" -echo "E2E passed: hook -> local runtime -> RuntimeCore -> risk engine -> SQLite -> dashboard API" +echo "E2E passed: hook -> local runtime -> RuntimeCore -> deterministic policy -> SQLite -> dashboard API" diff --git a/web/guard-dashboard/src/dashboard/ActionList.tsx b/web/guard-dashboard/src/dashboard/ActionList.tsx index e41e7de..ecbac2a 100644 --- a/web/guard-dashboard/src/dashboard/ActionList.tsx +++ b/web/guard-dashboard/src/dashboard/ActionList.tsx @@ -7,7 +7,7 @@ import { } from "@/components/ui/collapsible"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { cn } from "@/lib/utils"; -import { decisionTone, prettyTool, scoreLabel, summaryOf } from "./helpers"; +import { decisionSource, decisionTone, prettyTool, summaryOf } from "./helpers"; import { DecisionDot } from "./shared"; import type { Decision, Event, EventGroups, Tab } from "./types"; @@ -173,12 +173,12 @@ function Row({ )} - {scoreLabel(event)} + {decisionSource(event)} 0 ? Math.min(1.2, score / threshold) : null; const tone = decisionTone[event.decision]; return ( @@ -47,19 +42,29 @@ export function Inspector({ event }: { event: Event }) {

- {score != null && threshold != null && ( - - )} -
Operation
{r.operation || r.operation_class || "unknown"}
Source
{decisionSource(event)}
+
Stage
+
{r.decision_stage ? humanize(r.decision_stage) : "unknown"}
Environment
{r.environment || "unknown"}
+ {r.judge_model && ( + <> +
Judge
+
{r.judge_model}
+ + )} + {r.policy_rule_id && ( + <> +
Policy rule
+
{r.policy_rule_id}
+ + )}
@@ -101,59 +106,6 @@ export function Inspector({ event }: { event: Event }) { ); } -function RiskMeter({ - tone, - score, - threshold, - ratio, -}: { - tone: { text: string; bg: string }; - score: number; - threshold: number; - ratio: number | null; -}) { - return ( - - -
-
-
- - Risk score - - - {score.toFixed(3)} - -
-
- - Threshold - -
- {threshold.toFixed(3)} -
-
-
- {ratio != null && ( -
-
-
- )} -
- - Risk score relative to threshold - - ); -} - function Section({ title, children }: { title: string; children: React.ReactNode }) { return (
@@ -164,4 +116,3 @@ function Section({ title, children }: { title: string; children: React.ReactNode
); } - diff --git a/web/guard-dashboard/src/dashboard/api.ts b/web/guard-dashboard/src/dashboard/api.ts index ab9e33a..e3c0b6e 100644 --- a/web/guard-dashboard/src/dashboard/api.ts +++ b/web/guard-dashboard/src/dashboard/api.ts @@ -44,11 +44,6 @@ function optionalNumber(value: unknown): number | undefined { return typeof value === "number" && Number.isFinite(value) ? value : undefined; } -function nullableNumber(value: unknown): number | null | undefined { - if (value === null) return null; - return optionalNumber(value); -} - function stringList(value: unknown): string[] | undefined { if (!Array.isArray(value)) return undefined; const strings = value.filter((item): item is string => typeof item === "string"); @@ -96,11 +91,18 @@ function parseRiskEvent(value: unknown): RiskEvent | undefined { path_class: optionalString(value.path_class), decision: decision(value.decision), reason_code: optionalString(value.reason_code), - model_version: optionalString(value.model_version), + decision_stage: optionalString(value.decision_stage), signals: stringList(value.signals), guard_id: optionalString(value.guard_id), - risk_score: nullableNumber(value.risk_score), confidence: optionalNumber(value.confidence), + policy_profile: optionalString(value.policy_profile), + policy_rule_id: optionalString(value.policy_rule_id), + policy_rule_category: optionalString(value.policy_rule_category), + judge_runtime: optionalString(value.judge_runtime), + judge_model: optionalString(value.judge_model), + judge_failure_kind: optionalString(value.judge_failure_kind), + judge_risk_level: optionalString(value.judge_risk_level), + judge_categories: stringList(value.judge_categories), }; } @@ -129,8 +131,6 @@ function parseEvent(value: unknown): Event | undefined { decision: parsedDecision, reason: optionalString(value.reason), reason_code: optionalString(value.reason_code), - risk_score: nullableNumber(value.risk_score), - threshold: nullableNumber(value.threshold), risk_event: parseRiskEvent(value.risk_event), }; } diff --git a/web/guard-dashboard/src/dashboard/helpers.ts b/web/guard-dashboard/src/dashboard/helpers.ts index 00be220..b08bec9 100644 --- a/web/guard-dashboard/src/dashboard/helpers.ts +++ b/web/guard-dashboard/src/dashboard/helpers.ts @@ -6,8 +6,12 @@ const DETERMINISTIC_REASON_CODES = new Set([ "destructive_operation_without_intent", "direct_infra_api_with_credential", "unknown_high_risk_command", + "no_policy_rule_matched", ]); +const JUDGE_STAGES = new Set(["judge_allow", "judge_deny", "judge_fail_open"]); +const DETERMINISTIC_STAGES = new Set(["deterministic_deny", "deterministic_allow"]); + export function bucket(events: Event[]): EventBuckets { const groups: EventGroups = { deny: [], ask: [], allow: [] }; for (const e of events) groups[e.decision]?.push(e); @@ -46,55 +50,58 @@ export function prettyTool(t?: string): string { } export function isDeterministicGuard(e: Event): boolean { - return Boolean(e.risk_event?.guard_id) || DETERMINISTIC_REASON_CODES.has(e.reason_code ?? ""); + const stage = e.risk_event?.decision_stage; + return ( + Boolean(stage && DETERMINISTIC_STAGES.has(stage)) || + DETERMINISTIC_REASON_CODES.has(e.reason_code ?? "") + ); } export function humanReason(e: Event): string { if (e.reason_code === "async_telemetry") return "Recorded after execution."; - if (e.reason_code === "model_risk_threshold") { - return "Markov sequence risk crossed the local threshold."; + if (e.risk_event?.decision_stage === "judge_fail_open") { + return "Local judge was unavailable, so Guard allowed by fail-open policy."; } return e.reason || e.reason_code || "No explanation captured."; } export function technicalExplanation(e: Event): string { const r = e.risk_event ?? {}; - const score = scoreLabel(e); - const threshold = thresholdLabel(e); - if (e.reason_code === "model_risk_threshold") { - return `The Markov-chain model scored this normalized action at ${score}, at or above threshold ${threshold}.`; - } if (e.reason_code === "async_telemetry") { - return "Not a live gate. Recorded after execution to improve future model parameters."; + return "Not a live gate. Recorded after execution for local session history."; + } + if (r.decision_stage === "judge_allow") { + return `Deterministic policy allowed this action, then the local judge allowed it${r.judge_model ? ` using ${r.judge_model}` : ""}.`; + } + if (r.decision_stage === "judge_deny") { + return `Deterministic policy allowed this action, then the local judge denied it${r.judge_model ? ` using ${r.judge_model}` : ""}.`; + } + if (r.decision_stage === "judge_fail_open") { + return `Deterministic policy allowed this action, but the local judge failed${r.judge_failure_kind ? ` with ${humanize(r.judge_failure_kind)}` : ""}.`; } if (isDeterministicGuard(e)) { - return `A deterministic rule fired before the model decision mattered. Markov score is ${score} against threshold ${threshold}.`; + return r.policy_rule_id + ? `Deterministic policy matched ${r.policy_rule_id} before calling the local judge.` + : "Deterministic policy allowed this action."; } if (r.type === "normal_tool_call") { - return `Model score is ${score} against threshold ${threshold}. Routine coding-agent behavior.`; + return "Routine coding-agent behavior. No deterministic policy rule matched."; } - return `Normalized as ${r.type || "unknown"} with model score ${score} against threshold ${threshold}.`; + return `Normalized as ${r.type || "unknown"}.`; } export function decisionSource(e: Event): string { - if (e.reason_code === "model_risk_threshold") return "Markov-chain model"; + const stage = e.risk_event?.decision_stage; + if (stage && JUDGE_STAGES.has(stage)) return "Local LLM judge"; if (e.reason_code === "async_telemetry") return "Trace history"; - if (isDeterministicGuard(e)) return "Deterministic rule"; - return "Normal scoring"; + if (isDeterministicGuard(e)) return "Deterministic policy"; + return "Guard policy"; } export function actionSummary(e: Event): string { return summaryOf(e, "No command summary stored."); } -export function scoreLabel(e: Event): string { - return e.risk_score == null ? "n/a" : e.risk_score.toFixed(3); -} - -export function thresholdLabel(e: Event): string { - return e.threshold == null ? "n/a" : e.threshold.toFixed(3); -} - export function relativeTime(value?: string): string { if (!value) return "just now"; const ts = Date.parse(value); diff --git a/web/guard-dashboard/src/dashboard/sample-data.ts b/web/guard-dashboard/src/dashboard/sample-data.ts index 0a90be2..12004b3 100644 --- a/web/guard-dashboard/src/dashboard/sample-data.ts +++ b/web/guard-dashboard/src/dashboard/sample-data.ts @@ -22,8 +22,6 @@ export const SAMPLE_EVENTS: Event[] = [ decision: "deny", reason_code: "production_mutation", reason: "Production mutation blocked by deterministic policy.", - risk_score: 0.982, - threshold: 0.8, risk_event: { type: "provider_operation", operation: "delete", @@ -32,6 +30,8 @@ export const SAMPLE_EVENTS: Event[] = [ command_summary: "kubectl delete deployment checkout-api -n production", signals: ["production", "mutation", "persistent_resource"], guard_id: "guard.production_mutation.v1", + decision_stage: "deterministic_deny", + policy_rule_id: "guard.production_mutation.v1", }, }, { @@ -41,8 +41,6 @@ export const SAMPLE_EVENTS: Event[] = [ decision: "deny", reason_code: "credential_access_without_intent", reason: "Credential access blocked by deterministic policy.", - risk_score: 0.944, - threshold: 0.8, risk_event: { type: "credential_access", operation: "read", @@ -51,17 +49,17 @@ export const SAMPLE_EVENTS: Event[] = [ command_summary: "Read local AWS credentials without explicit user intent", signals: ["credential_path", "credential_observed"], guard_id: "guard.credential_access.v1", + decision_stage: "deterministic_deny", + policy_rule_id: "guard.credential_access.v1", }, }, { id: "evt-admin-reindex-001", session_id: SAMPLE_SESSION_ID, tool_name: "Bash", - decision: "ask", - reason_code: "model_risk_threshold", - reason: "Markov sequence risk crossed the local threshold.", - risk_score: 0.836, - threshold: 0.8, + decision: "deny", + reason_code: "judge_deny", + reason: "Local judge denied a risky staging admin mutation.", risk_event: { type: "normal_tool_call", operation: "network_write", @@ -69,6 +67,10 @@ export const SAMPLE_EVENTS: Event[] = [ environment: "staging", command_summary: "curl -X POST $PAYMENTS_ADMIN_URL/reindex", signals: ["network_call", "admin_endpoint"], + decision_stage: "judge_deny", + judge_model: "Qwen/Qwen3-0.6B-GGUF", + judge_risk_level: "high", + judge_categories: ["admin_mutation"], }, }, { @@ -78,8 +80,6 @@ export const SAMPLE_EVENTS: Event[] = [ decision: "ask", reason_code: "unknown_high_risk_command", reason: "Unknown high-risk command needs review.", - risk_score: 0.791, - threshold: 0.8, risk_event: { type: "unknown", operation: "shell", @@ -88,6 +88,8 @@ export const SAMPLE_EVENTS: Event[] = [ command_summary: "openssl rsautl -decrypt -inkey private.pem -in payload.bin", signals: ["unknown_high_risk", "credential_observed"], guard_id: "guard.unknown_high_risk.v1", + decision_stage: "deterministic_deny", + policy_rule_id: "guard.unknown_high_risk.v1", }, }, { @@ -97,8 +99,6 @@ export const SAMPLE_EVENTS: Event[] = [ decision: "allow", reason_code: "async_telemetry", reason: "Recorded after execution.", - risk_score: 0.071, - threshold: 0.8, risk_event: { type: "normal_tool_call", operation: "read", @@ -106,6 +106,7 @@ export const SAMPLE_EVENTS: Event[] = [ path_class: "source_code", command_summary: "Read internal/guard/app/server/server.go", signals: ["source_code_read"], + decision_stage: "async_telemetry", }, }, { @@ -115,8 +116,6 @@ export const SAMPLE_EVENTS: Event[] = [ decision: "allow", reason_code: "async_telemetry", reason: "Recorded after execution.", - risk_score: 0.118, - threshold: 0.8, risk_event: { type: "normal_tool_call", operation: "write", @@ -125,6 +124,7 @@ export const SAMPLE_EVENTS: Event[] = [ path_class: "source_code", command_summary: "Edit web/guard-dashboard/src/App.tsx", signals: ["workspace_file", "source_code_write"], + decision_stage: "async_telemetry", }, }, { @@ -134,8 +134,6 @@ export const SAMPLE_EVENTS: Event[] = [ decision: "allow", reason_code: "async_telemetry", reason: "Recorded after execution.", - risk_score: 0.203, - threshold: 0.8, risk_event: { type: "normal_tool_call", operation: "test", @@ -143,6 +141,7 @@ export const SAMPLE_EVENTS: Event[] = [ environment: "local", command_summary: "pnpm --dir web/guard-dashboard build", signals: ["local_build", "known_safe_command"], + decision_stage: "async_telemetry", }, }, ]; diff --git a/web/guard-dashboard/src/dashboard/types.ts b/web/guard-dashboard/src/dashboard/types.ts index b6974a6..b7ad89c 100644 --- a/web/guard-dashboard/src/dashboard/types.ts +++ b/web/guard-dashboard/src/dashboard/types.ts @@ -21,11 +21,18 @@ export type RiskEvent = { path_class?: string; decision?: Decision; reason_code?: string; - model_version?: string; + decision_stage?: string; signals?: string[]; guard_id?: string; - risk_score?: number | null; confidence?: number; + policy_profile?: string; + policy_rule_id?: string; + policy_rule_category?: string; + judge_runtime?: string; + judge_model?: string; + judge_failure_kind?: string; + judge_risk_level?: string; + judge_categories?: string[]; }; export type Event = { @@ -35,8 +42,6 @@ export type Event = { decision: Decision; reason?: string; reason_code?: string; - risk_score?: number | null; - threshold?: number | null; risk_event?: RiskEvent; };