diff --git a/cmd/agentctl/cmd_set_model.go b/cmd/agentctl/cmd_set_model.go new file mode 100644 index 0000000..9a2f0d6 --- /dev/null +++ b/cmd/agentctl/cmd_set_model.go @@ -0,0 +1,56 @@ +package main + +import ( + "fmt" + + "github.com/agentserver/agentserver-pkg/internal/codex" + "github.com/agentserver/agentserver-pkg/internal/paths" + "github.com/agentserver/agentserver-pkg/internal/protoconv" +) + +func runSetModel(args []string) { + if err := runSetModelWithConfigResolved(args); err != nil { + die(err) + } +} + +// runSetModelWithConfigResolved resolves the real Codex config path and applies. +func runSetModelWithConfigResolved(args []string) error { + if len(args) < 1 { + return fmt.Errorf("usage: agentctl set-model ; known models: %v", protoconv.KnownModels()) + } + if err := validateModelSelection(args[0]); err != nil { + return err + } + p, err := paths.Default() + if err != nil { + return err + } + return runSetModelWithConfig(p.CodexConfigFile, args) +} + +// runSetModelWithConfig applies the selection to an explicit config path (testable). +func runSetModelWithConfig(configPath string, args []string) error { + if len(args) < 1 { + return fmt.Errorf("usage: set-model ; known models: %v", protoconv.KnownModels()) + } + if err := validateModelSelection(args[0]); err != nil { + return err + } + if err := codex.SetModel(configPath, args[0]); err != nil { + return err + } + fmt.Printf("model set to %s in %s\n", args[0], configPath) + return nil +} + +// validateModelSelection rejects models not in the protoconv catalog. +func validateModelSelection(model string) error { + if model == "" { + return fmt.Errorf("model name required; known models: %v", protoconv.KnownModels()) + } + if _, ok := protoconv.LookupRoute(model); !ok { + return fmt.Errorf("unknown model %q; known models: %v", model, protoconv.KnownModels()) + } + return nil +} diff --git a/cmd/agentctl/cmd_set_model_test.go b/cmd/agentctl/cmd_set_model_test.go new file mode 100644 index 0000000..a6f7760 --- /dev/null +++ b/cmd/agentctl/cmd_set_model_test.go @@ -0,0 +1,46 @@ +package main + +import ( + "os" + "path/filepath" + "testing" +) + +func TestValidateModelSelection(t *testing.T) { + cases := []struct { + model string + ok bool + }{ + {"gpt-5.5", true}, + {"deepseek-v4-pro", true}, + {"glm-5.2", true}, + {"bogus-model", false}, + {"", false}, + } + for _, c := range cases { + if err := validateModelSelection(c.model); (err == nil) != c.ok { + t.Errorf("validateModelSelection(%q) err=%v, want ok=%v", c.model, err, c.ok) + } + } +} + +func TestRunSetModelWritesConfig(t *testing.T) { + dir := t.TempDir() + path := filepath.Join(dir, "config.toml") + if err := runSetModelWithConfig(path, []string{"deepseek-v4-pro"}); err != nil { + t.Fatalf("err: %v", err) + } + b, _ := os.ReadFile(path) + if !contains(string(b), `model = "deepseek-v4-pro"`) { + t.Errorf("model not written; got:\n%s", b) + } +} + +func contains(s, sub string) bool { + for i := 0; i+len(sub) <= len(s); i++ { + if s[i:i+len(sub)] == sub { + return true + } + } + return false +} diff --git a/cmd/agentctl/main.go b/cmd/agentctl/main.go index 7a16003..57b42ff 100644 --- a/cmd/agentctl/main.go +++ b/cmd/agentctl/main.go @@ -23,6 +23,8 @@ func main() { if err := runInstallCodex(os.Args[2:]); err != nil { die(err) } + case "set-model": + runSetModel(os.Args[2:]) case "test-install-vscode": runTestInstallVSCode() case "test-install-codex-desktop": @@ -54,6 +56,7 @@ USAGE: agentctl logs print last 200 lines of launcher log agentctl install-codex --manifest download and install Codex runtime from npm mirrors + agentctl set-model set the Codex model (gpt-5.5 / deepseek-v4-pro / glm-5.2) P13.4 verification subcommands (skip the OAuth steps, exercise everything else): agentctl test-install-vscode download + run the VS Code Microsoft Store bootstrapper diff --git a/cmd/agentserver/main.go b/cmd/agentserver/main.go index 31452be..60b1536 100644 --- a/cmd/agentserver/main.go +++ b/cmd/agentserver/main.go @@ -13,11 +13,13 @@ import ( "strings" "syscall" + "github.com/agentserver/agentserver-pkg/internal/codex" "github.com/agentserver/agentserver-pkg/internal/headless" "github.com/agentserver/agentserver-pkg/internal/modelaccess" "github.com/agentserver/agentserver-pkg/internal/modelserver" "github.com/agentserver/agentserver-pkg/internal/oauth" "github.com/agentserver/agentserver-pkg/internal/paths" + "github.com/agentserver/agentserver-pkg/internal/protoconv" "github.com/agentserver/agentserver-pkg/internal/secrets" "github.com/agentserver/agentserver-pkg/internal/terminalauth" "golang.org/x/term" @@ -32,6 +34,7 @@ type app struct { switchWorkspace func(context.Context) error serveDriverMCP func(context.Context) error runDaemon func(context.Context) error + setModel func(args []string) error } func main() { @@ -165,6 +168,9 @@ func newApp() app { Logf: daemonLogf(proxyLogPath), }) }, + setModel: func(args []string) error { + return runAgentserverSetModel(args) + }, } } @@ -191,6 +197,12 @@ func (a app) run(ctx context.Context, args []string) error { if cmd == "model-proxy-daemon" { return a.runDaemon(ctx) } + if cmd == "set-model" { + if a.setModel == nil { + return fmt.Errorf("set-model unavailable: paths not initialized") + } + return a.setModel(args[1:]) + } switch cmd { case "", "install-driver", "switch-workspace", "serve-driver-mcp": default: @@ -230,6 +242,25 @@ func promptName(defaultName string) (string, error) { }) } +func runAgentserverSetModel(args []string) error { + if len(args) < 1 { + return fmt.Errorf("usage: agentserver set-model ; known models: %v", protoconv.KnownModels()) + } + model := args[0] + if _, ok := protoconv.LookupRoute(model); !ok { + return fmt.Errorf("unknown model %q; known models: %v", model, protoconv.KnownModels()) + } + p, err := paths.Default() + if err != nil { + return err + } + if err := codex.SetModel(p.CodexConfigFile, model); err != nil { + return err + } + fmt.Printf("model set to %s in %s\n", model, p.CodexConfigFile) + return nil +} + func promptNameWithTerminal(r io.Reader, w io.Writer, defaultName string, isTerminal func() bool) (string, error) { if isTerminal == nil || !isTerminal() { return defaultName, nil diff --git a/cmd/launcher/main.go b/cmd/launcher/main.go index 94d0e5f..709d342 100644 --- a/cmd/launcher/main.go +++ b/cmd/launcher/main.go @@ -231,6 +231,7 @@ func serveCompletedConsole(ctx context.Context, in completedServeInput) error { Slaves: slaveManager, Updates: updates, PendingSlaveRestartsPath: in.Paths.PendingSlaveRestartsFile, + CodexConfigFile: in.Paths.CodexConfigFile, ModelserverWebBaseURL: "https://code.cs.ac.cn", RefreshModelserverToken: func(ctx context.Context) error { _, err := tokenrefresh.RefreshOnce(ctx, tokenrefresh.Options{ @@ -806,8 +807,9 @@ func launchCompletedOpenCodeDesktop(ctx context.Context, s *state.State, p paths if err != nil { return err } + // See launchCompletedCodexDesktop for why this is tolerant of failure. if err := codex.UpdateConfig(p.CodexConfigFile, codex.ModelserverProxySettings(modelproxy.DefaultBaseURL, localProxyToken)); err != nil { - return err + log.Printf("launcher: update codex config (continuing): %v", err) } if p.OpenCodeConfigFile != "" { if err := opencode.UpdateConfig(p.OpenCodeConfigFile, opencode.Settings{ @@ -858,8 +860,15 @@ func launchCompletedCodexDesktop(ctx context.Context, s *state.State, p paths.Pa if err != nil { return err } + // UpdateConfig writes config.toml atomically (write tmp, rename). If Codex + // Desktop is already running it holds a read handle and Windows rejects + // the rename with ERROR_ACCESS_DENIED. That's a benign no-op for "open + // frontend" — the running Codex won't reload the file anyway — so log and + // continue rather than fail the launch. First-time startup (Codex not + // running, file unlocked) still writes normally; codex.SetModel (user + // switching models) is invoked when Codex isn't holding the file open. if err := codex.UpdateConfig(p.CodexConfigFile, codex.ModelserverProxySettings(modelproxy.DefaultBaseURL, localProxyToken)); err != nil { - return err + log.Printf("launcher: update codex config (continuing): %v", err) } _ = env.PersistUserEnv(codex.LocalProxyAPIKeyEnv, localProxyToken) _ = os.Setenv(codex.LocalProxyAPIKeyEnv, localProxyToken) @@ -1028,8 +1037,13 @@ func execVSCode(codeExe string, p paths.Paths, folder string, sec secrets.Store, if err != nil { return err } + // Unlike Codex/OpenCode Desktop, VS Code does NOT hold the codex config + // open, so the rename-while-locked race that justifies tolerating + // UpdateConfig failures in those paths doesn't apply here. We need a + // fresh codex config before VS Code starts (the Codex extension reads it + // at session creation), so propagate the error. if err := codex.UpdateConfig(p.CodexConfigFile, codex.ModelserverProxySettings(modelproxy.DefaultBaseURL, localProxyToken)); err != nil { - return err + return fmt.Errorf("update codex config before launching VS Code: %w", err) } _ = env.PersistUserEnv(codex.LocalProxyAPIKeyEnv, localProxyToken) _ = os.Setenv(codex.LocalProxyAPIKeyEnv, localProxyToken) diff --git a/docs/superpowers/plans/2026-06-17-glm-deepseek-codex-support.md b/docs/superpowers/plans/2026-06-17-glm-deepseek-codex-support.md new file mode 100644 index 0000000..21eb1f5 --- /dev/null +++ b/docs/superpowers/plans/2026-06-17-glm-deepseek-codex-support.md @@ -0,0 +1,1739 @@ +# GLM / DeepSeek Codex Support Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Let Codex use `glm-5.2[1m]` (via Anthropic Messages) and `deepseek-v4-pro` (via Chat Completions) in addition to `gpt-5.5`, by adding a per-request protocol-conversion layer to the existing local proxy. + +**Architecture:** Codex only speaks the OpenAI Responses API. The local proxy (`internal/modelproxy`, `127.0.0.1:53452`) peeks the `model` field from each `/v1/responses` request and dispatches: `gpt-5.5` → pass-through; `deepseek-v4-pro` → a new `internal/protoconv` converter (Responses⇄Chat Completions); `glm-5.2[1m]` → another converter (Responses⇄Anthropic Messages). The proxy owns transport/auth/token; `protoconv` owns pure translation. A `set-model` subcommand on both CLIs rewrites `~/.codex/config.toml`'s `model` field. + +**Tech Stack:** Go 1.x, `encoding/json`, `net/http`/`httputil`, table-driven tests. Conversion logic references cc-switch / `responses-proxy` / llama-swap (read-only). + +**Spec:** `docs/superpowers/specs/2026-06-17-glm-deepseek-codex-support-design.md`. The conversion mapping contract lives there (Conversion Contract §). + +**Worktree:** `worktree-glm-deepseek-codex-support`, based on `origin/master` (contains `opencode-desktop-support`). All paths below are relative to the worktree root. + +**Conventions:** match the repo — `errors`/`fmt`, table-driven tests, `go test -race -count=1`. Commit after each task. Reference the spec's Conversion Contract for any mapping detail not shown verbatim below. + +--- + +## File Structure + +| File | Responsibility | +|---|---| +| `internal/protoconv/catalog.go` | model → wire-protocol routing table; `LookupRoute`, `KnownModels` | +| `internal/protoconv/responses.go` | shared types: `Wire`, `Route`, Responses request/response/SSE structs | +| `internal/protoconv/chat.go` | Converter A: Responses⇄Chat Completions (deepseek) | +| `internal/protoconv/anthropic.go` | Converter B: Responses⇄Anthropic Messages (glm) | +| `internal/protoconv/*_test.go` | table-driven tests for each converter | +| `internal/modelproxy/proxy.go` | routing dispatch in `NewHandler` | +| `internal/modelproxy/proxy_test.go` | routing cases (gpt-5.5 / deepseek / glm / unknown) | +| `cmd/agentctl/cmd_set_model.go` + `cmd/agentctl/main.go` | `agentctl set-model ` | +| `cmd/agentctl/cmd_set_model_test.go` | validation + config-rewrite test | +| `cmd/agentserver/main.go` (+ wiring) | `agentserver set-model ` | + +`internal/codex/config.go` needs **no code change** — `ModelserverSettings()` keeps the `gpt-5.5` default and callers already override `s.Model` (verified unchanged on `origin/master`). + +--- + +## Task 1: Catalog + shared types + +**Files:** +- Create: `internal/protoconv/responses.go` +- Create: `internal/protoconv/catalog.go` +- Create: `internal/protoconv/catalog_test.go` + +- [ ] **Step 1: Write the failing test** + +`internal/protoconv/catalog_test.go`: +```go +package protoconv + +import "testing" + +func TestLookupRoute(t *testing.T) { + cases := []struct { + model string + want Wire + ok bool + }{ + {"gpt-5.5", WireResponses, true}, + {"deepseek-v4-pro", WireChat, true}, + {"glm-5.2[1m]", WireAnthropic, true}, + {"does-not-exist", "", false}, + } + for _, c := range cases { + r, ok := LookupRoute(c.model) + if ok != c.ok { + t.Errorf("LookupRoute(%q) ok = %v, want %v", c.model, ok, c.ok) + continue + } + if ok && r.Wire != c.want { + t.Errorf("LookupRoute(%q) wire = %q, want %q", c.model, r.Wire, c.want) + } + } +} + +func TestKnownModels(t *testing.T) { + got := KnownModels() + want := map[string]bool{"gpt-5.5": true, "deepseek-v4-pro": true, "glm-5.2[1m]": true} + if len(got) != len(want) { + t.Fatalf("KnownModels() = %v, want %d entries", got, len(want)) + } + for _, m := range got { + if !want[m] { + t.Errorf("KnownModels() unexpected entry %q", m) + } + } +} +``` + +- [ ] **Step 2: Run test to verify it fails** + +Run: `go test ./internal/protoconv/` +Expected: FAIL (package doesn't exist / types undefined). + +- [ ] **Step 3: Write the implementation** + +`internal/protoconv/responses.go`: +```go +// Package protoconv translates Codex's OpenAI Responses API requests to and +// from the wire protocols the model gateway exposes for non-OpenAI models +// (Chat Completions for deepseek-v4-pro, Anthropic Messages for glm-5.2[1m]). +package protoconv + +// Wire names the upstream protocol a model is served through. +type Wire string + +const ( + // WireResponses passes the request through to /v1/responses unchanged. + WireResponses Wire = "responses" + // WireChat converts to OpenAI Chat Completions (/v1/chat/completions). + WireChat Wire = "chat" + // WireAnthropic converts to Anthropic Messages (/v1/messages). + WireAnthropic Wire = "anthropic" +) + +// Route binds a model name to its upstream wire protocol. +type Route struct { + Model string + Wire Wire +} +``` + +`internal/protoconv/catalog.go`: +```go +package protoconv + +// catalog is the single source of truth for which models the proxy knows how +// to route. Add a model = add a row. Buckets mirror opencode's +// responsesModels / compatibleModels / anthropicModels. +var catalog = []Route{ + {Model: "gpt-5.5", Wire: WireResponses}, + {Model: "deepseek-v4-pro", Wire: WireChat}, + {Model: "glm-5.2[1m]", Wire: WireAnthropic}, +} + +// LookupRoute returns the route for a model name and whether it is known. +func LookupRoute(model string) (Route, bool) { + for _, r := range catalog { + if r.Model == model { + return r, true + } + } + return Route{}, false +} + +// KnownModels returns the catalog model names, for set-model validation. +func KnownModels() []string { + out := make([]string, 0, len(catalog)) + for _, r := range catalog { + out = append(out, r.Model) + } + return out +} +``` + +- [ ] **Step 4: Run test to verify it passes** + +Run: `go test ./internal/protoconv/` +Expected: PASS. + +- [ ] **Step 5: Commit** + +```bash +git add internal/protoconv/responses.go internal/protoconv/catalog.go internal/protoconv/catalog_test.go +git commit -m "feat(protoconv): add model routing catalog" +``` + +--- + +## Task 2: Chat converter — request mapper (Responses → Chat Completions) + +**Files:** +- Create: `internal/protoconv/chat.go` +- Create: `internal/protoconv/chat_test.go` + +- [ ] **Step 1: Write the failing test** + +`internal/protoconv/chat_test.go` (request mapping — the contract): +```go +package protoconv + +import ( + "encoding/json" + "testing" +) + +func TestChatRequestFromResponses(t *testing.T) { + // Minimal: string input + instructions + a function tool. + resp := map[string]any{ + "model": "deepseek-v4-pro", + "instructions": "be brief", + "input": "hello", + "tools": []any{map[string]any{ + "type": "function", "name": "run", "description": "run it", + "parameters": map[string]any{"type": "object"}, + }}, + "stream": true, + } + body, _ := json.Marshal(resp) + + gotBody, err := ChatRequestFromResponses(body) + if err != nil { + t.Fatalf("ChatRequestFromResponses: %v", err) + } + var got map[string]any + if err := json.Unmarshal(gotBody, &got); err != nil { + t.Fatalf("unmarshal converted: %v", err) + } + + if got["model"] != "deepseek-v4-pro" { + t.Errorf("model = %v, want deepseek-v4-pro", got["model"]) + } + msgs, _ := got["messages"].([]any) + if len(msgs) == 0 || msgs[0].(map[string]any)["role"] != "system" { + t.Errorf("expected first message to be system from instructions, got %v", msgs) + } + if got["stream"] != true { + t.Errorf("stream not forwarded: %v", got["stream"]) + } + tools, _ := got["tools"].([]any) + if len(tools) != 1 { + t.Fatalf("tools len = %d, want 1", len(tools)) + } + fn := tools[0].(map[string]any)["function"].(map[string]any) + if fn["name"] != "run" { + t.Errorf("tool function name = %v, want run", fn["name"]) + } +} + +func TestChatRequestMapsItems(t *testing.T) { + // Array input with message, function_call, function_call_output. + resp := map[string]any{ + "model": "deepseek-v4-pro", + "input": []any{ + map[string]any{"type": "message", "role": "user", + "content": []any{map[string]any{"type": "input_text", "text": "hi"}}}, + map[string]any{"type": "function_call", "name": "run", "arguments": "{}", "call_id": "c1"}, + map[string]any{"type": "function_call_output", "call_id": "c1", "output": "ok"}, + }, + } + body, _ := json.Marshal(resp) + gotBody, err := ChatRequestFromResponses(body) + if err != nil { + t.Fatalf("err: %v", err) + } + var got struct { + Messages []map[string]any `json:"messages"` + } + _ = json.Unmarshal(gotBody, &got) + + // user message content flattened to a string + if got.Messages[0]["role"] != "user" { + t.Errorf("msg0 role = %v, want user", got.Messages[0]["role"]) + } + if _, ok := got.Messages[0]["content"].(string); !ok { + t.Errorf("msg0 content should be flattened string, got %T", got.Messages[0]["content"]) + } + // assistant message with tool_calls + var asst map[string]any + for _, m := range got.Messages { + if m["role"] == "assistant" { + asst = m + } + } + if asst == nil { + t.Fatalf("no assistant message produced from function_call") + } + tc := asst["tool_calls"].([]any)[0].(map[string]any) + if tc["id"] != "c1" || tc["type"] != "function" { + t.Errorf("tool_call = %v, want id c1 type function", tc) + } + // tool message + var tool map[string]any + for _, m := range got.Messages { + if m["role"] == "tool" { + tool = m + } + } + if tool == nil || tool["tool_call_id"] != "c1" { + t.Errorf("missing tool message for c1, got %v", tool) + } +} +``` + +- [ ] **Step 2: Run test to verify it fails** + +Run: `go test ./internal/protoconv/ -run TestChatRequest` +Expected: FAIL (`ChatRequestFromResponses` undefined). + +- [ ] **Step 3: Write the implementation** + +`internal/protoconv/chat.go`: +```go +package protoconv + +import ( + "encoding/json" + "fmt" + "strings" +) + +// ChatUpstreamPath is where Chat Completions requests go on the gateway. +const ChatUpstreamPath = "/v1/chat/completions" + +// ChatRequestFromResponses translates a Codex Responses request body to an +// OpenAI Chat Completions request body. See spec "Converter A". +func ChatRequestFromResponses(respBody []byte) ([]byte, error) { + var root map[string]any + if err := json.Unmarshal(respBody, &root); err != nil { + return nil, fmt.Errorf("protoconv: parse responses body: %w", err) + } + + out := map[string]any{ + "model": root["model"], + "stream": root["stream"], + } + if r, ok := root["reasoning"]; ok { + out["reasoning"] = r // forwarded where upstream accepts it + } + + messages := []any{} + if instr, _ := root["instructions"].(string); strings.TrimSpace(instr) != "" { + messages = append(messages, map[string]any{"role": "system", "content": instr}) + } + + switch in := root["input"].(type) { + case string: + if strings.TrimSpace(in) != "" { + messages = append(messages, map[string]any{"role": "user", "content": in}) + } + case []any: + for _, item := range in { + m, ok := item.(map[string]any) + if !ok { + continue + } + switch m["type"] { + case "message": + role, _ := m["role"].(string) + if role == "" { + role = "user" + } + messages = append(messages, map[string]any{ + "role": role, + "content": flattenResponsesContent(m["content"]), + }) + case "function_call": + name, _ := m["name"].(string) + args, _ := m["arguments"].(string) + callID, _ := m["call_id"].(string) + messages = append(messages, map[string]any{ + "role": "assistant", + "tool_calls": []any{map[string]any{ + "id": callID, "type": "function", + "function": map[string]any{"name": name, "arguments": args}, + }}, + }) + case "function_call_output": + callID, _ := m["call_id"].(string) + output, _ := m["output"].(string) + messages = append(messages, map[string]any{ + "role": "tool", "tool_call_id": callID, "content": output, + }) + case "reasoning": + // v1: dropped. file/audio/reasoning parity is a follow-up (spec #7). + } + } + } + + if tools, ok := root["tools"].([]any); ok { + conv := make([]any, 0, len(tools)) + for _, t := range tools { + tm, ok := t.(map[string]any) + if !ok || tm["type"] != "function" { + continue // non-function tool types logged-and-dropped (spec) + } + conv = append(conv, map[string]any{"type": "function", "function": map[string]any{ + "name": tm["name"], + "description": tm["description"], + "parameters": tm["parameters"], + }}) + } + out["tools"] = conv + } + + out["messages"] = messages + return json.Marshal(out) +} + +// flattenResponsesContent turns a Responses content (string or array of +// {type,text} parts) into a single string for Chat Completions. +func flattenResponsesContent(content any) string { + switch v := content.(type) { + case string: + return v + case []any: + var parts []string + for _, part := range v { + if pm, ok := part.(map[string]any); ok { + if text, _ := pm["text"].(string); text != "" { + parts = append(parts, text) + } + } + } + return strings.Join(parts, "\n\n") + default: + return "" + } +} +``` + +- [ ] **Step 4: Run test to verify it passes** + +Run: `go test ./internal/protoconv/ -run TestChatRequest` +Expected: PASS. + +- [ ] **Step 5: Commit** + +```bash +git add internal/protoconv/chat.go internal/protoconv/chat_test.go +git commit -m "feat(protoconv): Responses->Chat Completions request mapper" +``` + +--- + +## Task 3: Chat converter — non-stream response assembler (Chat → Responses) + +**Files:** +- Modify: `internal/protoconv/chat.go` +- Modify: `internal/protoconv/chat_test.go` + +- [ ] **Step 1: Write the failing test** + +Append to `internal/protoconv/chat_test.go`: +```go +func TestChatResponseToResponses(t *testing.T) { + // A Chat Completions body with text + one tool call. + chat := map[string]any{ + "id": "chat_1", + "model": "deepseek-v4-pro", + "choices": []any{map[string]any{ + "message": map[string]any{ + "role": "assistant", + "content": "hello there", + "tool_calls": []any{map[string]any{ + "id": "c1", "type": "function", + "function": map[string]any{"name": "run", "arguments": "{}"}, + }}, + }, + "finish_reason": "tool_calls", + }}, + "usage": map[string]any{"prompt_tokens": 1, "completion_tokens": 2}, + } + body, _ := json.Marshal(chat) + + out, err := ChatResponseToResponses(body) + if err != nil { + t.Fatalf("err: %v", err) + } + var got map[string]any + _ = json.Unmarshal(out, &got) + + if got["model"] != "deepseek-v4-pro" { + t.Errorf("model = %v", got["model"]) + } + if got["status"] != "completed" { + t.Errorf("status = %v, want completed", got["status"]) + } + output, _ := got["output"].([]any) + if len(output) < 2 { + t.Fatalf("output items = %d, want >=2 (message + function_call)", len(output)) + } + // first item should be a message carrying the text + first := output[0].(map[string]any) + if first["type"] != "message" { + t.Errorf("first output type = %v, want message", first["type"]) + } + // a function_call item must be present + var foundFn bool + for _, it := range output { + if m, ok := it.(map[string]any); ok && m["type"] == "function_call" { + foundFn = true + if m["name"] != "run" || m["call_id"] != "c1" { + t.Errorf("function_call = %v", m) + } + } + } + if !foundFn { + t.Errorf("no function_call item in output") + } +} +``` + +- [ ] **Step 2: Run test to verify it fails** + +Run: `go test ./internal/protoconv/ -run TestChatResponse` +Expected: FAIL (`ChatResponseToResponses` undefined). + +- [ ] **Step 3: Write the implementation** + +Append to `internal/protoconv/chat.go`: +```go +// ChatResponseToResponses assembles a complete (non-streaming) Chat +// Completions response body into a Responses-shaped body. See spec "Converter A". +func ChatResponseToResponses(chatBody []byte) ([]byte, error) { + var chat struct { + ID string `json:"id"` + Model string `json:"model"` + Choices []struct { + Message struct { + Role string `json:"role"` + Content string `json:"content"` + ToolCalls []struct { + ID string `json:"id"` + Function struct { + Name string `json:"name"` + Arguments string `json:"arguments"` + } `json:"function"` + } `json:"tool_calls"` + } `json:"message"` + } `json:"choices"` + Usage any `json:"usage"` + } + if err := json.Unmarshal(chatBody, &chat); err != nil { + return nil, fmt.Errorf("protoconv: parse chat body: %w", err) + } + + output := []any{} + for _, ch := range chat.Choices { + m := ch.Message + if strings.TrimSpace(m.Content) != "" { + output = append(output, map[string]any{ + "type": "message", "role": firstNonEmpty(m.Role, "assistant"), + "content": []any{map[string]any{"type": "output_text", "text": m.Content}}, + }) + } + for _, tc := range m.ToolCalls { + output = append(output, map[string]any{ + "type": "function_call", "name": tc.Function.Name, + "arguments": tc.Function.Arguments, "call_id": tc.ID, + }) + } + } + + resp := map[string]any{ + "id": chat.ID, + "model": chat.Model, + "status": "completed", + "output": output, + "usage": chat.Usage, + } + return json.Marshal(resp) +} + +func firstNonEmpty(a, b string) string { + if a != "" { + return a + } + return b +} +``` + +- [ ] **Step 4: Run test to verify it passes** + +Run: `go test ./internal/protoconv/ -run TestChatResponse` +Expected: PASS. + +- [ ] **Step 5: Commit** + +```bash +git add internal/protoconv/chat.go internal/protoconv/chat_test.go +git commit -m "feat(protoconv): Chat Completions->Responses response assembler" +``` + +--- + +## Task 4: Chat converter — streaming (SSE) + +> **Contract-first.** The exact upstream chunk shape must be confirmed against the real gateway on the test box (`ssh Administrator@9.0.16.110`); the test below pins the *expected Responses output* for a representative canned Chat Completions stream. See spec "Converter A — Response (stream)" and reference cc-switch / llama-swap for the event sequence. + +**Files:** +- Modify: `internal/protoconv/chat.go` +- Create: `internal/protoconv/chat_stream_test.go` + +- [ ] **Step 1: Write the failing test (the contract)** + +`internal/protoconv/chat_stream_test.go`: +```go +package protoconv + +import ( + "bufio" + "net/http/httptest" + "strings" + "testing" +) + +func TestChatStreamToResponses(t *testing.T) { + // Canned Chat Completions SSE: one text delta, one tool-call arg delta, finish. + const sse = "data: {\"choices\":[{\"delta\":{\"role\":\"assistant\",\"content\":\"hi\"}}]}\n\n" + + "data: {\"choices\":[{\"delta\":{\"tool_calls\":[{\"index\":0,\"id\":\"c1\",\"function\":{\"name\":\"run\",\"arguments\":\"{}\"}}]}}]}\n\n" + + "data: {\"choices\":[{\"delta\":{},\"finish_reason\":\"tool_calls\"}]}\n\n" + + "data: [DONE]\n\n" + + rec := httptest.NewRecorder() + r := strings.NewReader(sse) + err := WriteChatStreamAsResponses(r, rec) + if err != nil { + t.Fatalf("WriteChatStreamAsResponses: %v", err) + } + + body := rec.Body.String() + mustContain := []string{ + "event: response.created", + "event: response.output_item.added", + "event: response.output_text.delta", + `"hi"`, + "event: response.function_call_arguments.delta", + "event: response.completed", + } + for _, want := range mustContain { + if !strings.Contains(body, want) { + t.Errorf("stream output missing %q\n--- got ---\n%s", want, body) + } + } + // every line must be a valid SSE frame (event:/data:) or blank + sc := bufio.NewScanner(strings.NewReader(body)) + for sc.Scan() { + line := sc.Text() + if line == "" || strings.HasPrefix(line, "event:") || strings.HasPrefix(line, "data:") { + continue + } + t.Errorf("unexpected SSE line: %q", line) + } +} +``` + +- [ ] **Step 2: Run test to verify it fails** + +Run: `go test ./internal/protoconv/ -run TestChatStream` +Expected: FAIL (`WriteChatStreamAsResponses` undefined). + +- [ ] **Step 3: Write the implementation** + +Append to `internal/protoconv/chat.go`: +```go +import ( + "bufio" + "encoding/json" + // ...existing imports... + "io" + "net/http" +) + +// WriteChatStreamAsResponses reads a Chat Completions SSE stream from r and +// writes the equivalent Responses SSE event sequence to w. Event sequence per +// spec: response.created -> output_item.added -> output_text.delta / +// function_call_arguments.delta -> output_item.done -> response.completed. +func WriteChatStreamAsResponses(r io.Reader, w http.ResponseWriter) error { + flusher, _ := w.(http.Flusher) + w.Header().Set("Content-Type", "text/event-stream") + w.Header().Set("Cache-Control", "no-cache") + w.Header().Set("Connection", "keep-alive") + + writeEvent := func(event string, data any) { + b, _ := json.Marshal(data) + fmt.Fprintf(w, "event: %s\ndata: %s\n\n", event, b) + if flusher != nil { + flusher.Flush() + } + } + + writeEvent("response.created", map[string]any{"type": "response.created"}) + + sc := bufio.NewScanner(r) + sc.Buffer(make([]byte, 0, 64*1024), 4*1024*1024) + itemAdded := false + // tool-call argument buffers keyed by tool index -> {id, name, args} + toolBuf := map[int]map[string]string{} + + for sc.Scan() { + line := strings.TrimSpace(sc.Text()) + if line == "" || !strings.HasPrefix(line, "data:") { + continue + } + payload := strings.TrimSpace(strings.TrimPrefix(line, "data:")) + if payload == "[DONE]" { + break + } + var chunk struct { + Choices []struct { + Delta struct { + Role string `json:"role"` + Content string `json:"content"` + ToolCalls []struct { + Index int `json:"index"` + ID string `json:"id"` + Function struct { + Name string `json:"name"` + Arguments string `json:"arguments"` + } `json:"function"` + } `json:"tool_calls"` + } `json:"delta"` + FinishReason string `json:"finish_reason"` + } `json:"choices"` + } + if err := json.Unmarshal([]byte(payload), &chunk); err != nil { + continue // skip malformed chunk + } + for _, ch := range chunk.Choices { + d := ch.Delta + if d.Content != "" { + if !itemAdded { + writeEvent("response.output_item.added", map[string]any{"type": "response.output_item.added"}) + itemAdded = true + } + writeEvent("response.output_text.delta", map[string]any{"type": "response.output_text.delta", "delta": d.Content}) + } + for _, tc := range d.ToolCalls { + buf := toolBuf[tc.Index] + if buf == nil { + buf = map[string]string{"id": tc.ID, "name": tc.Function.Name} + toolBuf[tc.Index] = buf + writeEvent("response.output_item.added", map[string]any{"type": "response.output_item.added"}) + } + if tc.Function.Arguments != "" { + writeEvent("response.function_call_arguments.delta", map[string]any{ + "type": "response.function_call_arguments.delta", + "item_id": buf["id"], "delta": tc.Function.Arguments, + }) + buf["args"] += tc.Function.Arguments + } + } + } + } + if err := sc.Err(); err != nil { + return err + } + + writeEvent("response.output_item.done", map[string]any{"type": "response.output_item.done"}) + writeEvent("response.completed", map[string]any{"type": "response.completed", "response": map[string]any{"status": "completed"}}) + return nil +} +``` + +> NOTE for the implementer: validate the exact `data:` JSON shape of a real `deepseek-v4-pro` streaming response on the test box; adjust the `chunk` struct if the gateway uses `reasoning_content` or different `tool_calls` framing. The test above pins the Responses-side contract — keep it passing. + +- [ ] **Step 4: Run test to verify it passes** + +Run: `go test ./internal/protoconv/ -run TestChatStream` +Expected: PASS. + +- [ ] **Step 5: Commit** + +```bash +git add internal/protoconv/chat.go internal/protoconv/chat_stream_test.go +git commit -m "feat(protoconv): Chat Completions SSE -> Responses SSE" +``` + +--- + +## Task 5: Anthropic converter — request mapper (Responses → Anthropic Messages) + +**Files:** +- Create: `internal/protoconv/anthropic.go` +- Create: `internal/protoconv/anthropic_test.go` + +- [ ] **Step 1: Write the failing test** + +`internal/protoconv/anthropic_test.go`: +```go +package protoconv + +import ( + "encoding/json" + "testing" +) + +func TestAnthropicRequestFromResponses(t *testing.T) { + resp := map[string]any{ + "model": "glm-5.2[1m]", + "instructions": "be brief", + "input": []any{ + map[string]any{"type": "message", "role": "user", + "content": []any{map[string]any{"type": "input_text", "text": "hi"}}}, + map[string]any{"type": "function_call", "name": "run", "arguments": "{}", "call_id": "c1"}, + map[string]any{"type": "function_call_output", "call_id": "c1", "output": "ok"}, + }, + "tools": []any{map[string]any{"type": "function", "name": "run", "description": "d", + "parameters": map[string]any{"type": "object"}}}, + "stream": true, + } + body, _ := json.Marshal(resp) + gotBody, err := AnthropicRequestFromResponses(body) + if err != nil { + t.Fatalf("err: %v", err) + } + var got map[string]any + _ = json.Unmarshal(gotBody, &got) + + if got["model"] != "glm-5.2[1m]" { + t.Errorf("model = %v", got["model"]) + } + if got["system"] != "be brief" { + t.Errorf("system = %v, want instructions", got["system"]) + } + msgs, _ := got["messages"].([]any) + if len(msgs) != 3 { // user, assistant(tool_use), user(tool_result) + t.Fatalf("messages len = %d, want 3", len(msgs)) + } + // user text -> content block array + u := msgs[0].(map[string]any) + blocks, _ := u["content"].([]any) + if len(blocks) != 1 || blocks[0].(map[string]any)["type"] != "text" { + t.Errorf("user content blocks = %v", blocks) + } + // assistant tool_use + asst := msgs[1].(map[string]any) + if asst["role"] != "assistant" { + t.Errorf("msg1 role = %v", asst["role"]) + } + // tool_result + tr := msgs[2].(map[string]any) + if tr["role"] != "user" { + t.Errorf("msg2 role = %v, want user (tool_result)", tr["role"]) + } + tools, _ := got["tools"].([]any) + if len(tools) != 1 || tools[0].(map[string]any)["name"] != "run" { + t.Errorf("tools = %v", tools) + } +} +``` + +- [ ] **Step 2: Run test to verify it fails** + +Run: `go test ./internal/protoconv/ -run TestAnthropicRequest` +Expected: FAIL (`AnthropicRequestFromResponses` undefined). + +- [ ] **Step 3: Write the implementation** + +`internal/protoconv/anthropic.go`: +```go +package protoconv + +import ( + "encoding/json" + "fmt" + "strings" +) + +// AnthropicUpstreamPath is where Anthropic Messages requests go on the gateway. +const AnthropicUpstreamPath = "/v1/messages" + +// AnthropicRequestFromResponses translates a Codex Responses request body to +// an Anthropic Messages request body. See spec "Converter B". +func AnthropicRequestFromResponses(respBody []byte) ([]byte, error) { + var root map[string]any + if err := json.Unmarshal(respBody, &root); err != nil { + return nil, fmt.Errorf("protoconv: parse responses body: %w", err) + } + + out := map[string]any{ + "model": root["model"], + "stream": root["stream"], + } + + // system: instructions + any developer/system input messages + systemParts := []string{} + if instr, _ := root["instructions"].(string); strings.TrimSpace(instr) != "" { + systemParts = append(systemParts, instr) + } + + messages := []any{} + switch in := root["input"].(type) { + case []any: + for _, item := range in { + m, ok := item.(map[string]any) + if !ok { + continue + } + switch m["type"] { + case "message": + role, _ := m["role"].(string) + switch strings.ToLower(role) { + case "system", "developer": + if t := flattenResponsesContent(m["content"]); t != "" { + systemParts = append(systemParts, t) + } + default: + if role == "" { + role = "user" + } + messages = append(messages, map[string]any{ + "role": role, + "content": anthropicContentBlocks(m["content"]), + }) + } + case "function_call": + name, _ := m["name"].(string) + args, _ := m["arguments"].(string) + callID, _ := m["call_id"].(string) + var input any + _ = json.Unmarshal([]byte(args), &input) // best-effort object + if input == nil { + input = map[string]any{} + } + messages = append(messages, map[string]any{ + "role": "assistant", + "content": []any{map[string]any{ + "type": "tool_use", "id": callID, "name": name, "input": input, + }}, + }) + case "function_call_output": + callID, _ := m["call_id"].(string) + output, _ := m["output"].(string) + messages = append(messages, map[string]any{ + "role": "user", + "content": []any{map[string]any{ + "type": "tool_result", "tool_use_id": callID, "content": output, + }}, + }) + case "reasoning": + // v1: dropped (spec #7). + } + } + } + + if tools, ok := root["tools"].([]any); ok { + conv := make([]any, 0, len(tools)) + for _, t := range tools { + tm, ok := t.(map[string]any) + if !ok || tm["type"] != "function" { + continue + } + conv = append(conv, map[string]any{ + "name": tm["name"], + "description": tm["description"], + "input_schema": tm["parameters"], + }) + } + out["tools"] = conv + } + + if len(systemParts) > 0 { + out["system"] = strings.Join(systemParts, "\n\n") + } + out["messages"] = messages + return json.Marshal(out) +} + +// anthropicContentBlocks turns Responses content into Anthropic text content blocks. +func anthropicContentBlocks(content any) []any { + switch v := content.(type) { + case string: + return []any{map[string]any{"type": "text", "text": v}} + case []any: + blocks := []any{} + for _, part := range v { + if pm, ok := part.(map[string]any); ok { + if text, _ := pm["text"].(string); text != "" { + blocks = append(blocks, map[string]any{"type": "text", "text": text}) + } + } + } + return blocks + } + return []any{map[string]any{"type": "text", "text": ""}} +} +``` + +- [ ] **Step 4: Run test to verify it passes** + +Run: `go test ./internal/protoconv/ -run TestAnthropicRequest` +Expected: PASS. + +- [ ] **Step 5: Commit** + +```bash +git add internal/protoconv/anthropic.go internal/protoconv/anthropic_test.go +git commit -m "feat(protoconv): Responses->Anthropic Messages request mapper" +``` + +--- + +## Task 6: Anthropic converter — non-stream response assembler + +**Files:** +- Modify: `internal/protoconv/anthropic.go` +- Modify: `internal/protoconv/anthropic_test.go` + +- [ ] **Step 1: Write the failing test** + +Append to `internal/protoconv/anthropic_test.go`: +```go +func TestAnthropicResponseToResponses(t *testing.T) { + ant := map[string]any{ + "id": "msg_1", + "model": "glm-5.2[1m]", + "content": []any{ + map[string]any{"type": "text", "text": "hello there"}, + map[string]any{"type": "tool_use", "id": "c1", "name": "run", "input": map[string]any{}}, + }, + "usage": map[string]any{"input_tokens": 1, "output_tokens": 2}, + } + body, _ := json.Marshal(ant) + out, err := AnthropicResponseToResponses(body) + if err != nil { + t.Fatalf("err: %v", err) + } + var got map[string]any + _ = json.Unmarshal(out, &got) + if got["status"] != "completed" { + t.Errorf("status = %v", got["status"]) + } + output, _ := got["output"].([]any) + if len(output) != 2 { + t.Fatalf("output len = %d, want 2", len(output)) + } + if output[0].(map[string]any)["type"] != "message" { + t.Errorf("output[0] type = %v", output[0].(map[string]any)["type"]) + } + if output[1].(map[string]any)["type"] != "function_call" { + t.Errorf("output[1] type = %v", output[1].(map[string]any)["type"]) + } +} +``` + +- [ ] **Step 2: Run test to verify it fails** + +Run: `go test ./internal/protoconv/ -run TestAnthropicResponse` +Expected: FAIL. + +- [ ] **Step 3: Write the implementation** + +Append to `internal/protoconv/anthropic.go`: +```go +// AnthropicResponseToResponses assembles a complete (non-streaming) Anthropic +// Messages response body into a Responses-shaped body. See spec "Converter B". +func AnthropicResponseToResponses(antBody []byte) ([]byte, error) { + var ant struct { + ID string `json:"id"` + Model string `json:"model"` + Content []struct { + Type string `json:"type"` + Text string `json:"text"` + ID string `json:"id"` + Name string `json:"name"` + Input json.RawMessage `json:"input"` + } `json:"content"` + Usage any `json:"usage"` + } + if err := json.Unmarshal(antBody, &ant); err != nil { + return nil, fmt.Errorf("protoconv: parse anthropic body: %w", err) + } + + output := []any{} + for _, b := range ant.Content { + switch b.Type { + case "text": + if strings.TrimSpace(b.Text) != "" { + output = append(output, map[string]any{ + "type": "message", "role": "assistant", + "content": []any{map[string]any{"type": "output_text", "text": b.Text}}, + }) + } + case "tool_use": + output = append(output, map[string]any{ + "type": "function_call", "name": b.Name, "call_id": b.ID, + "arguments": string(b.Input), + }) + } + } + + resp := map[string]any{ + "id": ant.ID, + "model": ant.Model, + "status": "completed", + "output": output, + "usage": ant.Usage, + } + return json.Marshal(resp) +} +``` + +- [ ] **Step 4: Run test to verify it passes** + +Run: `go test ./internal/protoconv/ -run TestAnthropicResponse` +Expected: PASS. + +- [ ] **Step 5: Commit** + +```bash +git add internal/protoconv/anthropic.go internal/protoconv/anthropic_test.go +git commit -m "feat(protoconv): Anthropic Messages->Responses response assembler" +``` + +--- + +## Task 7: Anthropic converter — streaming (SSE) + +> **Contract-first, like Task 4.** Anthropic content-block streaming (`message_start`/`content_block_start`/`content_block_delta`/`content_block_stop`/`message_delta`/`message_stop`) is the harder of the two — validate against a real `glm-5.2[1m]` stream on the test box. + +**Files:** +- Modify: `internal/protoconv/anthropic.go` +- Create: `internal/protoconv/anthropic_stream_test.go` + +- [ ] **Step 1: Write the failing test (the contract)** + +`internal/protoconv/anthropic_stream_test.go`: +```go +package protoconv + +import ( + "net/http/httptest" + "strings" + "testing" +) + +func TestAnthropicStreamToResponses(t *testing.T) { + const sse = "event: message_start\ndata: {\"type\":\"message_start\",\"message\":{\"id\":\"msg_1\",\"model\":\"glm-5.2[1m]\"}}\n\n" + + "event: content_block_start\ndata: {\"type\":\"content_block_start\",\"index\":0,\"content_block\":{\"type\":\"text\",\"text\":\"\"}}\n\n" + + "event: content_block_delta\ndata: {\"type\":\"content_block_delta\",\"index\":0,\"delta\":{\"type\":\"text_delta\",\"text\":\"hi\"}}\n\n" + + "event: content_block_stop\ndata: {\"type\":\"content_block_stop\",\"index\":0}\n\n" + + "event: message_delta\ndata: {\"type\":\"message_delta\",\"delta\":{\"stop_reason\":\"end_turn\"}}\n\n" + + "event: message_stop\ndata: {\"type\":\"message_stop\"}\n\n" + + rec := httptest.NewRecorder() + err := WriteAnthropicStreamAsResponses(strings.NewReader(sse), rec) + if err != nil { + t.Fatalf("err: %v", err) + } + body := rec.Body.String() + for _, want := range []string{ + "event: response.created", + "event: response.output_text.delta", + "event: response.completed", + `"hi"`, + } { + if !strings.Contains(body, want) { + t.Errorf("missing %q\n--- got ---\n%s", want, body) + } + } +} +``` + +- [ ] **Step 2: Run test to verify it fails** + +Run: `go test ./internal/protoconv/ -run TestAnthropicStream` +Expected: FAIL. + +- [ ] **Step 3: Write the implementation** + +Append to `internal/protoconv/anthropic.go`: +```go +import ( + "bufio" + "io" + "net/http" +) + +// WriteAnthropicStreamAsResponses reads an Anthropic Messages SSE stream and +// writes the Responses SSE event sequence. See spec "Converter B — Response". +func WriteAnthropicStreamAsResponses(r io.Reader, w http.ResponseWriter) error { + flusher, _ := w.(http.Flusher) + w.Header().Set("Content-Type", "text/event-stream") + w.Header().Set("Cache-Control", "no-cache") + w.Header().Set("Connection", "keep-alive") + + writeEvent := func(event string, data any) { + b, _ := json.Marshal(data) + fmt.Fprintf(w, "event: %s\ndata: %s\n\n", event, b) + if flusher != nil { + flusher.Flush() + } + } + writeEvent("response.created", map[string]any{"type": "response.created"}) + + scanner := bufio.NewScanner(r) + scanner.Buffer(make([]byte, 0, 64*1024), 4*1024*1024) + var event string + itemAdded := false + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if strings.HasPrefix(line, "event:") { + event = strings.TrimSpace(strings.TrimPrefix(line, "event:")) + if (event == "content_block_start" || event == "message_start") && !itemAdded { + writeEvent("response.output_item.added", map[string]any{"type": "response.output_item.added"}) + itemAdded = true + } + continue + } + if !strings.HasPrefix(line, "data:") { + continue + } + payload := strings.TrimSpace(strings.TrimPrefix(line, "data:")) + var msg map[string]any + if err := json.Unmarshal([]byte(payload), &msg); err != nil { + continue + } + switch event { + case "content_block_delta": + delta, _ := msg["delta"].(map[string]any) + if delta["type"] == "text_delta" { + if text, _ := delta["text"].(string); text != "" { + writeEvent("response.output_text.delta", map[string]any{"type": "response.output_text.delta", "delta": text}) + } + } + // input_json_delta (tool_use args) -> function_call_arguments.delta + if delta["type"] == "input_json_delta" { + if pj, _ := delta["partial_json"].(string); pj != "" { + writeEvent("response.function_call_arguments.delta", map[string]any{ + "type": "response.function_call_arguments.delta", "delta": pj, + }) + } + } + case "message_stop": + writeEvent("response.output_item.done", map[string]any{"type": "response.output_item.done"}) + writeEvent("response.completed", map[string]any{"type": "response.completed", "response": map[string]any{"status": "completed"}}) + } + } + return scanner.Err() +} +``` + +- [ ] **Step 4: Run test to verify it passes** + +Run: `go test ./internal/protoconv/ -run TestAnthropicStream` +Expected: PASS. + +- [ ] **Step 5: Commit** + +```bash +git add internal/protoconv/anthropic.go internal/protoconv/anthropic_stream_test.go +git commit -m "feat(protoconv): Anthropic Messages SSE -> Responses SSE" +``` + +--- + +## Task 8: Proxy routing integration + +> Extend `NewHandler` in `internal/modelproxy/proxy.go`: after the existing token injection + instructions normalization, peek `model` and dispatch converted models through `protoconv`; everything else falls through to the existing reverse proxy. + +**Files:** +- Modify: `internal/modelproxy/proxy.go` +- Modify: `internal/modelproxy/proxy_test.go` + +- [ ] **Step 1: Write the failing test** + +Append to `internal/modelproxy/proxy_test.go`: +```go +func TestHandlerRoutesDeepseekToChatCompletions(t *testing.T) { + var gotPath, gotBody string + upstream := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + gotPath = r.URL.Path + b, _ := io.ReadAll(r.Body) + gotBody = string(b) + w.Header().Set("Content-Type", "application/json") + fmt.Fprint(w, `{"id":"x","model":"deepseek-v4-pro","choices":[{"message":{"role":"assistant","content":"ok"}}],"usage":{}}`) + })) + defer upstream.Close() + + h, err := modelproxy.NewHandler(modelproxy.Options{ + Secrets: stubSecrets("token"), + UpstreamBaseURL: upstream.URL, + LocalBearerToken: "local", + }) + if err != nil { + t.Fatal(err) + } + srv := httptest.NewServer(h) + defer srv.Close() + + body := []byte(`{"model":"deepseek-v4-pro","input":"hi","stream":false}`) + req, _ := http.NewRequest(http.MethodPost, srv.URL+"/v1/responses", bytes.NewReader(body)) + req.Header.Set("Authorization", "Bearer local") + res, err := http.DefaultClient.Do(req) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() + + if gotPath != "/v1/chat/completions" { + t.Errorf("upstream path = %q, want /v1/chat/completions", gotPath) + } + var sent map[string]any + _ = json.Unmarshal([]byte(gotBody), &sent) + if sent["model"] != "deepseek-v4-pro" { + t.Errorf("upstream body model = %v", sent["model"]) + } + // client gets a Responses-shaped body + var out map[string]any + _ = json.NewDecoder(res.Body).Decode(&out) + if out["status"] != "completed" { + t.Errorf("client status = %v, want completed", out["status"]) + } +} +``` + +If `stubSecrets`, `io`, `json`, `bytes`, `fmt` are not already imported in the test file, add them. `stubSecrets` may already exist in `proxy_test.go` — reuse it; if not, add a minimal stub implementing `secrets.Store`. + +- [ ] **Step 2: Run test to verify it fails** + +Run: `go test ./internal/modelproxy/ -run TestHandlerRoutesDeepseek` +Expected: FAIL (handler currently passes everything straight to `/v1/responses`, so `gotPath` will be `/v1/responses`). + +- [ ] **Step 3: Write the implementation** + +In `internal/modelproxy/proxy.go`, add the import `"github.com/agentserver/agentserver-pkg/internal/protoconv"` and `"io"` (if not present). Replace the handler closure's tail so that, after `normalizeResponsesInstructions`, it decides whether to convert: + +```go + // peek model and dispatch converted models through protoconv; otherwise + // fall through to the existing reverse proxy (responses pass-through). + if converted, path, convBody, ok := convertIfCatalogued(r2); ok { + serveConverted(r2.Context(), opts, upstream, converted, path, convBody, w, r2) + return + } + r2.Header.Del("X-AgentServer-Client") + proxy.ServeHTTP(w, r2) +``` + +Add helper functions in the same file: +```go +// convertIfCatalogued reads the request body; if the model is a converted one, +// it returns the converted upstream body + path. It always restores r2.Body. +func convertIfCatalogued(r *http.Request) (wire protoconv.Wire, path string, convBody []byte, ok bool) { + if r.Method != http.MethodPost { + return "", "", nil, false + } + trimmed := strings.TrimRight(r.URL.Path, "/") + if trimmed != "/v1/responses" && trimmed != "/responses" { + return "", "", nil, false + } + raw, err := io.ReadAll(r.Body) + r.Body.Close() + defer func() { + // restore the original body for the fall-through path + r.Body = io.NopCloser(bytes.NewReader(raw)) + r.ContentLength = int64(len(raw)) + }() + if err != nil { + return "", "", nil, false + } + var peek struct { + Model string `json:"model"` + } + if err := json.Unmarshal(raw, &peek); err != nil { + return "", "", nil, false + } + route, found := protoconv.LookupRoute(peek.Model) + if !found || route.Wire == protoconv.WireResponses { + return "", "", nil, false + } + switch route.Wire { + case protoconv.WireChat: + body, err := protoconv.ChatRequestFromResponses(raw) + if err != nil { + return "", "", nil, false + } + return route.Wire, protoconv.ChatUpstreamPath, body, true + case protoconv.WireAnthropic: + body, err := protoconv.AnthropicRequestFromResponses(raw) + if err != nil { + return "", "", nil, false + } + return route.Wire, protoconv.AnthropicUpstreamPath, body, true + } + return "", "", nil, false +} + +// serveConverted POSTs the converted body upstream and writes the translated +// Responses response (streaming-aware) back to the client. +func serveConverted(ctx context.Context, opts Options, upstream *url.URL, wire protoconv.Wire, path string, convBody []byte, w http.ResponseWriter, r *http.Request) { + defer func() { + if rec := recover(); rec != nil { + http.Error(w, "model proxy conversion error", http.StatusBadGateway) + } + }() + + token, err := opts.Secrets.Get(tokenrefresh.AccessTokenKey) + if err != nil || token == "" { + http.Error(w, "modelserver login required", http.StatusUnauthorized) + return + } + stream := bytes.Contains(convBody, []byte(`"stream":true`)) + upReq, err := http.NewRequestWithContext(ctx, http.MethodPost, upstream.Scheme+"://"+upstream.Host+path, bytes.NewReader(convBody)) + if err != nil { + http.Error(w, "model proxy upstream request", http.StatusBadGateway) + return + } + upReq.Header.Set("Content-Type", "application/json") + upReq.Header.Set("Authorization", "Bearer "+token) + if wire == protoconv.WireAnthropic { + upReq.Header.Set("X-Api-Key", token) + } + client := &http.Client{} + if opts.Transport != nil { + client.Transport = opts.Transport + } + resp, err := client.Do(upReq) + if err != nil { + http.Error(w, "model proxy upstream error", http.StatusBadGateway) + return + } + defer resp.Body.Close() + + if resp.StatusCode < 200 || resp.StatusCode >= 300 { + for k, vs := range resp.Header { + for _, v := range vs { + w.Header().Add(k, v) + } + } + w.WriteHeader(resp.StatusCode) + _, _ = io.Copy(w, resp.Body) + return + } + + switch { + case wire == protoconv.WireChat && stream: + _ = protoconv.WriteChatStreamAsResponses(resp.Body, w) + case wire == protoconv.WireChat: + b, _ := io.ReadAll(resp.Body) + out, err := protoconv.ChatResponseToResponses(b) + if err != nil { + http.Error(w, "model proxy conversion error", http.StatusBadGateway) + return + } + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write(out) + case wire == protoconv.WireAnthropic && stream: + _ = protoconv.WriteAnthropicStreamAsResponses(resp.Body, w) + case wire == protoconv.WireAnthropic: + b, _ := io.ReadAll(resp.Body) + out, err := protoconv.AnthropicResponseToResponses(b) + if err != nil { + http.Error(w, "model proxy conversion error", http.StatusBadGateway) + return + } + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write(out) + } +} +``` + +> `context` is already imported in proxy.go; ensure `bytes`, `io`, `net/url`, `encoding/json` are imported too. The existing `normalizeResponsesInstructions` already reads/rewrites the body; since `convertIfCatalogued` runs *after* it, read `r2.Body` (the normalized body) — the restore in the deferred func keeps the reverse-proxy fall-through working. + +- [ ] **Step 4: Run test to verify it passes** + +Run: `go test ./internal/modelproxy/` +Expected: PASS (new test + existing tests still pass). + +- [ ] **Step 5: Commit** + +```bash +git add internal/modelproxy/proxy.go internal/modelproxy/proxy_test.go +git commit -m "feat(modelproxy): route converted models through protoconv" +``` + +--- + +## Task 9: Codex config non-default model test + +> No code change to `internal/codex` — just a regression test proving a non-default `Model` lands in `config.toml`. (Confirms `ModelserverSettings()` default + override pattern.) + +**Files:** +- Modify: `internal/codex/config_test.go` + +- [ ] **Step 1: Write the failing test** + +Append to `internal/codex/config_test.go`: +```go +func TestUpdateConfigWritesNonDefaultModel(t *testing.T) { + dir := t.TempDir() + path := filepath.Join(dir, "config.toml") + s := ModelserverSettings() + s.Model = "glm-5.2[1m]" + if err := UpdateConfig(path, s); err != nil { + t.Fatal(err) + } + b, err := os.ReadFile(path) + if err != nil { + t.Fatal(err) + } + if !strings.Contains(string(b), `model = "glm-5.2[1m]"`) { + t.Errorf("config missing overridden model; got:\n%s", b) + } +} +``` +Ensure `filepath`, `os`, `strings` are imported (they already are in that file). + +- [ ] **Step 2: Run test to verify it passes (no impl change expected)** + +Run: `go test ./internal/codex/` +Expected: PASS immediately (the override already flows through the existing merge). + +- [ ] **Step 3: Commit** + +```bash +git add internal/codex/config_test.go +git commit -m "test(codex): non-default model overrides config.toml model field" +``` + +--- + +## Task 10: `agentctl set-model` + +**Files:** +- Create: `cmd/agentctl/cmd_set_model.go` +- Create: `cmd/agentctl/cmd_set_model_test.go` +- Modify: `cmd/agentctl/main.go` + +- [ ] **Step 1: Write the failing test** + +`cmd/agentctl/cmd_set_model_test.go`: +```go +package main + +import ( + "os" + "path/filepath" + "testing" + + "github.com/agentserver/agentserver-pkg/internal/codex" + "github.com/agentserver/agentserver-pkg/internal/modelproxy" +) + +func TestWriteModelSelection(t *testing.T) { + dir := t.TempDir() + path := filepath.Join(dir, "config.toml") + // seed a valid codex config so we only rewrite the model field + if err := codex.UpdateConfig(path, codex.ModelserverProxySettings(modelproxy.DefaultBaseURL, "t")); err != nil { + t.Fatal(err) + } + if err := writeModelSelection(path, "deepseek-v4-pro"); err != nil { + t.Fatalf("writeModelSelection: %v", err) + } + b, _ := os.ReadFile(path) + if !contains(string(b), `model = "deepseek-v4-pro"`) { + t.Errorf("model field not updated; got:\n%s", b) + } + // other keys preserved + if !contains(string(b), `model_provider = "modelserver"`) { + t.Errorf("model_provider clobbered; got:\n%s", b) + } +} + +func contains(s, sub string) bool { return len(s) >= len(sub) && indexOf(s, sub) >= 0 } +func indexOf(s, sub string) int { + for i := 0; i+len(sub) <= len(s); i++ { + if s[i:i+len(sub)] == sub { + return i + } + } + return -1 +} +``` +> If `strings` import is acceptable, replace the toy `contains`/`indexOf` with `strings.Contains`. Keep the test self-contained otherwise. + +- [ ] **Step 2: Run test to verify it fails** + +Run: `go test ./cmd/agentctl/ -run TestWriteModelSelection` +Expected: FAIL (`writeModelSelection` undefined). + +- [ ] **Step 3: Write the implementation** + +`cmd/agentctl/cmd_set_model.go`: +```go +package main + +import ( + "fmt" + "os" + + "github.com/agentserver/agentserver-pkg/internal/codex" + "github.com/agentserver/agentserver-pkg/internal/modelproxy" + "github.com/agentserver/agentserver-pkg/internal/paths" + "github.com/agentserver/agentserver-pkg/internal/protoconv" +) + +func runSetModel(args []string) { + if len(args) < 1 { + fmt.Fprintln(os.Stderr, "usage: agentctl set-model ") + fmt.Fprintf(os.Stderr, "known models: %v\n", protoconv.KnownModels()) + os.Exit(2) + } + model := args[0] + if _, ok := protoconv.LookupRoute(model); !ok { + fmt.Fprintf(os.Stderr, "unknown model %q; known models: %v\n", model, protoconv.KnownModels()) + os.Exit(2) + } + p, err := paths.Default() + if err != nil { + die(err) + } + if err := writeModelSelection(p.CodexConfigFile, model); err != nil { + die(err) + } + fmt.Printf("model set to %s in %s\n", model, p.CodexConfigFile) +} + +// writeModelSelection rewrites only the model field of the Codex config, +// preserving the rest (provider, wire_api, etc.). +func writeModelSelection(path, model string) error { + settings := codex.ModelserverProxySettings(modelproxy.DefaultBaseURL, codex.LegacyLocalProxyAPIKeyValue) + settings.Model = model + return codex.UpdateConfig(path, settings) +} +``` + +Wire it into `cmd/agentctl/main.go` — add to the switch: +```go + case "set-model": + runSetModel(os.Args[2:]) +``` +and add to the `usage()` text: +``` + agentctl set-model set the Codex model (gpt-5.5 / deepseek-v4-pro / glm-5.2[1m]) +``` + +- [ ] **Step 4: Run test to verify it passes** + +Run: `go test ./cmd/agentctl/ -run TestWriteModelSelection` +Expected: PASS. + +- [ ] **Step 5: Commit** + +```bash +git add cmd/agentctl/cmd_set_model.go cmd/agentctl/cmd_set_model_test.go cmd/agentctl/main.go +git commit -m "feat(agentctl): add set-model subcommand" +``` + +--- + +## Task 11: `agentserver set-model` (Linux headless) + +**Files:** +- Modify: `cmd/agentserver/main.go` (and the `app` struct + `run` dispatch + wiring in `newApp`) + +- [ ] **Step 1: Read the current dispatch** + +Run: `sed -n '1,200p' cmd/agentserver/main.go` to see the `app.run` switch and `newApp` wiring. The pattern: each action is a function field on `app`, dispatched in `run`, wired in `newApp`. + +- [ ] **Step 2: Add the `set-model` action** + +Add a field `setModel func(args []string) error` to the `app` struct. In `run`'s switch, add: +```go + case "set-model": + return a.setModel(args[1:]) +``` +In `newApp`, wire it (reuse the same helper as agentctl — move `writeModelSelection` to a shared spot, or re-implement inline): +```go + setModel: func(args []string) error { + return runAgentserverSetModel(args) + }, +``` +Add a small function in the same package: +```go +func runAgentserverSetModel(args []string) error { + if len(args) < 1 { + return fmt.Errorf("usage: agentserver set-model ; known: %v", protoconv.KnownModels()) + } + model := args[0] + if _, ok := protoconv.LookupRoute(model); !ok { + return fmt.Errorf("unknown model %q; known: %v", model, protoconv.KnownModels()) + } + p, err := paths.Default() + if err != nil { + return err + } + settings := codex.ModelserverProxySettings(modelproxy.DefaultBaseURL, codex.LegacyLocalProxyAPIKeyValue) + settings.Model = model + if err := codex.UpdateConfig(p.CodexConfigFile, settings); err != nil { + return err + } + fmt.Printf("model set to %s in %s\n", model, p.CodexConfigFile) + return nil +} +``` +> To avoid duplicating logic between agentctl and agentserver, prefer extracting `writeModelSelection(path, model)` into `internal/codex` (e.g. `codex.SetModel(path, model) error`) and call it from both. If you do, update Task 10 to call it too. Keep it DRY. + +- [ ] **Step 3: Build + test** + +Run: `go build ./cmd/agentserver && go test ./cmd/agentserver/` +Expected: build succeeds; existing tests pass. + +- [ ] **Step 4: Commit** + +```bash +git add cmd/agentserver/main.go +git commit -m "feat(agentserver): add set-model subcommand" +``` + +--- + +## Task 12: End-to-end manual verification (Windows test box) + +> Build the proxy, deploy to the test box, and validate real Codex + `code.ai.cs.ac.cn` for all three models. This is the acceptance gate for the contract-first streaming code (Tasks 4 & 7). + +- [ ] **Step 1: Build for Windows** + +Run: `make cross-windows` (produces the Windows binaries in `dist/`). + +- [ ] **Step 2: Deploy to the test box** + +Run: `scp` the built launcher/daemon to `Administrator@9.0.16.110` and start the local proxy + token refresher the way the Windows installer would (or run the onboarding once). Confirm the proxy listens on `127.0.0.1:53452` and `~/.codex/config.toml` points `base_url` at it with `wire_api = "responses"`. + +- [ ] **Step 3: Set + exercise each model** + +```bash +# on the box +agentctl set-model gpt-5.5 # baseline: must work as before +agentctl set-model deepseek-v4-pro # chat converter +agentctl set-model glm-5.2[1m] # anthropic converter +``` +For each, run a real Codex session: a plain chat, and a coding task that triggers a tool call (e.g. an edit). Confirm text streams correctly and tool calls round-trip. + +- [ ] **Step 4: Capture and fix streaming edge cases** + +If `deepseek-v4-pro` or `glm-5.2[1m]` streams look wrong, capture a raw upstream chunk (`curl` to `code.ai.cs.ac.cn/v1/chat/completions` and `/v1/messages` with the real key) and adjust the `chunk`/`msg` structs in Task 4 / Task 7 to match. Re-run those unit tests against the real shape; keep the contract test green. + +- [ ] **Step 5: Commit any fixes** + +```bash +git add internal/protoconv/*.go +git commit -m "fix(protoconv): align streaming structs with real gateway shapes" +``` + +- [ ] **Step 6: Full verification** + +Run: `go test -race -count=1 ./...` +Expected: all packages pass. + +--- + +## Notes for implementers + +- **DRY:** the model-selection write logic is the same in agentctl and agentserver — extract `codex.SetModel(path, model)` and reuse (Task 11 note). +- **`internal/codex/config.go` needs no structural change** — the override-via-`s.Model` pattern is already supported (Task 9 proves it). +- **Streaming is contract-first:** the unit tests pin the Responses-side output; confirm the upstream-side shapes against the real gateway on the test box (Task 12 Step 4) before declaring done. +- **`gpt-5.5` behavior must not change** — it still pass-through-proxies to `/v1/responses`. The existing `proxy_test.go` cases guard this. diff --git a/docs/superpowers/specs/2026-06-17-glm-deepseek-codex-support-design.md b/docs/superpowers/specs/2026-06-17-glm-deepseek-codex-support-design.md new file mode 100644 index 0000000..5bd7a55 --- /dev/null +++ b/docs/superpowers/specs/2026-06-17-glm-deepseek-codex-support-design.md @@ -0,0 +1,146 @@ +# GLM / DeepSeek Codex Support Design + +## Goal + +Let Codex Desktop (and the Codex CLI / Linux headless frontends that share `~/.codex/config.toml`) use `glm-5.2[1m]` and `deepseek-v4-pro` in addition to `gpt-5.5`, all through the existing local proxy and the same ModelServer account (`code.ai.cs.ac.cn`, same key as `gpt-5.5`). + +## Background & Research + +Codex only speaks the **OpenAI Responses API** (`POST /v1/responses`) — since v0.81.0 it dropped `wire_api = "chat"`. GLM and DeepSeek are not Responses-native on the gateway: + +- **`gpt-5.5`** already works via `code.ai.cs.ac.cn/v1/responses` (pass-through). +- **`deepseek-v4-pro`** is served via **Chat Completions** (`/v1/chat/completions`). +- **`glm-5.2[1m]`** is served via **Anthropic Messages** (`/v1/messages`). + +The sibling **`opencode-desktop-support`** feature (merged on `origin/master`, PR #10) already established this exact 3-bucket routing in `internal/opencode/config.go` (`responsesModels=[gpt-5.5]`, `compatibleModels=[deepseek-v4-pro]`, `anthropicModels=[glm-5.1]`) — but **opencode does the protocol adaptation itself** through its `@ai-sdk/openai`, `@ai-sdk/openai-compatible`, and `@ai-sdk/anthropic` SDK providers, so its local proxy just forwards each path unchanged. **Codex has no such SDK layer** — it always emits Responses — so Codex + GLM/DeepSeek needs the *proxy* to convert. That conversion is the subject of this design. + +Reference converters studied (read-only, not embedded): `farion1231/cc-switch` (Rust/Tauri, accumulates the edge cases), `responses-proxy` (Rust crate, SSE + reasoning), `musistudio/claude-code-router`, and llama-swap's Go `proxymanager.go` (structural reference). + +## Locked Decisions + +1. **Base:** this feature builds on `origin/master` (which contains `opencode-desktop-support`). The earlier local checkout was 22 commits behind; the spec is re-grounded on the real current code. +2. **Where conversion lives:** extend the existing `internal/modelproxy` (single process, `127.0.0.1:53452`). No second resident service. +3. **Two converters, per-model, aligned with opencode's proven gateway routing:** + - `gpt-5.5` → pass-through `/v1/responses` (unchanged). + - `deepseek-v4-pro` → **Responses → Chat Completions** → `POST /v1/chat/completions`. + - `glm-5.2[1m]` → **Responses → Anthropic Messages** → `POST /v1/messages` (the proxy already forwards this path and sets `X-Api-Key`). +4. **Routing:** per-request, by reading the `model` field from the request body. No proxy restart on model switch. +5. **Model selection UX:** two layers. + - **Default model** (new sessions): the `model` field in `~/.codex/config.toml`, set via `agentctl set-model ` (Windows desktop) and `agentserver set-model ` (Linux headless), or by editing `config.toml`. + - **Live switch:** Codex's `/model` picklist is populated by the gateway's `GET /v1/models` (pass-through-proxied); selecting a name just sets the `model` string Codex sends, routed by #4 with no restart. +6. **Unknown model / unsupported feature:** fall back to pass-through `/v1/responses` **and log**, rather than hard-fail (preserves `gpt-5.5` parity as the safe default). +7. **Conversion implementation:** self-developed in Go (`internal/protoconv`), using the open-source converters as reference implementations (read-only, not runtime deps). **Delivered incrementally:** v1 ships text + tool calls + streaming (the core coding loop) for both converters; file/audio/reasoning parity is a known v1 limitation, structurally designed-for and filled in by a follow-up. +8. **Catalog is table-driven and mirrors opencode's buckets:** adding models = adding rows. (A future cleanup may extract a shared `internal/modelcatalog` used by both opencode and protoconv; out of scope for v1 — we don't touch opencode's working code.) + +## Assumptions (confirmed in brainstorm) + +- Scope covers all frontends sharing `~/.codex/config.toml`: Codex Desktop, Codex CLI, Linux headless `agentserver`. +- One upstream (`code.ai.cs.ac.cn`) and one key (the ModelServer token the proxy already injects). +- `gpt-5.5` stays pass-through Responses. +- Upstream model names are passed through as-is (`glm-5.2[1m]`, `deepseek-v4-pro`). +- Conversion correctness is validated end-to-end on the Windows test box (`ssh Administrator@9.0.16.110`) against real Codex. + +## Architecture + +``` +Codex Desktop / CLI / headless + │ POST /v1/responses (Authorization: Bearer | X-Api-Key) + ▼ +internal/modelproxy.NewHandler (127.0.0.1:53452) + │ existing: validate local token, inject ModelServer bearer, /v1/messages → +X-Api-Key, + │ normalizeResponsesInstructions (reads/rewrites body) + │ NEW: peek `model` from body, dispatch via protoconv + │ + ├── model == gpt-5.5 ───────────────► pass-through reverse proxy → /v1/responses (unchanged) + │ + ├── model == deepseek-v4-pro ─► protoconv.Chat Responses⇄ChatCompletions → /v1/chat/completions + │ + ├── model == glm-5.2[1m] ────► protoconv.Anthropic Responses⇄AnthropicMessages → /v1/messages + │ + └── unknown ─────────────────────► pass-through /v1/responses + log (safe fallback) +``` + +## Components + +- **`internal/protoconv` (new, pure):** two translators plus shared Responses types. Pure request/response mappers + streaming SSE adapters; no network code, unit-testable in isolation. + - `chat.go` — Responses ⇄ OpenAI Chat Completions (deepseek). + - `anthropic.go` — Responses ⇄ Anthropic Messages (glm). + - `responses.go` — shared Responses request/response + SSE event types. + - `catalog.go` — the model→{converter, upstream path} table used by routing and `set-model` validation. +- **`internal/modelproxy` (extended):** `NewHandler` gains a routing step before the reverse proxy. Reuses the existing local-token auth (`validLocalRequestToken`: Bearer or `X-Api-Key`), ModelServer token injection, `/v1/messages` `X-Api-Key` handling, hop-by-hop stripping, body-size limits, and the instructions-normalization hook. The converter output replaces the request body/path; for pass-through models the existing reverse proxy runs unchanged. +- **`internal/codex` (extended):** `ModelserverSettings()` keeps returning the `gpt-5.5` default for back-compat; callers that select another model override `s.Model` before `UpdateConfig` (the model already flows into `config.toml`'s `model` field via the existing merge). +- **CLI:** `agentctl set-model ` and `agentserver set-model ` — thin subcommands that validate `` against the protoconv catalog and rewrite the `model` field in `~/.codex/config.toml` via the existing merge + backup logic. No daemon restart required. + +## Data Flow + +1. Codex sends `POST /v1/responses` with `model` set (e.g. `glm-5.2[1m]`) and the local proxy token. +2. Proxy validates the local token, strips hop-by-hop headers, injects the current ModelServer bearer token (and `X-Api-Key` if the eventual upstream is `/v1/messages`). +3. Proxy peeks `model`: + - `gpt-5.5` → reverse-proxy to `/v1/responses` unchanged. + - `deepseek-v4-pro` → `protoconv.Chat` translates the body to a Chat Completions request; proxy POSTs to `code.ai.cs.ac.cn/v1/chat/completions`; the response/SSE is translated back to Responses shape. + - `glm-5.2[1m]` → `protoconv.Anthropic` translates the body to an Anthropic Messages request; proxy POSTs to `code.ai.cs.ac.cn/v1/messages`; the response/SSE is translated back to Responses shape. + - unknown → pass-through `/v1/responses` and log. +4. Codex receives a Responses-shaped response it can render. Switching models = change the `model` field; the next request routes accordingly with no restart. + +## Conversion Contract + +Implemented in Go (`internal/protoconv`), referencing cc-switch / `responses-proxy` / llama-swap for edge cases. Built incrementally — request/response mapping for **text + tool calls** first, then streaming; file/audio/reasoning parity deferred (decision #7) but the types admit them. + +### Converter A — Responses ⇄ Chat Completions (deepseek-v4-pro) + +Request (Responses → Chat Completions): + +- `instructions` → prepended `system` message. +- `input` items → `messages`: + - `message` → `{role, content}`; flatten `content[].text` / `output_text` parts to a string. + - `function_call` → assistant message with `tool_calls:[{id:call_id,type:"function",function:{name,arguments}}]`. + - `function_call_output` → `{role:"tool", tool_call_id:call_id, content:output}`. + - `reasoning` → carried into `reasoning_content` where supported, else dropped. +- `tools[]` (function) → `tools:[{type:"function",function:{name,description,parameters}}]`; non-function tool types logged and dropped. +- `reasoning.effort` / `reasoning.summary` → forwarded where accepted, ignored otherwise. `stream` honored. + +Response (Chat Completions → Responses): non-stream assembles `{id,model,status,output:[message+function_call items],usage}`; stream consumes `data:{choices:[{delta,finish_reason}]}`…`[DONE]` and emits `response.created` → `output_item.added` → `output_text.delta` / `function_call_arguments.delta` (buffered per `tool_call_id`) → `output_item.done` → `response.completed`. + +### Converter B — Responses ⇄ Anthropic Messages (glm-5.2[1m]) + +Request (Responses → Anthropic Messages): + +- `instructions` + any system/developer input messages → Anthropic top-level `system` field. +- `input` items → Anthropic `messages` (content-block based): + - `message` → `{role, content:[{type:"text", text}]}`. + - `function_call` → assistant message with `content:[{type:"tool_use", id, name, input}]`. + - `function_call_output` → `{role:"user", content:[{type:"tool_result", tool_use_id, content}]}`. + - `reasoning` → `{type:"thinking",...}` where supported, else dropped. +- `tools[]` (function) → `tools:[{name,description,input_schema}]`. +- `reasoning.effort` → Anthropic `thinking:{type:"enabled"}` mapping where applicable. `stream` honored. + +Response (Anthropic Messages → Responses): non-stream maps Anthropic content blocks to Responses `output` items (`text` → message item, `tool_use` → function_call item). Stream consumes Anthropic events (`message_start`, `content_block_start`, `content_block_delta` of `text_delta`/`input_json_delta`, `content_block_stop`, `message_delta`, `message_stop`) and emits the same Responses event sequence as Converter A. + +## Error Handling + +- Upstream non-2xx: surface the gateway error body to Codex as a Responses-shaped error so Codex shows a sensible message (mirror cc-switch's error-body translation for known gateway quirks). +- Malformed request body: `400` with a clear error string. +- Unknown/unsupported Responses feature: pass through unconverted to `/v1/responses` and log (safe fallback). +- Per-request `recover`: a conversion panic is caught so one bad request can't kill the proxy; the request returns a `502`-style Responses error. + +## Testing + +- `protoconv` focused unit tests (table-driven): both converters' request mappers (message / function_call / function_call_output / reasoning items, tool conversion), response assemblers, and streaming translators fed canned upstream chunks asserting the exact Responses event sequence (Chat Completions chunks for A; Anthropic events for B). +- `modelproxy` handler test: three routing cases (`gpt-5.5` pass-through, `deepseek-v4-pro` → chat converter, `glm-5.2[1m]` → anthropic converter) against `httptest` fake upstreams, plus the unknown-model fallback, reusing the harness in `proxy_test.go`. +- `codex` config test: existing `gpt-5.5` cases unchanged; add a case that overrides `s.Model` and asserts it lands in `config.toml`. +- `set-model`: validation against the catalog (accept the three known models, reject unknown) and that it rewrites only the `model` field while preserving other keys. +- End-to-end smoke against real Codex on the Windows test box (`ssh Administrator@9.0.16.110`) is the manual acceptance check (requires a real ModelServer key). + +## Risks & Open Items + +- **Streaming correctness is the main risk, doubled across two converters.** Mitigated by (a) non-stream first, (b) referencing cc-switch / llama-swap's event sequencing and test vectors, (c) validating the exact sequence with the real Codex client. Converter B (Anthropic content-block streaming) is the harder of the two. +- **Scope intentionally bounded for v1:** file/audio content parts and full reasoning-content parity are deferred (#7) — text + tool calls + streaming covers the core Codex coding loop. +- **Reasoning parity:** DeepSeek/GLM reasoning fields differ across providers; carry reasoning where supported, degrade gracefully otherwise. +- The gateway's exact `/v1/chat/completions` and `/v1/messages` error shapes will be confirmed against real traffic during implementation. + +## Out of Scope / Future + +- A shared `internal/modelcatalog` unified across opencode + protoconv (don't touch opencode's working code in v1). +- More GLM/DeepSeek variants beyond the three released models. +- File/audio/reasoning parity beyond the v1 text+tools+streaming core. +- A model-picker in the tray/console UI (the catalog + `set-model` CLI are the v1 surface). diff --git a/internal/codex/config.go b/internal/codex/config.go index 1e58598..f19705b 100644 --- a/internal/codex/config.go +++ b/internal/codex/config.go @@ -13,6 +13,8 @@ import ( "time" "github.com/BurntSushi/toml" + + "github.com/agentserver/agentserver-pkg/internal/modelproxy" ) type Settings struct { @@ -56,14 +58,96 @@ const ( LegacyLocalProxyAPIKeyValue = "agentserver-local-proxy" ) +// ModelserverProxySettings returns Settings that point Codex at the local +// model proxy. It leaves Model unset so UpdateConfig preserves whatever the +// user previously selected (via agentctl/agentserver set-model). When no +// config.toml exists yet, UpdateConfig falls back to the default model. func ModelserverProxySettings(baseURL, bearerToken string) Settings { s := ModelserverSettings() + s.Model = "" // provider-only update; do not clobber user-selected model s.BaseURL = baseURL s.EnvKey = "" s.ExperimentalBearerToken = strings.TrimSpace(bearerToken) return s } +// CurrentModel returns the model field from the Codex config at path. +// Returns the default (ModelserverSettings().Model, i.e. "gpt-5.5") if the file +// is missing, unparseable, or has no model field. Pure read; never writes or +// backs up. +func CurrentModel(path string) (string, error) { + def := ModelserverSettings().Model + b, err := os.ReadFile(path) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + return def, nil + } + return def, fmt.Errorf("read codex config: %w", err) + } + var root map[string]any + if _, err := toml.Decode(string(b), &root); err != nil { + return def, fmt.Errorf("parse codex config: %w", err) + } + if m, ok := root["model"].(string); ok && m != "" { + return m, nil + } + return def, nil +} + +// SetModel rewrites only the model field of the Codex config at path. Every +// other field — provider, base_url, env_key, experimental_bearer_token, +// wire_api, MCP servers, unrelated top-level keys — is left untouched. If the +// file does not exist yet, it is seeded with the proxy-style default config +// (modelserver provider, local proxy URL, legacy bearer token) and then the +// requested model is set. +// +// Important: this MUST NOT go through UpdateConfig. UpdateConfig is a +// provider-rewrite operation that assumes the caller owns the full provider +// block — in particular, an empty Settings.EnvKey instructs it to delete +// env_key. Routing SetModel through UpdateConfig would silently convert a +// direct env_key-based provider config into a proxy bearer-token config. +func SetModel(path, model string) error { + if model == "" { + return errors.New("model required") + } + if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil { + return fmt.Errorf("mkdir codex dir: %w", err) + } + + root := map[string]any{} + b, err := os.ReadFile(path) + switch { + case err == nil: + if _, err := toml.Decode(string(b), &root); err != nil { + return fmt.Errorf("parse existing config.toml: %w", err) + } + if err := writeConfigBackup(path, b); err != nil { + return fmt.Errorf("backup config.toml: %w", err) + } + case errors.Is(err, os.ErrNotExist): + // Seed from defaults so a first-time SetModel produces a working file. + seed := ModelserverProxySettings(modelproxy.DefaultBaseURL, LegacyLocalProxyAPIKeyValue) + if err := UpdateConfig(path, seed); err != nil { + return err + } + if b, err := os.ReadFile(path); err == nil { + if _, err := toml.Decode(string(b), &root); err != nil { + return fmt.Errorf("parse seeded config.toml: %w", err) + } + } + default: + return fmt.Errorf("read codex config: %w", err) + } + + root["model"] = model + + var buf bytes.Buffer + if err := toml.NewEncoder(&buf).Encode(root); err != nil { + return fmt.Errorf("marshal config.toml: %w", err) + } + return writeConfigFile(path, buf.Bytes()) +} + const ( defaultModelReasoningEffort = "high" defaultApprovalsReviewer = "guardian_subagent" @@ -97,8 +181,14 @@ func UpdateConfig(path string, s Settings) error { } root["model_provider"] = s.Provider + // Caller-supplied Model always wins. If the caller omits it (provider-only + // update from the launcher), preserve whatever the user previously + // selected; only seed a default when the field is missing entirely (first + // write). if s.Model != "" { root["model"] = s.Model + } else if _, ok := root["model"].(string); !ok { + root["model"] = ModelserverSettings().Model } root["model_reasoning_effort"] = defaultString(s.ModelReasoningEffort, defaultModelReasoningEffort) root["approvals_reviewer"] = defaultString(s.ApprovalsReviewer, defaultApprovalsReviewer) @@ -333,13 +423,34 @@ func writeConfigFile(path string, body []byte) error { if err := tmp.Close(); err != nil { return err } - if err := os.Rename(tmpPath, path); err != nil { + if err := renameWithRetry(tmpPath, path); err != nil { return err } tmpPath = "" return os.Chmod(path, 0o600) } +// renameWithRetry retries os.Rename a few times on Windows when the +// destination is briefly locked by a reader (e.g. Codex Desktop holding +// config.toml open as it polls). Linux returns immediately; only Windows +// sees this transient ERROR_ACCESS_DENIED. Total wait ≤ ~250ms before giving up. +func renameWithRetry(src, dst string) error { + const attempts = 6 + delays := []time.Duration{0, 20 * time.Millisecond, 40 * time.Millisecond, 60 * time.Millisecond, 60 * time.Millisecond, 80 * time.Millisecond} + var lastErr error + for i := 0; i < attempts; i++ { + if d := delays[i]; d > 0 { + time.Sleep(d) + } + if err := os.Rename(src, dst); err == nil { + return nil + } else { + lastErr = err + } + } + return lastErr +} + func pruneConfigBackups(path string) error { matches, err := filepath.Glob(path + ".bak.*") if err != nil { diff --git a/internal/codex/config_test.go b/internal/codex/config_test.go index 2ee6caf..3eb6590 100644 --- a/internal/codex/config_test.go +++ b/internal/codex/config_test.go @@ -7,6 +7,8 @@ import ( "strconv" "strings" "testing" + + "github.com/agentserver/agentserver-pkg/internal/modelproxy" ) func TestUpdateConfig_Empty(t *testing.T) { @@ -391,3 +393,195 @@ func writeCodexTestFile(t *testing.T, path, body string) { func boolPtr(v bool) *bool { return &v } + +func TestCurrentModelMissingFileReturnsDefault(t *testing.T) { + dir := t.TempDir() + got, err := CurrentModel(filepath.Join(dir, "nope.toml")) + if err != nil { + t.Fatalf("err: %v", err) + } + if got != ModelserverSettings().Model { + t.Errorf("CurrentModel = %q, want default %q", got, ModelserverSettings().Model) + } +} + +func TestCurrentModelReturnsConfiguredValue(t *testing.T) { + dir := t.TempDir() + path := filepath.Join(dir, "config.toml") + if err := SetModel(path, "glm-5.2"); err != nil { + t.Fatal(err) + } + got, err := CurrentModel(path) + if err != nil { + t.Fatalf("err: %v", err) + } + if got != "glm-5.2" { + t.Errorf("CurrentModel = %q, want glm-5.2", got) + } +} + +// Regression: Windows sometimes returns ERROR_ACCESS_DENIED on rename when +// another process (Codex Desktop polling config.toml) briefly holds a read +// handle. The rename helper retries a few times to ride out the lock. +func TestRenameWithRetrySucceedsAfterTransientFailure(t *testing.T) { + dir := t.TempDir() + src := filepath.Join(dir, "src") + dst := filepath.Join(dir, "dst") + if err := os.WriteFile(src, []byte("x"), 0o600); err != nil { + t.Fatal(err) + } + if err := renameWithRetry(src, dst); err != nil { + t.Fatalf("renameWithRetry on a clean dst should succeed: %v", err) + } + if _, err := os.Stat(dst); err != nil { + t.Fatalf("dst missing after rename: %v", err) + } +} + +func TestSetModelRewritesOnlyModelField(t *testing.T) { + dir := t.TempDir() + path := filepath.Join(dir, "config.toml") + if err := SetModel(path, "glm-5.2[1m]"); err != nil { + t.Fatal(err) + } + b, err := os.ReadFile(path) + if err != nil { + t.Fatal(err) + } + if !strings.Contains(string(b), `model = "glm-5.2[1m]"`) { + t.Errorf("model field not set; got:\n%s", b) + } + // provider/wire_api must be present (not clobbered) + if !strings.Contains(string(b), `model_provider = "modelserver"`) { + t.Errorf("model_provider clobbered; got:\n%s", b) + } + if !strings.Contains(string(b), `wire_api = "responses"`) { + t.Errorf("wire_api clobbered; got:\n%s", b) + } +} + +// Regression: the launcher calls ModelserverProxySettings + UpdateConfig every +// time the desktop app starts. It must NOT clobber the user's set-model choice +// back to the compiled-in default — Codex Desktop would then immediately reset +// glm-5.2 / deepseek-v4-pro to gpt-5.5 on every restart. +func TestUpdateConfig_ProviderOnlyPreservesUserModel(t *testing.T) { + dir := t.TempDir() + path := filepath.Join(dir, "config.toml") + // Initial provisioning (first write): default model lands. + if err := UpdateConfig(path, ModelserverProxySettings(modelproxy.DefaultBaseURL, "tok")); err != nil { + t.Fatal(err) + } + b, _ := os.ReadFile(path) + if !strings.Contains(string(b), `model = "gpt-5.5"`) { + t.Fatalf("first-write default missing:\n%s", b) + } + // User picks glm-5.2. + if err := SetModel(path, "glm-5.2"); err != nil { + t.Fatal(err) + } + // Launcher fires again on next desktop start — must preserve glm-5.2. + if err := UpdateConfig(path, ModelserverProxySettings(modelproxy.DefaultBaseURL, "tok")); err != nil { + t.Fatal(err) + } + b, _ = os.ReadFile(path) + if !strings.Contains(string(b), `model = "glm-5.2"`) { + t.Fatalf("launcher restart clobbered user model selection:\n%s", b) + } + if strings.Contains(string(b), `model = "gpt-5.5"`) { + t.Fatalf("default model leaked back in:\n%s", b) + } +} + +// Regression (PR #12 review P1): SetModel previously read the config, dropped +// every field except base_url + experimental_bearer_token, then handed the +// stripped Settings to UpdateConfig — which deletes env_key when Settings.EnvKey +// is empty. A valid direct-provider config (env_key = "OPENAI_API_KEY", no +// bearer token) silently became a proxy config (no env_key, legacy bearer +// token), breaking auth on the next Codex start. SetModel must leave the +// existing provider block intact. +func TestSetModelPreservesDirectProviderEnvKey(t *testing.T) { + dir := t.TempDir() + path := filepath.Join(dir, "config.toml") + writeCodexTestFile(t, path, strings.Join([]string{ + `model = "gpt-4o"`, + `model_provider = "modelserver"`, + ``, + `[model_providers.modelserver]`, + `name = "modelserver"`, + `base_url = "https://api.openai.com/v1"`, + `env_key = "OPENAI_API_KEY"`, + `wire_api = "responses"`, + ``, + }, "\n")) + + if err := SetModel(path, "glm-5.2"); err != nil { + t.Fatal(err) + } + body, _ := os.ReadFile(path) + got := string(body) + for _, want := range []string{ + `model = "glm-5.2"`, + `env_key = "OPENAI_API_KEY"`, + `base_url = "https://api.openai.com/v1"`, + } { + if !strings.Contains(got, want) { + t.Errorf("SetModel clobbered direct config; missing %q in:\n%s", want, got) + } + } + for _, unwanted := range []string{ + `experimental_bearer_token`, + LegacyLocalProxyAPIKeyValue, + } { + if strings.Contains(got, unwanted) { + t.Errorf("SetModel leaked proxy-mode field %q into direct config:\n%s", unwanted, got) + } + } +} + +// Regression: SetModel on a non-existent file should still produce a working +// proxy-style config seeded with sane defaults (this is what `agentctl +// set-model` on a brand-new headless install hits). +func TestSetModelOnMissingFileSeedsProxyConfig(t *testing.T) { + dir := t.TempDir() + path := filepath.Join(dir, "config.toml") + if err := SetModel(path, "glm-5.2"); err != nil { + t.Fatal(err) + } + body, _ := os.ReadFile(path) + got := string(body) + for _, want := range []string{ + `model = "glm-5.2"`, + `model_provider = "modelserver"`, + `base_url = "http://127.0.0.1:53452/v1"`, + `experimental_bearer_token = "agentserver-local-proxy"`, + `wire_api = "responses"`, + } { + if !strings.Contains(got, want) { + t.Errorf("missing %q in seeded config:\n%s", want, got) + } + } +} + +func TestSetModelPreservesExistingBearerToken(t *testing.T) { + dir := t.TempDir() + path := filepath.Join(dir, "config.toml") + // Linux headless writes a per-user random token into experimental_bearer_token. + seed := ModelserverProxySettings(modelproxy.DefaultBaseURL, "per-user-random-token") + if err := UpdateConfig(path, seed); err != nil { + t.Fatal(err) + } + if err := SetModel(path, "deepseek-v4-pro"); err != nil { + t.Fatal(err) + } + b, _ := os.ReadFile(path) + body := string(b) + if !strings.Contains(body, `model = "deepseek-v4-pro"`) { + t.Errorf("model not set; got:\n%s", body) + } + if !strings.Contains(body, `experimental_bearer_token = "per-user-random-token"`) { + t.Errorf("per-user bearer token was clobbered; got:\n%s", body) + } + if strings.Contains(body, `agentserver-local-proxy`) { + t.Errorf("legacy token leaked into config; got:\n%s", body) + } +} diff --git a/internal/console/state.go b/internal/console/state.go index 7432abf..fccb524 100644 --- a/internal/console/state.go +++ b/internal/console/state.go @@ -10,7 +10,9 @@ import ( "time" "github.com/agentserver/agentserver-pkg/internal/agentserver" + "github.com/agentserver/agentserver-pkg/internal/codex" "github.com/agentserver/agentserver-pkg/internal/modelserver" + "github.com/agentserver/agentserver-pkg/internal/protoconv" "github.com/agentserver/agentserver-pkg/internal/secrets" "github.com/agentserver/agentserver-pkg/internal/slave" "github.com/agentserver/agentserver-pkg/internal/state" @@ -27,6 +29,7 @@ type Deps struct { Slaves *slave.Manager Updates *updater.Service PendingSlaveRestartsPath string + CodexConfigFile string ModelserverWebBaseURL string RefreshModelserverToken func(context.Context) error OpenFrontend func(context.Context) error @@ -50,9 +53,17 @@ type State struct { Quotas []QuotaWindow `json:"quotas"` QuotaError string `json:"quota_error,omitempty"` SubscriptionURL string `json:"subscription_url,omitempty"` + CurrentModel string `json:"current_model,omitempty"` + AvailableModels []ModelOption `json:"available_models,omitempty"` LastRefreshedAt string `json:"last_refreshed_at"` } +// ModelOption is one entry in the UI model picker. +type ModelOption struct { + Name string `json:"name"` + DisplayName string `json:"display_name,omitempty"` +} + type ModelserverView struct { ProjectID string `json:"project_id,omitempty"` ProjectName string `json:"project_name,omitempty"` @@ -111,6 +122,7 @@ func (c *Controller) State(ctx context.Context) (State, error) { LastRefreshedAt: time.Now().UTC().Format(time.RFC3339), } out.SubscriptionURL = modelserverSubscriptionURL(c.d.ModelserverWebBaseURL, out.Modelserver.ProjectID) + c.applyCodexModelState(&out) msToken := c.secret(tokenrefresh.AccessTokenKey) preRefreshErr := c.refreshExpiredModelserverToken(ctx, st, msToken) @@ -197,6 +209,36 @@ func (c *Controller) SelectFolder(ctx context.Context) (string, error) { return c.d.SelectFolder(ctx) } +// SetCodexModel rewrites the model field of the user's codex config to the +// given name. The name must appear in the protoconv catalog. +func (c *Controller) SetCodexModel(_ context.Context, model string) error { + if c.d.CodexConfigFile == "" { + return errors.New("console: codex config path not configured") + } + if _, ok := protoconv.LookupRoute(model); !ok { + return errors.New("console: unknown model") + } + return codex.SetModel(c.d.CodexConfigFile, model) +} + +// applyCodexModelState fills CurrentModel + AvailableModels on out. Best-effort: +// errors are swallowed (the UI just shows defaults) so a missing config file +// doesn't break the rest of the dashboard. +func (c *Controller) applyCodexModelState(out *State) { + for _, r := range protoconv.Catalog() { + out.AvailableModels = append(out.AvailableModels, ModelOption{ + Name: r.Model, + DisplayName: r.DisplayName, + }) + } + if c.d.CodexConfigFile == "" { + return + } + if m, err := codex.CurrentModel(c.d.CodexConfigFile); err == nil { + out.CurrentModel = m + } +} + func (c *Controller) RestartSlave(ctx context.Context, id string) (slave.Slave, error) { if c.d.Slaves == nil { return slave.Slave{}, errors.New("console: slave manager unavailable") diff --git a/internal/console/state_test.go b/internal/console/state_test.go index 5240034..e3b722d 100644 --- a/internal/console/state_test.go +++ b/internal/console/state_test.go @@ -7,6 +7,7 @@ import ( "net/http/httptest" "os" "path/filepath" + "strings" "sync" "sync/atomic" "testing" @@ -253,6 +254,60 @@ func TestControllerStateProvidesProjectsURLWhenProjectIDMissing(t *testing.T) { } } +func TestControllerStateExposesModelCatalogAndCurrent(t *testing.T) { + dir := t.TempDir() + storePath := filepath.Join(dir, "state.json") + store := state.NewStore(storePath) + if err := store.Update(func(s *state.State) error { + s.Onboarding.Status = state.StatusComplete + return nil + }); err != nil { + t.Fatal(err) + } + codexConfig := filepath.Join(dir, "codex.toml") + // Seed with glm-5.2 so we see the picker reflect a non-default selection. + if err := os.WriteFile(codexConfig, []byte("model = \"glm-5.2\"\n"), 0o600); err != nil { + t.Fatal(err) + } + c := NewController(Deps{State: store, Secrets: newTestSecrets(), CodexConfigFile: codexConfig}) + got, err := c.State(context.Background()) + if err != nil { + t.Fatal(err) + } + if got.CurrentModel != "glm-5.2" { + t.Errorf("CurrentModel = %q, want glm-5.2", got.CurrentModel) + } + if len(got.AvailableModels) != 3 { + t.Fatalf("AvailableModels len = %d, want 3", len(got.AvailableModels)) + } + wantDisplay := map[string]string{ + "gpt-5.5": "GPT-5.5", + "deepseek-v4-pro": "DeepSeek v4 Pro", + "glm-5.2": "智谱 GLM-5.2", + } + for _, opt := range got.AvailableModels { + if wantDisplay[opt.Name] != opt.DisplayName { + t.Errorf("AvailableModels %q display = %q, want %q", opt.Name, opt.DisplayName, wantDisplay[opt.Name]) + } + } +} + +func TestControllerSetCodexModelRejectsUnknownAndPersistsKnown(t *testing.T) { + dir := t.TempDir() + codexConfig := filepath.Join(dir, "codex.toml") + c := NewController(Deps{State: state.NewStore(filepath.Join(dir, "state.json")), CodexConfigFile: codexConfig}) + if err := c.SetCodexModel(context.Background(), "does-not-exist"); err == nil { + t.Fatal("SetCodexModel(unknown) should fail") + } + if err := c.SetCodexModel(context.Background(), "glm-5.2"); err != nil { + t.Fatalf("SetCodexModel(glm-5.2): %v", err) + } + b, _ := os.ReadFile(codexConfig) + if want := `model = "glm-5.2"`; !strings.Contains(string(b), want) { + t.Errorf("config missing %q:\n%s", want, b) + } +} + func TestControllerStateRequiresStateStore(t *testing.T) { _, err := NewController(Deps{}).State(context.Background()) if err == nil || err.Error() != "console: state store required" { diff --git a/internal/modelproxy/proxy.go b/internal/modelproxy/proxy.go index 7a43318..d460c31 100644 --- a/internal/modelproxy/proxy.go +++ b/internal/modelproxy/proxy.go @@ -17,6 +17,7 @@ import ( "strings" "time" + "github.com/agentserver/agentserver-pkg/internal/protoconv" "github.com/agentserver/agentserver-pkg/internal/secrets" "github.com/agentserver/agentserver-pkg/internal/tokenrefresh" ) @@ -128,6 +129,10 @@ func NewHandler(opts Options) (http.Handler, error) { http.Error(w, "request body unavailable", http.StatusBadRequest) return } + if converted, path, convBody, ok := convertIfCatalogued(r2); ok { + serveConverted(r2.Context(), opts, upstream, converted, path, convBody, w) + return + } r2.Header.Del("X-AgentServer-Client") proxy.ServeHTTP(w, r2) }), nil @@ -276,6 +281,125 @@ func setRequestBody(r *http.Request, body []byte) { r.Header.Set("Content-Length", strconv.Itoa(len(body))) } +// convertIfCatalogued reads the request body; if the model is a converted one +// it returns the converted upstream body + path. It always restores r.Body so +// the pass-through reverse proxy still works for non-converted requests. +func convertIfCatalogued(r *http.Request) (wire protoconv.Wire, path string, convBody []byte, ok bool) { + if r.Method != http.MethodPost { + return "", "", nil, false + } + trimmed := strings.TrimRight(r.URL.Path, "/") + if trimmed != "/v1/responses" && trimmed != "/responses" { + return "", "", nil, false + } + raw, err := io.ReadAll(r.Body) + r.Body.Close() + if err != nil { + // restore what we can and bail to pass-through + setRequestBody(r, raw) + return "", "", nil, false + } + setRequestBody(r, raw) // restore for the pass-through path + var peek struct { + Model string `json:"model"` + } + if err := json.Unmarshal(raw, &peek); err != nil { + return "", "", nil, false + } + route, found := protoconv.LookupRoute(peek.Model) + if !found || route.Wire == protoconv.WireResponses { + return "", "", nil, false + } + switch route.Wire { + case protoconv.WireChat: + body, err := protoconv.ChatRequestFromResponses(raw) + if err != nil { + return "", "", nil, false + } + return route.Wire, protoconv.ChatUpstreamPath, body, true + case protoconv.WireAnthropic: + body, err := protoconv.AnthropicRequestFromResponses(raw) + if err != nil { + return "", "", nil, false + } + return route.Wire, protoconv.AnthropicUpstreamPath, body, true + } + return "", "", nil, false +} + +// serveConverted POSTs the converted body upstream and writes the translated +// Responses response (streaming-aware) back to the client. +func serveConverted(ctx context.Context, opts Options, upstream *url.URL, wire protoconv.Wire, path string, convBody []byte, w http.ResponseWriter) { + defer func() { + if rec := recover(); rec != nil { + http.Error(w, "model proxy conversion error", http.StatusBadGateway) + } + }() + + token, err := opts.Secrets.Get(tokenrefresh.AccessTokenKey) + if err != nil || token == "" { + http.Error(w, "modelserver login required", http.StatusUnauthorized) + return + } + stream := bytes.Contains(convBody, []byte(`"stream":true`)) + upReq, err := http.NewRequestWithContext(ctx, http.MethodPost, upstream.Scheme+"://"+upstream.Host+path, bytes.NewReader(convBody)) + if err != nil { + http.Error(w, "model proxy upstream request", http.StatusBadGateway) + return + } + upReq.Header.Set("Content-Type", "application/json") + upReq.Header.Set("Authorization", "Bearer "+token) + if wire == protoconv.WireAnthropic { + upReq.Header.Set("X-Api-Key", token) + } + client := &http.Client{} + if opts.Transport != nil { + client.Transport = opts.Transport + } + resp, err := client.Do(upReq) + if err != nil { + http.Error(w, "model proxy upstream error", http.StatusBadGateway) + return + } + defer resp.Body.Close() + + if resp.StatusCode < 200 || resp.StatusCode >= 300 { + for k, vs := range resp.Header { + for _, v := range vs { + w.Header().Add(k, v) + } + } + w.WriteHeader(resp.StatusCode) + _, _ = io.Copy(w, resp.Body) + return + } + + switch { + case wire == protoconv.WireChat && stream: + _ = protoconv.WriteChatStreamAsResponses(resp.Body, w) + case wire == protoconv.WireChat: + b, _ := io.ReadAll(resp.Body) + out, err := protoconv.ChatResponseToResponses(b) + if err != nil { + http.Error(w, "model proxy conversion error", http.StatusBadGateway) + return + } + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write(out) + case wire == protoconv.WireAnthropic && stream: + _ = protoconv.WriteAnthropicStreamAsResponses(resp.Body, w) + case wire == protoconv.WireAnthropic: + b, _ := io.ReadAll(resp.Body) + out, err := protoconv.AnthropicResponseToResponses(b) + if err != nil { + http.Error(w, "model proxy conversion error", http.StatusBadGateway) + return + } + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write(out) + } +} + func stripHopByHopHeaders(h http.Header) { for _, value := range h.Values("Connection") { for _, name := range strings.Split(value, ",") { diff --git a/internal/modelproxy/proxy_test.go b/internal/modelproxy/proxy_test.go index 2e66cbb..58a8497 100644 --- a/internal/modelproxy/proxy_test.go +++ b/internal/modelproxy/proxy_test.go @@ -3,6 +3,7 @@ package modelproxy import ( "bytes" "encoding/json" + "fmt" "io" "net/http" "net/http/httptest" @@ -649,3 +650,91 @@ func TestProxyRequiresConfiguredLocalBearerToken(t *testing.T) { t.Fatal("NewHandler returned nil error without LocalBearerToken") } } + +func TestHandlerPassesThroughUnknownModel(t *testing.T) { + var gotPath string + upstream := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + gotPath = r.URL.Path + w.Header().Set("Content-Type", "application/json") + _, _ = w.Write([]byte(`{}`)) + })) + defer upstream.Close() + + sec := newTestSecrets() + if err := sec.Set(tokenrefresh.AccessTokenKey, "access"); err != nil { + t.Fatal(err) + } + h, err := NewHandler(Options{ + Secrets: sec, + UpstreamBaseURL: upstream.URL, + LocalBearerToken: "local", + }) + if err != nil { + t.Fatal(err) + } + srv := httptest.NewServer(h) + defer srv.Close() + + body := []byte(`{"model":"some-unknown-model","input":"hi"}`) + req, _ := http.NewRequest(http.MethodPost, srv.URL+"/v1/responses", bytes.NewReader(body)) + req.Header.Set("Authorization", "Bearer local") + res, err := http.DefaultClient.Do(req) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() + + if gotPath != "/v1/responses" { + t.Errorf("unknown model routed upstream to %q, want /v1/responses (pass-through)", gotPath) + } +} + +func TestHandlerRoutesDeepseekToChatCompletions(t *testing.T) { + var gotPath, gotBody string + upstream := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + gotPath = r.URL.Path + b, _ := io.ReadAll(r.Body) + gotBody = string(b) + w.Header().Set("Content-Type", "application/json") + fmt.Fprint(w, `{"id":"x","model":"deepseek-v4-pro","choices":[{"message":{"role":"assistant","content":"ok"}}],"usage":{}}`) + })) + defer upstream.Close() + + sec := newTestSecrets() + if err := sec.Set(tokenrefresh.AccessTokenKey, "access"); err != nil { + t.Fatal(err) + } + h, err := NewHandler(Options{ + Secrets: sec, + UpstreamBaseURL: upstream.URL, + LocalBearerToken: "local", + }) + if err != nil { + t.Fatal(err) + } + srv := httptest.NewServer(h) + defer srv.Close() + + body := []byte(`{"model":"deepseek-v4-pro","input":"hi","stream":false}`) + req, _ := http.NewRequest(http.MethodPost, srv.URL+"/v1/responses", bytes.NewReader(body)) + req.Header.Set("Authorization", "Bearer local") + res, err := http.DefaultClient.Do(req) + if err != nil { + t.Fatal(err) + } + defer res.Body.Close() + + if gotPath != "/v1/chat/completions" { + t.Errorf("upstream path = %q, want /v1/chat/completions", gotPath) + } + var sent map[string]any + _ = json.Unmarshal([]byte(gotBody), &sent) + if sent["model"] != "deepseek-v4-pro" { + t.Errorf("upstream body model = %v", sent["model"]) + } + var out map[string]any + _ = json.NewDecoder(res.Body).Decode(&out) + if out["status"] != "completed" { + t.Errorf("client status = %v, want completed", out["status"]) + } +} diff --git a/internal/protoconv/anthropic.go b/internal/protoconv/anthropic.go new file mode 100644 index 0000000..220535d --- /dev/null +++ b/internal/protoconv/anthropic.go @@ -0,0 +1,388 @@ +package protoconv + +import ( + "bufio" + "encoding/json" + "fmt" + "io" + "net/http" + "strings" +) + +// AnthropicUpstreamPath is where Anthropic Messages requests go on the gateway. +const AnthropicUpstreamPath = "/v1/messages" + +// AnthropicRequestFromResponses translates a Codex Responses request body to +// an Anthropic Messages request body. +func AnthropicRequestFromResponses(respBody []byte) ([]byte, error) { + var root map[string]any + if err := json.Unmarshal(respBody, &root); err != nil { + return nil, fmt.Errorf("protoconv: parse responses body: %w", err) + } + + out := map[string]any{ + "model": root["model"], + } + // Only forward stream when it's actually a bool in the source request; + // see chat.go for the same omission rationale. + if s, ok := root["stream"].(bool); ok { + out["stream"] = s + } + // Anthropic Messages exposes a top-level `tool_choice` object with a + // different shape than Codex's Responses string ({"type":"auto"|"any"|"tool"}). + // Without a safe shape mapping we deliberately drop it; tool_choice is + // rarely set by Codex 0.142 (default behavior leaves it unset, which is + // equivalent to {"type":"auto"} on the Anthropic side). + // + // parallel_tool_calls is not part of the Anthropic Messages API — Anthropic + // controls parallel tool calls server-side per model — so we also do not + // forward it here. Both omissions are intentional. + + // Anthropic Messages API requires max_tokens. Map it from the Responses + // request's max_output_tokens when present, else default. + maxTokens := 8192 + if mot, ok := root["max_output_tokens"].(float64); ok && mot > 0 { + maxTokens = int(mot) + } + out["max_tokens"] = maxTokens + + // system: instructions + any developer/system input messages + systemParts := []string{} + if instr, _ := root["instructions"].(string); strings.TrimSpace(instr) != "" { + systemParts = append(systemParts, instr) + } + + messages := []any{} + switch in := root["input"].(type) { + case string: + // Responses API permits a bare string as a single user message. + messages = append(messages, map[string]any{ + "role": "user", + "content": []any{map[string]any{"type": "text", "text": in}}, + }) + case []any: + for _, item := range in { + m, ok := item.(map[string]any) + if !ok { + continue + } + switch m["type"] { + case "message": + role, _ := m["role"].(string) + switch strings.ToLower(role) { + case "system", "developer": + if t := flattenResponsesContent(m["content"]); t != "" { + systemParts = append(systemParts, t) + } + default: + if role == "" { + role = "user" + } + messages = append(messages, map[string]any{ + "role": role, + "content": anthropicContentBlocks(m["content"]), + }) + } + case "function_call": + name, _ := m["name"].(string) + args, _ := m["arguments"].(string) + callID, _ := m["call_id"].(string) + var input any + _ = json.Unmarshal([]byte(args), &input) // best-effort object + if input == nil { + input = map[string]any{} + } + messages = append(messages, map[string]any{ + "role": "assistant", + "content": []any{map[string]any{ + "type": "tool_use", "id": callID, "name": name, "input": input, + }}, + }) + case "function_call_output": + callID, _ := m["call_id"].(string) + output := flattenResponsesContent(m["output"]) + messages = append(messages, map[string]any{ + "role": "user", + "content": []any{map[string]any{ + "type": "tool_result", "tool_use_id": callID, "content": output, + }}, + }) + case "reasoning": + // v1: dropped (parity follow-up). + } + } + } + + if tools, ok := root["tools"].([]any); ok { + conv := make([]any, 0, len(tools)) + for _, t := range tools { + tm, ok := t.(map[string]any) + if !ok || tm["type"] != "function" { + continue + } + conv = append(conv, map[string]any{ + "name": tm["name"], + "description": tm["description"], + "input_schema": tm["parameters"], + }) + } + out["tools"] = conv + } + + if len(systemParts) > 0 { + out["system"] = strings.Join(systemParts, "\n\n") + } + out["messages"] = messages + return json.Marshal(out) +} + +// anthropicContentBlocks turns Responses content into Anthropic text content blocks. +func anthropicContentBlocks(content any) []any { + switch v := content.(type) { + case string: + return []any{map[string]any{"type": "text", "text": v}} + case []any: + blocks := []any{} + for _, part := range v { + if pm, ok := part.(map[string]any); ok { + if text, _ := pm["text"].(string); text != "" { + blocks = append(blocks, map[string]any{"type": "text", "text": text}) + } + } + } + return blocks + } + return []any{map[string]any{"type": "text", "text": ""}} +} + +// AnthropicResponseToResponses assembles a complete (non-streaming) Anthropic +// Messages response body into a Responses-shaped body. +func AnthropicResponseToResponses(antBody []byte) ([]byte, error) { + var ant struct { + ID string `json:"id"` + Model string `json:"model"` + Content []struct { + Type string `json:"type"` + Text string `json:"text"` + ID string `json:"id"` + Name string `json:"name"` + Input json.RawMessage `json:"input"` + } `json:"content"` + Usage any `json:"usage"` + } + if err := json.Unmarshal(antBody, &ant); err != nil { + return nil, fmt.Errorf("protoconv: parse anthropic body: %w", err) + } + + output := []any{} + for _, b := range ant.Content { + switch b.Type { + case "text": + if strings.TrimSpace(b.Text) != "" { + output = append(output, map[string]any{ + "type": "message", "role": "assistant", + "content": []any{map[string]any{"type": "output_text", "text": b.Text}}, + }) + } + case "tool_use": + output = append(output, map[string]any{ + "type": "function_call", "name": b.Name, "call_id": b.ID, + "arguments": string(b.Input), + }) + } + } + + resp := map[string]any{ + "id": ant.ID, + "model": ant.Model, + "status": "completed", + "output": output, + "usage": ant.Usage, + } + return json.Marshal(resp) +} + +// WriteAnthropicStreamAsResponses reads an Anthropic Messages SSE stream and +// writes the Responses SSE event sequence. Each content block (text or tool_use) +// gets a balanced added/done pair; deltas carry item_id. +func WriteAnthropicStreamAsResponses(r io.Reader, w http.ResponseWriter) error { + flusher, _ := w.(http.Flusher) + w.Header().Set("Content-Type", "text/event-stream") + w.Header().Set("Cache-Control", "no-cache") + + writeEvent := func(event string, data any) { + b, _ := json.Marshal(data) + fmt.Fprintf(w, "event: %s\ndata: %s\n\n", event, b) + if flusher != nil { + flusher.Flush() + } + } + scanner := bufio.NewScanner(r) + scanner.Buffer(make([]byte, 0, 64*1024), 4*1024*1024) + + counter := 0 + newID := func(prefix string) string { counter++; return fmt.Sprintf("%s_%d", prefix, counter) } + + var event string + var curItemID string // id of the currently open content block; "" = none + curToolID := "" // if the open block is tool_use, the tool id; else "" + curToolName := "" // function name carried from content_block_start + var textBuf strings.Builder + var argsBuf strings.Builder + + // Upstream response identity, captured from message_start. Codex's + // Responses parser rejects the stream with "missing field `id`" if these + // are absent from response.created/response.completed. + respID := "" + respModel := "" + createdEmitted := false + emitCreated := func() { + if createdEmitted { + return + } + createdEmitted = true + writeEvent("response.created", map[string]any{ + "type": "response.created", + "response": map[string]any{ + "id": respID, + "model": respModel, + "status": "in_progress", + }, + }) + } + + closeCurrent := func() { + if curItemID == "" { + return + } + if curToolID != "" { + // Codex's ResponseItem::FunctionCall requires {name, arguments, call_id}. + writeEvent("response.output_item.done", map[string]any{ + "type": "response.output_item.done", + "item": map[string]any{ + "type": "function_call", + "id": curToolID, + "call_id": curToolID, + "name": curToolName, + "arguments": argsBuf.String(), + }, + }) + curToolID = "" + curToolName = "" + argsBuf.Reset() + } else { + // Codex's ResponseItem::Message requires {role, content:[{type,text}]}. + writeEvent("response.output_item.done", map[string]any{ + "type": "response.output_item.done", + "item": map[string]any{ + "type": "message", + "id": curItemID, + "role": "assistant", + "content": []any{map[string]any{"type": "output_text", "text": textBuf.String()}}, + }, + }) + textBuf.Reset() + } + curItemID = "" + } + + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if strings.HasPrefix(line, "event:") { + event = strings.TrimSpace(strings.TrimPrefix(line, "event:")) + continue + } + if !strings.HasPrefix(line, "data:") { + continue + } + payload := strings.TrimSpace(strings.TrimPrefix(line, "data:")) + var msg map[string]any + if err := json.Unmarshal([]byte(payload), &msg); err != nil { + continue + } + switch event { + case "message_start": + if m, _ := msg["message"].(map[string]any); m != nil { + if id, _ := m["id"].(string); id != "" { + respID = id + } + if mdl, _ := m["model"].(string); mdl != "" { + respModel = mdl + } + } + emitCreated() + case "content_block_start": + emitCreated() // some gateways omit message_start; ensure created fires before any item + + closeCurrent() + block, _ := msg["content_block"].(map[string]any) + switch block["type"] { + case "tool_use": + id, _ := block["id"].(string) + if id == "" { + id = newID("fc") + } + name, _ := block["name"].(string) + curItemID = id + curToolID = id + curToolName = name + writeEvent("response.output_item.added", map[string]any{ + "type": "response.output_item.added", + "item": map[string]any{ + "type": "function_call", + "id": id, + "call_id": id, + "name": name, + "arguments": "", + }, + }) + case "text", "": + curItemID = newID("msg") + writeEvent("response.output_item.added", map[string]any{ + "type": "response.output_item.added", + "item": map[string]any{ + "type": "message", + "id": curItemID, + "role": "assistant", + "content": []any{}, + }, + }) + default: + // thinking / server-tool / other deferred block types: ignore + // without opening an output item (reasoning parity is a follow-up). + } + case "content_block_delta": + delta, _ := msg["delta"].(map[string]any) + if curItemID == "" { + continue + } + switch delta["type"] { + case "text_delta": + if text, _ := delta["text"].(string); text != "" { + textBuf.WriteString(text) + writeEvent("response.output_text.delta", map[string]any{"type": "response.output_text.delta", "item_id": curItemID, "delta": text}) + } + case "input_json_delta": + if pj, _ := delta["partial_json"].(string); pj != "" { + argsBuf.WriteString(pj) + writeEvent("response.function_call_arguments.delta", map[string]any{"type": "response.function_call_arguments.delta", "item_id": curItemID, "delta": pj}) + } + } + case "content_block_stop": + closeCurrent() + case "message_stop": + closeCurrent() + } + } + closeCurrent() + emitCreated() // edge case: empty stream — still emit a well-formed pair + writeEvent("response.completed", map[string]any{ + "type": "response.completed", + "response": map[string]any{ + "id": respID, + "model": respModel, + "status": "completed", + }, + }) + return scanner.Err() +} diff --git a/internal/protoconv/anthropic_stream_realglm_test.go b/internal/protoconv/anthropic_stream_realglm_test.go new file mode 100644 index 0000000..e5597d8 --- /dev/null +++ b/internal/protoconv/anthropic_stream_realglm_test.go @@ -0,0 +1,31 @@ +package protoconv + +import ( + "net/http/httptest" + "strings" + "testing" +) + +// Real GLM /v1/messages stream captured from the gateway. +const realGLMSSE = "event: message_start\ndata: {\"type\": \"message_start\", \"message\": {\"id\": \"msg_x\", \"type\": \"message\", \"role\": \"assistant\", \"model\": \"glm-5.2\", \"content\": [], \"stop_reason\": null, \"stop_sequence\": null, \"usage\": {\"input_tokens\": 0, \"output_tokens\": 0}}}\n\n" + + "event: ping\ndata: {\"type\": \"ping\"}\n\n" + + "event: content_block_start\ndata: {\"type\": \"content_block_start\", \"index\": 0, \"content_block\": {\"type\": \"text\", \"text\": \"\"}}\n\n" + + "event: content_block_delta\ndata: {\"type\": \"content_block_delta\", \"index\": 0, \"delta\": {\"type\": \"text_delta\", \"text\": \"OK\"}}\n\n" + + "event: content_block_stop\ndata: {\"type\": \"content_block_stop\", \"index\": 0}\n\n" + + "event: message_delta\ndata: {\"type\": \"message_delta\", \"delta\": {\"stop_reason\": \"end_turn\", \"stop_sequence\": null}, \"usage\": {\"input_tokens\": 12, \"output_tokens\": 2}}\n\n" + + "event: message_stop\ndata: {\"type\": \"message_stop\"}\n\n" + +func TestAnthropicStreamRealGLM(t *testing.T) { + rec := httptest.NewRecorder() + if err := WriteAnthropicStreamAsResponses(strings.NewReader(realGLMSSE), rec); err != nil { + t.Fatalf("err: %v", err) + } + body := rec.Body.String() + t.Logf("OUTPUT:\n%s", body) + if !strings.Contains(body, "output_text.delta") { + t.Errorf("MISSING output_text.delta") + } + if !strings.Contains(body, `"OK"`) { + t.Errorf("MISSING the OK text delta") + } +} diff --git a/internal/protoconv/anthropic_stream_test.go b/internal/protoconv/anthropic_stream_test.go new file mode 100644 index 0000000..1836120 --- /dev/null +++ b/internal/protoconv/anthropic_stream_test.go @@ -0,0 +1,240 @@ +package protoconv + +import ( + "encoding/json" + "net/http/httptest" + "strings" + "testing" +) + +func TestAnthropicStreamToResponses(t *testing.T) { + const sse = "event: message_start\ndata: {\"type\":\"message_start\",\"message\":{\"id\":\"msg_1\",\"model\":\"glm-5.2\"}}\n\n" + + "event: content_block_start\ndata: {\"type\":\"content_block_start\",\"index\":0,\"content_block\":{\"type\":\"text\",\"text\":\"\"}}\n\n" + + "event: content_block_delta\ndata: {\"type\":\"content_block_delta\",\"index\":0,\"delta\":{\"type\":\"text_delta\",\"text\":\"hi\"}}\n\n" + + "event: content_block_stop\ndata: {\"type\":\"content_block_stop\",\"index\":0}\n\n" + + "event: message_delta\ndata: {\"type\":\"message_delta\",\"delta\":{\"stop_reason\":\"end_turn\"}}\n\n" + + "event: message_stop\ndata: {\"type\":\"message_stop\"}\n\n" + + rec := httptest.NewRecorder() + err := WriteAnthropicStreamAsResponses(strings.NewReader(sse), rec) + if err != nil { + t.Fatalf("err: %v", err) + } + body := rec.Body.String() + for _, want := range []string{ + "event: response.created", + "event: response.output_text.delta", + "event: response.completed", + `"hi"`, + } { + if !strings.Contains(body, want) { + t.Errorf("missing %q\n--- got ---\n%s", want, body) + } + } +} + +// Regression: Codex's ResponseItem::Message requires {role, content:[…]} and +// ResponseItem::FunctionCall requires {name, arguments, call_id}. If we omit +// any of these, the parser silently drops the item — text never reaches the +// UI even though the SSE stream looks "complete". Accumulate deltas and emit +// fully-shaped items on output_item.done. +func TestAnthropicStreamItemShapesAreCodexParseable(t *testing.T) { + const sse = "event: message_start\ndata: {\"type\":\"message_start\",\"message\":{\"id\":\"msg_x\",\"model\":\"glm-5.2\"}}\n\n" + + "event: content_block_start\ndata: {\"type\":\"content_block_start\",\"index\":0,\"content_block\":{\"type\":\"text\",\"text\":\"\"}}\n\n" + + "event: content_block_delta\ndata: {\"type\":\"content_block_delta\",\"index\":0,\"delta\":{\"type\":\"text_delta\",\"text\":\"Hello \"}}\n\n" + + "event: content_block_delta\ndata: {\"type\":\"content_block_delta\",\"index\":0,\"delta\":{\"type\":\"text_delta\",\"text\":\"world\"}}\n\n" + + "event: content_block_stop\ndata: {\"type\":\"content_block_stop\",\"index\":0}\n\n" + + "event: content_block_start\ndata: {\"type\":\"content_block_start\",\"index\":1,\"content_block\":{\"type\":\"tool_use\",\"id\":\"c1\",\"name\":\"run\"}}\n\n" + + "event: content_block_delta\ndata: {\"type\":\"content_block_delta\",\"index\":1,\"delta\":{\"type\":\"input_json_delta\",\"partial_json\":\"{\\\"k\\\":1}\"}}\n\n" + + "event: content_block_stop\ndata: {\"type\":\"content_block_stop\",\"index\":1}\n\n" + + "event: message_stop\ndata: {\"type\":\"message_stop\"}\n\n" + rec := httptest.NewRecorder() + if err := WriteAnthropicStreamAsResponses(strings.NewReader(sse), rec); err != nil { + t.Fatal(err) + } + // Pull every output_item.done frame and assert it has Codex-required fields. + body := rec.Body.String() + var doneItems []map[string]any + for _, frame := range strings.Split(body, "\n\n") { + if !strings.Contains(frame, "event: response.output_item.done") { + continue + } + dataIdx := strings.Index(frame, "data:") + if dataIdx < 0 { + continue + } + var ev struct { + Item map[string]any `json:"item"` + } + if err := json.Unmarshal([]byte(strings.TrimSpace(frame[dataIdx+len("data:"):])), &ev); err != nil { + t.Fatalf("malformed done frame %q: %v", frame, err) + } + doneItems = append(doneItems, ev.Item) + } + if len(doneItems) != 2 { + t.Fatalf("want 2 output_item.done frames (message+tool), got %d:\n%s", len(doneItems), body) + } + // message item + msg := doneItems[0] + if msg["type"] != "message" || msg["role"] != "assistant" { + t.Errorf("message item bad shape: %v", msg) + } + content, _ := msg["content"].([]any) + if len(content) != 1 { + t.Fatalf("message content len=%d, want 1: %v", len(content), msg) + } + cp := content[0].(map[string]any) + if cp["type"] != "output_text" || cp["text"] != "Hello world" { + t.Errorf("message content bad: %v", cp) + } + // function_call item + fc := doneItems[1] + if fc["type"] != "function_call" || fc["name"] != "run" || fc["call_id"] != "c1" || fc["arguments"] != `{"k":1}` { + t.Errorf("function_call item bad shape: %v", fc) + } +} + +// Regression: Codex Responses parser fails with +// +// "stream disconnected before completion: failed to parse ResponseCompleted: missing field `id`" +// +// unless response.created and response.completed both carry the upstream +// response id (and model). Pull them out of Anthropic's message_start. +func TestAnthropicStreamCarriesResponseIDAndModel(t *testing.T) { + const sse = "event: message_start\ndata: {\"type\":\"message_start\",\"message\":{\"id\":\"msg_abc123\",\"model\":\"glm-5.2\"}}\n\n" + + "event: content_block_start\ndata: {\"type\":\"content_block_start\",\"index\":0,\"content_block\":{\"type\":\"text\",\"text\":\"\"}}\n\n" + + "event: content_block_delta\ndata: {\"type\":\"content_block_delta\",\"index\":0,\"delta\":{\"type\":\"text_delta\",\"text\":\"ok\"}}\n\n" + + "event: message_stop\ndata: {\"type\":\"message_stop\"}\n\n" + rec := httptest.NewRecorder() + if err := WriteAnthropicStreamAsResponses(strings.NewReader(sse), rec); err != nil { + t.Fatal(err) + } + body := rec.Body.String() + for _, want := range []string{ + `"id":"msg_abc123"`, + `"model":"glm-5.2"`, + `"status":"in_progress"`, + `"status":"completed"`, + } { + if !strings.Contains(body, want) { + t.Errorf("missing %q\n--- got ---\n%s", want, body) + } + } + // Both response.created and response.completed must contain id+model. + for _, ev := range []string{"response.created", "response.completed"} { + idx := strings.Index(body, "event: "+ev) + if idx < 0 { + t.Errorf("event %s missing\n%s", ev, body) + continue + } + end := strings.Index(body[idx:], "\n\n") + if end < 0 { + t.Errorf("event %s frame truncated\n%s", ev, body) + continue + } + frame := body[idx : idx+end] + if !strings.Contains(frame, `"id":"msg_abc123"`) { + t.Errorf("event %s missing id:\n%s", ev, frame) + } + if !strings.Contains(frame, `"model":"glm-5.2"`) { + t.Errorf("event %s missing model:\n%s", ev, frame) + } + } +} + +func TestAnthropicStreamMultiItemBalanced(t *testing.T) { + const sse = "event: content_block_start\ndata: {\"type\":\"content_block_start\",\"index\":0,\"content_block\":{\"type\":\"text\",\"text\":\"\"}}\n\n" + + "event: content_block_delta\ndata: {\"type\":\"content_block_delta\",\"index\":0,\"delta\":{\"type\":\"text_delta\",\"text\":\"hi\"}}\n\n" + + "event: content_block_stop\ndata: {\"type\":\"content_block_stop\",\"index\":0}\n\n" + + "event: content_block_start\ndata: {\"type\":\"content_block_start\",\"index\":1,\"content_block\":{\"type\":\"tool_use\",\"id\":\"c1\",\"name\":\"run\"}}\n\n" + + "event: content_block_delta\ndata: {\"type\":\"content_block_delta\",\"index\":1,\"delta\":{\"type\":\"input_json_delta\",\"partial_json\":\"{}\"}}\n\n" + + "event: content_block_stop\ndata: {\"type\":\"content_block_stop\",\"index\":1}\n\n" + + "event: message_stop\ndata: {\"type\":\"message_stop\"}\n\n" + rec := httptest.NewRecorder() + if err := WriteAnthropicStreamAsResponses(strings.NewReader(sse), rec); err != nil { + t.Fatal(err) + } + body := rec.Body.String() + added, done, argWithItem := countItemEvents(body) + if added != done { + t.Errorf("added=%d done=%d (must balance);\n%s", added, done, body) + } + if added != 2 { // text + tool_use + t.Errorf("added=%d, want 2", added) + } + if argWithItem < 1 { + t.Errorf("tool arg delta missing item_id") + } + // frame structure: every non-blank line starts with event: or data: + for _, line := range strings.Split(body, "\n") { + l := strings.TrimSpace(line) + if l == "" || strings.HasPrefix(l, "event:") || strings.HasPrefix(l, "data:") { + continue + } + t.Errorf("unexpected SSE line: %q", l) + } +} + +func TestAnthropicStreamEmitsCompletedOnTruncation(t *testing.T) { + // Upstream closes mid-stream with no message_stop. + const sse = "event: content_block_start\ndata: {\"type\":\"content_block_start\",\"index\":0,\"content_block\":{\"type\":\"text\",\"text\":\"\"}}\n\n" + + "event: content_block_delta\ndata: {\"type\":\"content_block_delta\",\"index\":0,\"delta\":{\"type\":\"text_delta\",\"text\":\"hi\"}}\n\n" + rec := httptest.NewRecorder() + if err := WriteAnthropicStreamAsResponses(strings.NewReader(sse), rec); err != nil { + t.Fatal(err) + } + body := rec.Body.String() + if !strings.Contains(body, "event: response.completed") { + t.Errorf("missing response.completed on truncated stream;\n%s", body) + } + added, done, _ := countItemEvents(body) + if added != done { + t.Errorf("added=%d done=%d (must balance even on truncation)", added, done) + } +} + +func TestAnthropicStreamThinkingBlockOpensNoItem(t *testing.T) { + // A thinking block must not open a spurious empty message item. + const sse = "event: content_block_start\ndata: {\"type\":\"content_block_start\",\"index\":0,\"content_block\":{\"type\":\"thinking\",\"thinking\":\"reasoning here\"}}\n\n" + + "event: content_block_stop\ndata: {\"type\":\"content_block_stop\",\"index\":0}\n\n" + + "event: message_stop\ndata: {\"type\":\"message_stop\"}\n\n" + rec := httptest.NewRecorder() + if err := WriteAnthropicStreamAsResponses(strings.NewReader(sse), rec); err != nil { + t.Fatal(err) + } + body := rec.Body.String() + added, done, _ := countItemEvents(body) + if added != 0 || done != 0 { + t.Errorf("thinking block opened items: added=%d done=%d (want 0/0);\n%s", added, done, body) + } + if !strings.Contains(body, "event: response.completed") { + t.Errorf("missing response.completed;\n%s", body) + } +} + +func TestAnthropicRequestFunctionCallOutputArray(t *testing.T) { + resp := map[string]any{ + "model": "glm-5.2", + "input": []any{ + map[string]any{"type": "function_call_output", "call_id": "c1", + "output": []any{map[string]any{"type": "output_text", "text": "result"}}}, + }, + } + body, _ := json.Marshal(resp) + gotBody, err := AnthropicRequestFromResponses(body) + if err != nil { + t.Fatal(err) + } + var got struct { + Messages []map[string]any `json:"messages"` + } + _ = json.Unmarshal(gotBody, &got) + if len(got.Messages) != 1 { + t.Fatalf("messages=%v", got.Messages) + } + blocks, _ := got.Messages[0]["content"].([]any) + tr, _ := blocks[0].(map[string]any) + if tr["content"] != "result" { + t.Errorf("array output dropped; got %v", tr) + } +} diff --git a/internal/protoconv/anthropic_test.go b/internal/protoconv/anthropic_test.go new file mode 100644 index 0000000..7a29170 --- /dev/null +++ b/internal/protoconv/anthropic_test.go @@ -0,0 +1,131 @@ +package protoconv + +import ( + "encoding/json" + "testing" +) + +func TestAnthropicRequestFromResponses(t *testing.T) { + resp := map[string]any{ + "model": "glm-5.2", + "instructions": "be brief", + "input": []any{ + map[string]any{"type": "message", "role": "user", + "content": []any{map[string]any{"type": "input_text", "text": "hi"}}}, + map[string]any{"type": "function_call", "name": "run", "arguments": "{}", "call_id": "c1"}, + map[string]any{"type": "function_call_output", "call_id": "c1", "output": "ok"}, + }, + "tools": []any{map[string]any{"type": "function", "name": "run", "description": "d", + "parameters": map[string]any{"type": "object"}}}, + "stream": true, + } + body, _ := json.Marshal(resp) + gotBody, err := AnthropicRequestFromResponses(body) + if err != nil { + t.Fatalf("err: %v", err) + } + var got map[string]any + _ = json.Unmarshal(gotBody, &got) + + if got["model"] != "glm-5.2" { + t.Errorf("model = %v", got["model"]) + } + if mt, ok := got["max_tokens"].(float64); !ok || mt != 8192 { + t.Errorf("max_tokens = %v, want 8192 (default)", got["max_tokens"]) + } + if got["system"] != "be brief" { + t.Errorf("system = %v, want instructions", got["system"]) + } + msgs, _ := got["messages"].([]any) + if len(msgs) != 3 { // user, assistant(tool_use), user(tool_result) + t.Fatalf("messages len = %d, want 3", len(msgs)) + } + u := msgs[0].(map[string]any) + blocks, _ := u["content"].([]any) + if len(blocks) != 1 || blocks[0].(map[string]any)["type"] != "text" { + t.Errorf("user content blocks = %v", blocks) + } + asst := msgs[1].(map[string]any) + if asst["role"] != "assistant" { + t.Errorf("msg1 role = %v", asst["role"]) + } + tr := msgs[2].(map[string]any) + if tr["role"] != "user" { + t.Errorf("msg2 role = %v, want user (tool_result)", tr["role"]) + } + tools, _ := got["tools"].([]any) + if len(tools) != 1 || tools[0].(map[string]any)["name"] != "run" { + t.Errorf("tools = %v", tools) + } +} + +// Regression (PR #12 review P2): omitting `stream` should not produce +// `"stream": null` on the wire. +func TestAnthropicRequest_OmitsStreamWhenSourceOmitsIt(t *testing.T) { + body, _ := json.Marshal(map[string]any{"model": "glm-5.2", "input": "hi"}) + got, err := AnthropicRequestFromResponses(body) + if err != nil { + t.Fatal(err) + } + var m map[string]any + _ = json.Unmarshal(got, &m) + if v, present := m["stream"]; present { + t.Errorf("stream should be absent when source omits it; got %#v", v) + } +} + +func TestAnthropicRequestFromResponses_StringInput(t *testing.T) { + // Responses API permits a bare string as `input`; ensure it becomes a single user message. + resp := map[string]any{"model": "glm-5.2", "input": "reply OK", "stream": true} + body, _ := json.Marshal(resp) + gotBody, err := AnthropicRequestFromResponses(body) + if err != nil { + t.Fatalf("err: %v", err) + } + var got map[string]any + _ = json.Unmarshal(gotBody, &got) + msgs, _ := got["messages"].([]any) + if len(msgs) != 1 { + t.Fatalf("messages len = %d, want 1", len(msgs)) + } + m := msgs[0].(map[string]any) + if m["role"] != "user" { + t.Errorf("role = %v, want user", m["role"]) + } + blocks, _ := m["content"].([]any) + if len(blocks) != 1 || blocks[0].(map[string]any)["text"] != "reply OK" { + t.Errorf("content = %v", blocks) + } +} + +func TestAnthropicResponseToResponses(t *testing.T) { + ant := map[string]any{ + "id": "msg_1", + "model": "glm-5.2", + "content": []any{ + map[string]any{"type": "text", "text": "hello there"}, + map[string]any{"type": "tool_use", "id": "c1", "name": "run", "input": map[string]any{}}, + }, + "usage": map[string]any{"input_tokens": 1, "output_tokens": 2}, + } + body, _ := json.Marshal(ant) + out, err := AnthropicResponseToResponses(body) + if err != nil { + t.Fatalf("err: %v", err) + } + var got map[string]any + _ = json.Unmarshal(out, &got) + if got["status"] != "completed" { + t.Errorf("status = %v", got["status"]) + } + output, _ := got["output"].([]any) + if len(output) != 2 { + t.Fatalf("output len = %d, want 2", len(output)) + } + if output[0].(map[string]any)["type"] != "message" { + t.Errorf("output[0] type = %v", output[0].(map[string]any)["type"]) + } + if output[1].(map[string]any)["type"] != "function_call" { + t.Errorf("output[1] type = %v", output[1].(map[string]any)["type"]) + } +} diff --git a/internal/protoconv/catalog.go b/internal/protoconv/catalog.go new file mode 100644 index 0000000..fc4a8f3 --- /dev/null +++ b/internal/protoconv/catalog.go @@ -0,0 +1,40 @@ +package protoconv + +// catalog is the single source of truth for which models the proxy knows how +// to route. Add a model = add a row. Buckets mirror opencode's +// responsesModels / compatibleModels / anthropicModels. +var catalog = []Route{ + {Model: "gpt-5.5", Wire: WireResponses, DisplayName: "GPT-5.5"}, + {Model: "deepseek-v4-pro", Wire: WireChat, DisplayName: "DeepSeek v4 Pro"}, + // The gateway's Anthropic /v1/messages endpoint exposes the GLM model as + // "glm-5.2" (the "[1m]" label is not a model on this gateway and is rejected + // with HTTP 400). GLM is served only via Anthropic Messages, not Chat. + {Model: "glm-5.2", Wire: WireAnthropic, DisplayName: "智谱 GLM-5.2"}, +} + +// LookupRoute returns the route for a model name and whether it is known. +func LookupRoute(model string) (Route, bool) { + for _, r := range catalog { + if r.Model == model { + return r, true + } + } + return Route{}, false +} + +// KnownModels returns the catalog model names, for set-model validation. +func KnownModels() []string { + out := make([]string, 0, len(catalog)) + for _, r := range catalog { + out = append(out, r.Model) + } + return out +} + +// Catalog returns a copy of the routing catalog for UI consumption. The slice +// is freshly allocated so callers cannot mutate the package-level table. +func Catalog() []Route { + out := make([]Route, len(catalog)) + copy(out, catalog) + return out +} diff --git a/internal/protoconv/catalog_test.go b/internal/protoconv/catalog_test.go new file mode 100644 index 0000000..31f399f --- /dev/null +++ b/internal/protoconv/catalog_test.go @@ -0,0 +1,61 @@ +package protoconv + +import "testing" + +func TestLookupRoute(t *testing.T) { + cases := []struct { + model string + want Wire + ok bool + }{ + {"gpt-5.5", WireResponses, true}, + {"deepseek-v4-pro", WireChat, true}, + {"glm-5.2", WireAnthropic, true}, + {"does-not-exist", "", false}, + } + for _, c := range cases { + r, ok := LookupRoute(c.model) + if ok != c.ok { + t.Errorf("LookupRoute(%q) ok = %v, want %v", c.model, ok, c.ok) + continue + } + if ok && r.Wire != c.want { + t.Errorf("LookupRoute(%q) wire = %q, want %q", c.model, r.Wire, c.want) + } + } +} + +func TestCatalogHasDisplayNamesAndIsACopy(t *testing.T) { + got := Catalog() + if len(got) != 3 { + t.Fatalf("Catalog() len = %d, want 3", len(got)) + } + wantDisplay := map[string]string{ + "gpt-5.5": "GPT-5.5", + "deepseek-v4-pro": "DeepSeek v4 Pro", + "glm-5.2": "智谱 GLM-5.2", + } + for _, r := range got { + if r.DisplayName != wantDisplay[r.Model] { + t.Errorf("Catalog() %q display = %q, want %q", r.Model, r.DisplayName, wantDisplay[r.Model]) + } + } + // Mutation by caller must not leak into the package table. + got[0].Model = "mutated" + if Catalog()[0].Model == "mutated" { + t.Errorf("Catalog() returned a shared slice; caller mutation leaked back") + } +} + +func TestKnownModels(t *testing.T) { + got := KnownModels() + want := map[string]bool{"gpt-5.5": true, "deepseek-v4-pro": true, "glm-5.2": true} + if len(got) != len(want) { + t.Fatalf("KnownModels() = %v, want %d entries", got, len(want)) + } + for _, m := range got { + if !want[m] { + t.Errorf("KnownModels() unexpected entry %q", m) + } + } +} diff --git a/internal/protoconv/chat.go b/internal/protoconv/chat.go new file mode 100644 index 0000000..e196893 --- /dev/null +++ b/internal/protoconv/chat.go @@ -0,0 +1,428 @@ +package protoconv + +import ( + "bufio" + "encoding/json" + "fmt" + "io" + "net/http" + "strings" +) + +// ChatUpstreamPath is where Chat Completions requests go on the gateway. +const ChatUpstreamPath = "/v1/chat/completions" + +// ChatRequestFromResponses translates a Codex Responses request body to an +// OpenAI Chat Completions request body. +func ChatRequestFromResponses(respBody []byte) ([]byte, error) { + var root map[string]any + if err := json.Unmarshal(respBody, &root); err != nil { + return nil, fmt.Errorf("protoconv: parse responses body: %w", err) + } + + out := map[string]any{ + "model": root["model"], + } + // Only forward stream when it's actually a bool in the source request. + // Codex Desktop always sets it, but other Codex clients (exec, review, + // app-server probes) may omit it. Sending `"stream": null` makes upstream + // validators reject the request. + if s, ok := root["stream"].(bool); ok { + out["stream"] = s + } + // `reasoning` is a Responses-API field. Chat Completions does NOT have a + // top-level `reasoning` field — DeepSeek uses `thinking: {type, + // reasoning_effort}`, Anthropic uses `thinking: {type, budget_tokens}`, + // and OpenAI Chat just doesn't support it. Forwarding the Responses-shaped + // object verbatim (or its null) at minimum sends a meaningless field, and + // at worst trips strict validators ("reasoning": null was rejected by + // some upstreams). Proper per-upstream mapping is a deferred feature. + // Forward tool-control fields when Codex sets them. Codex 0.142 sends + // parallel_tool_calls (driven by ModelInfo.supports_parallel_tool_calls) + // and tool_choice; dropping either lets the upstream silently disregard + // the client's intent. + if v, ok := root["parallel_tool_calls"].(bool); ok { + out["parallel_tool_calls"] = v + } + if v, ok := root["tool_choice"]; ok && v != nil { + out["tool_choice"] = v + } + + // Chat Completions only allows roles {system, assistant, user, tool, function}. + // The Responses API uses "developer" for prompt-author instructions; merge + // those (and any inline system messages) into a single leading system + // message — same behavior as the Anthropic converter. + systemParts := []string{} + if instr, _ := root["instructions"].(string); strings.TrimSpace(instr) != "" { + systemParts = append(systemParts, instr) + } + + messages := []any{} + switch in := root["input"].(type) { + case string: + if strings.TrimSpace(in) != "" { + messages = append(messages, map[string]any{"role": "user", "content": in}) + } + case []any: + for _, item := range in { + m, ok := item.(map[string]any) + if !ok { + continue + } + switch m["type"] { + case "message": + role, _ := m["role"].(string) + switch strings.ToLower(role) { + case "system", "developer": + if t := flattenResponsesContent(m["content"]); t != "" { + systemParts = append(systemParts, t) + } + continue + } + if role == "" { + role = "user" + } + messages = append(messages, map[string]any{ + "role": role, + "content": flattenResponsesContent(m["content"]), + }) + case "function_call": + name, _ := m["name"].(string) + args, _ := m["arguments"].(string) + callID, _ := m["call_id"].(string) + messages = append(messages, map[string]any{ + "role": "assistant", + "tool_calls": []any{map[string]any{ + "id": callID, "type": "function", + "function": map[string]any{"name": name, "arguments": args}, + }}, + }) + case "function_call_output": + callID, _ := m["call_id"].(string) + output := flattenResponsesContent(m["output"]) + messages = append(messages, map[string]any{ + "role": "tool", "tool_call_id": callID, "content": output, + }) + case "reasoning": + // v1: dropped. parity is a follow-up. + } + } + } + + if tools, ok := root["tools"].([]any); ok { + conv := make([]any, 0, len(tools)) + for _, t := range tools { + tm, ok := t.(map[string]any) + if !ok || tm["type"] != "function" { + continue + } + fn := map[string]any{ + "name": tm["name"], + "description": tm["description"], + "parameters": tm["parameters"], + } + // Preserve `strict` when Codex requests structured-output + // enforcement on this tool. + if v, ok := tm["strict"].(bool); ok { + fn["strict"] = v + } + conv = append(conv, map[string]any{"type": "function", "function": fn}) + } + out["tools"] = conv + } + + if len(systemParts) > 0 { + // Prepend a single merged system message. + messages = append([]any{ + map[string]any{"role": "system", "content": strings.Join(systemParts, "\n\n")}, + }, messages...) + } + out["messages"] = messages + return json.Marshal(out) +} + +// flattenResponsesContent turns a Responses content (string or array of +// {type,text} parts) into a single string for Chat Completions. +func flattenResponsesContent(content any) string { + switch v := content.(type) { + case string: + return v + case []any: + var parts []string + for _, part := range v { + if pm, ok := part.(map[string]any); ok { + if text, _ := pm["text"].(string); text != "" { + parts = append(parts, text) + } + } + } + return strings.Join(parts, "\n\n") + default: + return "" + } +} + +// ChatResponseToResponses assembles a complete (non-streaming) Chat +// Completions response body into a Responses-shaped body. +func ChatResponseToResponses(chatBody []byte) ([]byte, error) { + var chat struct { + ID string `json:"id"` + Model string `json:"model"` + Choices []struct { + Message struct { + Role string `json:"role"` + Content string `json:"content"` + ToolCalls []struct { + ID string `json:"id"` + Function struct { + Name string `json:"name"` + Arguments string `json:"arguments"` + } `json:"function"` + } `json:"tool_calls"` + } `json:"message"` + } `json:"choices"` + Usage any `json:"usage"` + } + if err := json.Unmarshal(chatBody, &chat); err != nil { + return nil, fmt.Errorf("protoconv: parse chat body: %w", err) + } + + output := []any{} + for _, ch := range chat.Choices { + m := ch.Message + if strings.TrimSpace(m.Content) != "" { + output = append(output, map[string]any{ + "type": "message", "role": firstNonEmpty(m.Role, "assistant"), + "content": []any{map[string]any{"type": "output_text", "text": m.Content}}, + }) + } + for _, tc := range m.ToolCalls { + output = append(output, map[string]any{ + "type": "function_call", "name": tc.Function.Name, + "arguments": tc.Function.Arguments, "call_id": tc.ID, + }) + } + } + + resp := map[string]any{ + "id": chat.ID, + "model": chat.Model, + "status": "completed", + "output": output, + "usage": chat.Usage, + } + return json.Marshal(resp) +} + +func firstNonEmpty(a, b string) string { + if a != "" { + return a + } + return b +} + +// WriteChatStreamAsResponses reads a Chat Completions SSE stream from r and +// writes the equivalent Responses SSE event sequence to w. Each output item +// (message, and each tool call) gets a balanced added/done pair; deltas carry item_id. +func WriteChatStreamAsResponses(r io.Reader, w http.ResponseWriter) error { + flusher, _ := w.(http.Flusher) + w.Header().Set("Content-Type", "text/event-stream") + w.Header().Set("Cache-Control", "no-cache") + + writeEvent := func(event string, data any) { + b, _ := json.Marshal(data) + fmt.Fprintf(w, "event: %s\ndata: %s\n\n", event, b) + if flusher != nil { + flusher.Flush() + } + } + sc := bufio.NewScanner(r) + sc.Buffer(make([]byte, 0, 64*1024), 4*1024*1024) + + counter := 0 + newID := func(prefix string) string { counter++; return fmt.Sprintf("%s_%d", prefix, counter) } + + var msgItemID string // open message item; "" = none + var msgTextBuf strings.Builder + toolItems := map[int]string{} // open tool-call index -> item id + toolNames := map[int]string{} + toolArgs := map[int]*strings.Builder{} + + // Upstream response identity, captured from the first chunk. Codex's + // Responses parser fails ("missing field `id`") without these. + respID := "" + respModel := "" + createdEmitted := false + emitCreated := func() { + if createdEmitted { + return + } + createdEmitted = true + writeEvent("response.created", map[string]any{ + "type": "response.created", + "response": map[string]any{ + "id": respID, + "model": respModel, + "status": "in_progress", + }, + }) + } + + closeMsg := func() { + if msgItemID != "" { + // Codex's ResponseItem::Message requires {role, content:[{type,text}]}. + writeEvent("response.output_item.done", map[string]any{ + "type": "response.output_item.done", + "item": map[string]any{ + "type": "message", + "id": msgItemID, + "role": "assistant", + "content": []any{map[string]any{"type": "output_text", "text": msgTextBuf.String()}}, + }, + }) + msgItemID = "" + msgTextBuf.Reset() + } + } + closeTool := func(idx int) { + if id, ok := toolItems[idx]; ok { + // Codex's ResponseItem::FunctionCall requires {name, arguments, call_id}. + args := "" + if buf, ok := toolArgs[idx]; ok && buf != nil { + args = buf.String() + } + writeEvent("response.output_item.done", map[string]any{ + "type": "response.output_item.done", + "item": map[string]any{ + "type": "function_call", + "id": id, + "call_id": id, + "name": toolNames[idx], + "arguments": args, + }, + }) + delete(toolItems, idx) + delete(toolNames, idx) + delete(toolArgs, idx) + } + } + closeAll := func() { + closeMsg() + for idx := range toolItems { + closeTool(idx) + } + } + + for sc.Scan() { + line := strings.TrimSpace(sc.Text()) + if line == "" || !strings.HasPrefix(line, "data:") { + continue + } + payload := strings.TrimSpace(strings.TrimPrefix(line, "data:")) + if payload == "[DONE]" { + // Drain any trailing bytes (blank lines, usage chunks) so the + // underlying http.Response.Body reaches EOF before Close(). + // Otherwise net/http resets the TCP connection and the upstream + // gateway sees an abnormal disconnect — its turn state never + // transitions out of in_progress, leaving the modelserver dashboard + // showing "processing" forever even though Codex displayed the reply. + _, _ = io.Copy(io.Discard, r) + break + } + var chunk struct { + ID string `json:"id"` + Model string `json:"model"` + Choices []struct { + Delta struct { + Role string `json:"role"` + Content string `json:"content"` + ToolCalls []struct { + Index int `json:"index"` + ID string `json:"id"` + Function struct { + Name string `json:"name"` + Arguments string `json:"arguments"` + } `json:"function"` + } `json:"tool_calls"` + } `json:"delta"` + FinishReason string `json:"finish_reason"` + } `json:"choices"` + } + if err := json.Unmarshal([]byte(payload), &chunk); err != nil { + continue // skip malformed chunk + } + if respID == "" && chunk.ID != "" { + respID = chunk.ID + } + if respModel == "" && chunk.Model != "" { + respModel = chunk.Model + } + emitCreated() + for _, ch := range chunk.Choices { + d := ch.Delta + if d.Content != "" { + if msgItemID == "" { + msgItemID = newID("msg") + writeEvent("response.output_item.added", map[string]any{ + "type": "response.output_item.added", + "item": map[string]any{ + "type": "message", + "id": msgItemID, + "role": "assistant", + "content": []any{}, + }, + }) + } + msgTextBuf.WriteString(d.Content) + writeEvent("response.output_text.delta", map[string]any{"type": "response.output_text.delta", "item_id": msgItemID, "delta": d.Content}) + } + for _, tc := range d.ToolCalls { + if _, ok := toolItems[tc.Index]; !ok { + id := tc.ID + if id == "" { + id = newID("fc") + } + toolItems[tc.Index] = id + toolNames[tc.Index] = tc.Function.Name + toolArgs[tc.Index] = &strings.Builder{} + writeEvent("response.output_item.added", map[string]any{ + "type": "response.output_item.added", + "item": map[string]any{ + "type": "function_call", + "id": id, + "call_id": id, + "name": tc.Function.Name, + "arguments": "", + }, + }) + } + if tc.Function.Name != "" && toolNames[tc.Index] == "" { + toolNames[tc.Index] = tc.Function.Name + } + if tc.Function.Arguments != "" { + if buf := toolArgs[tc.Index]; buf != nil { + buf.WriteString(tc.Function.Arguments) + } + writeEvent("response.function_call_arguments.delta", map[string]any{"type": "response.function_call_arguments.delta", "item_id": toolItems[tc.Index], "delta": tc.Function.Arguments}) + } + } + if ch.FinishReason != "" { + closeAll() + } + } + } + closeAll() + if err := sc.Err(); err != nil { + return err + } + emitCreated() // edge case: empty stream + writeEvent("response.completed", map[string]any{ + "type": "response.completed", + "response": map[string]any{ + "id": respID, + "model": respModel, + "status": "completed", + }, + }) + return nil +} diff --git a/internal/protoconv/chat_stream_test.go b/internal/protoconv/chat_stream_test.go new file mode 100644 index 0000000..bd7444e --- /dev/null +++ b/internal/protoconv/chat_stream_test.go @@ -0,0 +1,166 @@ +package protoconv + +import ( + "bufio" + "encoding/json" + "net/http/httptest" + "strings" + "testing" +) + +func TestChatStreamToResponses(t *testing.T) { + // Canned Chat Completions SSE: one text delta, one tool-call arg delta, finish. + const sse = "data: {\"choices\":[{\"delta\":{\"role\":\"assistant\",\"content\":\"hi\"}}]}\n\n" + + "data: {\"choices\":[{\"delta\":{\"tool_calls\":[{\"index\":0,\"id\":\"c1\",\"function\":{\"name\":\"run\",\"arguments\":\"{}\"}}]}}]}\n\n" + + "data: {\"choices\":[{\"delta\":{},\"finish_reason\":\"tool_calls\"}]}\n\n" + + "data: [DONE]\n\n" + + rec := httptest.NewRecorder() + r := strings.NewReader(sse) + err := WriteChatStreamAsResponses(r, rec) + if err != nil { + t.Fatalf("WriteChatStreamAsResponses: %v", err) + } + + body := rec.Body.String() + mustContain := []string{ + "event: response.created", + "event: response.output_item.added", + "event: response.output_text.delta", + `"hi"`, + "event: response.function_call_arguments.delta", + "event: response.completed", + } + for _, want := range mustContain { + if !strings.Contains(body, want) { + t.Errorf("stream output missing %q\n--- got ---\n%s", want, body) + } + } + // every non-empty line must be a valid SSE frame (event:/data:) + sc := bufio.NewScanner(strings.NewReader(body)) + for sc.Scan() { + line := sc.Text() + if line == "" || strings.HasPrefix(line, "event:") || strings.HasPrefix(line, "data:") { + continue + } + t.Errorf("unexpected SSE line: %q", line) + } +} + +// Regression: mirror of the Anthropic shape test. Codex parser silently +// drops items that don't match ResponseItem. +func TestChatStreamItemShapesAreCodexParseable(t *testing.T) { + const sse = "data: {\"id\":\"x\",\"model\":\"deepseek-v4-pro\",\"choices\":[{\"delta\":{\"role\":\"assistant\",\"content\":\"Hi \"}}]}\n\n" + + "data: {\"id\":\"x\",\"model\":\"deepseek-v4-pro\",\"choices\":[{\"delta\":{\"content\":\"there\"}}]}\n\n" + + "data: {\"id\":\"x\",\"model\":\"deepseek-v4-pro\",\"choices\":[{\"delta\":{\"tool_calls\":[{\"index\":0,\"id\":\"c1\",\"function\":{\"name\":\"run\",\"arguments\":\"{\\\"k\\\":\"}}]}}]}\n\n" + + "data: {\"id\":\"x\",\"model\":\"deepseek-v4-pro\",\"choices\":[{\"delta\":{\"tool_calls\":[{\"index\":0,\"function\":{\"arguments\":\"1}\"}}]}}]}\n\n" + + "data: {\"id\":\"x\",\"model\":\"deepseek-v4-pro\",\"choices\":[{\"delta\":{},\"finish_reason\":\"tool_calls\"}]}\n\n" + + "data: [DONE]\n\n" + rec := httptest.NewRecorder() + if err := WriteChatStreamAsResponses(strings.NewReader(sse), rec); err != nil { + t.Fatal(err) + } + body := rec.Body.String() + var doneItems []map[string]any + for _, frame := range strings.Split(body, "\n\n") { + if !strings.Contains(frame, "event: response.output_item.done") { + continue + } + dataIdx := strings.Index(frame, "data:") + var ev struct { + Item map[string]any `json:"item"` + } + if err := json.Unmarshal([]byte(strings.TrimSpace(frame[dataIdx+len("data:"):])), &ev); err != nil { + t.Fatalf("malformed done frame: %v", err) + } + doneItems = append(doneItems, ev.Item) + } + if len(doneItems) != 2 { + t.Fatalf("want 2 done items (msg+tool), got %d:\n%s", len(doneItems), body) + } + msg := doneItems[0] + if msg["role"] != "assistant" { + t.Errorf("msg missing role:assistant: %v", msg) + } + content := msg["content"].([]any) + if len(content) != 1 || content[0].(map[string]any)["text"] != "Hi there" { + t.Errorf("msg content not accumulated: %v", content) + } + fc := doneItems[1] + if fc["name"] != "run" || fc["arguments"] != `{"k":1}` || fc["call_id"] != "c1" { + t.Errorf("function_call missing fields: %v", fc) + } +} + +// Regression: matches the Anthropic-side test. Codex parser requires id on +// response.completed; the Chat SSE format carries it on each chunk's top-level +// `id`. Pick up the first non-empty one we see. +func TestChatStreamCarriesResponseIDAndModel(t *testing.T) { + const sse = "data: {\"id\":\"chatcmpl-xyz\",\"model\":\"deepseek-v4-pro\",\"choices\":[{\"delta\":{\"role\":\"assistant\",\"content\":\"ok\"}}]}\n\n" + + "data: {\"id\":\"chatcmpl-xyz\",\"model\":\"deepseek-v4-pro\",\"choices\":[{\"delta\":{},\"finish_reason\":\"stop\"}]}\n\n" + + "data: [DONE]\n\n" + rec := httptest.NewRecorder() + if err := WriteChatStreamAsResponses(strings.NewReader(sse), rec); err != nil { + t.Fatal(err) + } + body := rec.Body.String() + for _, ev := range []string{"response.created", "response.completed"} { + idx := strings.Index(body, "event: "+ev) + if idx < 0 { + t.Errorf("event %s missing\n%s", ev, body) + continue + } + end := strings.Index(body[idx:], "\n\n") + frame := body[idx : idx+end] + if !strings.Contains(frame, `"id":"chatcmpl-xyz"`) { + t.Errorf("event %s missing id:\n%s", ev, frame) + } + if !strings.Contains(frame, `"model":"deepseek-v4-pro"`) { + t.Errorf("event %s missing model:\n%s", ev, frame) + } + } +} + +func TestChatStreamMultiItemBalanced(t *testing.T) { + const sse = "data: {\"choices\":[{\"delta\":{\"content\":\"hi\"}}]}\n\n" + + "data: {\"choices\":[{\"delta\":{\"tool_calls\":[{\"index\":0,\"id\":\"c1\",\"function\":{\"name\":\"a\",\"arguments\":\"{\\\"x\\\":1}\"}}]}}]}\n\n" + + "data: {\"choices\":[{\"delta\":{\"tool_calls\":[{\"index\":1,\"id\":\"c2\",\"function\":{\"name\":\"b\",\"arguments\":\"{}\"}}]}}]}\n\n" + + "data: {\"choices\":[{\"delta\":{},\"finish_reason\":\"tool_calls\"}]}\n\n" + + "data: [DONE]\n\n" + rec := httptest.NewRecorder() + if err := WriteChatStreamAsResponses(strings.NewReader(sse), rec); err != nil { + t.Fatal(err) + } + added, done, argWithItem := countItemEvents(rec.Body.String()) + if added != done { + t.Errorf("added=%d done=%d (must balance);\n%s", added, done, rec.Body.String()) + } + if added != 3 { // 1 message + 2 function calls + t.Errorf("added=%d, want 3", added) + } + if argWithItem < 2 { + t.Errorf("arg deltas with item_id = %d, want >=2", argWithItem) + } +} + +func TestChatRequestFunctionCallOutputArray(t *testing.T) { + resp := map[string]any{ + "model": "deepseek-v4-pro", + "input": []any{ + map[string]any{"type": "function_call_output", "call_id": "c1", + "output": []any{map[string]any{"type": "output_text", "text": "result"}}}, + }, + } + body, _ := json.Marshal(resp) + gotBody, err := ChatRequestFromResponses(body) + if err != nil { + t.Fatal(err) + } + var got struct { + Messages []map[string]any `json:"messages"` + } + _ = json.Unmarshal(gotBody, &got) + if len(got.Messages) != 1 || got.Messages[0]["content"] != "result" { + t.Errorf("array function_call_output dropped; messages=%v", got.Messages) + } +} diff --git a/internal/protoconv/chat_test.go b/internal/protoconv/chat_test.go new file mode 100644 index 0000000..552f137 --- /dev/null +++ b/internal/protoconv/chat_test.go @@ -0,0 +1,310 @@ +package protoconv + +import ( + "encoding/json" + "strings" + "testing" +) + +func TestChatRequestFromResponses(t *testing.T) { + resp := map[string]any{ + "model": "deepseek-v4-pro", + "instructions": "be brief", + "input": "hello", + "tools": []any{map[string]any{ + "type": "function", "name": "run", "description": "run it", + "parameters": map[string]any{"type": "object"}, + }}, + "stream": true, + } + body, _ := json.Marshal(resp) + + gotBody, err := ChatRequestFromResponses(body) + if err != nil { + t.Fatalf("ChatRequestFromResponses: %v", err) + } + var got map[string]any + if err := json.Unmarshal(gotBody, &got); err != nil { + t.Fatalf("unmarshal converted: %v", err) + } + + if got["model"] != "deepseek-v4-pro" { + t.Errorf("model = %v, want deepseek-v4-pro", got["model"]) + } + msgs, _ := got["messages"].([]any) + if len(msgs) == 0 || msgs[0].(map[string]any)["role"] != "system" { + t.Errorf("expected first message to be system from instructions, got %v", msgs) + } + if got["stream"] != true { + t.Errorf("stream not forwarded: %v", got["stream"]) + } + tools, _ := got["tools"].([]any) + if len(tools) != 1 { + t.Fatalf("tools len = %d, want 1", len(tools)) + } + fn := tools[0].(map[string]any)["function"].(map[string]any) + if fn["name"] != "run" { + t.Errorf("tool function name = %v, want run", fn["name"]) + } +} + +// Regression (PR #12 review P5): the Responses API's top-level `reasoning` +// object is not a valid Chat Completions field — DeepSeek uses `thinking: +// {type, reasoning_effort}`, Anthropic uses `thinking: {type, +// budget_tokens}`, OpenAI Chat doesn't have it. Forwarding the Responses +// object (or its null) is at best meaningless, at worst trips upstream +// validators. Drop it in the Chat converter. +func TestChatRequest_DropsReasoningField(t *testing.T) { + cases := []map[string]any{ + // reasoning present as object (Codex's real wire shape) + {"model": "deepseek-v4-pro", "input": "hi", "reasoning": map[string]any{"effort": "high", "summary": "auto"}}, + // reasoning present as null (the actual bug reviewer flagged) + {"model": "deepseek-v4-pro", "input": "hi", "reasoning": nil}, + // reasoning absent (sanity baseline) + {"model": "deepseek-v4-pro", "input": "hi"}, + } + for _, c := range cases { + body, _ := json.Marshal(c) + got, err := ChatRequestFromResponses(body) + if err != nil { + t.Fatalf("source %#v: %v", c, err) + } + var m map[string]any + _ = json.Unmarshal(got, &m) + if _, present := m["reasoning"]; present { + t.Errorf("reasoning leaked into Chat body for source %#v:\n%s", c, got) + } + } +} + +// Regression (PR #12 review P4): Codex 0.142 sends parallel_tool_calls and +// tool_choice; both must reach the upstream Chat endpoint. Function tools' +// strict flag must also survive translation. +func TestChatRequest_ForwardsToolControlFields(t *testing.T) { + body, _ := json.Marshal(map[string]any{ + "model": "deepseek-v4-pro", + "input": "hi", + "parallel_tool_calls": false, + "tool_choice": "required", + "tools": []any{map[string]any{ + "type": "function", "name": "run", "description": "d", + "parameters": map[string]any{"type": "object"}, + "strict": true, + }}, + }) + got, err := ChatRequestFromResponses(body) + if err != nil { + t.Fatal(err) + } + var m map[string]any + _ = json.Unmarshal(got, &m) + if v, _ := m["parallel_tool_calls"].(bool); v { + t.Errorf("parallel_tool_calls = %v, want false", v) + } + if v, ok := m["parallel_tool_calls"]; !ok { + t.Errorf("parallel_tool_calls dropped, want forwarded: %#v", v) + } + if v, _ := m["tool_choice"].(string); v != "required" { + t.Errorf("tool_choice = %v, want \"required\"", m["tool_choice"]) + } + tools := m["tools"].([]any) + fn := tools[0].(map[string]any)["function"].(map[string]any) + if v, _ := fn["strict"].(bool); !v { + t.Errorf("function.strict = %v, want true (preserved)", v) + } +} + +func TestChatRequest_OmitsToolControlsWhenSourceOmitsThem(t *testing.T) { + body, _ := json.Marshal(map[string]any{ + "model": "deepseek-v4-pro", + "input": "hi", + "tools": []any{map[string]any{ + "type": "function", "name": "run", "description": "d", + "parameters": map[string]any{"type": "object"}, + }}, + }) + got, err := ChatRequestFromResponses(body) + if err != nil { + t.Fatal(err) + } + var m map[string]any + _ = json.Unmarshal(got, &m) + if _, present := m["parallel_tool_calls"]; present { + t.Errorf("parallel_tool_calls should be absent when source omits it") + } + if _, present := m["tool_choice"]; present { + t.Errorf("tool_choice should be absent when source omits it") + } + tools := m["tools"].([]any) + fn := tools[0].(map[string]any)["function"].(map[string]any) + if _, present := fn["strict"]; present { + t.Errorf("function.strict should be absent when source omits it") + } +} + +// Regression (PR #12 review P2): omitting `stream` from the source body should +// not produce `"stream": null` (rejected by upstream Chat validators). +func TestChatRequest_OmitsStreamWhenSourceOmitsIt(t *testing.T) { + body, _ := json.Marshal(map[string]any{"model": "deepseek-v4-pro", "input": "hi"}) + got, err := ChatRequestFromResponses(body) + if err != nil { + t.Fatal(err) + } + var m map[string]any + _ = json.Unmarshal(got, &m) + if v, present := m["stream"]; present { + t.Errorf("stream should be absent when source omits it; got %#v", v) + } +} + +// Regression: Codex sends `developer` role for prompt-author instructions, but +// Chat Completions only accepts {system, assistant, user, tool, function} — +// DeepSeek rejects it with "developer is not one of [...]". Merge developer + +// inline system messages into a single leading system message (mirrors the +// Anthropic converter). +func TestChatRequestMergesDeveloperIntoSystem(t *testing.T) { + resp := map[string]any{ + "model": "deepseek-v4-pro", + "instructions": "be brief", + "input": []any{ + map[string]any{"type": "message", "role": "developer", + "content": []any{map[string]any{"type": "input_text", "text": "use Chinese"}}}, + map[string]any{"type": "message", "role": "system", + "content": []any{map[string]any{"type": "input_text", "text": "extra rule"}}}, + map[string]any{"type": "message", "role": "user", + "content": []any{map[string]any{"type": "input_text", "text": "hi"}}}, + }, + } + body, _ := json.Marshal(resp) + gotBody, err := ChatRequestFromResponses(body) + if err != nil { + t.Fatal(err) + } + var got map[string]any + _ = json.Unmarshal(gotBody, &got) + msgs, _ := got["messages"].([]any) + if len(msgs) != 2 { + t.Fatalf("messages len = %d, want 2 (system+user); got %+v", len(msgs), msgs) + } + sys := msgs[0].(map[string]any) + if sys["role"] != "system" { + t.Errorf("msg[0] role = %v, want system", sys["role"]) + } + for _, want := range []string{"be brief", "use Chinese", "extra rule"} { + if c, _ := sys["content"].(string); !strings.Contains(c, want) { + t.Errorf("system content missing %q; got %q", want, c) + } + } + if u := msgs[1].(map[string]any); u["role"] != "user" || u["content"] != "hi" { + t.Errorf("msg[1] = %v, want user/hi", u) + } + for _, m := range msgs { + if r := m.(map[string]any)["role"]; r == "developer" { + t.Errorf("developer role leaked into Chat messages: %v", m) + } + } +} + +func TestChatRequestMapsItems(t *testing.T) { + resp := map[string]any{ + "model": "deepseek-v4-pro", + "input": []any{ + map[string]any{"type": "message", "role": "user", + "content": []any{map[string]any{"type": "input_text", "text": "hi"}}}, + map[string]any{"type": "function_call", "name": "run", "arguments": "{}", "call_id": "c1"}, + map[string]any{"type": "function_call_output", "call_id": "c1", "output": "ok"}, + }, + } + body, _ := json.Marshal(resp) + gotBody, err := ChatRequestFromResponses(body) + if err != nil { + t.Fatalf("err: %v", err) + } + var got struct { + Messages []map[string]any `json:"messages"` + } + _ = json.Unmarshal(gotBody, &got) + + if got.Messages[0]["role"] != "user" { + t.Errorf("msg0 role = %v, want user", got.Messages[0]["role"]) + } + if _, ok := got.Messages[0]["content"].(string); !ok { + t.Errorf("msg0 content should be flattened string, got %T", got.Messages[0]["content"]) + } + var asst map[string]any + for _, m := range got.Messages { + if m["role"] == "assistant" { + asst = m + } + } + if asst == nil { + t.Fatalf("no assistant message produced from function_call") + } + tc := asst["tool_calls"].([]any)[0].(map[string]any) + if tc["id"] != "c1" || tc["type"] != "function" { + t.Errorf("tool_call = %v, want id c1 type function", tc) + } + var tool map[string]any + for _, m := range got.Messages { + if m["role"] == "tool" { + tool = m + } + } + if tool == nil || tool["tool_call_id"] != "c1" { + t.Errorf("missing tool message for c1, got %v", tool) + } +} + +func TestChatResponseToResponses(t *testing.T) { + chat := map[string]any{ + "id": "chat_1", + "model": "deepseek-v4-pro", + "choices": []any{map[string]any{ + "message": map[string]any{ + "role": "assistant", + "content": "hello there", + "tool_calls": []any{map[string]any{ + "id": "c1", "type": "function", + "function": map[string]any{"name": "run", "arguments": "{}"}, + }}, + }, + "finish_reason": "tool_calls", + }}, + "usage": map[string]any{"prompt_tokens": 1, "completion_tokens": 2}, + } + body, _ := json.Marshal(chat) + + out, err := ChatResponseToResponses(body) + if err != nil { + t.Fatalf("err: %v", err) + } + var got map[string]any + _ = json.Unmarshal(out, &got) + + if got["model"] != "deepseek-v4-pro" { + t.Errorf("model = %v", got["model"]) + } + if got["status"] != "completed" { + t.Errorf("status = %v, want completed", got["status"]) + } + output, _ := got["output"].([]any) + if len(output) < 2 { + t.Fatalf("output items = %d, want >=2 (message + function_call)", len(output)) + } + first := output[0].(map[string]any) + if first["type"] != "message" { + t.Errorf("first output type = %v, want message", first["type"]) + } + var foundFn bool + for _, it := range output { + if m, ok := it.(map[string]any); ok && m["type"] == "function_call" { + foundFn = true + if m["name"] != "run" || m["call_id"] != "c1" { + t.Errorf("function_call = %v", m) + } + } + } + if !foundFn { + t.Errorf("no function_call item in output") + } +} diff --git a/internal/protoconv/responses.go b/internal/protoconv/responses.go new file mode 100644 index 0000000..4bd8d4e --- /dev/null +++ b/internal/protoconv/responses.go @@ -0,0 +1,25 @@ +// Package protoconv translates Codex's OpenAI Responses API requests to and +// from the wire protocols the model gateway exposes for non-OpenAI models +// (Chat Completions for deepseek-v4-pro, Anthropic Messages for glm-5.2). +package protoconv + +// Wire names the upstream protocol a model is served through. +type Wire string + +const ( + // WireResponses passes the request through to /v1/responses unchanged. + WireResponses Wire = "responses" + // WireChat converts to OpenAI Chat Completions (/v1/chat/completions). + WireChat Wire = "chat" + // WireAnthropic converts to Anthropic Messages (/v1/messages). + WireAnthropic Wire = "anthropic" +) + +// Route binds a model name to its upstream wire protocol. +type Route struct { + Model string + Wire Wire + // DisplayName is the human-readable label for the UI model picker. Empty + // means "fall back to Model". The wire-side model name remains Model. + DisplayName string +} diff --git a/internal/protoconv/stream_helpers_test.go b/internal/protoconv/stream_helpers_test.go new file mode 100644 index 0000000..ce37b91 --- /dev/null +++ b/internal/protoconv/stream_helpers_test.go @@ -0,0 +1,52 @@ +package protoconv + +import ( + "encoding/json" + "strings" +) + +type sseFrame struct{ event, data string } + +func parseSSE(body string) []sseFrame { + var frames []sseFrame + var cur sseFrame + for _, line := range strings.Split(body, "\n") { + l := strings.TrimSpace(line) + if l == "" { + if cur.event != "" || cur.data != "" { + frames = append(frames, cur) + cur = sseFrame{} + } + continue + } + if strings.HasPrefix(l, "event:") { + cur.event = strings.TrimSpace(strings.TrimPrefix(l, "event:")) + } else if strings.HasPrefix(l, "data:") { + cur.data = strings.TrimSpace(strings.TrimPrefix(l, "data:")) + } + } + if cur.event != "" || cur.data != "" { + frames = append(frames, cur) + } + return frames +} + +// countItemEvents returns (#added, #done, #function_call_arguments.delta with item_id set). +func countItemEvents(body string) (added, done, argWithItem int) { + for _, f := range parseSSE(body) { + switch f.event { + case "response.output_item.added": + added++ + case "response.output_item.done": + done++ + case "response.function_call_arguments.delta": + var d map[string]any + if json.Unmarshal([]byte(f.data), &d) == nil { + if _, ok := d["item_id"].(string); ok && d["item_id"] != "" { + argWithItem++ + } + } + } + } + return +} diff --git a/internal/ui/assets/dist/assets/index-BU0q65th.js b/internal/ui/assets/dist/assets/index-BU0q65th.js new file mode 100644 index 0000000..3791751 --- /dev/null +++ b/internal/ui/assets/dist/assets/index-BU0q65th.js @@ -0,0 +1,13 @@ +(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();function e(e){let t=Object.create(null);for(let n of e.split(`,`))t[n]=1;return e=>e in t}var t={},n=[],r=()=>{},i=()=>!1,a=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),o=e=>e.startsWith(`onUpdate:`),s=Object.assign,c=(e,t)=>{let n=e.indexOf(t);n>-1&&e.splice(n,1)},l=Object.prototype.hasOwnProperty,u=(e,t)=>l.call(e,t),d=Array.isArray,f=e=>x(e)===`[object Map]`,p=e=>x(e)===`[object Set]`,m=e=>x(e)===`[object Date]`,h=e=>typeof e==`function`,g=e=>typeof e==`string`,_=e=>typeof e==`symbol`,v=e=>typeof e==`object`&&!!e,y=e=>(v(e)||h(e))&&h(e.then)&&h(e.catch),b=Object.prototype.toString,x=e=>b.call(e),S=e=>x(e).slice(8,-1),C=e=>x(e)===`[object Object]`,w=e=>g(e)&&e!==`NaN`&&e[0]!==`-`&&``+parseInt(e,10)===e,ee=e(`,key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted`),T=e=>{let t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},te=/-\w/g,E=T(e=>e.replace(te,e=>e.slice(1).toUpperCase())),D=/\B([A-Z])/g,ne=T(e=>e.replace(D,`-$1`).toLowerCase()),re=T(e=>e.charAt(0).toUpperCase()+e.slice(1)),ie=T(e=>e?`on${re(e)}`:``),ae=(e,t)=>!Object.is(e,t),oe=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},se=e=>{let t=parseFloat(e);return isNaN(t)?e:t},ce=e=>{let t=g(e)?Number(e):NaN;return isNaN(t)?e:t},le,ue=()=>le||(le=typeof globalThis<`u`?globalThis:typeof self<`u`?self:typeof window<`u`?window:typeof global<`u`?global:{});function k(e){if(d(e)){let t={};for(let n=0;n{if(e){let n=e.split(fe);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function A(e){let t=``;if(g(e))t=e;else if(d(e))for(let n=0;n!!(e&&e.__v_isRef===!0),M=e=>g(e)?e:e==null?``:d(e)||v(e)&&(e.toString===b||!h(e.toString))?ye(e)?M(e.value):JSON.stringify(e,be,2):String(e),be=(e,t)=>ye(t)?be(e,t.value):f(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((e,[t,n],r)=>(e[xe(t,r)+` =>`]=n,e),{})}:p(t)?{[`Set(${t.size})`]:[...t.values()].map(e=>xe(e))}:_(t)?xe(t):v(t)&&!d(t)&&!C(t)?String(t):t,xe=(e,t=``)=>_(e)?`Symbol(${e.description??t})`:e,N,Se=class{constructor(e=!1){this.detached=e,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!e&&N&&(N.active?(this.parent=N,this.index=(N.scopes||(N.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let e,t;if(this.scopes)for(e=0,t=this.scopes.length;e0&&--this._on===0){if(N===this)N=this.prevScope;else{let e=N;for(;e;){if(e.prevScope===this){e.prevScope=this.prevScope;break}e=e.prevScope}}this.prevScope=void 0}}stop(e){if(this._active){this._active=!1;let t,n;for(t=0,n=this.effects.length;t0)return;if(ke){let e=ke;for(ke=void 0;e;){let t=e.next;e.next=void 0,e.flags&=-9,e=t}}let e;for(;Oe;){let t=Oe;for(Oe=void 0;t;){let n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(t){e||(e=t)}t=n}}if(e)throw e}function Ne(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Pe(e){let t,n=e.depsTail,r=n;for(;r;){let e=r.prevDep;r.version===-1?(r===n&&(n=e),Le(r),Re(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=e}e.deps=t,e.depsTail=n}function Fe(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Ie(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Ie(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===We)||(e.globalVersion=We,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Fe(e))))return;e.flags|=2;let t=e.dep,n=P,r=ze;P=e,ze=!0;try{Ne(e);let n=e.fn(e._value);(t.version===0||ae(n,e._value))&&(e.flags|=128,e._value=n,t.version++)}catch(e){throw t.version++,e}finally{P=n,ze=r,Pe(e),e.flags&=-3}}function Le(e,t=!1){let{dep:n,prevSub:r,nextSub:i}=e;if(r&&(r.nextSub=i,e.prevSub=void 0),i&&(i.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let e=n.computed.deps;e;e=e.nextDep)Le(e,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Re(e){let{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}var ze=!0,Be=[];function Ve(){Be.push(ze),ze=!1}function He(){let e=Be.pop();ze=e===void 0?!0:e}function Ue(e){let{cleanup:t}=e;if(e.cleanup=void 0,t){let e=P;P=void 0;try{t()}finally{P=e}}}var We=0,Ge=class{constructor(e,t){this.sub=e,this.dep=t,this.version=t.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}},Ke=class{constructor(e){this.computed=e,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(e){if(!P||!ze||P===this.computed)return;let t=this.activeLink;if(t===void 0||t.sub!==P)t=this.activeLink=new Ge(P,this),P.deps?(t.prevDep=P.depsTail,P.depsTail.nextDep=t,P.depsTail=t):P.deps=P.depsTail=t,qe(t);else if(t.version===-1&&(t.version=this.version,t.nextDep)){let e=t.nextDep;e.prevDep=t.prevDep,t.prevDep&&(t.prevDep.nextDep=e),t.prevDep=P.depsTail,t.nextDep=void 0,P.depsTail.nextDep=t,P.depsTail=t,P.deps===t&&(P.deps=e)}return t}trigger(e){this.version++,We++,this.notify(e)}notify(e){je();try{for(let e=this.subs;e;e=e.prevSub)e.sub.notify()&&e.sub.dep.notify()}finally{Me()}}};function qe(e){if(e.dep.sc++,e.sub.flags&4){let t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let e=t.deps;e;e=e.nextDep)qe(e)}let n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}var Je=new WeakMap,Ye=Symbol(``),Xe=Symbol(``),Ze=Symbol(``);function Qe(e,t,n){if(ze&&P){let t=Je.get(e);t||Je.set(e,t=new Map);let r=t.get(n);r||(t.set(n,r=new Ke),r.map=t,r.key=n),r.track()}}function $e(e,t,n,r,i,a){let o=Je.get(e);if(!o){We++;return}let s=e=>{e&&e.trigger()};if(je(),t===`clear`)o.forEach(s);else{let i=d(e),a=i&&w(n);if(i&&n===`length`){let e=Number(r);o.forEach((t,n)=>{(n===`length`||n===Ze||!_(n)&&n>=e)&&s(t)})}else switch((n!==void 0||o.has(void 0))&&s(o.get(n)),a&&s(o.get(Ze)),t){case`add`:i?a&&s(o.get(`length`)):(s(o.get(Ye)),f(e)&&s(o.get(Xe)));break;case`delete`:i||(s(o.get(Ye)),f(e)&&s(o.get(Xe)));break;case`set`:f(e)&&s(o.get(Ye));break}}Me()}function et(e,t){let n=Je.get(e);return n&&n.get(t)}function tt(e){let t=F(e);return t===e?t:(Qe(t,`iterate`,Ze),Ut(e)?t:t.map(Kt))}function nt(e){return Qe(e=F(e),`iterate`,Ze),e}function rt(e,t){return Ht(e)?qt(Vt(e)?Kt(t):t):Kt(t)}var it={__proto__:null,[Symbol.iterator](){return at(this,Symbol.iterator,e=>rt(this,e))},concat(...e){return tt(this).concat(...e.map(e=>d(e)?tt(e):e))},entries(){return at(this,`entries`,e=>(e[1]=rt(this,e[1]),e))},every(e,t){return st(this,`every`,e,t,void 0,arguments)},filter(e,t){return st(this,`filter`,e,t,e=>e.map(e=>rt(this,e)),arguments)},find(e,t){return st(this,`find`,e,t,e=>rt(this,e),arguments)},findIndex(e,t){return st(this,`findIndex`,e,t,void 0,arguments)},findLast(e,t){return st(this,`findLast`,e,t,e=>rt(this,e),arguments)},findLastIndex(e,t){return st(this,`findLastIndex`,e,t,void 0,arguments)},forEach(e,t){return st(this,`forEach`,e,t,void 0,arguments)},includes(...e){return lt(this,`includes`,e)},indexOf(...e){return lt(this,`indexOf`,e)},join(e){return tt(this).join(e)},lastIndexOf(...e){return lt(this,`lastIndexOf`,e)},map(e,t){return st(this,`map`,e,t,void 0,arguments)},pop(){return ut(this,`pop`)},push(...e){return ut(this,`push`,e)},reduce(e,...t){return ct(this,`reduce`,e,t)},reduceRight(e,...t){return ct(this,`reduceRight`,e,t)},shift(){return ut(this,`shift`)},some(e,t){return st(this,`some`,e,t,void 0,arguments)},splice(...e){return ut(this,`splice`,e)},toReversed(){return tt(this).toReversed()},toSorted(e){return tt(this).toSorted(e)},toSpliced(...e){return tt(this).toSpliced(...e)},unshift(...e){return ut(this,`unshift`,e)},values(){return at(this,`values`,e=>rt(this,e))}};function at(e,t,n){let r=nt(e),i=r[t]();return r!==e&&!Ut(e)&&(i._next=i.next,i.next=()=>{let e=i._next();return e.done||(e.value=n(e.value)),e}),i}var ot=Array.prototype;function st(e,t,n,r,i,a){let o=nt(e),s=o!==e&&!Ut(e),c=o[t];if(c!==ot[t]){let t=c.apply(e,a);return s?Kt(t):t}let l=n;o!==e&&(s?l=function(t,r){return n.call(this,rt(e,t),r,e)}:n.length>2&&(l=function(t,r){return n.call(this,t,r,e)}));let u=c.call(o,l,r);return s&&i?i(u):u}function ct(e,t,n,r){let i=nt(e),a=i!==e&&!Ut(e),o=n,s=!1;i!==e&&(a?(s=r.length===0,o=function(t,r,i){return s&&(s=!1,t=rt(e,t)),n.call(this,t,rt(e,r),i,e)}):n.length>3&&(o=function(t,r,i){return n.call(this,t,r,i,e)}));let c=i[t](o,...r);return s?rt(e,c):c}function lt(e,t,n){let r=F(e);Qe(r,`iterate`,Ze);let i=r[t](...n);return(i===-1||i===!1)&&Wt(n[0])?(n[0]=F(n[0]),r[t](...n)):i}function ut(e,t,n=[]){Ve(),je();let r=F(e)[t].apply(e,n);return Me(),He(),r}var dt=e(`__proto__,__v_isRef,__isVue`),ft=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!==`arguments`&&e!==`caller`).map(e=>Symbol[e]).filter(_));function pt(e){_(e)||(e=String(e));let t=F(this);return Qe(t,`has`,e),t.hasOwnProperty(e)}var mt=class{constructor(e=!1,t=!1){this._isReadonly=e,this._isShallow=t}get(e,t,n){if(t===`__v_skip`)return e.__v_skip;let r=this._isReadonly,i=this._isShallow;if(t===`__v_isReactive`)return!r;if(t===`__v_isReadonly`)return r;if(t===`__v_isShallow`)return i;if(t===`__v_raw`)return n===(r?i?Pt:Nt:i?Mt:jt).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(n)?e:void 0;let a=d(e);if(!r){let e;if(a&&(e=it[t]))return e;if(t===`hasOwnProperty`)return pt}let o=Reflect.get(e,t,I(e)?e:n);if((_(t)?ft.has(t):dt(t))||(r||Qe(e,`get`,t),i))return o;if(I(o)){let e=a&&w(t)?o:o.value;return r&&v(e)?Rt(e):e}return v(o)?r?Rt(o):It(o):o}},ht=class extends mt{constructor(e=!1){super(!1,e)}set(e,t,n,r){let i=e[t],a=d(e)&&w(t);if(!this._isShallow){let e=Ht(i);if(!Ut(n)&&!Ht(n)&&(i=F(i),n=F(n)),!a&&I(i)&&!I(n))return e||(i.value=n),!0}let o=a?Number(t)e,St=e=>Reflect.getPrototypeOf(e);function Ct(e,t,n){return function(...r){let i=this.__v_raw,a=F(i),o=f(a),c=e===`entries`||e===Symbol.iterator&&o,l=e===`keys`&&o,u=i[e](...r),d=n?xt:t?qt:Kt;return!t&&Qe(a,`iterate`,l?Xe:Ye),s(Object.create(u),{next(){let{value:e,done:t}=u.next();return t?{value:e,done:t}:{value:c?[d(e[0]),d(e[1])]:d(e),done:t}}})}}function wt(e){return function(...t){return e===`delete`?!1:e===`clear`?void 0:this}}function Tt(e,t){let n={get(n){let r=this.__v_raw,i=F(r),a=F(n);e||(ae(n,a)&&Qe(i,`get`,n),Qe(i,`get`,a));let{has:o}=St(i),s=t?xt:e?qt:Kt;if(o.call(i,n))return s(r.get(n));if(o.call(i,a))return s(r.get(a));r!==i&&r.get(n)},get size(){let t=this.__v_raw;return!e&&Qe(F(t),`iterate`,Ye),t.size},has(t){let n=this.__v_raw,r=F(n),i=F(t);return e||(ae(t,i)&&Qe(r,`has`,t),Qe(r,`has`,i)),t===i?n.has(t):n.has(t)||n.has(i)},forEach(n,r){let i=this,a=i.__v_raw,o=F(a),s=t?xt:e?qt:Kt;return!e&&Qe(o,`iterate`,Ye),a.forEach((e,t)=>n.call(r,s(e),s(t),i))}};return s(n,e?{add:wt(`add`),set:wt(`set`),delete:wt(`delete`),clear:wt(`clear`)}:{add(e){let n=F(this),r=St(n),i=F(e),a=!t&&!Ut(e)&&!Ht(e)?i:e;return r.has.call(n,a)||ae(e,a)&&r.has.call(n,e)||ae(i,a)&&r.has.call(n,i)||(n.add(a),$e(n,`add`,a,a)),this},set(e,n){!t&&!Ut(n)&&!Ht(n)&&(n=F(n));let r=F(this),{has:i,get:a}=St(r),o=i.call(r,e);o||(e=F(e),o=i.call(r,e));let s=a.call(r,e);return r.set(e,n),o?ae(n,s)&&$e(r,`set`,e,n,s):$e(r,`add`,e,n),this},delete(e){let t=F(this),{has:n,get:r}=St(t),i=n.call(t,e);i||(e=F(e),i=n.call(t,e));let a=r?r.call(t,e):void 0,o=t.delete(e);return i&&$e(t,`delete`,e,void 0,a),o},clear(){let e=F(this),t=e.size!==0,n=e.clear();return t&&$e(e,`clear`,void 0,void 0,void 0),n}}),[`keys`,`values`,`entries`,Symbol.iterator].forEach(r=>{n[r]=Ct(r,e,t)}),n}function Et(e,t){let n=Tt(e,t);return(t,r,i)=>r===`__v_isReactive`?!e:r===`__v_isReadonly`?e:r===`__v_raw`?t:Reflect.get(u(n,r)&&r in t?n:t,r,i)}var Dt={get:Et(!1,!1)},Ot={get:Et(!1,!0)},kt={get:Et(!0,!1)},At={get:Et(!0,!0)},jt=new WeakMap,Mt=new WeakMap,Nt=new WeakMap,Pt=new WeakMap;function Ft(e){switch(e){case`Object`:case`Array`:return 1;case`Map`:case`Set`:case`WeakMap`:case`WeakSet`:return 2;default:return 0}}function It(e){return Ht(e)?e:Bt(e,!1,_t,Dt,jt)}function Lt(e){return Bt(e,!1,yt,Ot,Mt)}function Rt(e){return Bt(e,!0,vt,kt,Nt)}function zt(e){return Bt(e,!0,bt,At,Pt)}function Bt(e,t,n,r,i){if(!v(e)||e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;let a=i.get(e);if(a)return a;let o=Ft(S(e));if(o===0)return e;let s=new Proxy(e,o===2?r:n);return i.set(e,s),s}function Vt(e){return Ht(e)?Vt(e.__v_raw):!!(e&&e.__v_isReactive)}function Ht(e){return!!(e&&e.__v_isReadonly)}function Ut(e){return!!(e&&e.__v_isShallow)}function Wt(e){return e?!!e.__v_raw:!1}function F(e){let t=e&&e.__v_raw;return t?F(t):e}function Gt(e){return!u(e,`__v_skip`)&&Object.isExtensible(e)&&O(e,`__v_skip`,!0),e}var Kt=e=>v(e)?It(e):e,qt=e=>v(e)?Rt(e):e;function I(e){return e?e.__v_isRef===!0:!1}function L(e){return Yt(e,!1)}function Jt(e){return Yt(e,!0)}function Yt(e,t){return I(e)?e:new Xt(e,t)}var Xt=class{constructor(e,t){this.dep=new Ke,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=t?e:F(e),this._value=t?e:Kt(e),this.__v_isShallow=t}get value(){return this.dep.track(),this._value}set value(e){let t=this._rawValue,n=this.__v_isShallow||Ut(e)||Ht(e);e=n?e:F(e),ae(e,t)&&(this._rawValue=e,this._value=n?e:Kt(e),this.dep.trigger())}};function R(e){return I(e)?e.value:e}function Zt(e){return h(e)?e():R(e)}var Qt={get:(e,t,n)=>t===`__v_raw`?e:R(Reflect.get(e,t,n)),set:(e,t,n,r)=>{let i=e[t];return I(i)&&!I(n)?(i.value=n,!0):Reflect.set(e,t,n,r)}};function $t(e){return Vt(e)?e:new Proxy(e,Qt)}function en(e){let t=d(e)?Array(e.length):{};for(let n in e)t[n]=an(e,n);return t}var tn=class{constructor(e,t,n){this._object=e,this._defaultValue=n,this.__v_isRef=!0,this._value=void 0,this._key=_(t)?t:String(t),this._raw=F(e);let r=!0,i=e;if(!d(e)||_(this._key)||!w(this._key))do r=!Wt(i)||Ut(i);while(r&&(i=i.__v_raw));this._shallow=r}get value(){let e=this._object[this._key];return this._shallow&&(e=R(e)),this._value=e===void 0?this._defaultValue:e}set value(e){if(this._shallow&&I(this._raw[this._key])){let t=this._object[this._key];if(I(t)){t.value=e;return}}this._object[this._key]=e}get dep(){return et(this._raw,this._key)}},nn=class{constructor(e){this._getter=e,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}};function rn(e,t,n){return I(e)?e:h(e)?new nn(e):v(e)&&arguments.length>1?an(e,t,n):L(e)}function an(e,t,n){return new tn(e,t,n)}var on=class{constructor(e,t,n){this.fn=e,this.setter=t,this._value=void 0,this.dep=new Ke(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=We-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!t,this.isSSR=n}notify(){if(this.flags|=16,!(this.flags&8)&&P!==this)return Ae(this,!0),!0}get value(){let e=this.dep.track();return Ie(this),e&&(e.version=this.dep.version),this._value}set value(e){this.setter&&this.setter(e)}};function sn(e,t,n=!1){let r,i;return h(e)?r=e:(r=e.get,i=e.set),new on(r,i,n)}var cn={},ln=new WeakMap,un=void 0;function dn(e,t=!1,n=un){if(n){let t=ln.get(n);t||ln.set(n,t=[]),t.push(e)}}function fn(e,n,i=t){let{immediate:a,deep:o,once:s,scheduler:l,augmentJob:u,call:f}=i,p=e=>o?e:Ut(e)||o===!1||o===0?pn(e,1):pn(e),m,g,_,v,y=!1,b=!1;if(I(e)?(g=()=>e.value,y=Ut(e)):Vt(e)?(g=()=>p(e),y=!0):d(e)?(b=!0,y=e.some(e=>Vt(e)||Ut(e)),g=()=>e.map(e=>{if(I(e))return e.value;if(Vt(e))return p(e);if(h(e))return f?f(e,2):e()})):g=h(e)?n?f?()=>f(e,2):e:()=>{if(_){Ve();try{_()}finally{He()}}let t=un;un=m;try{return f?f(e,3,[v]):e(v)}finally{un=t}}:r,n&&o){let e=g,t=o===!0?1/0:o;g=()=>pn(e(),t)}let x=Ce(),S=()=>{m.stop(),x&&x.active&&c(x.effects,m)};if(s&&n){let e=n;n=(...t)=>{e(...t),S()}}let C=b?Array(e.length).fill(cn):cn,w=e=>{if(!(!(m.flags&1)||!m.dirty&&!e))if(n){let e=m.run();if(o||y||(b?e.some((e,t)=>ae(e,C[t])):ae(e,C))){_&&_();let t=un;un=m;try{let t=[e,C===cn?void 0:b&&C[0]===cn?[]:C,v];C=e,f?f(n,3,t):n(...t)}finally{un=t}}}else m.run()};return u&&u(w),m=new Ee(g),m.scheduler=l?()=>l(w,!1):w,v=e=>dn(e,!1,m),_=m.onStop=()=>{let e=ln.get(m);if(e){if(f)f(e,4);else for(let t of e)t();ln.delete(m)}},n?a?w(!0):C=m.run():l?l(w.bind(null,!0),!0):m.run(),S.pause=m.pause.bind(m),S.resume=m.resume.bind(m),S.stop=S,S}function pn(e,t=1/0,n){if(t<=0||!v(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,I(e))pn(e.value,t,n);else if(d(e))for(let r=0;r{pn(e,t,n)});else if(C(e)){for(let r in e)pn(e[r],t,n);for(let r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&pn(e[r],t,n)}return e}function mn(e,t,n,r){try{return r?e(...r):e()}catch(e){gn(e,t,n)}}function hn(e,t,n,r){if(h(e)){let i=mn(e,t,n,r);return i&&y(i)&&i.catch(e=>{gn(e,t,n)}),i}if(d(e)){let i=[];for(let a=0;a>>1,i=vn[r],a=Mn(i);a=Mn(n)?vn.push(e):vn.splice(En(t),0,e),e.flags|=1,On()}}function On(){wn||(wn=Cn.then(Nn))}function kn(e){d(e)?bn.push(...e):xn&&e.id===-1?xn.splice(Sn+1,0,e):e.flags&1||(bn.push(e),e.flags|=1),On()}function An(e,t,n=yn+1){for(;nMn(e)-Mn(t));if(bn.length=0,xn){xn.push(...e);return}for(xn=e,Sn=0;Sne.id==null?e.flags&2?-1:1/0:e.id;function Nn(e){try{for(yn=0;yn{r._d&&da(-1);let i=In(t),a;try{a=e(...n)}finally{In(i),r._d&&da(1)}return a};return r._n=!0,r._c=!0,r._d=!0,r}function Ln(e,n){if(Pn===null)return e;let r=Wa(Pn),i=e.dirs||(e.dirs=[]);for(let e=0;e1)return n&&h(t)?t.call(r&&r.proxy):t}}var Vn=Symbol.for(`v-scx`),Hn=()=>Bn(Vn);function Un(e,t){return Gn(e,null,t)}function Wn(e,t,n){return Gn(e,t,n)}function Gn(e,n,i=t){let{immediate:a,deep:o,flush:c,once:l}=i,u=s({},i),d=n&&a||!n&&c!==`post`,f;if(Fa){if(c===`sync`){let e=Hn();f=e.__watcherHandles||(e.__watcherHandles=[])}else if(!d){let e=()=>{};return e.stop=r,e.resume=r,e.pause=r,e}}let p=Oa;u.call=(e,t,n)=>hn(e,p,t,n);let m=!1;c===`post`?u.scheduler=e=>{Gi(e,p&&p.suspense)}:c!==`sync`&&(m=!0,u.scheduler=(e,t)=>{t?e():Dn(e)}),u.augmentJob=e=>{n&&(e.flags|=4),m&&(e.flags|=2,p&&(e.id=p.uid,e.i=p))};let h=fn(e,n,u);return Fa&&(f?f.push(h):d&&h()),h}function Kn(e,t,n){let r=this.proxy,i=g(e)?e.includes(`.`)?qn(r,e):()=>r[e]:e.bind(r,r),a;h(t)?a=t:(a=t.handler,n=t);let o=Ma(this),s=Gn(i,a.bind(r),n);return o(),s}function qn(e,t){let n=t.split(`.`);return()=>{let t=e;for(let e=0;ee.__isTeleport,Xn=Symbol(`_leaveCb`),Zn=Symbol(`_enterCb`);function Qn(){let e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Tr(()=>{e.isMounted=!0}),Or(()=>{e.isUnmounting=!0}),e}var $n=[Function,Array],er={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:$n,onEnter:$n,onAfterEnter:$n,onEnterCancelled:$n,onBeforeLeave:$n,onLeave:$n,onAfterLeave:$n,onLeaveCancelled:$n,onBeforeAppear:$n,onAppear:$n,onAfterAppear:$n,onAppearCancelled:$n},tr=e=>{let t=e.subTree;return t.component?tr(t.component):t},nr={name:`BaseTransition`,props:er,setup(e,{slots:t}){let n=ka(),r=Qn();return()=>{let i=t.default&&ur(t.default(),!0),a=i&&i.length?rr(i):n.subTree?Y():void 0;if(!a)return;let o=F(e),{mode:s}=o;if(r.isLeaving)return sr(a);let c=cr(a);if(!c)return sr(a);let l=or(c,o,r,n,e=>l=e);c.type!==aa&&lr(c,l);let u=n.subTree&&cr(n.subTree);if(u&&u.type!==aa&&!ma(u,c)&&tr(n).type!==aa){let e=or(u,o,r,n);if(lr(u,e),s===`out-in`&&c.type!==aa)return r.isLeaving=!0,e.afterLeave=()=>{r.isLeaving=!1,n.job.flags&8||n.update(),delete e.afterLeave,u=void 0},sr(a);s===`in-out`&&c.type!==aa?e.delayLeave=(e,t,n)=>{let i=ar(r,u);i[String(u.key)]=u,e[Xn]=()=>{t(),e[Xn]=void 0,delete l.delayedLeave,u=void 0},l.delayedLeave=()=>{n(),delete l.delayedLeave,u=void 0}}:u=void 0}else u&&(u=void 0);return a}}};function rr(e){let t=e[0];if(e.length>1){for(let n of e)if(n.type!==aa){t=n;break}}return t}var ir=nr;function ar(e,t){let{leavingVNodes:n}=e,r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function or(e,t,n,r,i){let{appear:a,mode:o,persisted:s=!1,onBeforeEnter:c,onEnter:l,onAfterEnter:u,onEnterCancelled:f,onBeforeLeave:p,onLeave:m,onAfterLeave:h,onLeaveCancelled:g,onBeforeAppear:_,onAppear:v,onAfterAppear:y,onAppearCancelled:b}=t,x=String(e.key),S=ar(n,e),C=(e,t)=>{e&&hn(e,r,9,t)},w=(e,t)=>{let n=t[1];C(e,t),d(e)?e.every(e=>e.length<=1)&&n():e.length<=1&&n()},ee={mode:o,persisted:s,beforeEnter(t){let r=c;if(!n.isMounted)if(a)r=_||c;else return;t[Xn]&&t[Xn](!0);let i=S[x];i&&ma(e,i)&&i.el[Xn]&&i.el[Xn](),C(r,[t])},enter(t){if(S[x]===e)return;let r=l,i=u,o=f;if(!n.isMounted)if(a)r=v||l,i=y||u,o=b||f;else return;let s=!1;t[Zn]=e=>{s||(s=!0,C(e?o:i,[t]),ee.delayedLeave&&ee.delayedLeave(),t[Zn]=void 0)};let c=t[Zn].bind(null,!1);r?w(r,[t,c]):c()},leave(t,r){let i=String(e.key);if(t[Zn]&&t[Zn](!0),n.isUnmounting)return r();C(p,[t]);let a=!1;t[Xn]=n=>{a||(a=!0,r(),C(n?g:h,[t]),t[Xn]=void 0,S[i]===e&&delete S[i])};let o=t[Xn].bind(null,!1);S[i]=e,m?w(m,[t,o]):o()},clone(e){let a=or(e,t,n,r,i);return i&&i(a),a}};return ee}function sr(e){if(_r(e))return e=ya(e),e.children=null,e}function cr(e){if(!_r(e))return Yn(e.type)&&e.children?rr(e.children):e;if(e.component)return e.component.subTree;let{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&h(n.default))return n.default()}}function lr(e,t){e.shapeFlag&6&&e.component?(e.transition=t,lr(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function ur(e,t=!1,n){let r=[],i=0;for(let a=0;a1)for(let e=0;emr(e,n&&(d(n)?n[t]:n),r,a,o));return}if(gr(a)&&!o){a.shapeFlag&512&&a.type.__asyncResolved&&a.component.subTree.component&&mr(e,n,r,a.component.subTree);return}let s=a.shapeFlag&4?Wa(a.component):a.el,l=o?null:s,{i:f,r:p}=e,m=n&&n.r,_=f.refs===t?f.refs={}:f.refs,v=f.setupState,y=F(v),b=v===t?i:e=>fr(_,e)?!1:u(y,e),x=(e,t)=>!(t&&fr(_,t));if(m!=null&&m!==p){if(hr(n),g(m))_[m]=null,b(m)&&(v[m]=null);else if(I(m)){let e=n;x(m,e.k)&&(m.value=null),e.k&&(_[e.k]=null)}}if(h(p))mn(p,f,12,[l,_]);else{let t=g(p),n=I(p);if(t||n){let i=()=>{if(e.f){let n=t?b(p)?v[p]:_[p]:x(p)||!e.k?p.value:_[e.k];if(o)d(n)&&c(n,s);else if(d(n))n.includes(s)||n.push(s);else if(t)_[p]=[s],b(p)&&(v[p]=_[p]);else{let t=[s];x(p,e.k)&&(p.value=t),e.k&&(_[e.k]=t)}}else t?(_[p]=l,b(p)&&(v[p]=l)):n&&(x(p,e.k)&&(p.value=l),e.k&&(_[e.k]=l))};if(l){let t=()=>{i(),pr.delete(e)};t.id=-1,pr.set(e,t),Gi(t,r)}else hr(e),i()}}}function hr(e){let t=pr.get(e);t&&(t.flags|=8,pr.delete(e))}ue().requestIdleCallback,ue().cancelIdleCallback;var gr=e=>!!e.type.__asyncLoader,_r=e=>e.type.__isKeepAlive;function vr(e,t){br(e,`a`,t)}function yr(e,t){br(e,`da`,t)}function br(e,t,n=Oa){let r=e.__wdc||(e.__wdc=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()});if(Sr(t,r,n),n){let e=n.parent;for(;e&&e.parent;)_r(e.parent.vnode)&&xr(r,t,n,e),e=e.parent}}function xr(e,t,n,r){let i=Sr(t,e,r,!0);kr(()=>{c(r[t],i)},n)}function Sr(e,t,n=Oa,r=!1){if(n){let i=n[e]||(n[e]=[]),a=t.__weh||(t.__weh=(...r)=>{Ve();let i=Ma(n),a=hn(t,n,e,r);return i(),He(),a});return r?i.unshift(a):i.push(a),a}}var Cr=e=>(t,n=Oa)=>{(!Fa||e===`sp`)&&Sr(e,(...e)=>t(...e),n)},wr=Cr(`bm`),Tr=Cr(`m`),Er=Cr(`bu`),Dr=Cr(`u`),Or=Cr(`bum`),kr=Cr(`um`),Ar=Cr(`sp`),jr=Cr(`rtg`),Mr=Cr(`rtc`);function Nr(e,t=Oa){Sr(`ec`,e,t)}var Pr=`components`;function Fr(e,t){return Rr(Pr,e,!0,t)||e}var Ir=Symbol.for(`v-ndc`);function Lr(e){return g(e)?Rr(Pr,e,!1)||e:e||Ir}function Rr(e,t,n=!0,r=!1){let i=Pn||Oa;if(i){let n=i.type;if(e===Pr){let e=Ga(n,!1);if(e&&(e===t||e===E(t)||e===re(E(t))))return n}let a=zr(i[e]||n[e],t)||zr(i.appContext[e],t);return!a&&r?n:a}}function zr(e,t){return e&&(e[t]||e[E(t)]||e[re(E(t))])}function Br(e,t,n,r){let i,a=n&&n[r],o=d(e);if(o||g(e)){let n=o&&Vt(e),r=!1,s=!1;n&&(r=!Ut(e),s=Ht(e),e=nt(e)),i=Array(e.length);for(let n=0,o=e.length;nt(e,n,void 0,a&&a[n]));else{let n=Object.keys(e);i=Array(n.length);for(let r=0,o=n.length;r0;return t!=="default"&&(n.name=t),U(),G(H,null,[q(`slot`,n,r&&r())],e?-2:64)}let a=e[t];a&&a._c&&(a._d=!1),U();let o=a&&Vr(a(n)),s=n.key||o&&o.key,c=G(H,{key:(s&&!_(s)?s:`_${t}`)+(!o&&r?`_fb`:``)},o||(r?r():[]),o&&e._===1?64:-2);return!i&&c.scopeId&&(c.slotScopeIds=[c.scopeId+`-s`]),a&&a._c&&(a._d=!0),c}function Vr(e){return e.some(e=>pa(e)?!(e.type===aa||e.type===H&&!Vr(e.children)):!0)?e:null}var Hr=e=>e?Pa(e)?Wa(e):Hr(e.parent):null,Ur=s(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Hr(e.parent),$root:e=>Hr(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>ti(e),$forceUpdate:e=>e.f||(e.f=()=>{Dn(e.update)}),$nextTick:e=>e.n||(e.n=Tn.bind(e.proxy)),$watch:e=>Kn.bind(e)}),Wr=(e,n)=>e!==t&&!e.__isScriptSetup&&u(e,n),Gr={get({_:e},n){if(n===`__v_skip`)return!0;let{ctx:r,setupState:i,data:a,props:o,accessCache:s,type:c,appContext:l}=e;if(n[0]!==`$`){let e=s[n];if(e!==void 0)switch(e){case 1:return i[n];case 2:return a[n];case 4:return r[n];case 3:return o[n]}else if(Wr(i,n))return s[n]=1,i[n];else if(a!==t&&u(a,n))return s[n]=2,a[n];else if(u(o,n))return s[n]=3,o[n];else if(r!==t&&u(r,n))return s[n]=4,r[n];else Xr&&(s[n]=0)}let d=Ur[n],f,p;if(d)return n===`$attrs`&&Qe(e.attrs,`get`,``),d(e);if((f=c.__cssModules)&&(f=f[n]))return f;if(r!==t&&u(r,n))return s[n]=4,r[n];if(p=l.config.globalProperties,u(p,n))return p[n]},set({_:e},n,r){let{data:i,setupState:a,ctx:o}=e;return Wr(a,n)?(a[n]=r,!0):i!==t&&u(i,n)?(i[n]=r,!0):u(e.props,n)||n[0]===`$`&&n.slice(1)in e?!1:(o[n]=r,!0)},has({_:{data:e,setupState:n,accessCache:r,ctx:i,appContext:a,props:o,type:s}},c){let l;return!!(r[c]||e!==t&&c[0]!==`$`&&u(e,c)||Wr(n,c)||u(o,c)||u(i,c)||u(Ur,c)||u(a.config.globalProperties,c)||(l=s.__cssModules)&&l[c])},defineProperty(e,t,n){return n.get==null?u(n,`value`)&&this.set(e,t,n.value,null):e._.accessCache[t]=0,Reflect.defineProperty(e,t,n)}};function Kr(){return Jr(`useSlots`).slots}function qr(){return Jr(`useAttrs`).attrs}function Jr(e){let t=ka();return t.setupContext||(t.setupContext=Ua(t))}function Yr(e){return d(e)?e.reduce((e,t)=>(e[t]=null,e),{}):e}var Xr=!0;function Zr(e){let t=ti(e),n=e.proxy,i=e.ctx;Xr=!1,t.beforeCreate&&$r(t.beforeCreate,e,`bc`);let{data:a,computed:o,methods:s,watch:c,provide:l,inject:u,created:f,beforeMount:p,mounted:m,beforeUpdate:g,updated:_,activated:y,deactivated:b,beforeDestroy:x,beforeUnmount:S,destroyed:C,unmounted:w,render:ee,renderTracked:T,renderTriggered:te,errorCaptured:E,serverPrefetch:D,expose:ne,inheritAttrs:re,components:ie,directives:ae,filters:oe}=t;if(u&&Qr(u,i,null),s)for(let e in s){let t=s[e];h(t)&&(i[e]=t.bind(n))}if(a){let t=a.call(n,n);v(t)&&(e.data=It(t))}if(Xr=!0,o)for(let e in o){let t=o[e],a=X({get:h(t)?t.bind(n,n):h(t.get)?t.get.bind(n,n):r,set:!h(t)&&h(t.set)?t.set.bind(n):r});Object.defineProperty(i,e,{enumerable:!0,configurable:!0,get:()=>a.value,set:e=>a.value=e})}if(c)for(let e in c)ei(c[e],i,n,e);if(l){let e=h(l)?l.call(n):l;Reflect.ownKeys(e).forEach(t=>{zn(t,e[t])})}f&&$r(f,e,`c`);function O(e,t){d(t)?t.forEach(t=>e(t.bind(n))):t&&e(t.bind(n))}if(O(wr,p),O(Tr,m),O(Er,g),O(Dr,_),O(vr,y),O(yr,b),O(Nr,E),O(Mr,T),O(jr,te),O(Or,S),O(kr,w),O(Ar,D),d(ne))if(ne.length){let t=e.exposed||(e.exposed={});ne.forEach(e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t,enumerable:!0})})}else e.exposed||(e.exposed={});ee&&e.render===r&&(e.render=ee),re!=null&&(e.inheritAttrs=re),ie&&(e.components=ie),ae&&(e.directives=ae),D&&dr(e)}function Qr(e,t,n=r){d(e)&&(e=oi(e));for(let n in e){let r=e[n],i;i=v(r)?`default`in r?Bn(r.from||n,r.default,!0):Bn(r.from||n):Bn(r),I(i)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>i.value,set:e=>i.value=e}):t[n]=i}}function $r(e,t,n){hn(d(e)?e.map(e=>e.bind(t.proxy)):e.bind(t.proxy),t,n)}function ei(e,t,n,r){let i=r.includes(`.`)?qn(n,r):()=>n[r];if(g(e)){let n=t[e];h(n)&&Wn(i,n)}else if(h(e))Wn(i,e.bind(n));else if(v(e))if(d(e))e.forEach(e=>ei(e,t,n,r));else{let r=h(e.handler)?e.handler.bind(n):t[e.handler];h(r)&&Wn(i,r,e)}}function ti(e){let t=e.type,{mixins:n,extends:r}=t,{mixins:i,optionsCache:a,config:{optionMergeStrategies:o}}=e.appContext,s=a.get(t),c;return s?c=s:!i.length&&!n&&!r?c=t:(c={},i.length&&i.forEach(e=>ni(c,e,o,!0)),ni(c,t,o)),v(t)&&a.set(t,c),c}function ni(e,t,n,r=!1){let{mixins:i,extends:a}=t;a&&ni(e,a,n,!0),i&&i.forEach(t=>ni(e,t,n,!0));for(let i in t)if(!(r&&i===`expose`)){let r=ri[i]||n&&n[i];e[i]=r?r(e[i],t[i]):t[i]}return e}var ri={data:ii,props:li,emits:li,methods:ci,computed:ci,beforeCreate:si,created:si,beforeMount:si,mounted:si,beforeUpdate:si,updated:si,beforeDestroy:si,beforeUnmount:si,destroyed:si,unmounted:si,activated:si,deactivated:si,errorCaptured:si,serverPrefetch:si,components:ci,directives:ci,watch:ui,provide:ii,inject:ai};function ii(e,t){return t?e?function(){return s(h(e)?e.call(this,this):e,h(t)?t.call(this,this):t)}:t:e}function ai(e,t){return ci(oi(e),oi(t))}function oi(e){if(d(e)){let t={};for(let n=0;nt===`modelValue`||t===`model-value`?e.modelModifiers:e[`${t}Modifiers`]||e[`${E(t)}Modifiers`]||e[`${ne(t)}Modifiers`];function gi(e,n,...r){if(e.isUnmounted)return;let i=e.vnode.props||t,a=r,o=n.startsWith(`update:`),s=o&&hi(i,n.slice(7));s&&(s.trim&&(a=r.map(e=>g(e)?e.trim():e)),s.number&&(a=r.map(se)));let c,l=i[c=ie(n)]||i[c=ie(E(n))];!l&&o&&(l=i[c=ie(ne(n))]),l&&hn(l,e,6,a);let u=i[c+`Once`];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[c])return;e.emitted[c]=!0,hn(u,e,6,a)}}var _i=new WeakMap;function vi(e,t,n=!1){let r=n?_i:t.emitsCache,i=r.get(e);if(i!==void 0)return i;let a=e.emits,o={},c=!1;if(!h(e)){let r=e=>{let n=vi(e,t,!0);n&&(c=!0,s(o,n))};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}return!a&&!c?(v(e)&&r.set(e,null),null):(d(a)?a.forEach(e=>o[e]=null):s(o,a),v(e)&&r.set(e,o),o)}function yi(e,t){return!e||!a(t)?!1:(t=t.slice(2).replace(/Once$/,``),u(e,t[0].toLowerCase()+t.slice(1))||u(e,ne(t))||u(e,t))}function bi(e){let{type:t,vnode:n,proxy:r,withProxy:i,propsOptions:[a],slots:s,attrs:c,emit:l,render:u,renderCache:d,props:f,data:p,setupState:m,ctx:h,inheritAttrs:g}=e,_=In(e),v,y;try{if(n.shapeFlag&4){let e=i||r,t=e;v=ba(u.call(t,e,d,f,m,p,h)),y=c}else{let e=t;v=ba(e.length>1?e(f,{attrs:c,slots:s,emit:l}):e(f,null)),y=t.props?c:xi(c)}}catch(t){sa.length=0,gn(t,e,1),v=q(aa)}let b=v;if(y&&g!==!1){let e=Object.keys(y),{shapeFlag:t}=b;e.length&&t&7&&(a&&e.some(o)&&(y=Si(y,a)),b=ya(b,y,!1,!0))}return n.dirs&&(b=ya(b,null,!1,!0),b.dirs=b.dirs?b.dirs.concat(n.dirs):n.dirs),n.transition&&lr(b,n.transition),v=b,In(_),v}var xi=e=>{let t;for(let n in e)(n===`class`||n===`style`||a(n))&&((t||(t={}))[n]=e[n]);return t},Si=(e,t)=>{let n={};for(let r in e)(!o(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function Ci(e,t,n){let{props:r,children:i,component:a}=e,{props:o,children:s,patchFlag:c}=t,l=a.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return r?wi(r,o,l):!!o;if(c&8){let e=t.dynamicProps;for(let t=0;tObject.create(Di),ki=e=>Object.getPrototypeOf(e)===Di;function Ai(e,t,n,r=!1){let i={},a=Oi();e.propsDefaults=Object.create(null),Mi(e,t,i,a);for(let t in e.propsOptions[0])t in i||(i[t]=void 0);n?e.props=r?i:Lt(i):e.type.props?e.props=i:e.props=a,e.attrs=a}function ji(e,t,n,r){let{props:i,attrs:a,vnode:{patchFlag:o}}=e,s=F(i),[c]=e.propsOptions,l=!1;if((r||o>0)&&!(o&16)){if(o&8){let n=e.vnode.dynamicProps;for(let r=0;r{p=!0;let[t,n]=Fi(e,r,!0);s(l,t),n&&f.push(...n)};!i&&r.mixins.length&&r.mixins.forEach(t),e.extends&&t(e.extends),e.mixins&&e.mixins.forEach(t)}if(!c&&!p)return v(e)&&a.set(e,n),n;if(d(c))for(let e=0;ee===`_`||e===`_ctx`||e===`$stable`,Ri=e=>d(e)?e.map(ba):[ba(e)],zi=(e,t,n)=>{if(t._n)return t;let r=z((...e)=>Ri(t(...e)),n);return r._c=!1,r},Bi=(e,t,n)=>{let r=e._ctx;for(let n in e){if(Li(n))continue;let i=e[n];if(h(i))t[n]=zi(n,i,r);else if(i!=null){let e=Ri(i);t[n]=()=>e}}},Vi=(e,t)=>{let n=Ri(t);e.slots.default=()=>n},Hi=(e,t,n)=>{for(let r in t)(n||!Li(r))&&(e[r]=t[r])},Ui=(e,t,n)=>{let r=e.slots=Oi();if(e.vnode.shapeFlag&32){let e=t._;e?(Hi(r,t,n),n&&O(r,`_`,e,!0)):Bi(t,r)}else t&&Vi(e,t)},Wi=(e,n,r)=>{let{vnode:i,slots:a}=e,o=!0,s=t;if(i.shapeFlag&32){let e=n._;e?r&&e===1?o=!1:Hi(a,n,r):(o=!n.$stable,Bi(n,a)),s=n}else n&&(Vi(e,n),s={default:1});if(o)for(let e in a)!Li(e)&&s[e]==null&&delete a[e]},Gi=ra;function Ki(e){return qi(e)}function qi(e,i){let a=ue();a.__VUE__=!0;let{insert:o,remove:s,patchProp:c,createElement:l,createText:u,createComment:d,setText:f,setElementText:p,parentNode:m,nextSibling:h,setScopeId:g=r,insertStaticContent:_}=e,v=(e,t,n,r=null,i=null,a=null,o=void 0,s=null,c=!!t.dynamicChildren)=>{if(e===t)return;e&&!ma(e,t)&&(r=_e(e),me(e,i,a,!0),e=null),t.patchFlag===-2&&(c=!1,t.dynamicChildren=null);let{type:l,ref:u,shapeFlag:d}=t;switch(l){case ia:y(e,t,n,r);break;case aa:b(e,t,n,r);break;case oa:e??x(t,n,r,o);break;case H:ie(e,t,n,r,i,a,o,s,c);break;default:d&1?w(e,t,n,r,i,a,o,s,c):d&6?ae(e,t,n,r,i,a,o,s,c):(d&64||d&128)&&l.process(e,t,n,r,i,a,o,s,c,M)}u!=null&&i?mr(u,e&&e.ref,a,t||e,!t):u==null&&e&&e.ref!=null&&mr(e.ref,null,a,e,!0)},y=(e,t,n,r)=>{if(e==null)o(t.el=u(t.children),n,r);else{let n=t.el=e.el;t.children!==e.children&&f(n,t.children)}},b=(e,t,n,r)=>{e==null?o(t.el=d(t.children||``),n,r):t.el=e.el},x=(e,t,n,r)=>{[e.el,e.anchor]=_(e.children,t,n,r,e.el,e.anchor)},S=({el:e,anchor:t},n,r)=>{let i;for(;e&&e!==t;)i=h(e),o(e,n,r),e=i;o(t,n,r)},C=({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=h(e),s(e),e=n;s(t)},w=(e,t,n,r,i,a,o,s,c)=>{if(t.type===`svg`?o=`svg`:t.type===`math`&&(o=`mathml`),e==null)T(t,n,r,i,a,o,s,c);else{let n=e.el&&e.el._isVueCE?e.el:null;try{n&&n._beginPatch(),D(e,t,i,a,o,s,c)}finally{n&&n._endPatch()}}},T=(e,t,n,r,i,a,s,u)=>{let d,f,{props:m,shapeFlag:h,transition:g,dirs:_}=e;if(d=e.el=l(e.type,a,m&&m.is,m),h&8?p(d,e.children):h&16&&E(e.children,d,null,r,i,Ji(e,a),s,u),_&&Rn(e,null,r,`created`),te(d,e,e.scopeId,s,r),m){for(let e in m)e!==`value`&&!ee(e)&&c(d,e,null,m[e],a,r);`value`in m&&c(d,`value`,null,m.value,a),(f=m.onVnodeBeforeMount)&&wa(f,r,e)}_&&Rn(e,null,r,`beforeMount`);let v=Xi(i,g);v&&g.beforeEnter(d),o(d,t,n),((f=m&&m.onVnodeMounted)||v||_)&&Gi(()=>{try{f&&wa(f,r,e),v&&g.enter(d),_&&Rn(e,null,r,`mounted`)}finally{}},i)},te=(e,t,n,r,i)=>{if(n&&g(e,n),r)for(let t=0;t{for(let l=c;l{let l=n.el=e.el,{patchFlag:u,dynamicChildren:d,dirs:f}=n;u|=e.patchFlag&16;let m=e.props||t,h=n.props||t,g;if(r&&Yi(r,!1),(g=h.onVnodeBeforeUpdate)&&wa(g,r,n,e),f&&Rn(n,e,r,`beforeUpdate`),r&&Yi(r,!0),(m.innerHTML&&h.innerHTML==null||m.textContent&&h.textContent==null)&&p(l,``),d?ne(e.dynamicChildren,d,l,r,i,Ji(n,a),o):s||k(e,n,l,null,r,i,Ji(n,a),o,!1),u>0){if(u&16)re(l,m,h,r,a);else if(u&2&&m.class!==h.class&&c(l,`class`,null,h.class,a),u&4&&c(l,`style`,m.style,h.style,a),u&8){let e=n.dynamicProps;for(let t=0;t{g&&wa(g,r,n,e),f&&Rn(n,e,r,`updated`)},i)},ne=(e,t,n,r,i,a,o)=>{for(let s=0;s{if(n!==r){if(n!==t)for(let t in n)!ee(t)&&!(t in r)&&c(e,t,n[t],null,a,i);for(let t in r){if(ee(t))continue;let o=r[t],s=n[t];o!==s&&t!==`value`&&c(e,t,s,o,a,i)}`value`in r&&c(e,`value`,n.value,r.value,a)}},ie=(e,t,n,r,i,a,s,c,l)=>{let d=t.el=e?e.el:u(``),f=t.anchor=e?e.anchor:u(``),{patchFlag:p,dynamicChildren:m,slotScopeIds:h}=t;h&&(c=c?c.concat(h):h),e==null?(o(d,n,r),o(f,n,r),E(t.children||[],n,f,i,a,s,c,l)):p>0&&p&64&&m&&e.dynamicChildren&&e.dynamicChildren.length===m.length?(ne(e.dynamicChildren,m,n,i,a,s,c),(t.key!=null||i&&t===i.subTree)&&Zi(e,t,!0)):k(e,t,n,f,i,a,s,c,l)},ae=(e,t,n,r,i,a,o,s,c)=>{t.slotScopeIds=s,e==null?t.shapeFlag&512?i.ctx.activate(t,n,r,o,c):O(t,n,r,i,a,o,c):se(e,t,c)},O=(e,t,n,r,i,a,o)=>{let s=e.component=Da(e,r,i);if(_r(e)&&(s.ctx.renderer=M),Ia(s,!1,o),s.asyncDep){if(i&&i.registerDep(s,ce,o),!e.el){let r=s.subTree=q(aa);b(null,r,t,n),e.placeholder=r.el}}else ce(s,e,t,n,i,a,o)},se=(e,t,n)=>{let r=t.component=e.component;if(Ci(e,t,n))if(r.asyncDep&&!r.asyncResolved){le(r,t,n);return}else r.next=t,r.update();else t.el=e.el,r.vnode=t},ce=(e,t,n,r,i,a,o)=>{let s=()=>{if(e.isMounted){let{next:t,bu:n,u:r,parent:s,vnode:c}=e;{let n=$i(e);if(n){t&&(t.el=c.el,le(e,t,o)),n.asyncDep.then(()=>{Gi(()=>{e.isUnmounted||l()},i)});return}}let u=t,d;Yi(e,!1),t?(t.el=c.el,le(e,t,o)):t=c,n&&oe(n),(d=t.props&&t.props.onVnodeBeforeUpdate)&&wa(d,s,t,c),Yi(e,!0);let f=bi(e),p=e.subTree;e.subTree=f,v(p,f,m(p.el),_e(p),e,i,a),t.el=f.el,u===null&&Ei(e,f.el),r&&Gi(r,i),(d=t.props&&t.props.onVnodeUpdated)&&Gi(()=>wa(d,s,t,c),i)}else{let o,{el:s,props:c}=t,{bm:l,m:u,parent:d,root:f,type:p}=e,m=gr(t);if(Yi(e,!1),l&&oe(l),!m&&(o=c&&c.onVnodeBeforeMount)&&wa(o,d,t),Yi(e,!0),s&&xe){let t=()=>{e.subTree=bi(e),xe(s,e.subTree,e,i,null)};m&&p.__asyncHydrate?p.__asyncHydrate(s,e,t):t()}else{f.ce&&f.ce._hasShadowRoot()&&f.ce._injectChildStyle(p,e.parent?e.parent.type:void 0);let o=e.subTree=bi(e);v(null,o,n,r,e,i,a),t.el=o.el}if(u&&Gi(u,i),!m&&(o=c&&c.onVnodeMounted)){let e=t;Gi(()=>wa(o,d,e),i)}(t.shapeFlag&256||d&&gr(d.vnode)&&d.vnode.shapeFlag&256)&&e.a&&Gi(e.a,i),e.isMounted=!0,t=n=r=null}};e.scope.on();let c=e.effect=new Ee(s);e.scope.off();let l=e.update=c.run.bind(c),u=e.job=c.runIfDirty.bind(c);u.i=e,u.id=e.uid,c.scheduler=()=>Dn(u),Yi(e,!0),l()},le=(e,t,n)=>{t.component=e;let r=e.vnode.props;e.vnode=t,e.next=null,ji(e,t.props,r,n),Wi(e,t.children,n),Ve(),An(e),He()},k=(e,t,n,r,i,a,o,s,c=!1)=>{let l=e&&e.children,u=e?e.shapeFlag:0,d=t.children,{patchFlag:f,shapeFlag:m}=t;if(f>0){if(f&128){fe(l,d,n,r,i,a,o,s,c);return}else if(f&256){de(l,d,n,r,i,a,o,s,c);return}}m&8?(u&16&&j(l,i,a),d!==l&&p(n,d)):u&16?m&16?fe(l,d,n,r,i,a,o,s,c):j(l,i,a,!0):(u&8&&p(n,``),m&16&&E(d,n,r,i,a,o,s,c))},de=(e,t,r,i,a,o,s,c,l)=>{e=e||n,t=t||n;let u=e.length,d=t.length,f=Math.min(u,d),p;for(p=0;pd?j(e,a,o,!0,!1,f):E(t,r,i,a,o,s,c,l,f)},fe=(e,t,r,i,a,o,s,c,l)=>{let u=0,d=t.length,f=e.length-1,p=d-1;for(;u<=f&&u<=p;){let n=e[u],i=t[u]=l?xa(t[u]):ba(t[u]);if(ma(n,i))v(n,i,r,null,a,o,s,c,l);else break;u++}for(;u<=f&&u<=p;){let n=e[f],i=t[p]=l?xa(t[p]):ba(t[p]);if(ma(n,i))v(n,i,r,null,a,o,s,c,l);else break;f--,p--}if(u>f){if(u<=p){let e=p+1,n=ep)for(;u<=f;)me(e[u],a,o,!0),u++;else{let m=u,h=u,g=new Map;for(u=h;u<=p;u++){let e=t[u]=l?xa(t[u]):ba(t[u]);e.key!=null&&g.set(e.key,u)}let _,y=0,b=p-h+1,x=!1,S=0,C=Array(b);for(u=0;u=b){me(n,a,o,!0);continue}let i;if(n.key!=null)i=g.get(n.key);else for(_=h;_<=p;_++)if(C[_-h]===0&&ma(n,t[_])){i=_;break}i===void 0?me(n,a,o,!0):(C[i-h]=u+1,i>=S?S=i:x=!0,v(n,t[i],r,null,a,o,s,c,l),y++)}let w=x?Qi(C):n;for(_=w.length-1,u=b-1;u>=0;u--){let e=h+u,n=t[e],f=t[e+1],p=e+1{let{el:a,type:c,transition:l,children:u,shapeFlag:d}=e;if(d&6){pe(e.component.subTree,t,n,r);return}if(d&128){e.suspense.move(t,n,r);return}if(d&64){c.move(e,t,n,M);return}if(c===H){o(a,t,n);for(let e=0;el.enter(a),i));else{let{leave:r,delayLeave:i,afterLeave:c}=l,u=()=>{e.ctx.isUnmounted?s(a):o(a,t,n)},d=()=>{let e=a._isLeaving||!!a[Xn];a._isLeaving&&a[Xn](!0),l.persisted&&!e?u():r(a,()=>{u(),c&&c()})};i?i(a,u,d):d()}else o(a,t,n)},me=(e,t,n,r=!1,i=!1)=>{let{type:a,props:o,ref:s,children:c,dynamicChildren:l,shapeFlag:u,patchFlag:d,dirs:f,cacheIndex:p,memo:m}=e;if(d===-2&&(i=!1),s!=null&&(Ve(),mr(s,null,n,e,!0),He()),p!=null&&(t.renderCache[p]=void 0),u&256){t.ctx.deactivate(e);return}let h=u&1&&f,g=!gr(e),_;if(g&&(_=o&&o.onVnodeBeforeUnmount)&&wa(_,t,e),u&6)ge(e.component,n,r);else{if(u&128){e.suspense.unmount(n,r);return}h&&Rn(e,null,t,`beforeUnmount`),u&64?e.type.remove(e,t,n,M,r):l&&!l.hasOnce&&(a!==H||d>0&&d&64)?j(l,t,n,!1,!0):(a===H&&d&384||!i&&u&16)&&j(c,t,n),r&&A(e)}let v=m!=null&&p==null;(g&&(_=o&&o.onVnodeUnmounted)||h||v)&&Gi(()=>{_&&wa(_,t,e),h&&Rn(e,null,t,`unmounted`),v&&(e.el=null)},n)},A=e=>{let{type:t,el:n,anchor:r,transition:i}=e;if(t===H){he(n,r);return}if(t===oa){C(e);return}let a=()=>{s(n),i&&!i.persisted&&i.afterLeave&&i.afterLeave()};if(e.shapeFlag&1&&i&&!i.persisted){let{leave:t,delayLeave:r}=i,o=()=>t(n,a);r?r(e.el,a,o):o()}else a()},he=(e,t)=>{let n;for(;e!==t;)n=h(e),s(e),e=n;s(t)},ge=(e,t,n)=>{let{bum:r,scope:i,job:a,subTree:o,um:s,m:c,a:l}=e;ea(c),ea(l),r&&oe(r),i.stop(),a&&(a.flags|=8,me(o,e,t,n)),s&&Gi(s,t),Gi(()=>{e.isUnmounted=!0},t)},j=(e,t,n,r=!1,i=!1,a=0)=>{for(let o=a;o{if(e.shapeFlag&6)return _e(e.component.subTree);if(e.shapeFlag&128)return e.suspense.next();let t=h(e.anchor||e.el),n=t&&t[Jn];return n?h(n):t},ve=!1,ye=(e,t,n)=>{let r;e==null?t._vnode&&(me(t._vnode,null,null,!0),r=t._vnode.component):v(t._vnode||null,e,t,null,null,null,n),t._vnode=e,ve||(ve=!0,An(r),jn(),ve=!1)},M={p:v,um:me,m:pe,r:A,mt:O,mc:E,pc:k,pbc:ne,n:_e,o:e},be,xe;return i&&([be,xe]=i(M)),{render:ye,hydrate:be,createApp:pi(ye,be)}}function Ji({type:e,props:t},n){return n===`svg`&&e===`foreignObject`||n===`mathml`&&e===`annotation-xml`&&t&&t.encoding&&t.encoding.includes(`html`)?void 0:n}function Yi({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Xi(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Zi(e,t,n=!1){let r=e.children,i=t.children;if(d(r)&&d(i))for(let e=0;e>1,e[n[s]]0&&(t[r]=n[a-1]),n[a]=r)}}for(a=n.length,o=n[a-1];a-- >0;)n[a]=o,o=t[o];return n}function $i(e){let t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:$i(t)}function ea(e){if(e)for(let t=0;te.__isSuspense;function ra(e,t){t&&t.pendingBranch?d(e)?t.effects.push(...e):t.effects.push(e):kn(e)}var H=Symbol.for(`v-fgt`),ia=Symbol.for(`v-txt`),aa=Symbol.for(`v-cmt`),oa=Symbol.for(`v-stc`),sa=[],ca=null;function U(e=!1){sa.push(ca=e?null:[])}function la(){sa.pop(),ca=sa[sa.length-1]||null}var ua=1;function da(e,t=!1){ua+=e,e<0&&ca&&t&&(ca.hasOnce=!0)}function fa(e){return e.dynamicChildren=ua>0?ca||n:null,la(),ua>0&&ca&&ca.push(e),e}function W(e,t,n,r,i,a){return fa(K(e,t,n,r,i,a,!0))}function G(e,t,n,r,i){return fa(q(e,t,n,r,i,!0))}function pa(e){return e?e.__v_isVNode===!0:!1}function ma(e,t){return e.type===t.type&&e.key===t.key}var ha=({key:e})=>e??null,ga=({ref:e,ref_key:t,ref_for:n})=>(typeof e==`number`&&(e=``+e),e==null?null:g(e)||I(e)||h(e)?{i:Pn,r:e,k:t,f:!!n}:e);function K(e,t=null,n=null,r=0,i=null,a=e===H?0:1,o=!1,s=!1){let c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&ha(t),ref:t&&ga(t),scopeId:Fn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:a,patchFlag:r,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:Pn};return s?(Sa(c,n),a&128&&e.normalize(c)):n&&(c.shapeFlag|=g(n)?8:16),ua>0&&!o&&ca&&(c.patchFlag>0||a&6)&&c.patchFlag!==32&&ca.push(c),c}var q=_a;function _a(e,t=null,n=null,r=0,i=null,a=!1){if((!e||e===Ir)&&(e=aa),pa(e)){let r=ya(e,t,!0);return n&&Sa(r,n),ua>0&&!a&&ca&&(r.shapeFlag&6?ca[ca.indexOf(e)]=r:ca.push(r)),r.patchFlag=-2,r}if(Ka(e)&&(e=e.__vccOpts),t){t=va(t);let{class:e,style:n}=t;e&&!g(e)&&(t.class=A(e)),v(n)&&(Wt(n)&&!d(n)&&(n=s({},n)),t.style=k(n))}let o=g(e)?1:na(e)?128:Yn(e)?64:v(e)?4:h(e)?2:0;return K(e,t,n,r,i,o,a,!0)}function va(e){return e?Wt(e)||ki(e)?s({},e):e:null}function ya(e,t,n=!1,r=!1){let{props:i,ref:a,patchFlag:o,children:s,transition:c}=e,l=t?Ca(i||{},t):i,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&ha(l),ref:t&&t.ref?n&&a?d(a)?a.concat(ga(t)):[a,ga(t)]:ga(t):a,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:s,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==H?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&ya(e.ssContent),ssFallback:e.ssFallback&&ya(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&r&&lr(u,c.clone(u)),u}function J(e=` `,t=0){return q(ia,null,e,t)}function Y(e=``,t=!1){return t?(U(),G(aa,null,e)):q(aa,null,e)}function ba(e){return e==null||typeof e==`boolean`?q(aa):d(e)?q(H,null,e.slice()):pa(e)?xa(e):q(ia,null,String(e))}function xa(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:ya(e)}function Sa(e,t){let n=0,{shapeFlag:r}=e;if(t==null)t=null;else if(d(t))n=16;else if(typeof t==`object`)if(r&65){let n=t.default;n&&(n._c&&(n._d=!1),Sa(e,n()),n._c&&(n._d=!0));return}else{n=32;let r=t._;!r&&!ki(t)?t._ctx=Pn:r===3&&Pn&&(Pn.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else h(t)?(t={default:t,_ctx:Pn},n=32):(t=String(t),r&64?(n=16,t=[J(t)]):n=8);e.children=t,e.shapeFlag|=n}function Ca(...e){let t={};for(let n=0;nOa||Pn,Aa,ja;{let e=ue(),t=(t,n)=>{let r;return(r=e[t])||(r=e[t]=[]),r.push(n),e=>{r.length>1?r.forEach(t=>t(e)):r[0](e)}};Aa=t(`__VUE_INSTANCE_SETTERS__`,e=>Oa=e),ja=t(`__VUE_SSR_SETTERS__`,e=>Fa=e)}var Ma=e=>{let t=Oa;return Aa(e),e.scope.on(),()=>{e.scope.off(),Aa(t)}},Na=()=>{Oa&&Oa.scope.off(),Aa(null)};function Pa(e){return e.vnode.shapeFlag&4}var Fa=!1;function Ia(e,t=!1,n=!1){t&&ja(t);let{props:r,children:i}=e.vnode,a=Pa(e);Ai(e,r,a,t),Ui(e,i,n||t);let o=a?La(e,t):void 0;return t&&ja(!1),o}function La(e,t){let n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Gr);let{setup:r}=n;if(r){Ve();let n=e.setupContext=r.length>1?Ua(e):null,i=Ma(e),a=mn(r,e,0,[e.props,n]),o=y(a);if(He(),i(),(o||e.sp)&&!gr(e)&&dr(e),o){if(a.then(Na,Na),t)return a.then(n=>{Ra(e,n,t)}).catch(t=>{gn(t,e,0)});e.asyncDep=a}else Ra(e,a,t)}else Va(e,t)}function Ra(e,t,n){h(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:v(t)&&(e.setupState=$t(t)),Va(e,n)}var za,Ba;function Va(e,t,n){let i=e.type;if(!e.render){if(!t&&za&&!i.render){let t=i.template||ti(e).template;if(t){let{isCustomElement:n,compilerOptions:r}=e.appContext.config,{delimiters:a,compilerOptions:o}=i;i.render=za(t,s(s({isCustomElement:n,delimiters:a},r),o))}}e.render=i.render||r,Ba&&Ba(e)}{let t=Ma(e);Ve();try{Zr(e)}finally{He(),t()}}}var Ha={get(e,t){return Qe(e,`get`,``),e[t]}};function Ua(e){return{attrs:new Proxy(e.attrs,Ha),slots:e.slots,emit:e.emit,expose:t=>{e.exposed=t||{}}}}function Wa(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy($t(Gt(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Ur)return Ur[n](e)},has(e,t){return t in e||t in Ur}})):e.proxy}function Ga(e,t=!0){return h(e)?e.displayName||e.name:e.name||t&&e.__name}function Ka(e){return h(e)&&`__vccOpts`in e}var X=(e,t)=>sn(e,t,Fa);function qa(e,t,n){try{da(-1);let r=arguments.length;return r===2?v(t)&&!d(t)?pa(t)?q(e,null,[t]):q(e,t):q(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&pa(n)&&(n=[n]),q(e,t,n))}finally{da(1)}}var Ja=`3.5.35`,Ya=r,Xa=void 0,Za=typeof window<`u`&&window.trustedTypes;if(Za)try{Xa=Za.createPolicy(`vue`,{createHTML:e=>e})}catch{}var Qa=Xa?e=>Xa.createHTML(e):e=>e,$a=`http://www.w3.org/2000/svg`,eo=`http://www.w3.org/1998/Math/MathML`,to=typeof document<`u`?document:null,no=to&&to.createElement(`template`),ro={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{let t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{let i=t===`svg`?to.createElementNS($a,e):t===`mathml`?to.createElementNS(eo,e):n?to.createElement(e,{is:n}):to.createElement(e);return e===`select`&&r&&r.multiple!=null&&i.setAttribute(`multiple`,r.multiple),i},createText:e=>to.createTextNode(e),createComment:e=>to.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>to.querySelector(e),setScopeId(e,t){e.setAttribute(t,``)},insertStaticContent(e,t,n,r,i,a){let o=n?n.previousSibling:t.lastChild;if(i&&(i===a||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),n),!(i===a||!(i=i.nextSibling)););else{no.innerHTML=Qa(r===`svg`?`${e}`:r===`mathml`?`${e}`:e);let i=no.content;if(r===`svg`||r===`mathml`){let e=i.firstChild;for(;e.firstChild;)i.appendChild(e.firstChild);i.removeChild(e)}t.insertBefore(i,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},io=`transition`,ao=`animation`,oo=Symbol(`_vtc`),so={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},co=s({},er,so),lo=(e=>(e.displayName=`Transition`,e.props=co,e))((e,{slots:t})=>qa(ir,po(e),t)),uo=(e,t=[])=>{d(e)?e.forEach(e=>e(...t)):e&&e(...t)},fo=e=>e?d(e)?e.some(e=>e.length>1):e.length>1:!1;function po(e){let t={};for(let n in e)n in so||(t[n]=e[n]);if(e.css===!1)return t;let{name:n=`v`,type:r,duration:i,enterFromClass:a=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:c=`${n}-enter-to`,appearFromClass:l=a,appearActiveClass:u=o,appearToClass:d=c,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:m=`${n}-leave-to`}=e,h=mo(i),g=h&&h[0],_=h&&h[1],{onBeforeEnter:v,onEnter:y,onEnterCancelled:b,onLeave:x,onLeaveCancelled:S,onBeforeAppear:C=v,onAppear:w=y,onAppearCancelled:ee=b}=t,T=(e,t,n,r)=>{e._enterCancelled=r,_o(e,t?d:c),_o(e,t?u:o),n&&n()},te=(e,t)=>{e._isLeaving=!1,_o(e,f),_o(e,m),_o(e,p),t&&t()},E=e=>(t,n)=>{let i=e?w:y,o=()=>T(t,e,n);uo(i,[t,o]),vo(()=>{_o(t,e?l:a),go(t,e?d:c),fo(i)||bo(t,r,g,o)})};return s(t,{onBeforeEnter(e){uo(v,[e]),go(e,a),go(e,o)},onBeforeAppear(e){uo(C,[e]),go(e,l),go(e,u)},onEnter:E(!1),onAppear:E(!0),onLeave(e,t){e._isLeaving=!0;let n=()=>te(e,t);go(e,f),e._enterCancelled?(go(e,p),wo(e)):(wo(e),go(e,p)),vo(()=>{e._isLeaving&&(_o(e,f),go(e,m),fo(x)||bo(e,r,_,n))}),uo(x,[e,n])},onEnterCancelled(e){T(e,!1,void 0,!0),uo(b,[e])},onAppearCancelled(e){T(e,!0,void 0,!0),uo(ee,[e])},onLeaveCancelled(e){te(e),uo(S,[e])}})}function mo(e){if(e==null)return null;if(v(e))return[ho(e.enter),ho(e.leave)];{let t=ho(e);return[t,t]}}function ho(e){return ce(e)}function go(e,t){t.split(/\s+/).forEach(t=>t&&e.classList.add(t)),(e[oo]||(e[oo]=new Set)).add(t)}function _o(e,t){t.split(/\s+/).forEach(t=>t&&e.classList.remove(t));let n=e[oo];n&&(n.delete(t),n.size||(e[oo]=void 0))}function vo(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}var yo=0;function bo(e,t,n,r){let i=e._endId=++yo,a=()=>{i===e._endId&&r()};if(n!=null)return setTimeout(a,n);let{type:o,timeout:s,propCount:c}=xo(e,t);if(!o)return r();let l=o+`end`,u=0,d=()=>{e.removeEventListener(l,f),a()},f=t=>{t.target===e&&++u>=c&&d()};setTimeout(()=>{u(n[e]||``).split(`, `),i=r(`${io}Delay`),a=r(`${io}Duration`),o=So(i,a),s=r(`${ao}Delay`),c=r(`${ao}Duration`),l=So(s,c),u=null,d=0,f=0;t===io?o>0&&(u=io,d=o,f=a.length):t===ao?l>0&&(u=ao,d=l,f=c.length):(d=Math.max(o,l),u=d>0?o>l?io:ao:null,f=u?u===io?a.length:c.length:0);let p=u===io&&/\b(?:transform|all)(?:,|$)/.test(r(`${io}Property`).toString());return{type:u,timeout:d,propCount:f,hasTransform:p}}function So(e,t){for(;e.lengthCo(t)+Co(e[n])))}function Co(e){return e===`auto`?0:Number(e.slice(0,-1).replace(`,`,`.`))*1e3}function wo(e){return(e?e.ownerDocument:document).body.offsetHeight}function To(e,t,n){let r=e[oo];r&&(t=(t?[t,...r]:[...r]).join(` `)),t==null?e.removeAttribute(`class`):n?e.setAttribute(`class`,t):e.className=t}var Eo=Symbol(`_vod`),Do=Symbol(`_vsh`),Oo={name:`show`,beforeMount(e,{value:t},{transition:n}){e[Eo]=e.style.display===`none`?``:e.style.display,n&&t?n.beforeEnter(e):ko(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),ko(e,!0),r.enter(e)):r.leave(e,()=>{ko(e,!1)}):ko(e,t))},beforeUnmount(e,{value:t}){ko(e,t)}};function ko(e,t){e.style.display=t?e[Eo]:`none`,e[Do]=!t}var Ao=Symbol(``),jo=/(?:^|;)\s*display\s*:/;function Mo(e,t,n){let r=e.style,i=g(n),a=!1;if(n&&!i){if(t)if(g(t))for(let e of t.split(`;`)){let t=e.slice(0,e.indexOf(`:`)).trim();n[t]??Po(r,t,``)}else for(let e in t)n[e]??Po(r,e,``);for(let i in n){i===`display`&&(a=!0);let o=n[i];o==null?Po(r,i,``):Ro(e,i,!g(t)&&t?t[i]:void 0,o)||Po(r,i,o)}}else if(i){if(t!==n){let e=r[Ao];e&&(n+=`;`+e),r.cssText=n,a=jo.test(n)}}else t&&e.removeAttribute(`style`);Eo in e&&(e[Eo]=a?r.display:``,e[Do]&&(r.display=`none`))}var No=/\s*!important$/;function Po(e,t,n){if(d(n))n.forEach(n=>Po(e,t,n));else if(n??(n=``),t.startsWith(`--`))e.setProperty(t,n);else{let r=Lo(e,t);No.test(n)?e.setProperty(ne(r),n.replace(No,``),`important`):e[r]=n}}var Fo=[`Webkit`,`Moz`,`ms`],Io={};function Lo(e,t){let n=Io[t];if(n)return n;let r=E(t);if(r!==`filter`&&r in e)return Io[t]=r;r=re(r);for(let n=0;nJo||(Yo.then(()=>Jo=0),Jo=Date.now());function Zo(e,t){let n=e=>{if(!e._vts)e._vts=Date.now();else if(e._vts<=n.attached)return;let r=n.value;if(d(r)){let n=e.stopImmediatePropagation;e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0};let i=r.slice(),a=[e];for(let n=0;ne.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,$o=(e,t,n,r,i,s)=>{let c=i===`svg`;t===`class`?To(e,r,c):t===`style`?Mo(e,n,r):a(t)?o(t)||Go(e,t,n,r,s):(t[0]===`.`?(t=t.slice(1),!0):t[0]===`^`?(t=t.slice(1),!1):es(e,t,r,c))?(Vo(e,t,r),!e.tagName.includes(`-`)&&(t===`value`||t===`checked`||t===`selected`)&&Bo(e,t,r,c,s,t!==`value`)):e._isVueCE&&(ts(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!g(r)))?Vo(e,E(t),r,s,t):(t===`true-value`?e._trueValue=r:t===`false-value`&&(e._falseValue=r),Bo(e,t,r,c))};function es(e,t,n,r){if(r)return!!(t===`innerHTML`||t===`textContent`||t in e&&Qo(t)&&h(n));if(t===`spellcheck`||t===`draggable`||t===`translate`||t===`autocorrect`||t===`sandbox`&&e.tagName===`IFRAME`||t===`form`||t===`list`&&e.tagName===`INPUT`||t===`type`&&e.tagName===`TEXTAREA`)return!1;if(t===`width`||t===`height`){let t=e.tagName;if(t===`IMG`||t===`VIDEO`||t===`CANVAS`||t===`SOURCE`)return!1}return Qo(t)&&g(n)?!1:t in e}function ts(e,t){let n=e._def.props;if(!n)return!1;let r=E(t);return Array.isArray(n)?n.some(e=>E(e)===r):Object.keys(n).some(e=>E(e)===r)}var ns=e=>{let t=e.props[`onUpdate:modelValue`]||!1;return d(t)?e=>oe(t,e):t},rs=Symbol(`_assign`),is={created(e,{value:t},n){e.checked=ve(t,n.props.value),e[rs]=ns(n),Ho(e,`change`,()=>{e[rs](as(e))})},beforeUpdate(e,{value:t,oldValue:n},r){e[rs]=ns(r),t!==n&&(e.checked=ve(t,r.props.value))}};function as(e){return`_value`in e?e._value:e.value}var os=[`ctrl`,`shift`,`alt`,`meta`],ss={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>`button`in e&&e.button!==0,middle:e=>`button`in e&&e.button!==1,right:e=>`button`in e&&e.button!==2,exact:(e,t)=>os.some(n=>e[`${n}Key`]&&!t.includes(n))},cs=(e,t)=>{if(!e)return e;let n=e._withMods||(e._withMods={}),r=t.join(`.`);return n[r]||(n[r]=((n,...r)=>{for(let e=0;e{let n=e._withKeys||(e._withKeys={}),r=t.join(`.`);return n[r]||(n[r]=(n=>{if(!(`key`in n))return;let r=ne(n.key);if(t.some(e=>e===r||ls[e]===r))return e(n)}))},ds=s({patchProp:$o},ro),fs;function ps(){return fs||(fs=Ki(ds))}var ms=((...e)=>{ps().render(...e)}),hs=((...e)=>{let t=ps().createApp(...e),{mount:n}=t;return t.mount=e=>{let r=_s(e);if(!r)return;let i=t._component;!h(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent=``);let a=n(r,!1,gs(r));return r instanceof Element&&(r.removeAttribute(`v-cloak`),r.setAttribute(`data-v-app`,``)),a},t});function gs(e){if(e instanceof SVGElement)return`svg`;if(typeof MathMLElement==`function`&&e instanceof MathMLElement)return`mathml`}function _s(e){return g(e)?document.querySelector(e):e}var vs={tab:`Tab`,enter:`Enter`,space:`Space`,left:`ArrowLeft`,up:`ArrowUp`,right:`ArrowRight`,down:`ArrowDown`,esc:`Escape`,delete:`Delete`,backspace:`Backspace`,numpadEnter:`NumpadEnter`,pageUp:`PageUp`,pageDown:`PageDown`,home:`Home`,end:`End`},ys=`update:modelValue`,bs=`change`,xs=`input`,Ss=[``,`default`,`small`,`large`],Cs=typeof global==`object`&&global&&global.Object===Object&&global,ws=typeof self==`object`&&self&&self.Object===Object&&self,Ts=Cs||ws||Function(`return this`)(),Es=Ts.Symbol,Ds=Object.prototype,Os=Ds.hasOwnProperty,ks=Ds.toString,As=Es?Es.toStringTag:void 0;function js(e){var t=Os.call(e,As),n=e[As];try{e[As]=void 0;var r=!0}catch{}var i=ks.call(e);return r&&(t?e[As]=n:delete e[As]),i}var Ms=Object.prototype.toString;function Ns(e){return Ms.call(e)}var Ps=`[object Null]`,Fs=`[object Undefined]`,Is=Es?Es.toStringTag:void 0;function Ls(e){return e==null?e===void 0?Fs:Ps:Is&&Is in Object(e)?js(e):Ns(e)}function Rs(e){return typeof e==`object`&&!!e}var zs=`[object Symbol]`;function Bs(e){return typeof e==`symbol`||Rs(e)&&Ls(e)==zs}function Vs(e,t){for(var n=-1,r=e==null?0:e.length,i=Array(r);++n0){if(++t>=Ac)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}function Pc(e){return function(){return e}}var Fc=function(){try{var e=wc(Object,`defineProperty`);return e({},``,{}),e}catch{}}(),Ic=Nc(Fc?function(e,t){return Fc(e,`toString`,{configurable:!0,enumerable:!1,value:Pc(t),writable:!0})}:ic);function Lc(e,t){for(var n=-1,r=e==null?0:e.length;++n-1&&e%1==0&&e-1&&e%1==0&&e<=Jc}function Xc(e){return e!=null&&Yc(e.length)&&!lc(e)}var Zc=Object.prototype;function Qc(e){var t=e&&e.constructor;return e===(typeof t==`function`&&t.prototype||Zc)}function $c(e,t){for(var n=-1,r=Array(e);++n-1}function bu(e,t){var n=this.__data__,r=hu(n,e);return r<0?(++this.size,n.push([e,t])):n[r][1]=t,this}function xu(e){var t=-1,n=e==null?0:e.length;for(this.clear();++t0&&n(s)?t>1?qu(s,t-1,n,r,i):Wu(i,s):r||(i[i.length]=s)}return i}function Ju(e){return e!=null&&e.length?qu(e,1):[]}function Yu(e){return Ic(qc(e,void 0,Ju),e+``)}var Xu=Gl(Object.getPrototypeOf,Object),Zu=`[object Object]`,Qu=Function.prototype,$u=Object.prototype,ed=Qu.toString,td=$u.hasOwnProperty,nd=ed.call(Object);function rd(e){if(!Rs(e)||Ls(e)!=Zu)return!1;var t=Xu(e);if(t===null)return!0;var n=td.call(t,`constructor`)&&t.constructor;return typeof n==`function`&&n instanceof n&&ed.call(n)==nd}function id(e,t,n){var r=-1,i=e.length;t<0&&(t=-t>i?0:i+t),n=n>i?i:n,n<0&&(n+=i),i=t>n?0:n-t>>>0,t>>>=0;for(var a=Array(i);++r=t?e:t)),e}function od(e,t,n){return n===void 0&&(n=t,t=void 0),n!==void 0&&(n=rc(n),n=n===n?n:0),t!==void 0&&(t=rc(t),t=t===t?t:0),ad(rc(e),t,n)}function sd(){this.__data__=new xu,this.size=0}function cd(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n}function ld(e){return this.__data__.get(e)}function ud(e){return this.__data__.has(e)}var dd=200;function fd(e,t){var n=this.__data__;if(n instanceof xu){var r=n.__data__;if(!Su||r.lengths))return!1;var l=a.get(e),u=a.get(t);if(l&&u)return l==t&&u==e;var d=-1,f=!0,p=n&vp?new mp:void 0;for(a.set(e,t),a.set(t,e);++d1),t}),Gc(e,jd(e),n),r&&(n=up(n,am|om|sm,im));for(var i=t.length;i--;)rm(n,t[i]);return n});function lm(e,t,n,r){if(!Zs(e))return e;t=zu(t,e);for(var i=-1,a=t.length,o=a-1,s=e;s!=null&&++ie===void 0,mm=e=>typeof e==`boolean`,hm=e=>typeof e==`number`,gm=e=>typeof Element>`u`?!1:e instanceof Element,_m=e=>tm(e),vm=e=>g(e)?!Number.isNaN(Number(e)):!1,ym=e=>Object.keys(e),bm=`__epPropKey`,$=e=>e,xm=e=>v(e)&&!!e.__epPropKey,Sm=(e,t)=>{if(!v(e)||xm(e))return e;let{values:n,required:r,default:i,type:a,validator:o}=e,s={type:a,required:!!r,validator:n||o?r=>{let a=!1,s=[];if(n&&(s=Array.from(n),u(e,`default`)&&s.push(i),a||(a=s.includes(r))),o&&(a||(a=o(r))),!a&&s.length>0){let e=[...new Set(s)].map(e=>JSON.stringify(e)).join(`, `);Ya(`Invalid prop: validation failed${t?` for prop "${t}"`:``}. Expected one of [${e}], got value ${JSON.stringify(r)}.`)}return a}:void 0,[bm]:!0};return u(e,`default`)&&(s.default=i),s},Cm=e=>Qp(Object.entries(e).map(([e,t])=>[e,Sm(t,e)])),wm=class extends Error{constructor(e){super(e),this.name=`ElementPlusError`}};function Tm(e,t){throw new wm(`[${e}] ${t}`)}function Em(e,t){{let n=g(e)?new wm(`[${e}] ${t}`):e;console.warn(n)}}var Dm=[`class`,`style`],Om=/^on[A-Z]/,km=(e={})=>{let{excludeListeners:t=!1,excludeKeys:n}=e,r=X(()=>(n?.value||[]).concat(Dm)),i=ka();return i?X(()=>Qp(Object.entries(i.proxy?.$attrs).filter(([e])=>!r.value.includes(e)&&!(t&&Om.test(e))))):(Em(`use-attrs`,`getCurrentInstance() returned null. useAttrs() must be called at the top of a setup function`),X(()=>({})))};function Am(e,t){let n=Jt();return Un(()=>{n.value=e()},{...t,flush:t?.flush??`sync`}),Rt(n)}function jm(e,t){return Ce()?(we(e,t),!0):!1}var Mm=typeof window<`u`&&typeof document<`u`;typeof WorkerGlobalScope<`u`&&globalThis instanceof WorkerGlobalScope;var Nm=Object.prototype.toString,Pm=e=>Nm.call(e)===`[object Object]`;function Fm(e){return Array.isArray(e)?e:[e]}function Im(e,t,n={}){let{immediate:r=!0,immediateCallback:i=!1}=n,a=Jt(!1),o;function s(){o&&(clearTimeout(o),o=void 0)}function c(){a.value=!1,s()}function l(...n){i&&e(),s(),a.value=!0,o=setTimeout(()=>{a.value=!1,o=void 0,e(...n)},Zt(t))}return r&&(a.value=!0,Mm&&l()),jm(c),{isPending:zt(a),start:l,stop:c}}function Lm(e,t,n){return Wn(e,t,{...n,immediate:!0})}var Rm=Mm?window:void 0;Mm&&window.document,Mm&&window.navigator,Mm&&window.location;function zm(e){let t=Zt(e);return t?.$el??t}function Bm(...e){let t=(e,t,n,r)=>(e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)),n=X(()=>{let t=Fm(Zt(e[0])).filter(e=>e!=null);return t.every(e=>typeof e!=`string`)?t:void 0});return Lm(()=>[n.value?.map(e=>zm(e))??[Rm].filter(e=>e!=null),Fm(Zt(n.value?e[1]:e[0])),Fm(R(n.value?e[2]:e[1])),Zt(n.value?e[3]:e[2])],([e,n,r,i],a,o)=>{if(!e?.length||!n?.length||!r?.length)return;let s=Pm(i)?{...i}:i,c=e.flatMap(e=>n.flatMap(n=>r.map(r=>t(e,n,r,s))));o(()=>{c.forEach(e=>e())})},{flush:`post`})}function Vm(){let e=Jt(!1),t=ka();return t&&Tr(()=>{e.value=!0},t),e}function Hm(e){let t=Vm();return X(()=>(t.value,!!e()))}function Um(e,t,n={}){let{window:r=Rm,...i}=n,a,o=Hm(()=>r&&`ResizeObserver`in r),s=()=>{a&&(a.disconnect(),a=void 0)},c=Wn(X(()=>{let t=Zt(e);return Array.isArray(t)?t.map(e=>zm(e)):[zm(t)]}),e=>{if(s(),o.value&&r){a=new ResizeObserver(t);for(let t of e)t&&a.observe(t,i)}},{immediate:!0,flush:`post`}),l=()=>{s(),c()};return jm(l),{isSupported:o,stop:l}}var Wm=({from:e,replacement:t,scope:n,version:r,ref:i,type:a=`API`},o)=>{Wn(()=>R(o),o=>{o&&Em(n,`[${a}] ${e} is about to be deprecated in version ${r}, please use ${t} instead. +For more detail, please visit: ${i} +`)},{immediate:!0})},Gm=`a[href],button:not([disabled]),button:not([hidden]),:not([tabindex="-1"]),input:not([disabled]),input:not([type="hidden"]),select:not([disabled]),textarea:not([disabled])`,Km=e=>typeof ShadowRoot>`u`?!1:e instanceof ShadowRoot,qm=e=>typeof Element>`u`?!1:e instanceof Element,Jm=e=>getComputedStyle(e).position===`fixed`?!1:e.offsetParent!==null,Ym=e=>Array.from(e.querySelectorAll(Gm)).filter(e=>Xm(e)&&Jm(e)),Xm=e=>{if(e.tabIndex>0||e.tabIndex===0&&e.getAttribute(`tabIndex`)!==null)return!0;if(e.tabIndex<0||e.hasAttribute(`disabled`)||e.getAttribute(`aria-disabled`)===`true`)return!1;switch(e.nodeName){case`A`:return!!e.href&&e.rel!==`ignore`;case`INPUT`:return!(e.type===`hidden`||e.type===`file`);case`BUTTON`:case`SELECT`:case`TEXTAREA`:return!0;default:return!1}},Zm=(e,t)=>{if(!e||!e.focus)return;let n=!1;qm(e)&&!Xm(e)&&!e.getAttribute(`tabindex`)&&(e.setAttribute(`tabindex`,`-1`),n=!0),e.focus(t),qm(e)&&n&&e.removeAttribute(`tabindex`)},Qm=()=>Mm&&/firefox/i.test(window.navigator.userAgent),$m=()=>Mm&&/android/i.test(window.navigator.userAgent),eh=`utils/dom/style`,th=(e=``)=>e.split(` `).filter(e=>!!e.trim()),nh=(e,t)=>{if(!e||!t)return!1;if(t.includes(` `))throw Error(`className should not contain space.`);return e.classList.contains(t)},rh=(e,t)=>{!e||!t.trim()||e.classList.add(...th(t))},ih=(e,t)=>{!e||!t.trim()||e.classList.remove(...th(t))},ah=(e,t)=>{if(!Mm||!e||!t||Km(e))return``;let n=E(t);n===`float`&&(n=`cssFloat`);try{let t=e.style[n];if(t)return t;let r=document.defaultView?.getComputedStyle(e,``);return r?r[n]:``}catch{return e.style[n]}};function oh(e,t=`px`){if(!e&&e!==0)return``;if(hm(e)||vm(e))return`${e}${t}`;if(g(e))return e;Em(eh,`binding value must be a string or number`)}var sh=(e,t,n,r)=>{let i={offsetX:0,offsetY:0},a=L(!1),o=(t,n)=>{if(e.value){let{offsetX:a,offsetY:o}=i,s=e.value.getBoundingClientRect(),c=Math.max(s.left,0),l=Math.max(s.top,0),u=s.width,d=s.height,f=document.documentElement.clientWidth,p=document.documentElement.clientHeight,m=-c+a,h=-l+o,g=f-c-u+a,_=p-l-(d{let t=e.clientX,n=e.clientY,{offsetX:r,offsetY:s}=i,c=e=>{a.value||(a.value=!0),o(r+e.clientX-t,s+e.clientY-n)},l=()=>{a.value=!1,document.removeEventListener(`mousemove`,c),document.removeEventListener(`mouseup`,l)};document.addEventListener(`mousemove`,c),document.addEventListener(`mouseup`,l)},c=()=>{t.value&&e.value&&(t.value.addEventListener(`mousedown`,s),window.addEventListener(`resize`,d))},l=()=>{t.value&&e.value&&(t.value.removeEventListener(`mousedown`,s),window.removeEventListener(`resize`,d))},u=()=>{i.offsetX=0,i.offsetY=0,e.value&&(e.value.style.transform=``)},d=()=>{let{offsetX:e,offsetY:t}=i;o(e,t)};return Tr(()=>{Un(()=>{n.value?c():l()})}),Or(()=>{l()}),{isDragging:a,resetPosition:u,updatePosition:d}},ch={name:`en`,el:{breadcrumb:{label:`Breadcrumb`},colorpicker:{confirm:`OK`,clear:`Clear`,defaultLabel:`color picker`,description:`current color is {color}. press enter to select a new color.`,alphaLabel:`pick alpha value`,alphaDescription:`alpha {alpha}, current color is {color}`,hueLabel:`pick hue value`,hueDescription:`hue {hue}, current color is {color}`,svLabel:`pick saturation and brightness value`,svDescription:`saturation {saturation}, brightness {brightness}, current color is {color}`,predefineDescription:`select {value} as the color`},datepicker:{now:`Now`,today:`Today`,cancel:`Cancel`,clear:`Clear`,confirm:`OK`,dateTablePrompt:`Use the arrow keys and enter to select the day of the month`,monthTablePrompt:`Use the arrow keys and enter to select the month`,yearTablePrompt:`Use the arrow keys and enter to select the year`,selectedDate:`Selected date`,selectDate:`Select date`,selectTime:`Select time`,startDate:`Start Date`,startTime:`Start Time`,endDate:`End Date`,endTime:`End Time`,prevYear:`Previous Year`,nextYear:`Next Year`,prevMonth:`Previous Month`,nextMonth:`Next Month`,year:``,month1:`January`,month2:`February`,month3:`March`,month4:`April`,month5:`May`,month6:`June`,month7:`July`,month8:`August`,month9:`September`,month10:`October`,month11:`November`,month12:`December`,weeks:{sun:`Sun`,mon:`Mon`,tue:`Tue`,wed:`Wed`,thu:`Thu`,fri:`Fri`,sat:`Sat`},weeksFull:{sun:`Sunday`,mon:`Monday`,tue:`Tuesday`,wed:`Wednesday`,thu:`Thursday`,fri:`Friday`,sat:`Saturday`},months:{jan:`Jan`,feb:`Feb`,mar:`Mar`,apr:`Apr`,may:`May`,jun:`Jun`,jul:`Jul`,aug:`Aug`,sep:`Sep`,oct:`Oct`,nov:`Nov`,dec:`Dec`}},inputNumber:{decrease:`decrease number`,increase:`increase number`},select:{loading:`Loading`,noMatch:`No matching data`,noData:`No data`,placeholder:`Select`},mention:{loading:`Loading`},dropdown:{toggleDropdown:`Toggle Dropdown`},cascader:{noMatch:`No matching data`,loading:`Loading`,placeholder:`Select`,noData:`No data`},pagination:{goto:`Go to`,pagesize:`/page`,total:`Total {total}`,pageClassifier:``,page:`Page`,prev:`Go to previous page`,next:`Go to next page`,currentPage:`page {pager}`,prevPages:`Previous {pager} pages`,nextPages:`Next {pager} pages`,deprecationWarning:`Deprecated usages detected, please refer to the el-pagination documentation for more details`},dialog:{close:`Close this dialog`},drawer:{close:`Close this dialog`},messagebox:{title:`Message`,confirm:`OK`,cancel:`Cancel`,error:`Illegal input`,close:`Close this dialog`},upload:{deleteTip:`press delete to remove`,delete:`Delete`,preview:`Preview`,continue:`Continue`},slider:{defaultLabel:`slider between {min} and {max}`,defaultRangeStartLabel:`pick start value`,defaultRangeEndLabel:`pick end value`},table:{emptyText:`No Data`,confirmFilter:`Confirm`,resetFilter:`Reset`,clearFilter:`All`,sumText:`Sum`,selectAllLabel:`Select all rows`,selectRowLabel:`Select this row`,expandRowLabel:`Expand this row`,collapseRowLabel:`Collapse this row`,sortLabel:`Sort by {column}`,filterLabel:`Filter by {column}`},tag:{close:`Close this tag`},tour:{next:`Next`,previous:`Previous`,finish:`Finish`,close:`Close this dialog`},tree:{emptyText:`No Data`},transfer:{noMatch:`No matching data`,noData:`No data`,titles:[`List 1`,`List 2`],filterPlaceholder:`Enter keyword`,noCheckedFormat:`{total} items`,hasCheckedFormat:`{checked}/{total} checked`},image:{error:`FAILED`},pageHeader:{title:`Back`},popconfirm:{confirmButtonText:`Yes`,cancelButtonText:`No`},carousel:{leftArrow:`Carousel arrow left`,rightArrow:`Carousel arrow right`,indicator:`Carousel switch to index {index}`},inputOTP:{groupLabel:`OTP Input`,defaultLabel:`Please enter OTP character {index}`}}},lh=e=>(t,n)=>uh(t,n,R(e)),uh=(e,t,n)=>Uu(n,e,e).replace(/\{(\w+)\}/g,(e,n)=>`${t?.[n]??`{${n}}`}`),dh=e=>({lang:X(()=>R(e).name),locale:I(e)?e:L(e),t:lh(e)}),fh=Symbol(`localeContextKey`),ph=e=>{let t=e||Bn(fh,L());return dh(X(()=>t.value||ch))},mh=`is-`,hh=(e,t,n,r,i)=>{let a=`${e}-${t}`;return n&&(a+=`-${n}`),r&&(a+=`__${r}`),i&&(a+=`--${i}`),a},gh=Symbol(`namespaceContextKey`),_h=e=>{let t=e||(ka()?Bn(gh,L(`el`)):L(`el`));return X(()=>R(t)||`el`)},vh=(e,t)=>{let n=_h(t);return{namespace:n,b:(t=``)=>hh(n.value,e,t,``,``),e:t=>t?hh(n.value,e,``,t,``):``,m:t=>t?hh(n.value,e,``,``,t):``,be:(t,r)=>t&&r?hh(n.value,e,t,r,``):``,em:(t,r)=>t&&r?hh(n.value,e,``,t,r):``,bm:(t,r)=>t&&r?hh(n.value,e,t,``,r):``,bem:(t,r,i)=>t&&r&&i?hh(n.value,e,t,r,i):``,is:(e,...t)=>{let n=t.length>=1?t[0]:!0;return e&&n?`${mh}${e}`:``},cssVar:e=>{let t={};for(let r in e)e[r]&&(t[`--${n.value}-${r}`]=e[r]);return t},cssVarName:e=>`--${n.value}-${e}`,cssVarBlock:t=>{let r={};for(let i in t)t[i]&&(r[`--${n.value}-${e}-${i}`]=t[i]);return r},cssVarBlockName:t=>`--${n.value}-${e}-${t}`}},yh=e=>Mm?window.requestAnimationFrame(e):setTimeout(e,16),bh=e=>Mm?window.cancelAnimationFrame(e):clearTimeout(e),xh,Sh=e=>{if(!Mm)return 0;if(xh!==void 0)return xh;let t=document.createElement(`div`);t.className=`${e}-scrollbar__wrap`,t.style.visibility=`hidden`,t.style.width=`100px`,t.style.position=`absolute`,t.style.top=`-9999px`,document.body.appendChild(t);let n=t.offsetWidth;t.style.overflow=`scroll`;let r=document.createElement(`div`);r.style.width=`100%`,t.appendChild(r);let i=r.offsetWidth;return t.parentNode?.removeChild(t),xh=n-i,xh},Ch=(e,t={})=>{I(e)||Tm(`[useLockscreen]`,`You need to pass a ref param to this function`);let n=t.ns||vh(`popup`),r=X(()=>n.bm(`parent`,`hidden`)),i=0,a=!1,o=`0`,s=!1,c=()=>{s||(s=!0,setTimeout(()=>{typeof document>`u`||a&&document&&(document.body.style.width=o,ih(document.body,r.value))},200))};Wn(e,e=>{if(!e){c();return}s=!1,a=!nh(document.body,r.value),a&&(o=document.body.style.width,rh(document.body,r.value)),i=Sh(n.namespace.value);let t=document.documentElement.clientHeight0&&(t||l===`scroll`)&&a&&(document.body.style.width=`calc(100% - ${i}px)`)}),we(()=>c())},wh=e=>{if(e.code&&e.code!==`Unidentified`)return e.code;let t=Th(e);if(t){if(Object.values(vs).includes(t))return t;switch(t){case` `:return vs.space;default:return``}}return``},Th=e=>{let t=e.key&&e.key!==`Unidentified`?e.key:``;if(!t&&e.type===`keyup`&&$m()){let n=e.target;t=n.value.charAt(n.selectionStart-1)}return t},Eh=e=>{let t=ka();return X(()=>t?.proxy?.$props?.[e])},Dh=e=>{if(!e)return{onClick:r,onMousedown:r,onMouseup:r};let t=!1,n=!1;return{onClick:r=>{t&&n&&e(r),t=n=!1},onMousedown:e=>{t=e.target===e.currentTarget},onMouseup:e=>{n=e.target===e.currentTarget}}},Oh={prefix:Math.floor(Math.random()*1e4),current:0},kh=Symbol(`elIdInjection`),Ah=()=>ka()?Bn(kh,Oh):Oh,jh=e=>{let t=Ah();!Mm&&t===Oh&&Em(`IdInjection`,`Looks like you are using server rendering, you must provide a id provider to ensure the hydration process to be succeed +usage: app.provide(ID_INJECTION_KEY, { + prefix: number, + current: number, +})`);let n=_h();return Am(()=>R(e)||`${n.value}-id-${t.prefix}-${t.current++}`)},Mh=[],Nh=e=>{wh(e)===vs.esc&&Mh.forEach(t=>t(e))},Ph=e=>{Tr(()=>{Mh.length===0&&document.addEventListener(`keydown`,Nh),Mm&&Mh.push(e)}),Or(()=>{Mh=Mh.filter(t=>t!==e),Mh.length===0&&Mm&&document.removeEventListener(`keydown`,Nh)})},Fh={current:0},Ih=L(0),Lh=2e3,Rh=Symbol(`elZIndexContextKey`),zh=Symbol(`zIndexContextKey`),Bh=e=>{let t=ka()?Bn(Rh,Fh):Fh,n=e||(ka()?Bn(zh,void 0):void 0),r=X(()=>{let e=R(n);return hm(e)?e:Lh}),i=X(()=>r.value+Ih.value);return!Mm&&!Bn(Rh)&&Em(`ZIndexInjection`,`Looks like you are using server rendering, you must provide a z-index provider to ensure the hydration process to be succeed +usage: app.provide(ZINDEX_INJECTION_KEY, { current: 0 })`),{initialZIndex:r,currentZIndex:i,nextZIndex:()=>(t.current++,Ih.value=t.current,i.value)}};function Vh(e){let t;function n(){if(e.value==null)return;let{selectionStart:n,selectionEnd:r,value:i}=e.value;n==null||r==null||(t={selectionStart:n,selectionEnd:r,value:i,beforeTxt:i.slice(0,Math.max(0,n)),afterTxt:i.slice(Math.max(0,r))})}function r(){if(e.value==null||t==null)return;let{value:n}=e.value,{beforeTxt:r,afterTxt:i,selectionStart:a}=t;if(r==null||i==null||a==null)return;let o=n.length;if(n.endsWith(i))o=n.length-i.length;else if(n.startsWith(r))o=r.length;else{let e=r[a-1],t=n.indexOf(e,a-1);t!==-1&&(o=t+1)}e.value.setSelectionRange(o,o)}return[n,r]}function Hh(e){return pa(e)&&e.type===aa}var Uh=e=>{let t=d(e)?e:[e],n=[];return t.forEach(e=>{d(e)?n.push(...Uh(e)):pa(e)&&e.component?.subTree?n.push(e,...Uh(e.component.subTree)):pa(e)&&d(e.children)?n.push(...Uh(e.children)):pa(e)&&e.shapeFlag===2?n.push(...Uh(e.type())):n.push(e)}),n},Wh=Sm({type:String,values:Ss,required:!1}),Gh=Symbol(`size`),Kh=()=>{let e=Bn(Gh,{});return X(()=>R(e.size)||``)};function qh(e,{disabled:t,beforeFocus:n,afterFocus:r,beforeBlur:i,afterBlur:a}={}){let{emit:o}=ka(),s=Jt(),c=L(!1),l=e=>{let i=h(n)?n(e):!1;R(t)||c.value||i||(c.value=!0,o(`focus`,e),r?.())},u=e=>{let n=h(i)?i(e):!1;R(t)||e.relatedTarget&&s.value?.contains(e.relatedTarget)||n||(c.value=!1,o(`blur`,e),a?.())};return Wn([s,()=>R(t)],([e,t])=>{e&&(t?e.removeAttribute(`tabindex`):e.setAttribute(`tabindex`,`-1`))}),Bm(s,`focus`,l,!0),Bm(s,`blur`,u,!0),Bm(s,`click`,n=>{R(t)||Xm(n.target)||s.value?.contains(document.activeElement)&&s.value!==document.activeElement||e.value?.focus()},!0),{isFocused:c,wrapperRef:s,handleFocus:l,handleBlur:u}}function Jh({afterComposition:e,emit:t}){let n=L(!1),r=e=>{t?.(`compositionstart`,e),n.value=!0},i=e=>{t?.(`compositionupdate`,e),n.value=!0},a=r=>{t?.(`compositionend`,r),n.value&&(n.value=!1,Tn(()=>e(r)))};return{isComposing:n,handleComposition:e=>{e.type===`compositionend`?a(e):i(e)},handleCompositionStart:r,handleCompositionUpdate:i,handleCompositionEnd:a}}var Yh=Symbol(`emptyValuesContextKey`),Xh=Cm({emptyValues:Array,valueOnClear:{type:$([String,Number,Boolean,Function]),default:void 0,validator:e=>(e=h(e)?e():e,d(e)?e.every(e=>!e):!e)}}),Zh=Cm({ariaLabel:String,ariaOrientation:{type:String,values:[`horizontal`,`vertical`,`undefined`]},ariaControls:String}),Qh=e=>fm(Zh,e),$h=e=>{let t=e.props,n=d(t)?Qp(t.map(e=>[e,{}])):t;e.setPropsDefaults=t=>{if(n){for(let[e,r]of Object.entries(t)){let t=n[e];if(u(n,e)){if(rd(t)){n[e]={...t,default:r};continue}n[e]={type:t,default:r}}}e.props=n}}},eg=(e,t)=>{if(e.install=n=>{for(let r of[e,...Object.values(t??{})])n.component(r.name,r)},t)for(let[n,r]of Object.entries(t))e[n]=r;return $h(e),e},tg=(e,t)=>(e.install=n=>{e._context=n._context,n.config.globalProperties[t]=e},e),ng=e=>(e.install=r,$h(e),e),rg=B({name:`Check`,__name:`check`,setup(e){return(e,t)=>(U(),W(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 1024 1024`},[K(`path`,{fill:`currentColor`,d:`M406.656 706.944 195.84 496.256a32 32 0 1 0-45.248 45.248l256 256 512-512a32 32 0 0 0-45.248-45.248L406.592 706.944z`})]))}}),ig=B({name:`CircleCheck`,__name:`circle-check`,setup(e){return(e,t)=>(U(),W(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 1024 1024`},[K(`path`,{fill:`currentColor`,d:`M512 896a384 384 0 1 0 0-768 384 384 0 0 0 0 768m0 64a448 448 0 1 1 0-896 448 448 0 0 1 0 896`}),K(`path`,{fill:`currentColor`,d:`M745.344 361.344a32 32 0 0 1 45.312 45.312l-288 288a32 32 0 0 1-45.312 0l-160-160a32 32 0 1 1 45.312-45.312L480 626.752z`})]))}}),ag=B({name:`CircleCloseFilled`,__name:`circle-close-filled`,setup(e){return(e,t)=>(U(),W(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 1024 1024`},[K(`path`,{fill:`currentColor`,d:`M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m0 393.664L407.936 353.6a38.4 38.4 0 1 0-54.336 54.336L457.664 512 353.6 616.064a38.4 38.4 0 1 0 54.336 54.336L512 566.336 616.064 670.4a38.4 38.4 0 1 0 54.336-54.336L566.336 512 670.4 407.936a38.4 38.4 0 1 0-54.336-54.336z`})]))}}),og=B({name:`CircleClose`,__name:`circle-close`,setup(e){return(e,t)=>(U(),W(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 1024 1024`},[K(`path`,{fill:`currentColor`,d:`m466.752 512-90.496-90.496a32 32 0 0 1 45.248-45.248L512 466.752l90.496-90.496a32 32 0 1 1 45.248 45.248L557.248 512l90.496 90.496a32 32 0 1 1-45.248 45.248L512 557.248l-90.496 90.496a32 32 0 0 1-45.248-45.248z`}),K(`path`,{fill:`currentColor`,d:`M512 896a384 384 0 1 0 0-768 384 384 0 0 0 0 768m0 64a448 448 0 1 1 0-896 448 448 0 0 1 0 896`})]))}}),sg=B({name:`Close`,__name:`close`,setup(e){return(e,t)=>(U(),W(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 1024 1024`},[K(`path`,{fill:`currentColor`,d:`M764.288 214.592 512 466.88 259.712 214.592a31.936 31.936 0 0 0-45.12 45.12L466.752 512 214.528 764.224a31.936 31.936 0 1 0 45.12 45.184L512 557.184l252.288 252.288a31.936 31.936 0 0 0 45.12-45.12L557.12 512.064l252.288-252.352a31.936 31.936 0 1 0-45.12-45.184z`})]))}}),cg=B({name:`FolderOpened`,__name:`folder-opened`,setup(e){return(e,t)=>(U(),W(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 1024 1024`},[K(`path`,{fill:`currentColor`,d:`M878.08 448H241.92l-96 384h636.16zM832 384v-64H485.76L357.504 192H128v448l57.92-231.744A32 32 0 0 1 216.96 384zm-24.96 512H96a32 32 0 0 1-32-32V160a32 32 0 0 1 32-32h287.872l128.384 128H864a32 32 0 0 1 32 32v96h23.04a32 32 0 0 1 31.04 39.744l-112 448A32 32 0 0 1 807.04 896`})]))}}),lg=B({name:`Hide`,__name:`hide`,setup(e){return(e,t)=>(U(),W(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 1024 1024`},[K(`path`,{fill:`currentColor`,d:`M876.8 156.8c0-9.6-3.2-16-9.6-22.4s-12.8-9.6-22.4-9.6-16 3.2-22.4 9.6L736 220.8c-64-32-137.6-51.2-224-60.8-160 16-288 73.6-377.6 176S0 496 0 512s48 73.6 134.4 176c22.4 25.6 44.8 48 73.6 67.2l-86.4 89.6c-6.4 6.4-9.6 12.8-9.6 22.4s3.2 16 9.6 22.4 12.8 9.6 22.4 9.6 16-3.2 22.4-9.6l704-710.4c3.2-6.4 6.4-12.8 6.4-22.4m-646.4 528Q115.2 579.2 76.8 512q43.2-72 153.6-172.8C304 272 400 230.4 512 224c64 3.2 124.8 19.2 176 44.8l-54.4 54.4C598.4 300.8 560 288 512 288c-64 0-115.2 22.4-160 64s-64 96-64 160c0 48 12.8 89.6 35.2 124.8L256 707.2c-9.6-6.4-19.2-16-25.6-22.4m140.8-96Q352 555.2 352 512c0-44.8 16-83.2 48-112s67.2-48 112-48c28.8 0 54.4 6.4 73.6 19.2zM889.599 336c-12.8-16-28.8-28.8-41.6-41.6l-48 48c73.6 67.2 124.8 124.8 150.4 169.6q-43.2 72-153.6 172.8c-73.6 67.2-172.8 108.8-284.8 115.2-51.2-3.2-99.2-12.8-140.8-28.8l-48 48c57.6 22.4 118.4 38.4 188.8 44.8 160-16 288-73.6 377.6-176S1024 528 1024 512s-48.001-73.6-134.401-176`}),K(`path`,{fill:`currentColor`,d:`M511.998 672c-12.8 0-25.6-3.2-38.4-6.4l-51.2 51.2c28.8 12.8 57.6 19.2 89.6 19.2 64 0 115.2-22.4 160-64 41.6-41.6 64-96 64-160 0-32-6.4-64-19.2-89.6l-51.2 51.2c3.2 12.8 6.4 25.6 6.4 38.4 0 44.8-16 83.2-48 112s-67.2 48-112 48`})]))}}),ug=B({name:`InfoFilled`,__name:`info-filled`,setup(e){return(e,t)=>(U(),W(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 1024 1024`},[K(`path`,{fill:`currentColor`,d:`M512 64a448 448 0 1 1 0 896.064A448 448 0 0 1 512 64m67.2 275.072c33.28 0 60.288-23.104 60.288-57.344s-27.072-57.344-60.288-57.344c-33.28 0-60.16 23.104-60.16 57.344s26.88 57.344 60.16 57.344M590.912 699.2c0-6.848 2.368-24.64 1.024-34.752l-52.608 60.544c-10.88 11.456-24.512 19.392-30.912 17.28a12.99 12.99 0 0 1-8.256-14.72l87.68-276.992c7.168-35.136-12.544-67.2-54.336-71.296-44.096 0-108.992 44.736-148.48 101.504 0 6.784-1.28 23.68.064 33.792l52.544-60.608c10.88-11.328 23.552-19.328 29.952-17.152a12.8 12.8 0 0 1 7.808 16.128L388.48 728.576c-10.048 32.256 8.96 63.872 55.04 71.04 67.84 0 107.904-43.648 147.456-100.416z`})]))}}),dg=B({name:`Loading`,__name:`loading`,setup(e){return(e,t)=>(U(),W(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 1024 1024`},[K(`path`,{fill:`currentColor`,d:`M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32m0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32m448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32m-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32M195.2 195.2a32 32 0 0 1 45.248 0L376.32 331.008a32 32 0 0 1-45.248 45.248L195.2 240.448a32 32 0 0 1 0-45.248m452.544 452.544a32 32 0 0 1 45.248 0L828.8 783.552a32 32 0 0 1-45.248 45.248L647.744 692.992a32 32 0 0 1 0-45.248M828.8 195.264a32 32 0 0 1 0 45.184L692.992 376.32a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0m-452.544 452.48a32 32 0 0 1 0 45.248L240.448 828.8a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0`})]))}}),fg=B({name:`SuccessFilled`,__name:`success-filled`,setup(e){return(e,t)=>(U(),W(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 1024 1024`},[K(`path`,{fill:`currentColor`,d:`M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m-55.808 536.384-99.52-99.584a38.4 38.4 0 1 0-54.336 54.336l126.72 126.72a38.27 38.27 0 0 0 54.336 0l262.4-262.464a38.4 38.4 0 1 0-54.272-54.336z`})]))}}),pg=B({name:`View`,__name:`view`,setup(e){return(e,t)=>(U(),W(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 1024 1024`},[K(`path`,{fill:`currentColor`,d:`M512 160c320 0 512 352 512 352S832 864 512 864 0 512 0 512s192-352 512-352m0 64c-225.28 0-384.128 208.064-436.8 288 52.608 79.872 211.456 288 436.8 288 225.28 0 384.128-208.064 436.8-288-52.608-79.872-211.456-288-436.8-288m0 64a224 224 0 1 1 0 448 224 224 0 0 1 0-448m0 64a160.19 160.19 0 0 0-160 160c0 88.192 71.744 160 160 160s160-71.808 160-160-71.744-160-160-160`})]))}}),mg=B({name:`WarningFilled`,__name:`warning-filled`,setup(e){return(e,t)=>(U(),W(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 1024 1024`},[K(`path`,{fill:`currentColor`,d:`M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m0 192a58.43 58.43 0 0 0-58.24 63.744l23.36 256.384a35.072 35.072 0 0 0 69.76 0l23.296-256.384A58.43 58.43 0 0 0 512 256m0 512a51.2 51.2 0 1 0 0-102.4 51.2 51.2 0 0 0 0 102.4`})]))}}),hg=$([String,Object,Function]),gg={Close:sg,SuccessFilled:fg,InfoFilled:ug,WarningFilled:mg,CircleCloseFilled:ag},_g={primary:ug,success:fg,warning:mg,error:ag,info:ug},vg={validating:dg,success:ig,error:og},yg=Cm({title:{type:String,default:``},description:{type:String,default:``},type:{type:String,values:ym(_g),default:`info`},closable:{type:Boolean,default:!0},closeText:{type:String,default:``},showIcon:Boolean,center:Boolean,effect:{type:String,values:[`light`,`dark`],default:`light`}}),bg={close:e=>e instanceof MouseEvent},xg=eg(B({name:`ElIcon`,inheritAttrs:!1,__name:`icon`,props:Cm({size:{type:$([Number,String])},color:{type:String}}),setup(e){let t=e,n=vh(`icon`),r=X(()=>{let{size:e,color:n}=t,r=oh(e);return!r&&!n?{}:{fontSize:r,"--color":n}});return(e,t)=>(U(),W(`i`,Ca({class:R(n).b(),style:r.value},e.$attrs),[V(e.$slots,`default`)],16))}})),Sg=eg(B({name:`ElAlert`,__name:`alert`,props:yg,emits:bg,setup(e,{emit:t}){let{Close:n}=gg,r=e,i=t,a=Kr(),o=vh(`alert`),s=L(!0),c=X(()=>_g[r.type]),l=X(()=>{if(r.description)return!0;let e=a.default?.();return e?Uh(e).some(e=>!Hh(e)):!1}),u=e=>{s.value=!1,i(`close`,e)};return(t,r)=>(U(),G(lo,{name:R(o).b(`fade`),persisted:``},{default:z(()=>[Ln(K(`div`,{class:A([R(o).b(),R(o).m(e.type),R(o).is(`center`,e.center),R(o).is(e.effect)]),role:`alert`},[e.showIcon&&(t.$slots.icon||c.value)?(U(),G(R(xg),{key:0,class:A([R(o).e(`icon`),R(o).is(`big`,l.value)])},{default:z(()=>[V(t.$slots,`icon`,{},()=>[(U(),G(Lr(c.value)))])]),_:3},8,[`class`])):Y(`v-if`,!0),K(`div`,{class:A(R(o).e(`content`))},[e.title||t.$slots.title?(U(),W(`span`,{key:0,class:A([R(o).e(`title`),{"with-description":l.value}])},[V(t.$slots,`title`,{},()=>[J(M(e.title),1)])],2)):Y(`v-if`,!0),l.value?(U(),W(`p`,{key:1,class:A(R(o).e(`description`))},[V(t.$slots,`default`,{},()=>[J(M(e.description),1)])],2)):Y(`v-if`,!0),e.closable?(U(),W(H,{key:2},[e.closeText?(U(),W(`div`,{key:0,class:A([R(o).e(`close-btn`),R(o).is(`customed`)]),onClick:u},M(e.closeText),3)):(U(),G(R(xg),{key:1,class:A(R(o).e(`close-btn`)),onClick:u},{default:z(()=>[q(R(n))]),_:1},8,[`class`]))],64)):Y(`v-if`,!0)],2)],2),[[Oo,s.value]])]),_:3},8,[`name`]))}})),Cg=Symbol(`formContextKey`),wg=Symbol(`formItemContextKey`),Tg=(e,t={})=>{let n=L(void 0),r=t.prop?n:Eh(`size`),i=t.global?n:Kh(),a=t.form?{size:void 0}:Bn(Cg,void 0),o=t.formItem?{size:void 0}:Bn(wg,void 0);return X(()=>r.value||R(e)||o?.size||a?.size||i.value||``)},Eg=e=>{let t=Eh(`disabled`),n=Bn(Cg,void 0);return X(()=>t.value??R(e)??n?.disabled??!1)},Dg=()=>({form:Bn(Cg,void 0),formItem:Bn(wg,void 0)}),Og=(e,{formItemContext:t,disableIdGeneration:n,disableIdManagement:r})=>{n||(n=L(!1)),r||(r=L(!1));let i=ka(),a=()=>{let e=i?.parent;for(;e;){if(e.type.name===`ElFormItem`)return!1;if(e.type.name===`ElLabelWrap`)return!0;e=e.parent}return!1},o=L(),s,c=X(()=>!!(!(e.label||e.ariaLabel)&&t&&t.inputIds&&t.inputIds?.length<=1));return Tr(()=>{s=Wn([rn(e,`id`),n],([e,n])=>{let i=e??(n?void 0:jh().value);i!==o.value&&(t?.removeInputId&&!a()&&(o.value&&t.removeInputId(o.value),!r?.value&&!n&&i&&t.addInputId(i)),o.value=i)},{immediate:!0})}),kr(()=>{s&&s(),t?.removeInputId&&o.value&&t.removeInputId(o.value)}),{isLabeledByFormItem:c,inputId:o}},kg=`focus-trap.focus-after-trapped`,Ag=`focus-trap.focus-after-released`,jg=`focus-trap.focusout-prevented`,Mg={cancelable:!0,bubbles:!1},Ng={cancelable:!0,bubbles:!1},Pg=`focusAfterTrapped`,Fg=`focusAfterReleased`,Ig=Symbol(`elFocusTrap`),Lg=L(),Rg=L(0),zg=L(0),Bg=0,Vg=e=>{let t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:e=>{let t=e.tagName===`INPUT`&&e.type===`hidden`;return e.disabled||e.hidden||t?NodeFilter.FILTER_SKIP:e.tabIndex>=0||e===document.activeElement?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t},Hg=(e,t)=>{for(let n of e)if(!Ug(n,t))return n},Ug=(e,t)=>{if(getComputedStyle(e).visibility===`hidden`)return!0;for(;e;){if(t&&e===t)return!1;if(getComputedStyle(e).display===`none`)return!0;e=e.parentElement}return!1},Wg=e=>{let t=Vg(e);return[Hg(t,e),Hg(t.reverse(),e)]},Gg=e=>e instanceof HTMLInputElement&&`select`in e,Kg=(e,t)=>{if(e){let n=document.activeElement;Zm(e,{preventScroll:!0}),zg.value=window.performance.now(),e!==n&&Gg(e)&&t&&e.select()}};function qg(e,t){let n=[...e],r=e.indexOf(t);return r!==-1&&n.splice(r,1),n}var Jg=()=>{let e=[];return{push:t=>{let n=e[0];n&&t!==n&&n.pause(),e=qg(e,t),e.unshift(t)},remove:t=>{e=qg(e,t),e[0]?.resume?.()}}},Yg=(e,t=!1)=>{let n=document.activeElement;for(let r of e)if(Kg(r,t),document.activeElement!==n)return},Xg=Jg(),Zg=()=>Rg.value>zg.value,Qg=()=>{Lg.value=`pointer`,Rg.value=window.performance.now()},$g=()=>{Lg.value=`keyboard`,Rg.value=window.performance.now()},e_=()=>(Tr(()=>{Bg===0&&(document.addEventListener(`mousedown`,Qg),document.addEventListener(`touchstart`,Qg),document.addEventListener(`keydown`,$g)),Bg++}),Or(()=>{Bg--,Bg<=0&&(document.removeEventListener(`mousedown`,Qg),document.removeEventListener(`touchstart`,Qg),document.removeEventListener(`keydown`,$g))}),{focusReason:Lg,lastUserFocusTimestamp:Rg,lastAutomatedFocusTimestamp:zg}),t_=e=>new CustomEvent(jg,{...Ng,detail:e}),n_=B({name:`ElFocusTrap`,inheritAttrs:!1,props:{loop:Boolean,trapped:Boolean,focusTrapEl:Object,focusStartEl:{type:[Object,String],default:`first`}},emits:[Pg,Fg,`focusin`,`focusout`,`focusout-prevented`,`release-requested`],setup(e,{emit:t}){let n=L(),r,i,{focusReason:a}=e_();Ph(n=>{e.trapped&&!o.paused&&t(`release-requested`,n)});let o={paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}},s=n=>{if(!e.loop&&!e.trapped||o.paused)return;let{altKey:r,ctrlKey:i,metaKey:s,currentTarget:c,shiftKey:l}=n,{loop:u}=e,d=wh(n)===vs.tab&&!r&&!i&&!s,f=document.activeElement;if(d&&f){let e=c,[r,i]=Wg(e);if(!(r&&i)){if(f===e){let e=t_({focusReason:a.value});t(`focusout-prevented`,e),e.defaultPrevented||n.preventDefault()}}else if(!l&&f===i){let e=t_({focusReason:a.value});t(`focusout-prevented`,e),e.defaultPrevented||(n.preventDefault(),u&&Kg(r,!0))}else if(l&&[r,e].includes(f)){let e=t_({focusReason:a.value});t(`focusout-prevented`,e),e.defaultPrevented||(n.preventDefault(),u&&Kg(i,!0))}}};zn(Ig,{focusTrapRef:n,onKeydown:s}),Wn(()=>e.focusTrapEl,e=>{e&&(n.value=e)},{immediate:!0}),Wn([n],([e],[t])=>{e&&(e.addEventListener(`keydown`,s),e.addEventListener(`focusin`,u),e.addEventListener(`focusout`,d)),t&&(t.removeEventListener(`keydown`,s),t.removeEventListener(`focusin`,u),t.removeEventListener(`focusout`,d))});let c=e=>{t(Pg,e)},l=e=>t(Fg,e),u=a=>{let s=R(n);if(!s)return;let c=a.target,l=a.relatedTarget,u=c&&s.contains(c);e.trapped||l&&s.contains(l)||(r=l),u&&t(`focusin`,a),!o.paused&&e.trapped&&(u?i=c:Kg(i,!0))},d=r=>{let s=R(n);if(!(o.paused||!s))if(e.trapped){let n=r.relatedTarget;!tm(n)&&!s.contains(n)&&setTimeout(()=>{if(!o.paused&&e.trapped){let e=t_({focusReason:a.value});t(`focusout-prevented`,e),e.defaultPrevented||Kg(i,!0)}},0)}else{let e=r.target;e&&s.contains(e)||t(`focusout`,r)}};async function f(){await Tn();let t=R(n);if(t){Xg.push(o);let n=t.contains(document.activeElement)?r:document.activeElement;if(r=n,!t.contains(n)){let r=new Event(kg,Mg);t.addEventListener(kg,c),t.dispatchEvent(r),r.defaultPrevented||Tn(()=>{let r=e.focusStartEl;g(r)||(Kg(r),document.activeElement!==r&&(r=`first`)),r===`first`&&Yg(Vg(t),!0),(document.activeElement===n||r===`container`)&&Kg(t)})}}}function p(){let e=R(n);if(e){e.removeEventListener(kg,c);let t=new CustomEvent(Ag,{...Mg,detail:{focusReason:a.value}});e.addEventListener(Ag,l),e.dispatchEvent(t),!t.defaultPrevented&&(a.value==`keyboard`||!Zg()||e.contains(document.activeElement))&&Kg(r??document.body),e.removeEventListener(Ag,l),Xg.remove(o),r=null,i=null}}return Tr(()=>{e.trapped&&f(),Wn(()=>e.trapped,e=>{e?f():p()})}),Or(()=>{e.trapped&&p(),n.value&&(n.value.removeEventListener(`keydown`,s),n.value.removeEventListener(`focusin`,u),n.value.removeEventListener(`focusout`,d),n.value=void 0),r=null,i=null}),{onKeydown:s}}}),r_=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n};function i_(e,t,n,r,i,a){return V(e.$slots,`default`,{handleKeydown:e.onKeydown})}var a_=r_(n_,[[`render`,i_]]),o_=e=>e,s_=Cm({id:{type:String,default:void 0},size:Wh,disabled:{type:Boolean,default:void 0},modelValue:{type:$([String,Number,Object]),default:``},modelModifiers:{type:$(Object),default:()=>({})},maxlength:{type:[String,Number]},minlength:{type:[String,Number]},type:{type:$(String),default:`text`},resize:{type:String,values:[`none`,`both`,`horizontal`,`vertical`]},autosize:{type:$([Boolean,Object]),default:!1},autocomplete:{type:$(String),default:`off`},formatter:{type:Function},parser:{type:Function},placeholder:{type:String},form:{type:String},readonly:Boolean,clearable:Boolean,clearIcon:{type:hg,default:og},showPassword:Boolean,showWordLimit:Boolean,wordLimitPosition:{type:String,values:[`inside`,`outside`],default:`inside`},suffixIcon:{type:hg},prefixIcon:{type:hg},containerRole:{type:String,default:void 0},tabindex:{type:[String,Number],default:0},validateEvent:{type:Boolean,default:!0},inputStyle:{type:$([Object,Array,String,Boolean]),default:()=>o_({})},countGraphemes:{type:$(Function)},autofocus:Boolean,rows:{type:Number,default:2},...Qh([`ariaLabel`]),inputmode:{type:$(String),default:void 0},name:String}),c_={[ys]:e=>g(e),input:e=>g(e),change:(e,t)=>g(e)&&(t instanceof Event||t===void 0),focus:e=>e instanceof FocusEvent,blur:e=>e instanceof FocusEvent,clear:e=>e===void 0||e instanceof MouseEvent,mouseleave:e=>e instanceof MouseEvent,mouseenter:e=>e instanceof MouseEvent,keydown:e=>e instanceof Event,compositionstart:e=>e instanceof CompositionEvent,compositionupdate:e=>e instanceof CompositionEvent,compositionend:e=>e instanceof CompositionEvent};Gt(og);var l_=void 0,u_={height:`0`,visibility:`hidden`,overflow:Qm()?``:`hidden`,position:`absolute`,"z-index":`-1000`,top:`0`,right:`0`},d_=[`letter-spacing`,`line-height`,`padding-top`,`padding-bottom`,`font-family`,`font-weight`,`font-size`,`text-rendering`,`text-transform`,`width`,`text-indent`,`padding-left`,`padding-right`,`border-width`,`box-sizing`,`word-break`],f_=e=>{let t=Number.parseFloat(e);return Number.isNaN(t)?e:t};function p_(e){let t=window.getComputedStyle(e),n=t.getPropertyValue(`box-sizing`),r=Number.parseFloat(t.getPropertyValue(`padding-bottom`))+Number.parseFloat(t.getPropertyValue(`padding-top`)),i=Number.parseFloat(t.getPropertyValue(`border-bottom-width`))+Number.parseFloat(t.getPropertyValue(`border-top-width`));return{contextStyle:d_.map(e=>[e,t.getPropertyValue(e)]),paddingSize:r,borderSize:i,boxSizing:n}}function m_(e,t=1,n){if(!l_){l_=document.createElement(`textarea`);let t=document.body;!Qm()&&e.parentNode&&(t=e.parentNode),t.appendChild(l_)}let{paddingSize:r,borderSize:i,boxSizing:a,contextStyle:o}=p_(e);o.forEach(([e,t])=>l_?.style.setProperty(e,t)),Object.entries(u_).forEach(([e,t])=>l_?.style.setProperty(e,t,`important`)),l_.value=e.value||e.placeholder||``;let s=l_.scrollHeight,c={};a===`border-box`?s+=i:a===`content-box`&&(s-=r),l_.value=``;let l=l_.scrollHeight-r;if(hm(t)){let e=l*t;a===`border-box`&&(e=e+r+i),s=Math.max(e,s),c.minHeight=`${e}px`}if(hm(n)){let e=l*n;a===`border-box`&&(e=e+r+i),s=Math.min(e,s)}return c.height=`${s}px`,l_.parentNode?.removeChild(l_),l_=void 0,c}var h_=[`id`,`name`,`minlength`,`maxlength`,`type`,`disabled`,`readonly`,`autocomplete`,`tabindex`,`aria-label`,`placeholder`,`form`,`autofocus`,`role`,`inputmode`],g_=[`id`,`name`,`minlength`,`maxlength`,`tabindex`,`disabled`,`readonly`,`autocomplete`,`aria-label`,`placeholder`,`form`,`autofocus`,`rows`,`role`,`inputmode`],__=`ElInput`,v_=eg(B({name:__,inheritAttrs:!1,__name:`input`,props:s_,emits:c_,setup(e,{expose:t,emit:n}){let i=e,a=n,o=qr(),s=Kr(),c=X(()=>[i.type===`textarea`?y.b():_.b(),_.m(h.value),_.is(`disabled`,g.value),_.is(`exceed`,j.value),{[_.b(`group`)]:s.prepend||s.append,[_.m(`prefix`)]:s.prefix||i.prefixIcon,[_.m(`suffix`)]:s.suffix||i.suffixIcon||i.clearable||i.showPassword,[_.bm(`suffix`,`password-clear`)]:pe.value&&me.value,[_.b(`hidden`)]:i.type===`hidden`},o.class]),l=X(()=>[_.e(`wrapper`),_.is(`focus`,re.value)]),u=km(),d=X(()=>i.maxlength?.toString()),{form:f,formItem:p}=Dg(),{inputId:m}=Og(i,{formItemContext:p}),h=Tg(),g=Eg(),_=vh(`input`),y=vh(`textarea`),b=Jt(),x=Jt(),S=L(!1),C=L(!1),w=L(),ee=L(),T=Jt(i.inputStyle),te=L(``),E=L(),D=X(()=>b.value||x.value),{wrapperRef:ne,isFocused:re,handleFocus:ie,handleBlur:ae}=qh(D,{disabled:g,afterBlur(){i.validateEvent&&p?.validate?.(`blur`).catch(r)}}),oe=X(()=>f?.statusIcon??!1),O=X(()=>p?.validateState||``),se=X(()=>O.value&&vg[O.value]),ce=X(()=>C.value?pg:lg),le=X(()=>[o.style]),ue=X(()=>[i.inputStyle,T.value,{resize:i.resize},E.value?{height:E.value}:void 0]),de=X(()=>tm(i.modelValue)?``:String(i.modelValue)),fe=X(()=>i.clearable&&!g.value&&!i.readonly),pe=X(()=>fe.value&&!!de.value&&(re.value||S.value)),me=X(()=>i.showPassword&&!g.value&&!!de.value),he=X(()=>i.showWordLimit&&!!d.value&&(i.type===`text`||i.type===`textarea`)&&!g.value&&!i.readonly&&!i.showPassword),ge=X(()=>i.countGraphemes&&i.showWordLimit?i.countGraphemes(de.value):de.value.length),j=X(()=>!!he.value&&ge.value>Number(d.value)),_e=X(()=>!!s.suffix||!!i.suffixIcon||i.clearable||i.showPassword||he.value||!!O.value&&oe.value),ve=X(()=>!!Object.keys(i.modelModifiers).length),[ye,be]=Vh(b),xe;Um(x,e=>{if(Se(),!he.value&&!fe.value||i.resize!==`both`&&i.resize!==`horizontal`)return;let{width:t}=e[0].target.getBoundingClientRect();xe&&bh(xe),xe=yh(()=>{xe=void 0,w.value={right:`calc(100% - ${t-10}px)`},ee.value={right:`calc(100% - ${t-11}px)`}})});let N=()=>{let{type:e,autosize:t}=i;if(!(!Mm||e!==`textarea`||!x.value))if(t){let e=v(t)?t.minRows:void 0,n=v(t)?t.maxRows:void 0,r=m_(x.value,e,n);T.value={overflowY:`hidden`,...r},Tn(()=>{x.value.offsetHeight,T.value=r})}else T.value={minHeight:m_(x.value).minHeight}},Se=(e=>{let t=!1;return()=>{if(t||!i.autosize){i.resize!==`none`&&setTimeout(()=>{E.value=x.value?.style.height});return}x.value?.offsetParent!==null&&(setTimeout(e),t=!0)}})(N),Ce=()=>{let e=D.value,t=i.formatter?i.formatter(de.value):de.value;!e||e.value===t||i.type===`file`||(e.value=t)},we=e=>{let{trim:t,number:n}=i.modelModifiers;return t&&(e=e.trim()),n&&(e=`${f_(e)}`),i.formatter&&i.parser&&(e=i.parser(e)),e},P=async e=>{if(Ee.value)return;let{lazy:t}=i.modelModifiers,{value:n}=e.target,r=!1;if(t){a(xs,n);return}if(n=we(n),i.countGraphemes&&d.value!=null){let e=Number(d.value),t=i.countGraphemes(n),a=i.countGraphemes(te.value);if(t>e&&t>a)if(a>e)n=te.value,r=!0;else{let t=te.value,o=n,s=0;for(;ss&&l>s&&t[c-1]===o[l-1];)c--,l--;let u=o.slice(0,s),d=t.slice(s,c),f=o.slice(s,l),p=o.slice(l),m=a-i.countGraphemes(d),h=Math.max(0,e-m),g=``;if(h>0)if(typeof Intl<`u`&&`Segmenter`in Intl){let e=new Intl.Segmenter(void 0,{granularity:`grapheme`});for(let{segment:t}of e.segment(f)){let e=g+t;if(i.countGraphemes(e)>h)break;g=e}}else for(let e of Array.from(f)){let t=g+e;if(i.countGraphemes(t)>h)break;g=t}n=u+g+p,r=!0}}if(String(n)===de.value){if(i.formatter||r){let t=e.target,n=t.value,i=t.selectionStart,a=t.selectionEnd;if(Ce(),r&&D.value&&i!=null&&a!=null){let e=D.value.value,t=n.slice(Math.max(0,a)),r=Math.min(i,e.length);t&&e.endsWith(t)&&(r=e.length-t.length),D.value.setSelectionRange(r,r)}}return}te.value=n,ye(),a(ys,n),a(xs,n),await Tn(),(i.formatter&&i.parser||!ve.value)&&Ce(),be()},Te=async e=>{let{value:t}=e.target;t=we(t),i.modelModifiers.lazy&&a(ys,t),a(bs,t,e),await Tn(),Ce()},{isComposing:Ee,handleCompositionStart:De,handleCompositionUpdate:Oe,handleCompositionEnd:ke}=Jh({emit:a,afterComposition:P}),Ae=()=>{C.value=!C.value},je=()=>D.value?.focus(),Me=()=>D.value?.blur(),Ne=e=>{S.value=!1,a(`mouseleave`,e)},Pe=e=>{S.value=!0,a(`mouseenter`,e)},Fe=e=>{a(`keydown`,e)},Ie=()=>{D.value?.select()},Le=e=>{a(ys,``),a(bs,``),a(`clear`,e),a(xs,``)};return Wn(()=>i.modelValue,()=>{Tn(()=>{N(),i.autosize&&(E.value=void 0)}),i.validateEvent&&p?.validate?.(`change`).catch(r)}),Wn(()=>de.value,e=>{te.value=e},{immediate:!0}),Wn(de,e=>{if(!D.value)return;let{trim:t,number:n}=i.modelModifiers,r=D.value.value,a=(n||i.type===`number`)&&!/^0\d/.test(r)?`${f_(r)}`:r;a!==e&&(document.activeElement===D.value&&D.value.type!==`range`&&t&&a.trim()===e||Ce())}),Wn(()=>i.type,async()=>{await Tn(),Ce(),N()}),Tr(()=>{!i.formatter&&i.parser&&Em(__,`If you set the parser, you also need to set the formatter.`),Ce(),Tn(N)}),Or(()=>{xe&&bh(xe)}),t({input:b,textarea:x,ref:D,textareaStyle:ue,autosize:rn(i,`autosize`),isComposing:Ee,passwordVisible:C,focus:je,blur:Me,select:Ie,clear:Le,resizeTextarea:N}),(t,n)=>(U(),W(`div`,{class:A([c.value,{[R(_).bm(`group`,`append`)]:t.$slots.append,[R(_).bm(`group`,`prepend`)]:t.$slots.prepend}]),style:k(le.value),onMouseenter:Pe,onMouseleave:Ne},[Y(` input `),e.type===`textarea`?(U(),W(H,{key:1},[Y(` textarea `),K(`textarea`,Ca({id:R(m),ref_key:`textarea`,ref:x,class:[R(y).e(`inner`),R(_).is(`focus`,R(re)),R(y).is(`clearable`,e.clearable)]},R(u),{name:e.name,minlength:e.countGraphemes?void 0:e.minlength,maxlength:e.countGraphemes?void 0:d.value,tabindex:e.tabindex,disabled:R(g),readonly:e.readonly,autocomplete:e.autocomplete,style:ue.value,"aria-label":e.ariaLabel,placeholder:e.placeholder,form:e.form,autofocus:e.autofocus,rows:e.rows,role:e.containerRole,inputmode:e.inputmode,onCompositionstart:n[3]||(n[3]=(...e)=>R(De)&&R(De)(...e)),onCompositionupdate:n[4]||(n[4]=(...e)=>R(Oe)&&R(Oe)(...e)),onCompositionend:n[5]||(n[5]=(...e)=>R(ke)&&R(ke)(...e)),onInput:P,onFocus:n[6]||(n[6]=(...e)=>R(ie)&&R(ie)(...e)),onBlur:n[7]||(n[7]=(...e)=>R(ae)&&R(ae)(...e)),onChange:Te,onKeydown:Fe}),null,16,g_),pe.value?(U(),G(R(xg),{key:0,class:A([R(y).e(`icon`),R(y).e(`clear`)]),style:k(ee.value),onMousedown:cs(R(r),[`prevent`]),onClick:Le},{default:z(()=>[(U(),G(Lr(e.clearIcon)))]),_:1},8,[`class`,`style`,`onMousedown`])):Y(`v-if`,!0),he.value?(U(),W(`span`,{key:1,style:k(w.value),class:A([R(_).e(`count`),R(_).is(`outside`,e.wordLimitPosition===`outside`)])},M(ge.value)+` / `+M(d.value),7)):Y(`v-if`,!0)],64)):(U(),W(H,{key:0},[Y(` prepend slot `),t.$slots.prepend?(U(),W(`div`,{key:0,class:A(R(_).be(`group`,`prepend`))},[V(t.$slots,`prepend`)],2)):Y(`v-if`,!0),K(`div`,{ref_key:`wrapperRef`,ref:ne,class:A(l.value)},[Y(` prefix slot `),t.$slots.prefix||e.prefixIcon?(U(),W(`span`,{key:0,class:A(R(_).e(`prefix`))},[K(`span`,{class:A(R(_).e(`prefix-inner`))},[V(t.$slots,`prefix`),e.prefixIcon?(U(),G(R(xg),{key:0,class:A(R(_).e(`icon`))},{default:z(()=>[(U(),G(Lr(e.prefixIcon)))]),_:1},8,[`class`])):Y(`v-if`,!0)],2)],2)):Y(`v-if`,!0),K(`input`,Ca({id:R(m),ref_key:`input`,ref:b,class:R(_).e(`inner`)},R(u),{name:e.name,minlength:e.countGraphemes?void 0:e.minlength,maxlength:e.countGraphemes?void 0:d.value,type:e.showPassword?C.value?`text`:`password`:e.type,disabled:R(g),readonly:e.readonly,autocomplete:e.autocomplete,tabindex:e.tabindex,"aria-label":e.ariaLabel,placeholder:e.placeholder,style:e.inputStyle,form:e.form,autofocus:e.autofocus,role:e.containerRole,inputmode:e.inputmode,onCompositionstart:n[0]||(n[0]=(...e)=>R(De)&&R(De)(...e)),onCompositionupdate:n[1]||(n[1]=(...e)=>R(Oe)&&R(Oe)(...e)),onCompositionend:n[2]||(n[2]=(...e)=>R(ke)&&R(ke)(...e)),onInput:P,onChange:Te,onKeydown:Fe}),null,16,h_),Y(` suffix slot `),_e.value?(U(),W(`span`,{key:1,class:A(R(_).e(`suffix`))},[K(`span`,{class:A(R(_).e(`suffix-inner`))},[fe.value?(U(),G(R(xg),{key:0,class:A([R(_).e(`icon`),R(_).e(`clear`)]),style:k({visibility:pe.value?`visible`:`hidden`}),onMousedown:cs(R(r),[`prevent`]),onClick:Le},{default:z(()=>[(U(),G(Lr(e.clearIcon)))]),_:1},8,[`class`,`style`,`onMousedown`])):Y(`v-if`,!0),!pe.value||!me.value||!he.value?(U(),W(H,{key:1},[V(t.$slots,`suffix`),e.suffixIcon?(U(),G(R(xg),{key:0,class:A(R(_).e(`icon`))},{default:z(()=>[(U(),G(Lr(e.suffixIcon)))]),_:1},8,[`class`])):Y(`v-if`,!0)],64)):Y(`v-if`,!0),me.value?(U(),G(R(xg),{key:2,class:A([R(_).e(`icon`),R(_).e(`password`)]),onClick:Ae,onMousedown:cs(R(r),[`prevent`]),onMouseup:cs(R(r),[`prevent`])},{default:z(()=>[V(t.$slots,`password-icon`,{visible:C.value},()=>[(U(),G(Lr(ce.value)))])]),_:3},8,[`class`,`onMousedown`,`onMouseup`])):Y(`v-if`,!0),he.value?(U(),W(`span`,{key:3,class:A([R(_).e(`count`),R(_).is(`outside`,e.wordLimitPosition===`outside`)])},[K(`span`,{class:A(R(_).e(`count-inner`))},M(ge.value)+` / `+M(d.value),3)],2)):Y(`v-if`,!0),O.value&&se.value&&oe.value?(U(),G(R(xg),{key:4,class:A([R(_).e(`icon`),R(_).e(`validateIcon`),R(_).is(`loading`,O.value===`validating`)])},{default:z(()=>[(U(),G(Lr(se.value)))]),_:1},8,[`class`])):Y(`v-if`,!0)],2)],2)):Y(`v-if`,!0)],2),Y(` append slot `),t.$slots.append?(U(),W(`div`,{key:1,class:A(R(_).be(`group`,`append`))},[V(t.$slots,`append`)],2)):Y(`v-if`,!0)],64))],38))}})),y_=eg(B({name:`ElBadge`,__name:`badge`,props:Cm({value:{type:[String,Number],default:``},max:{type:Number,default:99},isDot:Boolean,hidden:Boolean,type:{type:String,values:[`primary`,`success`,`warning`,`info`,`danger`],default:`danger`},showZero:{type:Boolean,default:!0},color:String,badgeStyle:{type:$([String,Object,Array,Boolean]),default:void 0},offset:{type:$(Array),default:()=>[0,0]},badgeClass:{type:String}}),setup(e,{expose:t}){let n=e,r=vh(`badge`),i=X(()=>n.isDot?``:hm(n.value)&&hm(n.max)&&n.max[{backgroundColor:n.color,marginRight:oh(-n.offset[0]),marginTop:oh(n.offset[1])},n.badgeStyle??{}]);return t({content:i}),(t,n)=>(U(),W(`div`,{class:A(R(r).b())},[V(t.$slots,`default`),q(lo,{name:`${R(r).namespace.value}-zoom-in-center`},{default:z(()=>[!e.hidden&&(i.value||e.isDot||t.$slots.content)?(U(),W(`sup`,{key:0,class:A([R(r).e(`content`),R(r).em(`content`,e.type),R(r).is(`fixed`,!!t.$slots.default),R(r).is(`dot`,e.isDot),R(r).is(`hide-zero`,!e.showZero&&e.value===0),e.badgeClass]),style:k(a.value)},[V(t.$slots,`content`,{value:i.value},()=>[J(M(i.value),1)])],6)):Y(`v-if`,!0)]),_:3},8,[`name`])],2))}})),b_=Cm({size:Wh,disabled:{type:Boolean,default:void 0},type:{type:String,values:[`default`,`primary`,`success`,`warning`,`info`,`danger`,`text`,``],default:``},icon:{type:hg},nativeType:{type:String,values:[`button`,`submit`,`reset`],default:`button`},loading:Boolean,loadingIcon:{type:hg,default:()=>dg},plain:{type:Boolean,default:void 0},text:{type:Boolean,default:void 0},link:Boolean,bg:Boolean,autofocus:Boolean,round:{type:Boolean,default:void 0},circle:Boolean,dashed:{type:Boolean,default:void 0},color:String,dark:Boolean,autoInsertSpace:{type:Boolean,default:void 0},tag:{type:$([String,Object]),default:`button`}}),x_={click:e=>e instanceof MouseEvent},S_=Symbol(),C_=L();function w_(e,t=void 0){let n=ka()?Bn(S_,C_):C_;return e?X(()=>n.value?.[e]??t):n}function T_(e,t){let n=w_(),r=vh(e,X(()=>n.value?.namespace||`el`)),i=ph(X(()=>n.value?.locale)),a=Bh(X(()=>{let e=n.value?.zIndex;return tm(e)||Number.isNaN(e)?Lh:e})),o=X(()=>R(t)||n.value?.size||``);return E_(X(()=>R(n)||{})),{ns:r,locale:i,zIndex:a,size:o}}var E_=(e,t,n=!1)=>{let r=!!ka(),i=r?w_():void 0,a=t?.provide??(r?zn:void 0);if(!a){Em(`provideGlobalConfig`,`provideGlobalConfig() can only be used inside setup().`);return}let o=X(()=>{let t=R(e);return i?.value?D_(i.value,t):t});return a(S_,o),a(fh,X(()=>o.value.locale)),a(gh,X(()=>o.value.namespace)),a(zh,X(()=>o.value.zIndex)),a(Gh,{size:X(()=>o.value.size||``)}),a(Yh,X(()=>({emptyValues:o.value.emptyValues,valueOnClear:o.value.valueOnClear}))),(n||!C_.value)&&(C_.value=o.value),o},D_=(e,t)=>{let n=[...new Set([...ym(e),...ym(t)])],r={};for(let i of n)r[i]=t[i]===void 0?e[i]:t[i];return r};Cm({a11y:{type:Boolean,default:!0},locale:{type:$(Object)},size:Wh,button:{type:$(Object)},card:{type:$(Object)},dialog:{type:$(Object)},link:{type:$(Object)},experimentalFeatures:{type:$(Object)},keyboardNavigation:{type:Boolean,default:!0},message:{type:$(Object)},zIndex:Number,namespace:{type:String,default:`el`},table:{type:$(Object)},...Xh});var O_={placement:`top`},k_=Symbol(`buttonGroupContextKey`),A_=(e,t)=>{Wm({from:`type.text`,replacement:`link`,version:`3.0.0`,scope:`props`,ref:`https://element-plus.org/en-US/component/button.html#button-attributes`},X(()=>e.type===`text`));let n=Bn(k_,void 0),r=w_(`button`),{form:i}=Dg(),a=Tg(X(()=>n?.size)),o=Eg(),s=L(),c=Kr(),l=X(()=>e.type||n?.type||r.value?.type||``),u=X(()=>e.autoInsertSpace??r.value?.autoInsertSpace??!1),d=X(()=>e.plain??r.value?.plain??!1),f=X(()=>e.round??r.value?.round??!1),p=X(()=>e.text??r.value?.text??!1),m=X(()=>e.dashed??r.value?.dashed??!1);return{_disabled:o,_size:a,_type:l,_ref:s,_props:X(()=>e.tag===`button`?{ariaDisabled:o.value||e.loading,disabled:o.value||e.loading,autofocus:e.autofocus,type:e.nativeType}:{}),_plain:d,_round:f,_text:p,_dashed:m,shouldAddSpace:X(()=>{let e=c.default?.();if(u.value&&e?.length===1){let t=e[0];if(t?.type===ia){let e=t.children;return/^\p{Unified_Ideograph}{2}$/u.test(e.trim())}}return!1}),handleClick:n=>{if(o.value||e.loading){n.stopPropagation();return}e.nativeType===`reset`&&i?.resetFields(),t(`click`,n)}}};function j_(e,t){N_(e)&&(e=`100%`);let n=P_(e);return e=t===360?e:Math.min(t,Math.max(0,parseFloat(e))),n&&(e=parseInt(String(e*t),10)/100),Math.abs(e-t)<1e-6?1:(e=t===360?(e<0?e%t+t:e%t)/parseFloat(String(t)):e%t/parseFloat(String(t)),e)}function M_(e){return Math.min(1,Math.max(0,e))}function N_(e){return typeof e==`string`&&e.indexOf(`.`)!==-1&&parseFloat(e)===1}function P_(e){return typeof e==`string`&&e.indexOf(`%`)!==-1}function F_(e){return e=parseFloat(e),(isNaN(e)||e<0||e>1)&&(e=1),e}function I_(e){return Number(e)<=1?`${Number(e)*100}%`:e}function L_(e){return e.length===1?`0`+e:String(e)}function R_(e,t,n){return{r:j_(e,255)*255,g:j_(t,255)*255,b:j_(n,255)*255}}function z_(e,t,n){e=j_(e,255),t=j_(t,255),n=j_(n,255);let r=Math.max(e,t,n),i=Math.min(e,t,n),a=0,o=0,s=(r+i)/2;if(r===i)o=0,a=0;else{let c=r-i;switch(o=s>.5?c/(2-r-i):c/(r+i),r){case e:a=(t-n)/c+(t1&&--n,n<1/6?e+(t-e)*(6*n):n<1/2?t:n<2/3?e+(t-e)*(2/3-n)*6:e}function V_(e,t,n){let r,i,a;if(e=j_(e,360),t=j_(t,100),n=j_(n,100),t===0)i=n,a=n,r=n;else{let o=n<.5?n*(1+t):n+t-n*t,s=2*n-o;r=B_(s,o,e+1/3),i=B_(s,o,e),a=B_(s,o,e-1/3)}return{r:r*255,g:i*255,b:a*255}}function H_(e,t,n){e=j_(e,255),t=j_(t,255),n=j_(n,255);let r=Math.max(e,t,n),i=Math.min(e,t,n),a=0,o=r,s=r-i,c=r===0?0:s/r;if(r===i)a=0;else{switch(r){case e:a=(t-n)/s+(t>16,g:(e&65280)>>8,b:e&255}}var Q_={aliceblue:`#f0f8ff`,antiquewhite:`#faebd7`,aqua:`#00ffff`,aquamarine:`#7fffd4`,azure:`#f0ffff`,beige:`#f5f5dc`,bisque:`#ffe4c4`,black:`#000000`,blanchedalmond:`#ffebcd`,blue:`#0000ff`,blueviolet:`#8a2be2`,brown:`#a52a2a`,burlywood:`#deb887`,cadetblue:`#5f9ea0`,chartreuse:`#7fff00`,chocolate:`#d2691e`,coral:`#ff7f50`,cornflowerblue:`#6495ed`,cornsilk:`#fff8dc`,crimson:`#dc143c`,cyan:`#00ffff`,darkblue:`#00008b`,darkcyan:`#008b8b`,darkgoldenrod:`#b8860b`,darkgray:`#a9a9a9`,darkgreen:`#006400`,darkgrey:`#a9a9a9`,darkkhaki:`#bdb76b`,darkmagenta:`#8b008b`,darkolivegreen:`#556b2f`,darkorange:`#ff8c00`,darkorchid:`#9932cc`,darkred:`#8b0000`,darksalmon:`#e9967a`,darkseagreen:`#8fbc8f`,darkslateblue:`#483d8b`,darkslategray:`#2f4f4f`,darkslategrey:`#2f4f4f`,darkturquoise:`#00ced1`,darkviolet:`#9400d3`,deeppink:`#ff1493`,deepskyblue:`#00bfff`,dimgray:`#696969`,dimgrey:`#696969`,dodgerblue:`#1e90ff`,firebrick:`#b22222`,floralwhite:`#fffaf0`,forestgreen:`#228b22`,fuchsia:`#ff00ff`,gainsboro:`#dcdcdc`,ghostwhite:`#f8f8ff`,goldenrod:`#daa520`,gold:`#ffd700`,gray:`#808080`,green:`#008000`,greenyellow:`#adff2f`,grey:`#808080`,honeydew:`#f0fff0`,hotpink:`#ff69b4`,indianred:`#cd5c5c`,indigo:`#4b0082`,ivory:`#fffff0`,khaki:`#f0e68c`,lavenderblush:`#fff0f5`,lavender:`#e6e6fa`,lawngreen:`#7cfc00`,lemonchiffon:`#fffacd`,lightblue:`#add8e6`,lightcoral:`#f08080`,lightcyan:`#e0ffff`,lightgoldenrodyellow:`#fafad2`,lightgray:`#d3d3d3`,lightgreen:`#90ee90`,lightgrey:`#d3d3d3`,lightpink:`#ffb6c1`,lightsalmon:`#ffa07a`,lightseagreen:`#20b2aa`,lightskyblue:`#87cefa`,lightslategray:`#778899`,lightslategrey:`#778899`,lightsteelblue:`#b0c4de`,lightyellow:`#ffffe0`,lime:`#00ff00`,limegreen:`#32cd32`,linen:`#faf0e6`,magenta:`#ff00ff`,maroon:`#800000`,mediumaquamarine:`#66cdaa`,mediumblue:`#0000cd`,mediumorchid:`#ba55d3`,mediumpurple:`#9370db`,mediumseagreen:`#3cb371`,mediumslateblue:`#7b68ee`,mediumspringgreen:`#00fa9a`,mediumturquoise:`#48d1cc`,mediumvioletred:`#c71585`,midnightblue:`#191970`,mintcream:`#f5fffa`,mistyrose:`#ffe4e1`,moccasin:`#ffe4b5`,navajowhite:`#ffdead`,navy:`#000080`,oldlace:`#fdf5e6`,olive:`#808000`,olivedrab:`#6b8e23`,orange:`#ffa500`,orangered:`#ff4500`,orchid:`#da70d6`,palegoldenrod:`#eee8aa`,palegreen:`#98fb98`,paleturquoise:`#afeeee`,palevioletred:`#db7093`,papayawhip:`#ffefd5`,peachpuff:`#ffdab9`,peru:`#cd853f`,pink:`#ffc0cb`,plum:`#dda0dd`,powderblue:`#b0e0e6`,purple:`#800080`,rebeccapurple:`#663399`,red:`#ff0000`,rosybrown:`#bc8f8f`,royalblue:`#4169e1`,saddlebrown:`#8b4513`,salmon:`#fa8072`,sandybrown:`#f4a460`,seagreen:`#2e8b57`,seashell:`#fff5ee`,sienna:`#a0522d`,silver:`#c0c0c0`,skyblue:`#87ceeb`,slateblue:`#6a5acd`,slategray:`#708090`,slategrey:`#708090`,snow:`#fffafa`,springgreen:`#00ff7f`,steelblue:`#4682b4`,tan:`#d2b48c`,teal:`#008080`,thistle:`#d8bfd8`,tomato:`#ff6347`,turquoise:`#40e0d0`,violet:`#ee82ee`,wheat:`#f5deb3`,white:`#ffffff`,whitesmoke:`#f5f5f5`,yellow:`#ffff00`,yellowgreen:`#9acd32`};function $_(e){let t={r:0,g:0,b:0},n=1,r=null,i=null,a=null,o=!1,s=!1;return typeof e==`string`&&(e=tv(e)),typeof e==`object`&&(nv(e.r)&&nv(e.g)&&nv(e.b)?(t=R_(e.r,e.g,e.b),o=!0,s=String(e.r).substr(-1)===`%`?`prgb`:`rgb`):nv(e.h)&&nv(e.s)&&nv(e.v)?(r=I_(e.s),i=I_(e.v),t=U_(e.h,r,i),o=!0,s=`hsv`):nv(e.h)&&nv(e.s)&&nv(e.l)?(r=I_(e.s),a=I_(e.l),t=V_(e.h,r,a),o=!0,s=`hsl`):nv(e.c)&&nv(e.m)&&nv(e.y)&&nv(e.k)&&(t=K_(e.c,e.m,e.y,e.k),o=!0,s=`cmyk`),Object.prototype.hasOwnProperty.call(e,`a`)&&(n=e.a)),n=F_(n),{ok:o,format:e.format||s,r:Math.min(255,Math.max(t.r,0)),g:Math.min(255,Math.max(t.g,0)),b:Math.min(255,Math.max(t.b,0)),a:n}}var ev={CSS_UNIT:RegExp(`(?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?)`),rgb:RegExp(`rgb[\\s|\\(]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))\\s*\\)?`),rgba:RegExp(`rgba[\\s|\\(]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))\\s*\\)?`),hsl:RegExp(`hsl[\\s|\\(]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))\\s*\\)?`),hsla:RegExp(`hsla[\\s|\\(]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))\\s*\\)?`),hsv:RegExp(`hsv[\\s|\\(]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))\\s*\\)?`),hsva:RegExp(`hsva[\\s|\\(]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))\\s*\\)?`),cmyk:RegExp(`cmyk[\\s|\\(]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))\\s*\\)?`),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/};function tv(e){if(e=e.trim().toLowerCase(),e.length===0)return!1;let t=!1;if(Q_[e])e=Q_[e],t=!0;else if(e===`transparent`)return{r:0,g:0,b:0,a:0,format:`name`};let n=ev.rgb.exec(e);return n?{r:n[1],g:n[2],b:n[3]}:(n=ev.rgba.exec(e),n?{r:n[1],g:n[2],b:n[3],a:n[4]}:(n=ev.hsl.exec(e),n?{h:n[1],s:n[2],l:n[3]}:(n=ev.hsla.exec(e),n?{h:n[1],s:n[2],l:n[3],a:n[4]}:(n=ev.hsv.exec(e),n?{h:n[1],s:n[2],v:n[3]}:(n=ev.hsva.exec(e),n?{h:n[1],s:n[2],v:n[3],a:n[4]}:(n=ev.cmyk.exec(e),n?{c:n[1],m:n[2],y:n[3],k:n[4]}:(n=ev.hex8.exec(e),n?{r:X_(n[1]),g:X_(n[2]),b:X_(n[3]),a:Y_(n[4]),format:t?`name`:`hex8`}:(n=ev.hex6.exec(e),n?{r:X_(n[1]),g:X_(n[2]),b:X_(n[3]),format:t?`name`:`hex`}:(n=ev.hex4.exec(e),n?{r:X_(n[1]+n[1]),g:X_(n[2]+n[2]),b:X_(n[3]+n[3]),a:Y_(n[4]+n[4]),format:t?`name`:`hex8`}:(n=ev.hex3.exec(e),n?{r:X_(n[1]+n[1]),g:X_(n[2]+n[2]),b:X_(n[3]+n[3]),format:t?`name`:`hex`}:!1))))))))))}function nv(e){return typeof e==`number`?!Number.isNaN(e):ev.CSS_UNIT.test(e)}var rv=class e{constructor(t=``,n={}){if(t instanceof e)return t;typeof t==`number`&&(t=Z_(t)),this.originalInput=t;let r=$_(t);this.originalInput=t,this.r=r.r,this.g=r.g,this.b=r.b,this.a=r.a,this.roundA=Math.round(100*this.a)/100,this.format=n.format??r.format,this.gradientType=n.gradientType,this.r<1&&(this.r=Math.round(this.r)),this.g<1&&(this.g=Math.round(this.g)),this.b<1&&(this.b=Math.round(this.b)),this.isValid=r.ok}isDark(){return this.getBrightness()<128}isLight(){return!this.isDark()}getBrightness(){let e=this.toRgb();return(e.r*299+e.g*587+e.b*114)/1e3}getLuminance(){let e=this.toRgb(),t,n,r,i=e.r/255,a=e.g/255,o=e.b/255;return t=i<=.03928?i/12.92:((i+.055)/1.055)**2.4,n=a<=.03928?a/12.92:((a+.055)/1.055)**2.4,r=o<=.03928?o/12.92:((o+.055)/1.055)**2.4,.2126*t+.7152*n+.0722*r}getAlpha(){return this.a}setAlpha(e){return this.a=F_(e),this.roundA=Math.round(100*this.a)/100,this}isMonochrome(){let{s:e}=this.toHsl();return e===0}toHsv(){let e=H_(this.r,this.g,this.b);return{h:e.h*360,s:e.s,v:e.v,a:this.a}}toHsvString(){let e=H_(this.r,this.g,this.b),t=Math.round(e.h*360),n=Math.round(e.s*100),r=Math.round(e.v*100);return this.a===1?`hsv(${t}, ${n}%, ${r}%)`:`hsva(${t}, ${n}%, ${r}%, ${this.roundA})`}toHsl(){let e=z_(this.r,this.g,this.b);return{h:e.h*360,s:e.s,l:e.l,a:this.a}}toHslString(){let e=z_(this.r,this.g,this.b),t=Math.round(e.h*360),n=Math.round(e.s*100),r=Math.round(e.l*100);return this.a===1?`hsl(${t}, ${n}%, ${r}%)`:`hsla(${t}, ${n}%, ${r}%, ${this.roundA})`}toHex(e=!1){return W_(this.r,this.g,this.b,e)}toHexString(e=!1){return`#`+this.toHex(e)}toHex8(e=!1){return G_(this.r,this.g,this.b,this.a,e)}toHex8String(e=!1){return`#`+this.toHex8(e)}toHexShortString(e=!1){return this.a===1?this.toHexString(e):this.toHex8String(e)}toRgb(){return{r:Math.round(this.r),g:Math.round(this.g),b:Math.round(this.b),a:this.a}}toRgbString(){let e=Math.round(this.r),t=Math.round(this.g),n=Math.round(this.b);return this.a===1?`rgb(${e}, ${t}, ${n})`:`rgba(${e}, ${t}, ${n}, ${this.roundA})`}toPercentageRgb(){let e=e=>`${Math.round(j_(e,255)*100)}%`;return{r:e(this.r),g:e(this.g),b:e(this.b),a:this.a}}toPercentageRgbString(){let e=e=>Math.round(j_(e,255)*100);return this.a===1?`rgb(${e(this.r)}%, ${e(this.g)}%, ${e(this.b)}%)`:`rgba(${e(this.r)}%, ${e(this.g)}%, ${e(this.b)}%, ${this.roundA})`}toCmyk(){return{...q_(this.r,this.g,this.b)}}toCmykString(){let{c:e,m:t,y:n,k:r}=q_(this.r,this.g,this.b);return`cmyk(${e}, ${t}, ${n}, ${r})`}toName(){if(this.a===0)return`transparent`;if(this.a<1)return!1;let e=`#`+W_(this.r,this.g,this.b,!1);for(let[t,n]of Object.entries(Q_))if(e===n)return t;return!1}toString(e){let t=!!e;e=e??this.format;let n=!1,r=this.a<1&&this.a>=0;return!t&&r&&(e.startsWith(`hex`)||e===`name`)?e===`name`&&this.a===0?this.toName():this.toRgbString():(e===`rgb`&&(n=this.toRgbString()),e===`prgb`&&(n=this.toPercentageRgbString()),(e===`hex`||e===`hex6`)&&(n=this.toHexString()),e===`hex3`&&(n=this.toHexString(!0)),e===`hex4`&&(n=this.toHex8String(!0)),e===`hex8`&&(n=this.toHex8String()),e===`name`&&(n=this.toName()),e===`hsl`&&(n=this.toHslString()),e===`hsv`&&(n=this.toHsvString()),e===`cmyk`&&(n=this.toCmykString()),n||this.toHexString())}toNumber(){return(Math.round(this.r)<<16)+(Math.round(this.g)<<8)+Math.round(this.b)}clone(){return new e(this.toString())}lighten(t=10){let n=this.toHsl();return n.l+=t/100,n.l=M_(n.l),new e(n)}brighten(t=10){let n=this.toRgb();return n.r=Math.max(0,Math.min(255,n.r-Math.round(255*-(t/100)))),n.g=Math.max(0,Math.min(255,n.g-Math.round(255*-(t/100)))),n.b=Math.max(0,Math.min(255,n.b-Math.round(255*-(t/100)))),new e(n)}darken(t=10){let n=this.toHsl();return n.l-=t/100,n.l=M_(n.l),new e(n)}tint(e=10){return this.mix(`white`,e)}shade(e=10){return this.mix(`black`,e)}desaturate(t=10){let n=this.toHsl();return n.s-=t/100,n.s=M_(n.s),new e(n)}saturate(t=10){let n=this.toHsl();return n.s+=t/100,n.s=M_(n.s),new e(n)}greyscale(){return this.desaturate(100)}spin(t){let n=this.toHsl(),r=(n.h+t)%360;return n.h=r<0?360+r:r,new e(n)}mix(t,n=50){let r=this.toRgb(),i=new e(t).toRgb(),a=n/100;return new e({r:(i.r-r.r)*a+r.r,g:(i.g-r.g)*a+r.g,b:(i.b-r.b)*a+r.b,a:(i.a-r.a)*a+r.a})}analogous(t=6,n=30){let r=this.toHsl(),i=360/n,a=[this];for(r.h=(r.h-(i*t>>1)+720)%360;--t;)r.h=(r.h+i)%360,a.push(new e(r));return a}complement(){let t=this.toHsl();return t.h=(t.h+180)%360,new e(t)}monochromatic(t=6){let n=this.toHsv(),{h:r}=n,{s:i}=n,{v:a}=n,o=[],s=1/t;for(;t--;)o.push(new e({h:r,s:i,v:a})),a=(a+s)%1;return o}splitcomplement(){let t=this.toHsl(),{h:n}=t;return[this,new e({h:(n+72)%360,s:t.s,l:t.l}),new e({h:(n+216)%360,s:t.s,l:t.l})]}onBackground(t){let n=this.toRgb(),r=new e(t).toRgb(),i=n.a+r.a*(1-n.a);return new e({r:(n.r*n.a+r.r*r.a*(1-n.a))/i,g:(n.g*n.a+r.g*r.a*(1-n.a))/i,b:(n.b*n.a+r.b*r.a*(1-n.a))/i,a:i})}triad(){return this.polyad(3)}tetrad(){return this.polyad(4)}polyad(t){let n=this.toHsl(),{h:r}=n,i=[this],a=360/t;for(let o=1;o{let r={},i=e.color;if(i){let a=i.match(/var\((.*?)\)/);a&&(i=window.getComputedStyle(window.document.documentElement).getPropertyValue(a[1]));let o=new rv(i),s=e.dark?o.tint(20).toString():iv(o,20);if(e.plain)r=n.cssVarBlock({"bg-color":e.dark?iv(o,90):o.tint(90).toString(),"text-color":i,"border-color":e.dark?iv(o,50):o.tint(50).toString(),"hover-text-color":`var(${n.cssVarName(`color-white`)})`,"hover-bg-color":i,"hover-border-color":i,"active-bg-color":s,"active-text-color":`var(${n.cssVarName(`color-white`)})`,"active-border-color":s}),t.value&&(r[n.cssVarBlockName(`disabled-bg-color`)]=e.dark?iv(o,90):o.tint(90).toString(),r[n.cssVarBlockName(`disabled-text-color`)]=e.dark?iv(o,50):o.tint(50).toString(),r[n.cssVarBlockName(`disabled-border-color`)]=e.dark?iv(o,80):o.tint(80).toString());else if(e.link||e.text){let a=e.dark?iv(o,30):o.tint(30).toString();if(r=n.cssVarBlock({"text-color":i,"hover-text-color":a,"active-text-color":s}),e.link&&(r[n.cssVarBlockName(`hover-link-text-color`)]=a,r[n.cssVarBlockName(`active-color`)]=s),t.value){let t=e.dark?iv(o,50):o.tint(50).toString();r[n.cssVarBlockName(`disabled-bg-color`)]=`transparent`,r[n.cssVarBlockName(`disabled-text-color`)]=t,r[n.cssVarBlockName(`disabled-border-color`)]=`transparent`}}else{let a=e.dark?iv(o,30):o.tint(30).toString(),c=o.isDark()?`var(${n.cssVarName(`color-white`)})`:`var(${n.cssVarName(`color-black`)})`;if(r=n.cssVarBlock({"bg-color":i,"text-color":c,"border-color":i,"hover-bg-color":a,"hover-text-color":c,"hover-border-color":a,"active-bg-color":s,"active-border-color":s}),t.value){let t=e.dark?iv(o,50):o.tint(50).toString();r[n.cssVarBlockName(`disabled-bg-color`)]=t,r[n.cssVarBlockName(`disabled-text-color`)]=e.dark?`rgba(255, 255, 255, 0.5)`:`var(${n.cssVarName(`color-white`)})`,r[n.cssVarBlockName(`disabled-border-color`)]=t}}}return r})}var ov=B({name:`ElButton`,__name:`button`,props:b_,emits:x_,setup(e,{expose:t,emit:n}){let r=e,i=n,a=av(r),o=vh(`button`),{_ref:s,_size:c,_type:l,_disabled:u,_props:d,_plain:f,_round:p,_text:m,_dashed:h,shouldAddSpace:g,handleClick:_}=A_(r,i),v=X(()=>[o.b(),o.m(l.value),o.m(c.value),o.is(`disabled`,u.value),o.is(`loading`,r.loading),o.is(`plain`,f.value),o.is(`round`,p.value),o.is(`circle`,r.circle),o.is(`text`,m.value),o.is(`dashed`,h.value),o.is(`link`,r.link),o.is(`has-bg`,r.bg)]);return t({ref:s,size:c,type:l,disabled:u,shouldAddSpace:g}),(t,n)=>(U(),G(Lr(e.tag),Ca({ref_key:`_ref`,ref:s},R(d),{class:v.value,style:R(a),onClick:R(_)}),{default:z(()=>[e.loading?(U(),W(H,{key:0},[t.$slots.loading?V(t.$slots,`loading`,{key:0}):(U(),G(R(xg),{key:1,class:A(R(o).is(`loading`))},{default:z(()=>[(U(),G(Lr(e.loadingIcon)))]),_:1},8,[`class`]))],64)):e.icon||t.$slots.icon?(U(),G(R(xg),{key:1},{default:z(()=>[e.icon?(U(),G(Lr(e.icon),{key:0})):V(t.$slots,`icon`,{key:1})]),_:3})):Y(`v-if`,!0),t.$slots.default?(U(),W(`span`,{key:2,class:A({[R(o).em(`text`,`expand`)]:R(g)})},[V(t.$slots,`default`)],2)):Y(`v-if`,!0)]),_:3},16,[`class`,`style`,`onClick`]))}}),sv=B({name:`ElButtonGroup`,__name:`button-group`,props:{size:b_.size,type:b_.type,direction:{type:$(String),values:[`horizontal`,`vertical`],default:`horizontal`}},setup(e){let t=e;zn(k_,It({size:rn(t,`size`),type:rn(t,`type`)}));let n=vh(`button`);return(e,r)=>(U(),W(`div`,{class:A([R(n).b(`group`),R(n).bm(`group`,t.direction)])},[V(e.$slots,`default`)],2))}}),cv=eg(ov,{ButtonGroup:sv});ng(sv);var lv=`_trap-focus-children`,uv=[],dv=e=>{if(uv.length===0)return;let t=wh(e),n=uv[uv.length-1][lv];if(n.length>0&&t===vs.tab){if(n.length===1){e.preventDefault(),document.activeElement!==n[0]&&n[0].focus();return}let t=e.shiftKey,r=e.target===n[0],i=e.target===n[n.length-1];r&&t&&(e.preventDefault(),n[n.length-1].focus()),i&&!t&&(e.preventDefault(),n[0].focus())}},fv={beforeMount(e){e[lv]=Ym(e),uv.push(e),uv.length<=1&&document.addEventListener(`keydown`,dv)},updated(e){Tn(()=>{e[lv]=Ym(e)})},unmounted(){uv.shift(),uv.length===0&&document.removeEventListener(`keydown`,dv)}},pv=Cm({modelValue:{type:[String,Number,Boolean],default:void 0},size:Wh,disabled:{type:Boolean,default:void 0},label:{type:[String,Number,Boolean],default:void 0},value:{type:[String,Number,Boolean],default:void 0},name:{type:String,default:void 0}}),mv=Cm({...pv,border:Boolean}),hv={[ys]:e=>g(e)||hm(e)||mm(e),[bs]:e=>g(e)||hm(e)||mm(e)},gv=Symbol(`radioGroupKey`),_v=Cm({...pv}),vv={label:`label`,value:`value`,disabled:`disabled`},yv=Cm({id:{type:String,default:void 0},size:Wh,disabled:{type:Boolean,default:void 0},modelValue:{type:[String,Number,Boolean],default:void 0},fill:{type:String,default:``},textColor:{type:String,default:``},name:{type:String,default:void 0},validateEvent:{type:Boolean,default:!0},options:{type:$(Array)},props:{type:$(Object),default:()=>vv},type:{type:String,values:[`radio`,`button`],default:`radio`},...Qh([`ariaLabel`])}),bv=hv,xv=(e,t)=>{let n=L(),r=Bn(gv,void 0),i=X(()=>!!r),a=X(()=>_m(e.value)?e.label:e.value),o=X({get(){return i.value?r.modelValue:e.modelValue},set(o){i.value?r.changeEvent(o):t&&t(`update:modelValue`,o),n.value.checked=e.modelValue===a.value}}),s=Tg(X(()=>r?.size)),c=Eg(X(()=>r?.disabled)),l=L(!1),u=X(()=>c.value||i.value&&o.value!==a.value?-1:0);return Wm({from:`label act as value`,replacement:`value`,version:`3.0.0`,scope:`el-radio`,ref:`https://element-plus.org/en-US/component/radio.html`},X(()=>i.value&&_m(e.value))),{radioRef:n,isGroup:i,radioGroup:r,focus:l,size:s,disabled:c,tabIndex:u,modelValue:o,actualValue:a}},Sv=[`value`,`name`,`disabled`,`checked`],Cv=B({name:`ElRadio`,__name:`radio`,props:mv,emits:hv,setup(e,{emit:t}){let n=e,r=t,i=vh(`radio`),{radioRef:a,radioGroup:o,focus:s,size:c,disabled:l,modelValue:u,actualValue:d}=xv(n,r);function f(){Tn(()=>r(bs,u.value))}return(t,n)=>(U(),W(`label`,{class:A([R(i).b(),R(i).is(`disabled`,R(l)),R(i).is(`focus`,R(s)),R(i).is(`bordered`,e.border),R(i).is(`checked`,R(u)===R(d)),R(i).m(R(c))])},[K(`span`,{class:A([R(i).e(`input`),R(i).is(`disabled`,R(l)),R(i).is(`checked`,R(u)===R(d))])},[Ln(K(`input`,{ref_key:`radioRef`,ref:a,"onUpdate:modelValue":n[0]||(n[0]=e=>I(u)?u.value=e:null),class:A(R(i).e(`original`)),value:R(d),name:e.name||R(o)?.name,disabled:R(l),checked:R(u)===R(d),type:`radio`,onFocus:n[1]||(n[1]=e=>s.value=!0),onBlur:n[2]||(n[2]=e=>s.value=!1),onChange:f,onClick:n[3]||(n[3]=cs(()=>{},[`stop`]))},null,42,Sv),[[is,R(u)]]),K(`span`,{class:A(R(i).e(`inner`))},null,2)],2),K(`span`,{class:A(R(i).e(`label`)),onKeydown:n[4]||(n[4]=cs(()=>{},[`stop`]))},[V(t.$slots,`default`,{},()=>[J(M(e.label),1)])],34)],2))}}),wv=[`value`,`name`,`disabled`],Tv=B({name:`ElRadioButton`,__name:`radio-button`,props:_v,setup(e){let t=e,n=vh(`radio`),{radioRef:r,focus:i,size:a,disabled:o,modelValue:s,radioGroup:c,actualValue:l}=xv(t),u=X(()=>({backgroundColor:c?.fill||``,borderColor:c?.fill||``,boxShadow:c?.fill?`-1px 0 0 0 ${c.fill}`:``,color:c?.textColor||``}));return(t,d)=>(U(),W(`label`,{class:A([R(n).b(`button`),R(n).is(`active`,R(s)===R(l)),R(n).is(`disabled`,R(o)),R(n).is(`focus`,R(i)),R(n).bm(`button`,R(a))])},[Ln(K(`input`,{ref_key:`radioRef`,ref:r,"onUpdate:modelValue":d[0]||(d[0]=e=>I(s)?s.value=e:null),class:A(R(n).be(`button`,`original-radio`)),value:R(l),type:`radio`,name:e.name||R(c)?.name,disabled:R(o),onFocus:d[1]||(d[1]=e=>i.value=!0),onBlur:d[2]||(d[2]=e=>i.value=!1),onClick:d[3]||(d[3]=cs(()=>{},[`stop`]))},null,42,wv),[[is,R(s)]]),K(`span`,{class:A(R(n).be(`button`,`inner`)),style:k(R(s)===R(l)?u.value:{}),onKeydown:d[4]||(d[4]=cs(()=>{},[`stop`]))},[V(t.$slots,`default`,{},()=>[J(M(e.label),1)])],38)],2))}}),Ev=[`id`,`aria-label`,`aria-labelledby`],Dv=B({name:`ElRadioGroup`,__name:`radio-group`,props:yv,emits:bv,setup(e,{emit:t}){let n=e,i=t,a=vh(`radio`),o=jh(),s=L(),{formItem:c}=Dg(),{inputId:l,isLabeledByFormItem:u}=Og(n,{formItemContext:c}),d=e=>{i(ys,e),Tn(()=>i(bs,e))};Tr(()=>{let e=s.value.querySelectorAll(`[type=radio]`),t=e[0];!Array.from(e).some(e=>e.checked)&&t&&(t.tabIndex=0)});let f=X(()=>n.name||o.value),p=X(()=>({...vv,...n.props})),m=e=>{let{label:t,value:n,disabled:r}=p.value,i={label:e[t],value:e[n],disabled:e[r]};return{...cm(e,[t,n,r]),...i}},h=X(()=>n.type===`button`?Tv:Cv);return zn(gv,It({...en(n),changeEvent:d,name:f})),Wn(()=>n.modelValue,(e,t)=>{n.validateEvent&&!em(e,t)&&c?.validate(`change`).catch(r)}),(t,n)=>(U(),W(`div`,{id:R(l),ref_key:`radioGroupRef`,ref:s,class:A(R(a).b(`group`)),role:`radiogroup`,"aria-label":R(u)?void 0:e.ariaLabel||`radio-group`,"aria-labelledby":R(u)?R(c).labelId:void 0},[V(t.$slots,`default`,{},()=>[(U(!0),W(H,null,Br(e.options,(e,t)=>(U(),G(Lr(h.value),Ca({key:t},{ref_for:!0},m(e)),null,16))),128))])],10,Ev))}}),Ov=eg(Cv,{RadioButton:Tv,RadioGroup:Dv}),kv=ng(Dv);ng(Tv);var Av=Cm({mask:{type:Boolean,default:!0},customMaskEvent:Boolean,overlayClass:{type:$([String,Array,Object])},zIndex:{type:$([String,Number])}}),jv={click:e=>e instanceof MouseEvent},Mv=`overlay`,Nv=B({name:`ElOverlay`,props:Av,emits:jv,setup(e,{slots:t,emit:n}){let r=vh(Mv),{onClick:i,onMousedown:a,onMouseup:o}=Dh(e.customMaskEvent?void 0:e=>{n(`click`,e)});return()=>e.mask?q(`div`,{class:[r.b(),e.overlayClass],style:{zIndex:e.zIndex},onClick:i,onMousedown:a,onMouseup:o},[V(t,`default`)],14,[`onClick`,`onMouseup`,`onMousedown`]):qa(`div`,{class:e.overlayClass,style:{zIndex:e.zIndex,position:`fixed`,top:`0px`,right:`0px`,bottom:`0px`,left:`0px`}},[V(t,`default`)])}}),Pv=Cm({type:{type:String,default:`line`,values:[`line`,`circle`,`dashboard`]},percentage:{type:Number,default:0,validator:e=>e>=0&&e<=100},status:{type:String,default:``,values:[``,`success`,`exception`,`warning`]},indeterminate:Boolean,duration:{type:Number,default:3},strokeWidth:{type:Number,default:6},strokeLinecap:{type:$(String),default:`round`},textInside:Boolean,width:{type:Number,default:126},showText:{type:Boolean,default:!0},color:{type:$([String,Array,Function]),default:``},striped:Boolean,stripedFlow:Boolean,format:{type:$(Function),default:e=>`${e}%`}}),Fv=[`aria-valuenow`],Iv={viewBox:`0 0 100 100`},Lv=[`d`,`stroke`,`stroke-linecap`,`stroke-width`],Rv=[`d`,`stroke`,`opacity`,`stroke-linecap`,`stroke-width`],zv={key:0},Bv=eg(B({name:`ElProgress`,__name:`progress`,props:Pv,setup(e){let t={success:`#13ce66`,exception:`#ff4949`,warning:`#e6a23c`,default:`#20a0ff`},n=e,r=vh(`progress`),i=X(()=>{let e={width:`${n.percentage}%`,animationDuration:`${n.duration}s`},t=b(n.percentage);return t.includes(`gradient`)?e.background=t:e.backgroundColor=t,e}),a=X(()=>(n.strokeWidth/n.width*100).toFixed(1)),o=X(()=>[`circle`,`dashboard`].includes(n.type)?Number.parseInt(`${50-Number.parseFloat(a.value)/2}`,10):0),s=X(()=>{let e=o.value,t=n.type===`dashboard`;return` + M 50 50 + m 0 ${t?``:`-`}${e} + a ${e} ${e} 0 1 1 0 ${t?`-`:``}${e*2} + a ${e} ${e} 0 1 1 0 ${t?``:`-`}${e*2} + `}),c=X(()=>2*Math.PI*o.value),l=X(()=>n.type===`dashboard`?.75:1),u=X(()=>`${-1*c.value*(1-l.value)/2}px`),d=X(()=>({strokeDasharray:`${c.value*l.value}px, ${c.value}px`,strokeDashoffset:u.value})),f=X(()=>({strokeDasharray:`${c.value*l.value*(n.percentage/100)}px, ${c.value}px`,strokeDashoffset:u.value,transition:`stroke-dasharray 0.6s ease 0s, stroke 0.6s ease, opacity ease 0.6s`})),p=X(()=>{let e;return e=n.color?b(n.percentage):t[n.status]||t.default,e}),m=X(()=>n.status===`warning`?mg:n.type===`line`?n.status===`success`?ig:og:n.status===`success`?rg:sg),_=X(()=>n.type===`line`?12+n.strokeWidth*.4:n.width*.111111+2),v=X(()=>n.format(n.percentage));function y(e){let t=100/e.length;return e.map((e,n)=>g(e)?{color:e,percentage:(n+1)*t}:e).sort((e,t)=>e.percentage-t.percentage)}let b=e=>{let{color:t}=n;if(h(t))return t(e);if(g(t))return t;{let n=y(t);for(let t of n)if(t.percentage>e)return t.color;return n[n.length-1]?.color}};return(t,n)=>(U(),W(`div`,{class:A([R(r).b(),R(r).m(e.type),R(r).is(e.status),{[R(r).m(`without-text`)]:!e.showText,[R(r).m(`text-inside`)]:e.textInside}]),role:`progressbar`,"aria-valuenow":e.percentage,"aria-valuemin":`0`,"aria-valuemax":`100`},[e.type===`line`?(U(),W(`div`,{key:0,class:A(R(r).b(`bar`))},[K(`div`,{class:A(R(r).be(`bar`,`outer`)),style:k({height:`${e.strokeWidth}px`})},[K(`div`,{class:A([R(r).be(`bar`,`inner`),{[R(r).bem(`bar`,`inner`,`indeterminate`)]:e.indeterminate},{[R(r).bem(`bar`,`inner`,`striped`)]:e.striped},{[R(r).bem(`bar`,`inner`,`striped-flow`)]:e.stripedFlow}]),style:k(i.value)},[(e.showText||t.$slots.default)&&e.textInside?(U(),W(`div`,{key:0,class:A(R(r).be(`bar`,`innerText`))},[V(t.$slots,`default`,{percentage:e.percentage},()=>[K(`span`,null,M(v.value),1)])],2)):Y(`v-if`,!0)],6)],6)],2)):(U(),W(`div`,{key:1,class:A(R(r).b(`circle`)),style:k({height:`${e.width}px`,width:`${e.width}px`})},[(U(),W(`svg`,Iv,[K(`path`,{class:A(R(r).be(`circle`,`track`)),d:s.value,stroke:`var(${R(r).cssVarName(`fill-color-light`)}, #e5e9f2)`,"stroke-linecap":e.strokeLinecap,"stroke-width":a.value,fill:`none`,style:k(d.value)},null,14,Lv),K(`path`,{class:A(R(r).be(`circle`,`path`)),d:s.value,stroke:p.value,fill:`none`,opacity:+!!e.percentage,"stroke-linecap":e.strokeLinecap,"stroke-width":a.value,style:k(f.value)},null,14,Rv)]))],6)),(e.showText||t.$slots.default)&&!e.textInside?(U(),W(`div`,{key:2,class:A(R(r).e(`text`)),style:k({fontSize:`${_.value}px`})},[V(t.$slots,`default`,{percentage:e.percentage},()=>[e.status?(U(),G(R(xg),{key:1},{default:z(()=>[(U(),G(Lr(m.value)))]),_:1})):(U(),W(`span`,zv,M(v.value),1))])],6)):Y(`v-if`,!0)],10,Fv))}})),Vv=e=>[``,...Ss].includes(e),Hv=[`primary`,`success`,`info`,`warning`,`error`],Uv=[`top`,`top-left`,`top-right`,`bottom`,`bottom-left`,`bottom-right`],Wv=o_({customClass:``,dangerouslyUseHTMLString:!1,duration:3e3,icon:void 0,id:``,message:``,onClose:void 0,showClose:!1,type:`info`,plain:!1,offset:16,placement:void 0,zIndex:0,grouping:!1,repeatNum:1,appendTo:Mm?document.body:void 0}),Gv=Cm({customClass:{type:String,default:Wv.customClass},dangerouslyUseHTMLString:{type:Boolean,default:Wv.dangerouslyUseHTMLString},duration:{type:Number,default:Wv.duration},icon:{type:hg,default:Wv.icon},id:{type:String,default:Wv.id},message:{type:$([String,Object,Function]),default:Wv.message},onClose:{type:$(Function),default:Wv.onClose},showClose:{type:Boolean,default:Wv.showClose},type:{type:String,values:Hv,default:Wv.type},plain:{type:Boolean,default:Wv.plain},offset:{type:Number,default:Wv.offset},placement:{type:String,values:Uv,default:Wv.placement},zIndex:{type:Number,default:Wv.zIndex},grouping:{type:Boolean,default:Wv.grouping},repeatNum:{type:Number,default:Wv.repeatNum}}),Kv={destroy:()=>!0},qv=Lt({}),Jv=e=>(qv[e]||(qv[e]=Lt([])),qv[e]),Yv=(e,t)=>{let n=qv[t]||[],r=n.findIndex(t=>t.id===e),i=n[r],a;return r>0&&(a=n[r-1]),{current:i,prev:a}},Xv=(e,t)=>{let{prev:n}=Yv(e,t);return n?n.vm.exposed.bottom.value:0},Zv=(e,t,n)=>(qv[n]||[]).findIndex(t=>t.id===e)>0?16:t,Qv=[`id`],$v=[`innerHTML`],ey=B({name:`ElMessage`,__name:`message`,props:Gv,emits:Kv,setup(e,{expose:t,emit:n}){let{Close:r}=gg,i=e,a=n,o=L(!1),{ns:s,zIndex:c}=T_(`message`),{currentZIndex:l,nextZIndex:u}=c,d=L(),f=L(!1),p=L(0),m,h=X(()=>i.type?i.type===`error`?`danger`:i.type:`info`),g=X(()=>{let e=i.type;return{[s.bm(`icon`,e)]:e&&_g[e]}}),_=X(()=>i.icon||_g[i.type]||``),v=X(()=>i.placement||`top`),y=X(()=>Xv(i.id,v.value)),b=X(()=>Math.max(Zv(i.id,i.offset,v.value)+y.value,i.offset)),x=X(()=>p.value+b.value),S=X(()=>v.value.includes(`left`)?s.is(`left`):v.value.includes(`right`)?s.is(`right`):s.is(`center`)),C=X(()=>v.value.startsWith(`top`)?`top`:`bottom`),w=X(()=>({[C.value]:`${b.value}px`,zIndex:l.value}));function ee(){i.duration!==0&&({stop:m}=Im(()=>{te()},i.duration))}function T(){m?.()}function te(){f.value=!1,Tn(()=>{o.value||(i.onClose?.(),a(`destroy`))})}function E(e){wh(e)===vs.esc&&te()}return Tr(()=>{ee(),u(),f.value=!0}),Wn(()=>i.repeatNum,()=>{T(),ee()}),Bm(document,`keydown`,E),Um(d,()=>{p.value=d.value.getBoundingClientRect().height}),t({visible:f,bottom:x,close:te}),(t,n)=>(U(),G(lo,{name:R(s).b(`fade`),onBeforeEnter:n[0]||(n[0]=e=>o.value=!0),onBeforeLeave:e.onClose,onAfterLeave:n[1]||(n[1]=e=>t.$emit(`destroy`)),persisted:``},{default:z(()=>[Ln(K(`div`,{id:e.id,ref_key:`messageRef`,ref:d,class:A([R(s).b(),{[R(s).m(e.type)]:e.type},R(s).is(`closable`,e.showClose),R(s).is(`plain`,e.plain),R(s).is(`bottom`,C.value===`bottom`),S.value,e.customClass]),style:k(w.value),role:`alert`,onMouseenter:T,onMouseleave:ee},[e.repeatNum>1?(U(),G(R(y_),{key:0,value:e.repeatNum,type:h.value,class:A(R(s).e(`badge`))},null,8,[`value`,`type`,`class`])):Y(`v-if`,!0),_.value?(U(),G(R(xg),{key:1,class:A([R(s).e(`icon`),g.value])},{default:z(()=>[(U(),G(Lr(_.value)))]),_:1},8,[`class`])):Y(`v-if`,!0),!e.dangerouslyUseHTMLString||t.$slots.default?(U(),W(`p`,{key:2,class:A(R(s).e(`content`))},[V(t.$slots,`default`,{},()=>[J(M(e.message),1)])],2)):(U(),W(H,{key:3},[Y(` Caution here, message could've been compromised, never use user's input as message `),K(`p`,{class:A(R(s).e(`content`)),innerHTML:e.message},null,10,$v)],2112)),e.showClose?(U(),G(R(xg),{key:4,class:A(R(s).e(`closeBtn`)),onClick:cs(te,[`stop`])},{default:z(()=>[q(R(r))]),_:1},8,[`class`])):Y(`v-if`,!0)],46,Qv),[[Oo,f.value]])]),_:3},8,[`name`,`onBeforeLeave`]))}}),ty=1,ny=e=>{if(!e.appendTo)e.appendTo=document.body;else if(g(e.appendTo)){let t=document.querySelector(e.appendTo);gm(t)||(Em(`ElMessage`,`the appendTo option is not an HTMLElement. Falling back to document.body.`),t=document.body),e.appendTo=t}},ry=e=>{!e.placement&&g(O_.placement)&&O_.placement&&(e.placement=O_.placement),e.placement||(e.placement=`top`),Uv.includes(e.placement)||(Em(`ElMessage`,`Invalid placement: ${e.placement}. Falling back to 'top'.`),e.placement=`top`)},iy=e=>{let t=!e||g(e)||pa(e)||h(e)?{message:e}:e,n={...Wv,...t};return ny(n),ry(n),mm(O_.grouping)&&!n.grouping&&(n.grouping=O_.grouping),hm(O_.duration)&&n.duration===3e3&&(n.duration=O_.duration),hm(O_.offset)&&n.offset===16&&(n.offset=O_.offset),mm(O_.showClose)&&!n.showClose&&(n.showClose=O_.showClose),mm(O_.plain)&&!n.plain&&(n.plain=O_.plain),n},ay=e=>{let t=qv[e.props.placement||`top`],n=t.indexOf(e);if(n===-1)return;t.splice(n,1);let{handler:r}=e;r.close()},oy=({appendTo:e,...t},n)=>{let r=`message_${ty++}`,i=t.onClose,a=document.createElement(`div`),o={...t,id:r,onClose:()=>{i?.(),ay(l)},onDestroy:()=>{ms(null,a)}},s=q(ey,o,h(o.message)||pa(o.message)?{default:h(o.message)?o.message:()=>o.message}:null);s.appContext=n||sy._context,ms(s,a),e.appendChild(a.firstElementChild);let c=s.component,l={id:r,vnode:s,vm:c,handler:{close:()=>{c.exposed.close()}},props:s.component.props};return l},sy=(e={},t)=>{if(!Mm)return{close:()=>void 0};let n=iy(e),r=Jv(n.placement||`top`);if(n.grouping&&r.length){let e=r.find(({vnode:e})=>e.props?.message===n.message);if(e)return e.props.repeatNum+=1,e.props.type=n.type,e.handler}if(hm(O_.max)&&r.length>=O_.max)return{close:()=>void 0};let i=oy(n,t);return r.push(i),i.handler};Hv.forEach(e=>{sy[e]=(t={},n)=>sy({...iy(t),type:e},n)});function cy(e){for(let t in qv)if(u(qv,t)){let n=[...qv[t]];for(let t of n)(!e||e===t.props.type)&&t.handler.close()}}function ly(e){qv[e]&&[...qv[e]].forEach(e=>e.handler.close())}sy.closeAll=cy,sy.closeAllByPlacement=ly,sy._context=null;var uy=tg(sy,`$message`),dy=B({name:`ElMessageBox`,directives:{TrapFocus:fv},components:{ElButton:cv,ElFocusTrap:a_,ElInput:v_,ElOverlay:Nv,ElIcon:xg,...gg},inheritAttrs:!1,props:{buttonSize:{type:String,validator:Vv},modal:{type:Boolean,default:!0},lockScroll:{type:Boolean,default:!0},showClose:{type:Boolean,default:!0},closeOnClickModal:{type:Boolean,default:!0},closeOnPressEscape:{type:Boolean,default:!0},closeOnHashChange:{type:Boolean,default:!0},center:Boolean,draggable:Boolean,overflow:Boolean,roundButton:Boolean,container:{type:String,default:`body`},boxType:{type:String,default:``}},emits:[`vanish`,`action`],setup(e,{emit:t}){let{locale:n,zIndex:r,ns:i,size:a}=T_(`message-box`,X(()=>e.buttonSize)),{t:o}=n,{nextZIndex:s}=r,c=L(!1),l=It({autofocus:!0,beforeClose:null,callback:null,cancelButtonText:``,cancelButtonClass:``,confirmButtonText:``,confirmButtonClass:``,cancelButtonType:``,confirmButtonType:`primary`,customClass:``,customStyle:{},dangerouslyUseHTMLString:!1,distinguishCancelAndClose:!1,icon:``,closeIcon:``,inputPattern:null,inputPlaceholder:``,inputType:`text`,inputValue:``,inputValidator:void 0,inputErrorMessage:``,message:``,modalFade:!0,modalClass:``,showCancelButton:!1,showConfirmButton:!0,type:``,title:void 0,showInput:!1,action:``,confirmButtonLoading:!1,cancelButtonLoading:!1,confirmButtonLoadingIcon:Gt(dg),cancelButtonLoadingIcon:Gt(dg),confirmButtonDisabled:!1,editorErrorMessage:``,validateError:!1,zIndex:s()}),u=X(()=>{let e=l.type;return{[i.bm(`icon`,e)]:e&&_g[e]}}),d=jh(),f=jh(),p=X(()=>{let e=l.type;return l.icon||e&&_g[e]||``}),m=X(()=>!!l.message),_=L(),v=L(),y=L(),b=L(),x=L(),S=X(()=>l.confirmButtonClass);Wn(()=>l.inputValue,async t=>{await Tn(),e.boxType===`prompt`&&t&&D()},{immediate:!0}),Wn(()=>c.value,t=>{t&&(e.boxType!==`prompt`&&(l.autofocus?y.value=x.value?.$el??_.value:y.value=_.value),l.zIndex=s()),e.boxType===`prompt`&&(t?Tn().then(()=>{b.value&&b.value.$el&&(l.autofocus?y.value=ne()??_.value:y.value=_.value)}):(l.editorErrorMessage=``,l.validateError=!1))});let{isDragging:C}=sh(_,v,X(()=>e.draggable),X(()=>e.overflow));Tr(async()=>{await Tn(),e.closeOnHashChange&&window.addEventListener(`hashchange`,w)}),Or(()=>{e.closeOnHashChange&&window.removeEventListener(`hashchange`,w)});function w(){c.value&&(c.value=!1,Tn(()=>{l.action&&t(`action`,l.action)}))}let ee=()=>{e.closeOnClickModal&&E(l.distinguishCancelAndClose?`close`:`cancel`)},T=Dh(ee),te=e=>{if(l.inputType!==`textarea`&&!b.value?.isComposing)return e.preventDefault(),E(`confirm`)},E=t=>{e.boxType===`prompt`&&t===`confirm`&&!D()||(l.action=t,l.beforeClose?l.beforeClose?.(t,l,w):w())},D=()=>{if(e.boxType===`prompt`){let e=l.inputPattern;if(e&&!e.test(l.inputValue||``))return l.editorErrorMessage=l.inputErrorMessage||o(`el.messagebox.error`),l.validateError=!0,!1;let t=l.inputValidator;if(h(t)){let e=t(l.inputValue);if(e===!1)return l.editorErrorMessage=l.inputErrorMessage||o(`el.messagebox.error`),l.validateError=!0,!1;if(g(e))return l.editorErrorMessage=e,l.validateError=!0,!1}}return l.editorErrorMessage=``,l.validateError=!1,!0},ne=()=>{let e=b.value?.$refs;return e?.input??e?.textarea},re=()=>{E(`close`)},ie=()=>{e.closeOnPressEscape&&re()};return e.lockScroll&&Ch(c,{ns:i}),{...en(l),ns:i,overlayEvent:T,visible:c,hasMessage:m,typeClass:u,contentId:d,inputId:f,btnSize:a,iconComponent:p,confirmButtonClasses:S,rootRef:_,focusStartRef:y,headerRef:v,inputRef:b,isDragging:C,confirmRef:x,doClose:w,handleClose:re,onCloseRequested:ie,handleWrapperClick:ee,handleInputEnter:te,handleAction:E,t:o}}}),fy=[`aria-label`,`aria-describedby`],py=[`aria-label`],my=[`id`];function hy(e,t,n,r,i,a){let o=Fr(`el-icon`),s=Fr(`el-input`),c=Fr(`el-button`),l=Fr(`el-focus-trap`),u=Fr(`el-overlay`);return U(),G(lo,{name:`fade-in-linear`,onAfterLeave:t[11]||(t[11]=t=>e.$emit(`vanish`)),persisted:``},{default:z(()=>[Ln(q(u,{"z-index":e.zIndex,"overlay-class":[e.ns.is(`message-box`),e.modalClass],mask:e.modal},{default:z(()=>[K(`div`,{role:`dialog`,"aria-label":e.title,"aria-modal":`true`,"aria-describedby":e.showInput?void 0:e.contentId,class:A(`${e.ns.namespace.value}-overlay-message-box`),onClick:t[8]||(t[8]=(...t)=>e.overlayEvent.onClick&&e.overlayEvent.onClick(...t)),onMousedown:t[9]||(t[9]=(...t)=>e.overlayEvent.onMousedown&&e.overlayEvent.onMousedown(...t)),onMouseup:t[10]||(t[10]=(...t)=>e.overlayEvent.onMouseup&&e.overlayEvent.onMouseup(...t))},[q(l,{loop:``,trapped:e.visible,"focus-trap-el":e.rootRef,"focus-start-el":e.focusStartRef,onReleaseRequested:e.onCloseRequested},{default:z(()=>[K(`div`,{ref:`rootRef`,class:A([e.ns.b(),e.customClass,e.ns.is(`draggable`,e.draggable),e.ns.is(`dragging`,e.isDragging),{[e.ns.m(`center`)]:e.center}]),style:k(e.customStyle),tabindex:`-1`,onClick:t[7]||(t[7]=cs(()=>{},[`stop`]))},[e.title!==null&&e.title!==void 0?(U(),W(`div`,{key:0,ref:`headerRef`,class:A([e.ns.e(`header`),{"show-close":e.showClose}])},[K(`div`,{class:A(e.ns.e(`title`))},[e.iconComponent&&e.center?(U(),G(o,{key:0,class:A([e.ns.e(`status`),e.typeClass])},{default:z(()=>[(U(),G(Lr(e.iconComponent)))]),_:1},8,[`class`])):Y(`v-if`,!0),K(`span`,null,M(e.title),1)],2),e.showClose?(U(),W(`button`,{key:0,type:`button`,class:A(e.ns.e(`headerbtn`)),"aria-label":e.t(`el.messagebox.close`),onClick:t[0]||(t[0]=t=>e.handleAction(e.distinguishCancelAndClose?`close`:`cancel`)),onKeydown:t[1]||(t[1]=us(cs(t=>e.handleAction(e.distinguishCancelAndClose?`close`:`cancel`),[`prevent`]),[`enter`]))},[q(o,{class:A(e.ns.e(`close`))},{default:z(()=>[(U(),G(Lr(e.closeIcon||`close`)))]),_:1},8,[`class`])],42,py)):Y(`v-if`,!0)],2)):Y(`v-if`,!0),K(`div`,{id:e.contentId,class:A(e.ns.e(`content`))},[K(`div`,{class:A(e.ns.e(`container`))},[e.iconComponent&&!e.center&&e.hasMessage?(U(),G(o,{key:0,class:A([e.ns.e(`status`),e.typeClass])},{default:z(()=>[(U(),G(Lr(e.iconComponent)))]),_:1},8,[`class`])):Y(`v-if`,!0),e.hasMessage?(U(),W(`div`,{key:1,class:A(e.ns.e(`message`))},[V(e.$slots,`default`,{},()=>[e.dangerouslyUseHTMLString?(U(),G(Lr(e.showInput?`label`:`p`),{key:1,for:e.showInput?e.inputId:void 0,innerHTML:e.message},null,8,[`for`,`innerHTML`])):(U(),G(Lr(e.showInput?`label`:`p`),{key:0,for:e.showInput?e.inputId:void 0,textContent:M(e.message)},null,8,[`for`,`textContent`]))])],2)):Y(`v-if`,!0)],2),Ln(K(`div`,{class:A(e.ns.e(`input`))},[q(s,{id:e.inputId,ref:`inputRef`,modelValue:e.inputValue,"onUpdate:modelValue":t[2]||(t[2]=t=>e.inputValue=t),type:e.inputType,placeholder:e.inputPlaceholder,"aria-invalid":e.validateError,class:A({invalid:e.validateError}),onKeydown:us(e.handleInputEnter,[`enter`])},null,8,[`id`,`modelValue`,`type`,`placeholder`,`aria-invalid`,`class`,`onKeydown`]),K(`div`,{class:A(e.ns.e(`errormsg`)),style:k({visibility:e.editorErrorMessage?`visible`:`hidden`})},M(e.editorErrorMessage),7)],2),[[Oo,e.showInput]])],10,my),e.showCancelButton||e.showConfirmButton?(U(),W(`div`,{key:1,class:A(e.ns.e(`btns`))},[e.showCancelButton?(U(),G(c,{key:0,type:e.cancelButtonType===`text`?``:e.cancelButtonType,text:e.cancelButtonType===`text`,loading:e.cancelButtonLoading,"loading-icon":e.cancelButtonLoadingIcon,class:A([e.cancelButtonClass]),round:e.roundButton,size:e.btnSize,onClick:t[3]||(t[3]=t=>e.handleAction(`cancel`)),onKeydown:t[4]||(t[4]=us(cs(t=>e.handleAction(`cancel`),[`prevent`]),[`enter`]))},{default:z(()=>[J(M(e.cancelButtonText||e.t(`el.messagebox.cancel`)),1)]),_:1},8,[`type`,`text`,`loading`,`loading-icon`,`class`,`round`,`size`])):Y(`v-if`,!0),Ln(q(c,{ref:`confirmRef`,type:e.confirmButtonType===`text`?``:e.confirmButtonType,text:e.confirmButtonType===`text`,loading:e.confirmButtonLoading,"loading-icon":e.confirmButtonLoadingIcon,class:A([e.confirmButtonClasses]),round:e.roundButton,disabled:e.confirmButtonDisabled,size:e.btnSize,onClick:t[5]||(t[5]=t=>e.handleAction(`confirm`)),onKeydown:t[6]||(t[6]=us(cs(t=>e.handleAction(`confirm`),[`prevent`]),[`enter`]))},{default:z(()=>[J(M(e.confirmButtonText||e.t(`el.messagebox.confirm`)),1)]),_:1},8,[`type`,`text`,`loading`,`loading-icon`,`class`,`round`,`disabled`,`size`]),[[Oo,e.showConfirmButton]])],2)):Y(`v-if`,!0)],6)]),_:3},8,[`trapped`,`focus-trap-el`,`focus-start-el`,`onReleaseRequested`])],42,fy)]),_:3},8,[`z-index`,`overlay-class`,`mask`]),[[Oo,e.visible]])]),_:3})}var gy=r_(dy,[[`render`,hy]]),_y=new Map,vy=e=>{let t=document.body;return e.appendTo&&(g(e.appendTo)&&(t=document.querySelector(e.appendTo)),gm(e.appendTo)&&(t=e.appendTo),gm(t)||(Em(`ElMessageBox`,`the appendTo option is not an HTMLElement. Falling back to document.body.`),t=document.body)),t},yy=(e,t)=>{let n=e.component?.proxy;return()=>n.handleAction(t)},by=(e,t,n=null)=>{let r=q(gy,e,h(e.message)||pa(e.message)?{default:h(e.message)?()=>e.message({confirm:yy(r,`confirm`),cancel:yy(r,`cancel`),close:yy(r,`close`)}):()=>e.message}:null);return r.appContext=n,ms(r,t),vy(e).appendChild(t.firstElementChild),r.component},xy=()=>document.createElement(`div`),Sy=(e,t)=>{let n=xy();e.onVanish=()=>{ms(null,n),_y.delete(i)},e.onAction=t=>{let n=_y.get(i),a;a=e.showInput?{value:i.inputValue,action:t}:t,e.callback?e.callback(a,r.proxy):t===`cancel`||t===`close`?e.distinguishCancelAndClose&&t!==`cancel`?n.reject(`close`):n.reject(`cancel`):n.resolve(a)};let r=by(e,n,t),i=r.proxy;for(let t in e)u(e,t)&&!u(i.$props,t)&&(t===`closeIcon`&&v(e[t])?i[t]=Gt(e[t]):i[t]=e[t]);return i.visible=!0,i};function Cy(e,t=null){if(!Mm)return Promise.reject();let n;return g(e)||pa(e)?e={message:e}:n=e.callback,new Promise((r,i)=>{let a=Sy(e,t??Cy._context);_y.set(a,{options:e,callback:n,resolve:r,reject:i})})}var wy=[`alert`,`confirm`,`prompt`],Ty={alert:{closeOnPressEscape:!1,closeOnClickModal:!1},confirm:{showCancelButton:!0},prompt:{showCancelButton:!0,showInput:!0}};wy.forEach(e=>{Cy[e]=Ey(e)});function Ey(e){return(t,n,r,i)=>{let a=``;return v(n)?(r=n,a=``):a=pm(n)?``:n,Cy(Object.assign({title:a,message:t,type:``,...Ty[e]},r,{boxType:e}),i)}}Cy.close=()=>{_y.forEach((e,t)=>{t.doClose()}),_y.clear()},Cy._context=null;var Dy=Cy;Dy.install=e=>{Dy._context=e._context,e.config.globalProperties.$msgbox=Dy,e.config.globalProperties.$messageBox=Dy,e.config.globalProperties.$alert=Dy.alert,e.config.globalProperties.$confirm=Dy.confirm,e.config.globalProperties.$prompt=Dy.prompt};var Oy=Dy,ky=[{id:`modelserver_login`,label:`连接大模型`,kind:`oauth`,autoStart:!1},{id:`agentserver_login`,label:`连接星池工作区`,kind:`oauth`,autoStart:!1},{id:`codex_desktop_install`,label:`安装 Codex Desktop 智能助手`,kind:`progress`,autoStart:!0},{id:`codex_desktop_configure`,label:`准备 Codex Desktop 智能助手`,kind:`action`,autoStart:!0},{id:`finalize`,label:`完成`,kind:`action`,autoStart:!1}],Ay=[{id:`modelserver_login`,label:`连接大模型`,kind:`oauth`,autoStart:!1},{id:`agentserver_login`,label:`连接星池工作区`,kind:`oauth`,autoStart:!1},{id:`vscode_install`,label:`安装极简工作台`,kind:`progress`,autoStart:!0},{id:`vscode_configure`,label:`准备极简工作台`,kind:`action`,autoStart:!0},{id:`finalize`,label:`完成`,kind:`action`,autoStart:!1}],jy=[{id:`modelserver_login`,label:`连接大模型`,kind:`oauth`,autoStart:!1},{id:`agentserver_login`,label:`连接星池工作区`,kind:`oauth`,autoStart:!1},{id:`opencode_desktop_install`,label:`安装 OpenCode Desktop 智能助手`,kind:`progress`,autoStart:!0},{id:`opencode_desktop_configure`,label:`准备 OpenCode Desktop 智能助手`,kind:`action`,autoStart:!0},{id:`finalize`,label:`完成`,kind:`action`,autoStart:!1}];function My(e){return e===`opencode_desktop`?`opencode_desktop`:e===`minimal_vscode`?`minimal_vscode`:`codex_desktop`}function Ny(e){let t=My(e);return t===`minimal_vscode`?Ay:t===`opencode_desktop`?jy:ky}function Py(e){let t=My(e);return t===`minimal_vscode`?{modelserver_login:`modelserver_login`,agentserver_login:`agentserver_login`,vscode_installed:`vscode_install`,vscode_configured:`vscode_configure`,shortcuts_created:`finalize`}:t===`opencode_desktop`?{modelserver_login:`modelserver_login`,agentserver_login:`agentserver_login`,opencode_desktop_installed:`opencode_desktop_install`,opencode_desktop_configured:`opencode_desktop_configure`,shortcuts_created:`finalize`}:{modelserver_login:`modelserver_login`,agentserver_login:`agentserver_login`,codex_desktop_installed:`codex_desktop_install`,codex_desktop_configured:`codex_desktop_configure`,shortcuts_created:`finalize`}}function Fy(e){"@babel/helpers - typeof";return Fy=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},Fy(e)}function Iy(e,t){if(Fy(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(Fy(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function Ly(e){var t=Iy(e,`string`);return Fy(t)==`symbol`?t:t+``}function Ry(e,t,n){return(t=Ly(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var zy=class extends Error{constructor(e,t,n){super(e),Ry(this,`status`,void 0),Ry(this,`detail`,void 0),this.status=t,this.detail=n,this.name=`OnboardingError`}},By=`X-AgentServer-Console-Token`;function Vy(){return typeof document>`u`?``:document.querySelector(`meta[name="agentserver-console-token"]`)?.content.trim()??``}function Hy(e){let t=Vy();if(!t)return e;let n=new Headers(e?.headers);return n.set(By,t),{...e,headers:n}}async function Uy(e,t){let n;try{n=await fetch(e,t)}catch(e){throw new zy(`网络错误: `+(e instanceof Error?e.message:String(e)))}if(!n.ok){let t=``;try{t=await n.text()}catch{}throw new zy(`${e} 返回 ${n.status}: ${t||n.statusText}`,n.status,t)}return n.json()}var Wy=()=>Uy(`/api/state`),Gy=e=>Uy(`/api/step/${e}`,{method:`POST`}),Ky=e=>Uy(`/api/step/${e}/status`,{method:`POST`}),qy=()=>Uy(`/api/step/frontend_install`,{method:`POST`}),Jy=()=>Uy(`/api/step/frontend_configure`,{method:`POST`}),Yy=()=>Uy(`/api/finalize`,{method:`POST`}),Xy=()=>Uy(`/api/console/state`),Zy=()=>Uy(`/api/console/refresh`,Hy({method:`POST`})),Qy=()=>Uy(`/api/console/open-frontend`,Hy({method:`POST`})),$y=()=>Uy(`/api/console/open-subscription`,Hy({method:`POST`})),eb=()=>Uy(`/api/console/logout-modelserver`,Hy({method:`POST`})),tb=e=>Uy(`/api/console/model`,Hy({method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({model:e})})),nb=()=>Uy(`/api/console/slaves`),rb=e=>Uy(`/api/console/slaves`,Hy({method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)})),ib=()=>Uy(`/api/console/select-folder`,Hy({method:`POST`})),ab=e=>Uy(`/api/console/slaves/${encodeURIComponent(e)}/restart`,Hy({method:`POST`})),ob=e=>Uy(`/api/console/slaves/${encodeURIComponent(e)}/pause`,Hy({method:`POST`})),sb=e=>Uy(`/api/console/slaves/${encodeURIComponent(e)}/open-remote`,Hy({method:`POST`})),cb=e=>Uy(`/api/console/slaves/${encodeURIComponent(e)}`,Hy({method:`DELETE`})),lb=()=>Uy(`/api/console/update`),ub=()=>Uy(`/api/console/update/check`,Hy({method:`POST`})),db=()=>Uy(`/api/console/update/install`,Hy({method:`POST`}));function fb(){let e=L(`codex_desktop`),t=L(`Codex Desktop`),n=L(Ny(e.value).map(e=>({...e,runtime:{status:`pending`}}))),r=L(null),i=L(new Set),a=L(`pending`),o=X(()=>n.value.find(e=>e.runtime.status!==`success`)),s=X(()=>a.value===`complete`);function c(e){return n.value.find(t=>t.id===e)}function l(r,i){let a=My(r),o=Ny(a),s=n.value.map(e=>e.id).join(`,`),c=o.map(e=>e.id).join(`,`);e.value=a,t.value=i||(a===`minimal_vscode`?`极简界面`:a===`opencode_desktop`?`OpenCode Desktop`:`Codex Desktop`),s!==c&&(n.value=o.map(e=>({...e,runtime:{status:`pending`}})))}function u(){let t=new Set,r=Py(e.value);for(let e of Array.from(i.value)){let n=r[e];n&&t.add(n)}if(a.value===`complete`){for(let e of n.value)e.runtime={status:`success`};return}let o=!1;for(let e of n.value)t.has(e.id)?e.runtime={status:`success`}:!o&&e.runtime.status!==`in_progress`&&e.runtime.status!==`error`?(e.runtime={status:`active`},o=!0):e.runtime.status===`success`&&!t.has(e.id)&&(e.runtime=o?{status:`pending`}:{status:`active`},o||(o=!0))}async function d(){try{let e=await Wy();r.value=null,l(e.frontend_mode,e.frontend_name),i.value=new Set(e.completed_steps??[]),a.value=e.onboarding_status,u()}catch(e){r.value=e instanceof Error?e.message:String(e)}}async function f(){await d()}function p(e,t){let n=c(e);n&&(n.runtime={...n.runtime,status:`in_progress`,stage:t,errorMessage:void 0,errorDetail:void 0})}function m(e){let t=c(e);if(!t)return;t.runtime={status:`success`};let r=n.value.findIndex(t=>t.id===e);if(r>=0&&r+1{let i=Bv;return U(),W(`section`,pb,[K(`div`,mb,[K(`strong`,null,M(t(e.quota.window)),1),K(`span`,null,`已用 `+M(e.quota.percentage)+`%`,1)]),q(i,{percentage:e.quota.percentage,"stroke-width":10},null,8,[`percentage`]),K(`div`,hb,[K(`span`,null,`剩余约 `+M(e.quota.remaining_percentage)+`%`,1),e.quota.resets_at?(U(),W(`span`,gb,`重置 `+M(new Date(e.quota.resets_at).toLocaleString()),1)):Y(``,!0)])])}}}),vb=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},yb=vb(_b,[[`__scopeId`,`data-v-77393e6b`]]),bb={class:`dashboard`},xb={class:`dashboard-head`},Sb={class:`dashboard-actions`},Cb={key:3,class:`reconnect-row`},wb={key:0},Tb=[`href`],Eb={key:5,class:`reconnect-row`},Db={key:0},Ob=[`href`],kb={class:`quota-grid`},Ab={class:`connection-grid`},jb={class:`info-block`},Mb={class:`info-block`},Nb={key:6,class:`model-panel`},Pb={class:`update-panel`},Fb={class:`section-head`},Ib={key:0},Lb={key:1},Rb={key:2},zb={class:`update-row`},Bb={class:`update-summary`},Vb={key:0},Hb={key:1},Ub={class:`update-actions`},Wb={class:`slave-panel`},Gb={class:`section-head`},Kb={class:`slave-create`},qb={class:`folder-select`},Jb={class:`slave-preview`},Yb={class:`slave-list`},Xb={class:`slave-main`},Zb={class:`slave-title-line`},Qb={class:`slave-status`},$b={class:`slave-folder`},ex=[`href`],tx={key:1},nx={class:`slave-actions`},rx={class:`subscription-actions`},ix=3e3,ax=vb(B({__name:`Dashboard`,setup(e){let t=L(null),n=L(null),r=L(``),i=L(``),a=L(``),o=L(``),s=L(``),c=L(!1),l=L(!1),u=L(!1),d=L(!1),f=L(!1),p=L(!1),m=L(!1),h=L(``),g=L(!1),_=L(``),v=L(``),y=L(``),b=L(!1),x=L(``),S=L(``),C=L(``),w=L(null),ee=L([]),T=L(``),te=L(``),E=L(``),D=L(``),ne=L(!1),re=L(!1),ie=L({}),ae=L({}),oe=0,O=0,se,ce=!1,le=X(()=>[{key:`status`,message:r.value},{key:`update`,message:i.value},{key:`frontend`,message:a.value},{key:`subscription`,message:o.value},{key:`logout-modelserver`,message:s.value},{key:`model-switch`,message:h.value},{key:`reconnect`,message:y.value},{key:`agentserver-reconnect`,message:C.value},{key:`slave`,message:E.value}].filter(e=>e.message)),ue=X(()=>{let e=t.value?.agentserver;return e?.workspace_name?e.workspace_name:e?.workspace_id?`工作空间 ${ge(e.workspace_id)}`:`未读取到工作空间`}),k=X(()=>w.value?.computer_name||`未初始化`),de=X(()=>{let e=Ie()||`文件夹名`;return`${k.value}-${e}`}),fe=X(()=>{let e=n.value;return e?e.status===`available`&&e.update?`发现新版本 ${e.update.version}`:e.status===`latest`?`已是最新版本`:e.status===`checking`?`正在检查更新`:e.status===`downloading`?`正在下载更新`:e.status===`installer_started`?`安装程序已启动`:e.status===`error`?e.last_error||`更新检查失败`:`未检查更新`:`正在读取更新状态`}),pe=X(()=>l.value||u.value),me=X(()=>pe.value),A=X(()=>{let e=n.value;return!!e?.update&&(e.status===`available`||e.status===`error`)}),he=X(()=>{let e=n.value;return e?.last_error?e.status===`error`?``:e.last_error:``});function ge(e){return e.length<=8?e:e.slice(-8)}function j(e){return e instanceof Error?e.message:String(e)}async function _e(e){try{return await Oy.confirm(e,`确认操作`,{confirmButtonText:`确定`,cancelButtonText:`取消`,type:`warning`}),!0}catch{return!1}}async function ve(){try{t.value=await Xy(),r.value=``}catch(e){r.value=j(e)}}async function ye(){let e=++oe;try{let t=await lb();if(!ce||e!==oe)return;n.value=t,i.value=``}catch(t){if(!ce||e!==oe)return;i.value=j(t)}}async function be(){let e=++O;try{let t=await nb();if(!ce||e!==O)return;w.value=t.machine,ee.value=t.slaves||[],E.value=``,we()}catch(t){if(!ce||e!==O)return;E.value=j(t),we()}}async function xe(){if(pe.value)return;let e=++oe;l.value=!0;try{let t=await ub();if(!ce||e!==oe)return;n.value=t,i.value=``}catch(t){if(!ce||e!==oe)return;i.value=j(t)}finally{ce&&(l.value=!1)}}async function N(){if(pe.value||!A.value||!n.value?.update)return;let e=n.value.update.version;if(!await _e(`安装星池指挥官更新 ${e}?安装程序启动后可能需要按提示完成更新。`))return;let t=++oe;u.value=!0;try{let e=await db();if(!ce||t!==oe)return;n.value=e,i.value=``}catch(e){if(!ce||t!==oe)return;let n=j(e);if(i.value=n,await ye(),!ce)return;i.value=n}finally{ce&&(u.value=!1)}}function Se(e){return e.status===`starting`||e.status===`auth_required`}function Ce(){se!==void 0&&(window.clearTimeout(se),se=void 0)}function we(){Ce(),ce&&ee.value.some(Se)&&(se=window.setTimeout(()=>{se=void 0,be()},ix))}async function P(){if(!c.value){c.value=!0;try{t.value=await Zy(),r.value=``,await be()}catch(e){r.value=j(e)}finally{c.value=!1}}}async function Te(){if(!d.value){d.value=!0;try{await Qy(),a.value=``}catch(e){a.value=j(e)}finally{d.value=!1}}}async function Ee(){if(!(f.value||!t.value?.subscription_url)){f.value=!0;try{await $y(),o.value=``}catch(e){o.value=j(e)}finally{f.value=!1}}}async function De(e){if(m.value||!e||e===t.value?.current_model)return;let n=t.value?.available_models?.find(t=>t.name===e)?.display_name||e;m.value=!0,h.value=``;try{await tb(e),t.value=await Zy(),uy.success(`已切换到 ${n}。新建 Codex 对话生效(旧对话保持原模型)。`)}catch(e){h.value=j(e);try{t.value=await Zy()}catch{}}finally{m.value=!1}}async function Oe(){if(!(p.value||!t.value)&&await _e(`退出大模型登录后需要重新连接大模型。确定退出大模型登录吗?`)){p.value=!0;try{await eb(),t.value=await Zy(),s.value=``}catch(e){s.value=j(e)}finally{p.value=!1}}}async function ke(){if(!g.value){g.value=!0,y.value=``,v.value=``,_.value=`正在打开登录页面…`;try{let e=await Gy(`modelserver_login`);e.oauth_url&&(v.value=e.oauth_url),_.value=`请在浏览器中完成大模型连接…`,await Ae()}catch(e){y.value=j(e)}finally{g.value=!1}}}async function Ae(){for(;;){let e=await Ky(`modelserver_login`);if(e.state===`success`){t.value=await Zy(),_.value=``,v.value=``;return}if(e.error&&!Ne(e.error))throw Error(e.error);await Fe(3e3)}}async function je(){if(!b.value){b.value=!0,C.value=``,S.value=``,x.value=`正在打开登录页面…`;try{let e=await Gy(`agentserver_login`);e.oauth_url&&(S.value=e.oauth_url),x.value=`请在浏览器中完成星池工作区连接…`,await Me()}catch(e){C.value=j(e)}finally{b.value=!1}}}async function Me(){for(;;){let e=await Ky(`agentserver_login`);if(e.state===`success`){t.value=await Zy(),x.value=``,S.value=``;return}if(e.error&&!Ne(e.error))throw Error(e.error);await Fe(3e3)}}function Ne(e){return e.includes(`context deadline exceeded`)||e.includes(`deadline exceeded`)}function Pe(e){if(!e)return``;try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`?e:``}catch{return``}}function Fe(e){return new Promise(t=>window.setTimeout(t,e))}function Ie(){return te.value.trim()||T.value.trim().replace(/\\/g,`/`).replace(/\/+$/,``).split(`/`).pop()||``}async function Le(){if(ne.value)return;let e=T.value.trim(),t=Ie();if(!e){E.value=`请选择文件夹`;return}if(Array.from(t).length>20){E.value=`名称最多 20 个字符`;return}ne.value=!0,D.value=``;try{await rb({folder:e,name:t}),T.value=``,te.value=``,await be()}catch(e){E.value=j(e)}finally{ne.value=!1}}async function Re(){if(!re.value){re.value=!0,D.value=``;try{let e=await ib();e.folder&&(T.value=e.folder),E.value=``}catch(e){E.value=j(e)}finally{re.value=!1}}}async function ze(e){D.value=``,await Ue(e,()=>ab(e))}async function Be(e){D.value=``,await Ue(e,()=>ob(e))}async function Ve(e){let t=!1;if(!ae.value[e]){if(ie.value[e])return;We(e,!0),D.value=``;try{if((await sb(e)).state===`opened`){ae.value[e]=!0,D.value=`已打开 agentserver 页面。请先在网页中删除远程记录,完成后再次点击删除来清理本机配置和进程。`,E.value=``;return}}catch(e){t=!0,E.value=``,D.value=`未能自动打开 agentserver 页面:${j(e)}。远程记录可能需要手动清理。`}finally{We(e,!1)}}await _e(He(e,t))&&await Ue(e,async()=>{await cb(e),Ge(e),D.value=``})}function He(e,t){return ae.value[e]?`我已在 agentserver 网页删除远程记录,现在删除这台电脑上的本地配置和进程。确定继续吗?`:t?`未能自动打开 agentserver 页面,远程记录可能需要手动清理。现在删除这台电脑上的本地配置和进程。确定继续吗?`:`删除这台电脑上的本地配置和进程。确定删除吗?`}async function Ue(e,t){if(!ie.value[e]){We(e,!0);try{await t(),await be()}catch(e){E.value=j(e)}finally{We(e,!1)}}}function We(e,t){if(t){ie.value[e]=!0;return}delete ie.value[e]}function Ge(e){delete ae.value[e]}function Ke(e){return{stopped:`已停止`,starting:`启动中`,auth_required:`待认证`,running:`运行中`,paused:`已暂停`,error:`出错`}[e]||e}return Tr(()=>{ce=!0,ve(),ye(),be()}),Or(()=>{ce=!1,Ce()}),(e,r)=>{let i=cv,a=Sg,o=Ov,s=kv,h=v_;return U(),W(`div`,bb,[K(`header`,xb,[K(`div`,null,[r[3]||(r[3]=K(`h1`,null,`星池指挥官`,-1)),K(`p`,null,M(t.value?.frontend_name||`正在读取状态`),1)]),K(`div`,Sb,[q(i,{loading:c.value,disabled:c.value,onClick:P},{default:z(()=>[...r[4]||(r[4]=[J(`刷新状态`,-1)])]),_:1},8,[`loading`,`disabled`]),q(i,{type:`primary`,loading:d.value,disabled:d.value,onClick:Te},{default:z(()=>[J(` 打开 `+M(t.value?.frontend_name||`前端`),1)]),_:1},8,[`loading`,`disabled`])])]),(U(!0),W(H,null,Br(le.value,e=>(U(),G(a,{key:e.key,type:`error`,title:e.message,closable:!1,"show-icon":``},null,8,[`title`]))),128)),D.value?(U(),G(a,{key:0,type:`info`,title:D.value,closable:!1,"show-icon":``},null,8,[`title`])):Y(``,!0),t.value?.quota_error?(U(),G(a,{key:1,type:`warning`,title:t.value.quota_error,closable:!1,"show-icon":``},null,8,[`title`])):Y(``,!0),t.value?.modelserver.reconnect_required?(U(),G(a,{key:2,type:`warning`,title:t.value.modelserver.auth_message||`大模型连接已失效,请重新连接。`,closable:!1,"show-icon":``},null,8,[`title`])):Y(``,!0),t.value?.modelserver.reconnect_required?(U(),W(`div`,Cb,[q(i,{type:`primary`,loading:g.value,disabled:g.value,onClick:ke},{default:z(()=>[...r[5]||(r[5]=[J(` 重新连接大模型 `,-1)])]),_:1},8,[`loading`,`disabled`]),_.value?(U(),W(`span`,wb,M(_.value),1)):Y(``,!0),Pe(v.value)?(U(),W(`a`,{key:1,href:Pe(v.value),target:`_blank`,rel:`noopener noreferrer`},` 浏览器没自动打开? 点这里 `,8,Tb)):Y(``,!0)])):Y(``,!0),t.value?.agentserver.reconnect_required?(U(),G(a,{key:4,type:`warning`,title:t.value.agentserver.auth_message||`星池工作区连接已失效,请重新连接。`,closable:!1,"show-icon":``},null,8,[`title`])):Y(``,!0),t.value?.agentserver.reconnect_required?(U(),W(`div`,Eb,[q(i,{type:`primary`,loading:b.value,disabled:b.value,onClick:je},{default:z(()=>[...r[6]||(r[6]=[J(` 重新连接星池工作区 `,-1)])]),_:1},8,[`loading`,`disabled`]),x.value?(U(),W(`span`,Db,M(x.value),1)):Y(``,!0),Pe(S.value)?(U(),W(`a`,{key:1,href:Pe(S.value),target:`_blank`,rel:`noopener noreferrer`},` 浏览器没自动打开? 点这里 `,8,Ob)):Y(``,!0)])):Y(``,!0),K(`section`,kb,[(U(!0),W(H,null,Br(t.value?.quotas||[],e=>(U(),G(yb,{key:e.window,quota:e},null,8,[`quota`]))),128))]),K(`section`,Ab,[K(`div`,jb,[r[7]||(r[7]=K(`span`,null,`modelserver 项目`,-1)),K(`strong`,null,M(t.value?.modelserver.project_name||t.value?.modelserver.project_id||`未读取到项目`),1)]),K(`div`,Mb,[r[8]||(r[8]=K(`span`,null,`agentserver 工作空间`,-1)),K(`strong`,null,M(ue.value),1)])]),t.value?.frontend_mode===`codex_desktop`&&(t.value?.available_models?.length||0)>0?(U(),W(`section`,Nb,[r[9]||(r[9]=K(`div`,{class:`section-head`},[K(`h2`,null,`Codex 模型`),K(`p`,null,`选择 Codex Desktop 默认使用的大模型。切换后新建对话生效;旧对话保持原模型。`)],-1)),q(s,{"model-value":t.value?.current_model,disabled:m.value,onChange:r[0]||(r[0]=e=>De(String(e??``)))},{default:z(()=>[(U(!0),W(H,null,Br(t.value?.available_models||[],e=>(U(),G(o,{key:e.name,value:e.name,label:e.name,border:``},{default:z(()=>[J(M(e.display_name||e.name),1)]),_:2},1032,[`value`,`label`]))),128))]),_:1},8,[`model-value`,`disabled`])])):Y(``,!0),K(`section`,Pb,[K(`div`,Fb,[r[10]||(r[10]=K(`h2`,null,`星池指挥官更新`,-1)),K(`p`,null,[n.value?(U(),W(`span`,Ib,`当前版本 `+M(n.value.current_version),1)):(U(),W(`span`,Lb,`正在读取当前版本`)),n.value?.last_checked_at?(U(),W(`span`,Rb,`上次检查 `+M(n.value.last_checked_at),1)):Y(``,!0)])]),K(`div`,zb,[K(`div`,Bb,[K(`strong`,null,M(fe.value),1),n.value?.update?.notes?(U(),W(`span`,Vb,M(n.value.update.notes),1)):Y(``,!0),he.value?(U(),W(`span`,Hb,M(he.value),1)):Y(``,!0)]),K(`div`,Ub,[q(i,{"data-test":`check-console-update`,loading:l.value,disabled:me.value,onClick:xe},{default:z(()=>[...r[11]||(r[11]=[J(` 检查更新 `,-1)])]),_:1},8,[`loading`,`disabled`]),A.value?(U(),G(i,{key:0,"data-test":`install-console-update`,type:`primary`,loading:u.value,disabled:me.value,onClick:N},{default:z(()=>[...r[12]||(r[12]=[J(` 安装更新 `,-1)])]),_:1},8,[`loading`,`disabled`])):Y(``,!0)])])]),K(`section`,Wb,[K(`div`,Gb,[r[13]||(r[13]=K(`h2`,null,`允许被远程控制的文件夹(智能体形式提供)`,-1)),K(`p`,null,`本机:`+M(k.value),1)]),K(`div`,Kb,[K(`div`,qb,[q(h,{modelValue:T.value,"onUpdate:modelValue":r[1]||(r[1]=e=>T.value=e),"data-test":`slave-folder-input`,placeholder:`请选择文件夹`,readonly:``,clearable:``},null,8,[`modelValue`]),q(i,{"data-test":`select-slave-folder`,icon:R(cg),loading:re.value,disabled:re.value,onClick:Re},{default:z(()=>[...r[14]||(r[14]=[J(` 选择文件夹 `,-1)])]),_:1},8,[`icon`,`loading`,`disabled`])]),q(h,{modelValue:te.value,"onUpdate:modelValue":r[2]||(r[2]=e=>te.value=e),"data-test":`slave-name-input`,maxlength:`20`,"show-word-limit":``,placeholder:`名称,默认使用文件夹名`,clearable:``},null,8,[`modelValue`]),K(`span`,Jb,`预览:`+M(de.value),1),q(i,{"data-test":`create-slave`,type:`primary`,loading:ne.value,disabled:ne.value,onClick:Le},{default:z(()=>[...r[15]||(r[15]=[J(` 创建并启动 `,-1)])]),_:1},8,[`loading`,`disabled`])]),K(`div`,Yb,[(U(!0),W(H,null,Br(ee.value,e=>(U(),W(`div`,{key:e.id,class:`slave-row`},[K(`div`,Xb,[K(`div`,Zb,[K(`strong`,null,M(e.display_name),1),K(`span`,Qb,M(Ke(e.status)),1)]),K(`span`,$b,M(e.folder),1),e.status===`auth_required`&&Pe(e.auth_url)?(U(),W(`a`,{key:0,href:Pe(e.auth_url),target:`_blank`,rel:`noopener noreferrer`},` 完成认证 `,8,ex)):Y(``,!0),e.last_error?(U(),W(`em`,tx,M(e.last_error),1)):Y(``,!0)]),K(`div`,nx,[q(i,{"data-test":`restart-slave-${e.id}`,loading:ie.value[e.id],disabled:ie.value[e.id],onClick:t=>ze(e.id)},{default:z(()=>[...r[16]||(r[16]=[J(` 启动/重启 `,-1)])]),_:1},8,[`data-test`,`loading`,`disabled`,`onClick`]),q(i,{"data-test":`pause-slave-${e.id}`,loading:ie.value[e.id],disabled:ie.value[e.id],onClick:t=>Be(e.id)},{default:z(()=>[...r[17]||(r[17]=[J(` 暂停 `,-1)])]),_:1},8,[`data-test`,`loading`,`disabled`,`onClick`]),q(i,{"data-test":`delete-slave-${e.id}`,type:`danger`,plain:``,loading:ie.value[e.id],disabled:ie.value[e.id],onClick:t=>Ve(e.id)},{default:z(()=>[...r[18]||(r[18]=[J(` 删除 `,-1)])]),_:1},8,[`data-test`,`loading`,`disabled`,`onClick`])])]))),128))])]),K(`div`,rx,[q(i,{loading:f.value,disabled:f.value||!t.value?.subscription_url,onClick:Ee},{default:z(()=>[...r[19]||(r[19]=[J(` 打开订阅页 `,-1)])]),_:1},8,[`loading`,`disabled`]),q(i,{type:`danger`,plain:``,loading:p.value,disabled:p.value||!t.value,onClick:Oe},{default:z(()=>[...r[20]||(r[20]=[J(` 退出大模型登录 `,-1)])]),_:1},8,[`loading`,`disabled`])])])}}}),[[`__scopeId`,`data-v-fca01011`]]),ox={class:`step__head`},sx={class:`step__label`},cx={key:0,class:`step__icon`},lx={class:`step__body`},ux=vb(B({__name:`StepCard`,props:{step:{}},setup(e){let t=e,n=X(()=>{switch(t.step.runtime.status){case`active`:return`step--active`;case`in_progress`:return`step--in_progress`;case`success`:return`step--done`;case`error`:return`step--error`;default:return``}}),r=X(()=>{switch(t.step.runtime.status){case`success`:return`✓`;case`error`:return`✗`;case`in_progress`:return`⏳`;default:return``}});return(t,i)=>(U(),W(`div`,{class:A([`step`,n.value])},[K(`div`,ox,[K(`span`,sx,M(e.step.label),1),r.value?(U(),W(`span`,cx,M(r.value),1)):Y(``,!0)]),K(`div`,lx,[V(t.$slots,`action`,{},void 0,!0)])],2))}}),[[`__scopeId`,`data-v-cee6048b`]]),dx={class:`error-actions`},fx={key:0,class:`error-detail`},px=vb(B({__name:`ErrorPanel`,props:{message:{},detail:{}},emits:[`retry`],setup(e,{emit:t}){let n=t,r=L(!1);return(t,i)=>{let a=cv,o=Sg;return U(),G(o,{type:`error`,closable:!1,"show-icon":``},{title:z(()=>[J(M(e.message),1)]),default:z(()=>[K(`div`,dx,[q(a,{size:`small`,type:`primary`,onClick:i[0]||(i[0]=e=>n(`retry`))},{default:z(()=>[...i[2]||(i[2]=[J(`重试`,-1)])]),_:1}),e.detail?(U(),G(a,{key:0,size:`small`,link:``,onClick:i[1]||(i[1]=e=>r.value=!r.value)},{default:z(()=>[J(M(r.value?`收起详情`:`查看详情`),1)]),_:1})):Y(``,!0)]),r.value&&e.detail?(U(),W(`pre`,fx,M(e.detail),1)):Y(``,!0)]),_:1})}}}),[[`__scopeId`,`data-v-c7c04702`]]),mx={key:0},hx={key:1,class:`in-progress`},gx=[`href`],_x=vb(B({__name:`OauthStep`,props:{step:{},onboarding:{}},setup(e){let t=e,n=L(null);async function r(){t.onboarding.markStepInProgress(t.step.id,`正在打开浏览器…`);try{let e=await Gy(t.step.id);e.oauth_url&&t.onboarding.setOauthUrl(t.step.id,e.oauth_url),t.onboarding.markStepInProgress(t.step.id,`请在弹出的浏览器中完成登录…`),i()}catch(e){let n=e;t.onboarding.markStepError(t.step.id,n.message,n.detail)}}async function i(){if(n.value)return;let e=async()=>{try{let r=await Ky(t.step.id);if(r.state===`success`){a(),t.onboarding.markStepSuccess(t.step.id),await t.onboarding.refreshState();return}if(r.error&&!s(r.error)){a(),t.onboarding.markStepError(t.step.id,r.error);return}n.value=window.setTimeout(e,3e3)}catch(e){a();let n=e;t.onboarding.markStepError(t.step.id,n.message,n.detail)}};n.value=window.setTimeout(e,100)}function a(){n.value!==null&&(clearTimeout(n.value),n.value=null)}function o(){a(),r()}function s(e){return e.includes(`context deadline exceeded`)||e.includes(`deadline exceeded`)}function c(e){if(!e)return``;try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`?e:``}catch{return``}}return kr(a),Tr(()=>{t.step.runtime.status===`in_progress`&&i()}),(t,n)=>{let i=cv,a=Fr(`Loading`),s=xg;return e.step.runtime.status===`active`?(U(),W(`div`,mx,[q(i,{type:`primary`,onClick:r},{default:z(()=>[...n[0]||(n[0]=[J(`开始`,-1)])]),_:1})])):e.step.runtime.status===`in_progress`?(U(),W(`div`,hx,[q(s,{class:`is-loading`},{default:z(()=>[q(a)]),_:1}),K(`span`,null,M(e.step.runtime.stage),1),c(e.step.runtime.oauthUrl)?(U(),W(`a`,{key:0,href:c(e.step.runtime.oauthUrl),target:`_blank`,rel:`noopener noreferrer`,class:`fallback`},` 浏览器没自动打开? 点这里 `,8,gx)):Y(``,!0)])):e.step.runtime.status===`error`?(U(),G(px,{key:2,message:e.step.runtime.errorMessage||`未知错误`,detail:e.step.runtime.errorDetail,onRetry:o},null,8,[`message`,`detail`])):Y(``,!0)}}}),[[`__scopeId`,`data-v-1c84bc54`]]),vx={key:0},yx={key:1,class:`in-progress`},bx=vb(B({__name:`ActionStep`,props:{step:{},onboarding:{}},setup(e){let t=e;async function n(){t.onboarding.markStepInProgress(t.step.id,`处理中…`);try{if(t.step.id===`vscode_configure`||t.step.id===`codex_desktop_configure`||t.step.id===`opencode_desktop_configure`)await Jy();else if(t.step.id===`finalize`)await Yy();else throw new zy(`ActionStep doesn't know step ${t.step.id}`);t.onboarding.markStepSuccess(t.step.id),await t.onboarding.refreshState()}catch(e){let n=e;t.onboarding.markStepError(t.step.id,n.message,n.detail)}}function r(){n()}return Tr(()=>{t.onboarding.shouldAutoAdvance(t.step)&&n()}),(t,i)=>{let a=cv,o=Fr(`Loading`),s=xg;return e.step.runtime.status===`active`?(U(),W(`div`,vx,[q(a,{type:`primary`,onClick:n},{default:z(()=>[J(M(e.step.id===`finalize`?`完成`:`开始`),1)]),_:1})])):e.step.runtime.status===`in_progress`?(U(),W(`div`,yx,[q(s,{class:`is-loading`},{default:z(()=>[q(o)]),_:1}),K(`span`,null,M(e.step.runtime.stage),1)])):e.step.runtime.status===`error`?(U(),G(px,{key:2,message:e.step.runtime.errorMessage||`未知错误`,detail:e.step.runtime.errorDetail,onRetry:r},null,8,[`message`,`detail`])):Y(``,!0)}}}),[[`__scopeId`,`data-v-1eb9d389`]]);function xx(e){let t=L([]),n=L(),r=L(!1),i=L(null),a=new EventSource(`/api/events?stream=${encodeURIComponent(e)}`);a.onmessage=e=>{try{let r=JSON.parse(e.data);t.value.push(r),n.value=r}catch(e){i.value=`解析事件失败: `+(e instanceof Error?e.message:String(e))}},a.onerror=()=>{a.readyState===EventSource.CLOSED||a.close(),r.value=!0};function o(){a.close(),r.value=!0}return ka()&&kr(o),{events:t,latest:n,done:r,error:i,close:o}}var Sx={key:0},Cx={key:1,class:`in-progress`},wx={class:`stage-row`},Tx=vb(B({__name:`ProgressStep`,props:{step:{},onboarding:{}},setup(e){let t=e,n=Jt(null),r=L(),i=[];async function a(){c(),t.onboarding.markStepInProgress(t.step.id,`准备中…`),r.value=void 0;try{n.value=xx((await qy()).stream_id),i=[Wn(()=>n.value?.latest.value,e=>{e&&(o(e),e.stage===`error`&&(r.value=e.msg||`安装失败`))}),Wn(()=>n.value?.done.value,async e=>{e&&(await t.onboarding.refreshState(),t.onboarding.steps.value.find(e=>e.id===t.step.id)?.runtime.status===`success`||t.onboarding.markStepError(t.step.id,`安装未完成`,r.value||`请重试;如果仍失败,请查看 launcher 日志获取详情。`))})]}catch(e){let n=e;t.onboarding.markStepError(t.step.id,n.message,n.detail)}}function o(e){let n=e.msg||e.stage||`处理中…`,r=e.total&&e.downloaded!=null?Math.round(e.downloaded/e.total*100):void 0;t.onboarding.updateProgress(t.step.id,{stage:n,percent:r})}function s(){a()}function c(){for(let e of i)e();i=[],n.value?.close(),n.value=null}return Tr(()=>{t.onboarding.shouldAutoAdvance(t.step)&&a()}),Or(()=>{c()}),(t,n)=>{let r=cv,i=Fr(`Loading`),o=xg,c=Bv;return e.step.runtime.status===`active`?(U(),W(`div`,Sx,[q(r,{type:`primary`,onClick:a},{default:z(()=>[...n[0]||(n[0]=[J(`开始`,-1)])]),_:1})])):e.step.runtime.status===`in_progress`?(U(),W(`div`,Cx,[K(`div`,wx,[q(o,{class:`is-loading`},{default:z(()=>[q(i)]),_:1}),K(`span`,null,M(e.step.runtime.stage),1)]),typeof e.step.runtime.percent==`number`?(U(),G(c,{key:0,percentage:e.step.runtime.percent,"stroke-width":8},null,8,[`percentage`])):Y(``,!0)])):e.step.runtime.status===`error`?(U(),G(px,{key:2,message:e.step.runtime.errorMessage||`未知错误`,detail:e.step.runtime.errorDetail,onRetry:s},null,8,[`message`,`detail`])):Y(``,!0)}}}),[[`__scopeId`,`data-v-f7fc6084`]]),Ex={class:`container`};hs(vb(B({__name:`App`,setup(e){let t=fb();return Tr(async()=>{await t.init()}),(e,n)=>{let r=Sg;return U(),W(`div`,Ex,[R(t).isComplete.value?(U(),G(ax,{key:0})):(U(),W(H,{key:1},[n[0]||(n[0]=K(`h1`,null,`星池指挥官配置向导`,-1)),R(t).connectionError.value?(U(),G(r,{key:0,type:`error`,title:R(t).connectionError.value,closable:!1,"show-icon":``,class:`conn-error`},null,8,[`title`])):Y(``,!0),(U(!0),W(H,null,Br(R(t).steps.value,e=>(U(),G(ux,{key:e.id,step:e},{action:z(()=>[e.kind===`oauth`&&(e.runtime.status===`active`||e.runtime.status===`in_progress`||e.runtime.status===`error`)?(U(),G(_x,{key:0,step:e,onboarding:R(t)},null,8,[`step`,`onboarding`])):e.kind===`progress`&&(e.runtime.status===`active`||e.runtime.status===`in_progress`||e.runtime.status===`error`)?(U(),G(Tx,{key:1,step:e,onboarding:R(t)},null,8,[`step`,`onboarding`])):e.kind===`action`&&(e.runtime.status===`active`||e.runtime.status===`in_progress`||e.runtime.status===`error`)?(U(),G(bx,{key:2,step:e,onboarding:R(t)},null,8,[`step`,`onboarding`])):Y(``,!0)]),_:2},1032,[`step`]))),128))],64))])}}}),[[`__scopeId`,`data-v-d1709252`]])).mount(`#app`); \ No newline at end of file diff --git a/internal/ui/assets/dist/assets/index-CMqmoZox.css b/internal/ui/assets/dist/assets/index-CMqmoZox.css new file mode 100644 index 0000000..903e7f8 --- /dev/null +++ b/internal/ui/assets/dist/assets/index-CMqmoZox.css @@ -0,0 +1 @@ +:root{--el-color-white:#fff;--el-color-black:#000;--el-color-primary-rgb:64, 158, 255;--el-color-success-rgb:103, 194, 58;--el-color-warning-rgb:230, 162, 60;--el-color-danger-rgb:245, 108, 108;--el-color-error-rgb:245, 108, 108;--el-color-info-rgb:144, 147, 153;--el-font-size-extra-large:20px;--el-font-size-large:18px;--el-font-size-medium:16px;--el-font-size-base:14px;--el-font-size-small:13px;--el-font-size-extra-small:12px;--el-font-family:"Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "微软雅黑", Arial, sans-serif;--el-font-weight-primary:500;--el-font-line-height-primary:24px;--el-index-normal:1;--el-index-top:1000;--el-index-popper:2000;--el-border-radius-base:4px;--el-border-radius-small:2px;--el-border-radius-round:20px;--el-border-radius-circle:100%;--el-transition-duration:.3s;--el-transition-duration-fast:.2s;--el-transition-function-ease-in-out-bezier:cubic-bezier(.645, .045, .355, 1);--el-transition-function-fast-bezier:cubic-bezier(.23, 1, .32, 1);--el-transition-all:all var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier);--el-transition-fade:opacity var(--el-transition-duration) var(--el-transition-function-fast-bezier);--el-transition-md-fade:transform var(--el-transition-duration) var(--el-transition-function-fast-bezier), opacity var(--el-transition-duration) var(--el-transition-function-fast-bezier);--el-transition-fade-linear:opacity var(--el-transition-duration-fast) linear;--el-transition-border:border-color var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-transition-box-shadow:box-shadow var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-transition-color:color var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-component-size-large:40px;--el-component-size:32px;--el-component-size-small:24px;--lightningcss-light:initial;--lightningcss-dark: ;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--el-color-primary:#409eff;--el-color-primary-light-3:#79bbff;--el-color-primary-light-5:#a0cfff;--el-color-primary-light-7:#c6e2ff;--el-color-primary-light-8:#d9ecff;--el-color-primary-light-9:#ecf5ff;--el-color-primary-dark-2:#337ecc;--el-color-success:#67c23a;--el-color-success-light-3:#95d475;--el-color-success-light-5:#b3e19d;--el-color-success-light-7:#d1edc4;--el-color-success-light-8:#e1f3d8;--el-color-success-light-9:#f0f9eb;--el-color-success-dark-2:#529b2e;--el-color-warning:#e6a23c;--el-color-warning-light-3:#eebe77;--el-color-warning-light-5:#f3d19e;--el-color-warning-light-7:#f8e3c5;--el-color-warning-light-8:#faecd8;--el-color-warning-light-9:#fdf6ec;--el-color-warning-dark-2:#b88230;--el-color-danger:#f56c6c;--el-color-danger-light-3:#f89898;--el-color-danger-light-5:#fab6b6;--el-color-danger-light-7:#fcd3d3;--el-color-danger-light-8:#fde2e2;--el-color-danger-light-9:#fef0f0;--el-color-danger-dark-2:#c45656;--el-color-error:#f56c6c;--el-color-error-light-3:#f89898;--el-color-error-light-5:#fab6b6;--el-color-error-light-7:#fcd3d3;--el-color-error-light-8:#fde2e2;--el-color-error-light-9:#fef0f0;--el-color-error-dark-2:#c45656;--el-color-info:#909399;--el-color-info-light-3:#b1b3b8;--el-color-info-light-5:#c8c9cc;--el-color-info-light-7:#dedfe0;--el-color-info-light-8:#e9e9eb;--el-color-info-light-9:#f4f4f5;--el-color-info-dark-2:#73767a;--el-bg-color:#fff;--el-bg-color-page:#f2f3f5;--el-bg-color-overlay:#fff;--el-text-color-primary:#303133;--el-text-color-regular:#606266;--el-text-color-secondary:#909399;--el-text-color-placeholder:#a8abb2;--el-text-color-disabled:#c0c4cc;--el-border-color:#dcdfe6;--el-border-color-light:#e4e7ed;--el-border-color-lighter:#ebeef5;--el-border-color-extra-light:#f2f6fc;--el-border-color-dark:#d4d7de;--el-border-color-darker:#cdd0d6;--el-fill-color:#f0f2f5;--el-fill-color-light:#f5f7fa;--el-fill-color-lighter:#fafafa;--el-fill-color-extra-light:#fafcff;--el-fill-color-dark:#ebedf0;--el-fill-color-darker:#e6e8eb;--el-fill-color-blank:#fff;--el-box-shadow:0px 12px 32px 4px #0000000a, 0px 8px 20px #00000014;--el-box-shadow-light:0px 0px 12px #0000001f;--el-box-shadow-lighter:0px 0px 6px #0000001f;--el-box-shadow-dark:0px 16px 48px 16px #00000014, 0px 12px 32px #0000001f, 0px 8px 16px -8px #00000029;--el-disabled-bg-color:var(--el-fill-color-light);--el-disabled-text-color:var(--el-text-color-placeholder);--el-disabled-border-color:var(--el-border-color-light);--el-overlay-color:#000c;--el-overlay-color-light:#000000b3;--el-overlay-color-lighter:#00000080;--el-mask-color:#ffffffe6;--el-mask-color-extra-light:#ffffff4d;--el-border-width:1px;--el-border-style:solid;--el-border-color-hover:var(--el-text-color-disabled);--el-border:var(--el-border-width) var(--el-border-style) var(--el-border-color);--el-svg-monochrome-grey:var(--el-border-color)}.fade-in-linear-enter-active,.fade-in-linear-leave-active{transition:var(--el-transition-fade-linear)}.fade-in-linear-enter-from,.fade-in-linear-leave-to{opacity:0}.el-fade-in-linear-enter-active,.el-fade-in-linear-leave-active{transition:var(--el-transition-fade-linear)}.el-fade-in-linear-enter-from,.el-fade-in-linear-leave-to{opacity:0}.el-fade-in-enter-active,.el-fade-in-leave-active{transition:all var(--el-transition-duration) cubic-bezier(.55, 0, .1, 1)}.el-fade-in-enter-from,.el-fade-in-leave-active{opacity:0}.el-zoom-in-center-enter-active,.el-zoom-in-center-leave-active{transition:all var(--el-transition-duration) cubic-bezier(.55, 0, .1, 1)}.el-zoom-in-center-enter-from,.el-zoom-in-center-leave-active{opacity:0;transform:scaleX(0)}.el-zoom-in-top-enter-active,.el-zoom-in-top-leave-active{opacity:1;transition:var(--el-transition-md-fade);transform-origin:top;transform:scaleY(1)}.el-zoom-in-top-enter-active[data-popper-placement^=top],.el-zoom-in-top-leave-active[data-popper-placement^=top]{transform-origin:bottom}.el-zoom-in-top-enter-from,.el-zoom-in-top-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-bottom-enter-active,.el-zoom-in-bottom-leave-active{opacity:1;transition:var(--el-transition-md-fade);transform-origin:bottom;transform:scaleY(1)}.el-zoom-in-bottom-enter-from,.el-zoom-in-bottom-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-left-enter-active,.el-zoom-in-left-leave-active{opacity:1;transition:var(--el-transition-md-fade);transform-origin:0 0;transform:scale(1)}.el-zoom-in-left-enter-from,.el-zoom-in-left-leave-active{opacity:0;transform:scale(.45)}.collapse-transition{transition:var(--el-transition-duration) height ease-in-out, var(--el-transition-duration) padding-top ease-in-out, var(--el-transition-duration) padding-bottom ease-in-out}.el-collapse-transition-leave-active,.el-collapse-transition-enter-active{transition:var(--el-transition-duration) max-height ease-in-out, var(--el-transition-duration) padding-top ease-in-out, var(--el-transition-duration) padding-bottom ease-in-out}.horizontal-collapse-transition{transition:var(--el-transition-duration) width ease-in-out, var(--el-transition-duration) padding-left ease-in-out, var(--el-transition-duration) padding-right ease-in-out}.el-list-enter-active,.el-list-leave-active{transition:all 1s}.el-list-enter-from,.el-list-leave-to{opacity:0;transform:translateY(-30px)}.el-list-leave-active{position:absolute!important}.el-opacity-transition{transition:opacity var(--el-transition-duration) cubic-bezier(.55, 0, .1, 1)}.el-icon--right{margin-left:5px}.el-icon--left{margin-right:5px}@keyframes rotating{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.el-icon{--color:inherit;fill:currentColor;width:1em;height:1em;color:var(--color);line-height:1em;font-size:inherit;justify-content:center;align-items:center;display:inline-flex;position:relative}.el-icon.is-loading{animation:2s linear infinite rotating}.el-icon svg{width:1em;height:1em}.el-alert{--el-alert-padding:8px 16px;--el-alert-border-radius-base:var(--el-border-radius-base);--el-alert-title-font-size:14px;--el-alert-title-with-description-font-size:16px;--el-alert-description-font-size:14px;--el-alert-close-font-size:16px;--el-alert-close-customed-font-size:14px;--el-alert-icon-size:16px;--el-alert-icon-large-size:28px;width:100%;padding:var(--el-alert-padding);box-sizing:border-box;border-radius:var(--el-alert-border-radius-base);background-color:var(--el-color-white);opacity:1;transition:opacity var(--el-transition-duration-fast);align-items:center;margin:0;display:flex;position:relative;overflow:hidden}.el-alert.is-light .el-alert__close-btn{color:var(--el-text-color-placeholder)}.el-alert.is-dark .el-alert__close-btn,.el-alert.is-dark .el-alert__description{color:var(--el-color-white)}.el-alert.is-center{justify-content:center}.el-alert--primary{--el-alert-bg-color:var(--el-color-primary-light-9)}.el-alert--primary.is-light{background-color:var(--el-alert-bg-color);color:var(--el-color-primary)}.el-alert--primary.is-light .el-alert__description{color:var(--el-color-primary)}.el-alert--primary.is-dark{background-color:var(--el-color-primary);color:var(--el-color-white)}.el-alert--success{--el-alert-bg-color:var(--el-color-success-light-9)}.el-alert--success.is-light{background-color:var(--el-alert-bg-color);color:var(--el-color-success)}.el-alert--success.is-light .el-alert__description{color:var(--el-color-success)}.el-alert--success.is-dark{background-color:var(--el-color-success);color:var(--el-color-white)}.el-alert--info{--el-alert-bg-color:var(--el-color-info-light-9)}.el-alert--info.is-light{background-color:var(--el-alert-bg-color);color:var(--el-color-info)}.el-alert--info.is-light .el-alert__description{color:var(--el-color-info)}.el-alert--info.is-dark{background-color:var(--el-color-info);color:var(--el-color-white)}.el-alert--warning{--el-alert-bg-color:var(--el-color-warning-light-9)}.el-alert--warning.is-light{background-color:var(--el-alert-bg-color);color:var(--el-color-warning)}.el-alert--warning.is-light .el-alert__description{color:var(--el-color-warning)}.el-alert--warning.is-dark{background-color:var(--el-color-warning);color:var(--el-color-white)}.el-alert--error{--el-alert-bg-color:var(--el-color-error-light-9)}.el-alert--error.is-light{background-color:var(--el-alert-bg-color);color:var(--el-color-error)}.el-alert--error.is-light .el-alert__description{color:var(--el-color-error)}.el-alert--error.is-dark{background-color:var(--el-color-error);color:var(--el-color-white)}.el-alert__content{flex-direction:column;gap:4px;display:flex}.el-alert .el-alert__icon{font-size:var(--el-alert-icon-size);width:var(--el-alert-icon-size);margin-right:8px}.el-alert .el-alert__icon.is-big{font-size:var(--el-alert-icon-large-size);width:var(--el-alert-icon-large-size);margin-right:12px}.el-alert__title{font-size:var(--el-alert-title-font-size);line-height:24px}.el-alert__title.with-description{font-size:var(--el-alert-title-with-description-font-size)}.el-alert .el-alert__description{font-size:var(--el-alert-description-font-size);margin:0}.el-alert .el-alert__close-btn{font-size:var(--el-alert-close-font-size);opacity:1;cursor:pointer;position:absolute;top:12px;right:16px}.el-alert .el-alert__close-btn.is-customed{font-style:normal;font-size:var(--el-alert-close-customed-font-size);line-height:24px;top:8px}.el-alert-fade-enter-from,.el-alert-fade-leave-active{opacity:0}.el-textarea{--el-input-text-color:var(--el-text-color-regular);--el-input-border:var(--el-border);--el-input-hover-border:var(--el-border-color-hover);--el-input-focus-border:var(--el-color-primary);--el-input-transparent-border:0 0 0 1px transparent inset;--el-input-border-color:var(--el-border-color);--el-input-border-radius:var(--el-border-radius-base);--el-input-bg-color:var(--el-fill-color-blank);--el-input-icon-color:var(--el-text-color-placeholder);--el-input-placeholder-color:var(--el-text-color-placeholder);--el-input-hover-border-color:var(--el-border-color-hover);--el-input-clear-hover-color:var(--el-text-color-secondary);--el-input-focus-border-color:var(--el-color-primary);--el-input-width:100%;vertical-align:bottom;width:100%;font-size:var(--el-font-size-base);display:inline-block;position:relative}.el-textarea__inner{resize:vertical;box-sizing:border-box;width:100%;line-height:1.5;font-size:inherit;color:var(--el-input-text-color,var(--el-text-color-regular));background-color:var(--el-input-bg-color,var(--el-fill-color-blank));-webkit-appearance:none;box-shadow:0 0 0 1px var(--el-input-border-color,var(--el-border-color)) inset;border-radius:var(--el-input-border-radius,var(--el-border-radius-base));transition:var(--el-transition-box-shadow);background-image:none;border:none;padding:5px 11px;font-family:inherit;display:block;position:relative}.el-textarea__inner.is-clearable{padding:5px 26px 5px 11px}.el-textarea__inner::placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-textarea__inner:hover{box-shadow:0 0 0 1px var(--el-input-hover-border-color) inset}.el-textarea__inner:focus{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset;outline:none}.el-textarea__clear{color:var(--el-input-icon-color);cursor:pointer;font-size:14px;position:absolute;top:15px;right:11px;transform:translateY(-50%)}.el-textarea__clear:hover{color:var(--el-input-clear-hover-color)}.el-textarea .el-input__count{color:var(--el-color-info);background:var(--el-fill-color-blank);font-size:12px;line-height:14px;position:absolute;bottom:5px;right:10px}.el-textarea .el-input__count.is-outside{top:100%;right:0;bottom:unset;background:0 0;padding-top:2px;line-height:1;position:absolute}.el-textarea.is-disabled .el-textarea__inner{box-shadow:0 0 0 1px var(--el-disabled-border-color) inset;background-color:var(--el-disabled-bg-color);color:var(--el-disabled-text-color);cursor:not-allowed}.el-textarea.is-disabled .el-textarea__inner::placeholder{color:var(--el-text-color-placeholder)}.el-textarea.is-exceed .el-textarea__inner{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-textarea.is-exceed .el-input__count{color:var(--el-color-danger)}.el-input{--el-input-text-color:var(--el-text-color-regular);--el-input-border:var(--el-border);--el-input-hover-border:var(--el-border-color-hover);--el-input-focus-border:var(--el-color-primary);--el-input-transparent-border:0 0 0 1px transparent inset;--el-input-border-color:var(--el-border-color);--el-input-border-radius:var(--el-border-radius-base);--el-input-bg-color:var(--el-fill-color-blank);--el-input-icon-color:var(--el-text-color-placeholder);--el-input-placeholder-color:var(--el-text-color-placeholder);--el-input-hover-border-color:var(--el-border-color-hover);--el-input-clear-hover-color:var(--el-text-color-secondary);--el-input-focus-border-color:var(--el-color-primary);--el-input-width:100%;--el-input-height:var(--el-component-size);font-size:var(--el-font-size-base);width:var(--el-input-width);line-height:var(--el-input-height);box-sizing:border-box;vertical-align:middle;display:inline-flex;position:relative}.el-input::-webkit-scrollbar{z-index:11;width:6px}.el-input::-webkit-scrollbar:horizontal{height:6px}.el-input::-webkit-scrollbar-thumb{background:var(--el-text-color-disabled);border-radius:5px;width:6px}.el-input::-webkit-scrollbar-corner{background:var(--el-fill-color-blank)}.el-input::-webkit-scrollbar-track{background:var(--el-fill-color-blank)}.el-input::-webkit-scrollbar-track-piece{background:var(--el-fill-color-blank);width:6px}.el-input .el-input__clear,.el-input .el-input__password{color:var(--el-input-icon-color);cursor:pointer;font-size:14px}.el-input .el-input__clear:hover,.el-input .el-input__password:hover{color:var(--el-input-clear-hover-color)}.el-input .el-input__count{height:100%;color:var(--el-color-info);align-items:center;font-size:12px;display:inline-flex}.el-input .el-input__count .el-input__count-inner{background:var(--el-fill-color-blank);line-height:initial;padding-left:8px;display:inline-block}.el-input .el-input__count.is-outside{height:unset;padding-top:2px;position:absolute;top:100%;right:0}.el-input .el-input__count.is-outside .el-input__count-inner{background:0 0;padding-left:0;line-height:1}.el-input__wrapper{background-color:var(--el-input-bg-color,var(--el-fill-color-blank));border-radius:var(--el-input-border-radius,var(--el-border-radius-base));cursor:text;transition:var(--el-transition-box-shadow);box-shadow:0 0 0 1px var(--el-input-border-color,var(--el-border-color)) inset;background-image:none;flex-grow:1;justify-content:center;align-items:center;padding:1px 11px;display:inline-flex;transform:translate(0)}.el-input__wrapper:hover{box-shadow:0 0 0 1px var(--el-input-hover-border-color) inset}.el-input__wrapper.is-focus{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset}.el-input{--el-input-inner-height:calc(var(--el-input-height,32px) - 2px)}.el-input__inner{-webkit-appearance:none;width:100%;color:var(--el-input-text-color,var(--el-text-color-regular));font-size:inherit;height:var(--el-input-inner-height);line-height:var(--el-input-inner-height);box-sizing:border-box;background:0 0;border:none;outline:none;flex-grow:1;padding:0}.el-input__inner:focus{outline:none}.el-input__inner::placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-input__inner[type=password]::-ms-reveal{display:none}.el-input__inner[type=number]{line-height:1}.el-input__prefix{white-space:nowrap;height:100%;line-height:var(--el-input-inner-height);text-align:center;color:var(--el-input-icon-color,var(--el-text-color-placeholder));transition:all var(--el-transition-duration);pointer-events:none;flex-wrap:nowrap;flex-shrink:0;display:inline-flex}.el-input__prefix-inner{pointer-events:all;justify-content:center;align-items:center;display:inline-flex}.el-input__prefix-inner>:last-child{margin-right:8px}.el-input__prefix-inner>:first-child,.el-input__prefix-inner>:first-child.el-input__icon{margin-left:0}.el-input__suffix{white-space:nowrap;height:100%;line-height:var(--el-input-inner-height);text-align:center;color:var(--el-input-icon-color,var(--el-text-color-placeholder));transition:all var(--el-transition-duration);pointer-events:none;flex-wrap:nowrap;flex-shrink:0;display:inline-flex}.el-input__suffix-inner{pointer-events:all;justify-content:center;align-items:center;display:inline-flex}.el-input__suffix-inner>:first-child{margin-left:8px}.el-input .el-input__icon{height:inherit;line-height:inherit;transition:all var(--el-transition-duration);justify-content:center;align-items:center;margin-left:8px;display:flex}.el-input .el-input__clear{transition:color var(--el-transition-duration)}.el-input__validateIcon{pointer-events:none}.el-input.is-active .el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-focus-color, ) inset}.el-input.is-disabled{cursor:not-allowed}.el-input.is-disabled .el-input__wrapper{background-color:var(--el-disabled-bg-color);cursor:not-allowed;box-shadow:0 0 0 1px var(--el-disabled-border-color) inset}.el-input.is-disabled .el-input__inner{color:var(--el-disabled-text-color);-webkit-text-fill-color:var(--el-disabled-text-color);cursor:not-allowed}.el-input.is-disabled .el-input__inner::placeholder{color:var(--el-text-color-placeholder)}.el-input.is-disabled .el-input__icon{cursor:not-allowed}.el-input.is-disabled .el-input__prefix-inner,.el-input.is-disabled .el-input__suffix-inner{pointer-events:none}.el-input.is-exceed .el-input__wrapper{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-input.is-exceed .el-input__suffix .el-input__count{color:var(--el-color-danger)}.el-input--large{--el-input-height:var(--el-component-size-large);font-size:14px}.el-input--large .el-input__wrapper{padding:1px 15px}.el-input--large{--el-input-inner-height:calc(var(--el-input-height,40px) - 2px)}.el-input--small{--el-input-height:var(--el-component-size-small);font-size:12px}.el-input--small .el-input__wrapper{padding:1px 7px}.el-input--small{--el-input-inner-height:calc(var(--el-input-height,24px) - 2px)}.el-input-group{align-items:stretch;width:100%;display:inline-flex}.el-input-group__append,.el-input-group__prepend{background-color:var(--el-fill-color-light);color:var(--el-color-info);border-radius:var(--el-input-border-radius);white-space:nowrap;justify-content:center;align-items:center;min-height:100%;padding:0 20px;display:inline-flex;position:relative}.el-input-group__append:focus,.el-input-group__prepend:focus{outline:none}.el-input-group__append .el-select,.el-input-group__append .el-button,.el-input-group__prepend .el-select,.el-input-group__prepend .el-button{flex:1;margin:0 -20px;display:inline-block}.el-input-group__append button.el-button,.el-input-group__append button.el-button:hover,.el-input-group__append div.el-select .el-select__wrapper,.el-input-group__append div.el-select:hover .el-select__wrapper,.el-input-group__prepend button.el-button,.el-input-group__prepend button.el-button:hover,.el-input-group__prepend div.el-select .el-select__wrapper,.el-input-group__prepend div.el-select:hover .el-select__wrapper{color:inherit;background-color:#0000;border-color:#0000}.el-input-group__append .el-button,.el-input-group__append .el-input,.el-input-group__prepend .el-button,.el-input-group__prepend .el-input{font-size:inherit}.el-input-group__prepend{box-shadow:1px 0 0 0 var(--el-input-border-color) inset, 0 1px 0 0 var(--el-input-border-color) inset, 0 -1px 0 0 var(--el-input-border-color) inset;border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.el-input-group__append{box-shadow:0 1px 0 0 var(--el-input-border-color) inset, 0 -1px 0 0 var(--el-input-border-color) inset, -1px 0 0 0 var(--el-input-border-color) inset;border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.el-input-group--prepend>.el-input__wrapper{border-top-left-radius:0;border-bottom-left-radius:0}.el-input-group--prepend .el-input-group__prepend .el-select .el-select__wrapper{box-shadow:1px 0 0 0 var(--el-input-border-color) inset, 0 1px 0 0 var(--el-input-border-color) inset, 0 -1px 0 0 var(--el-input-border-color) inset;border-top-right-radius:0;border-bottom-right-radius:0}.el-input-group--append>.el-input__wrapper{border-top-right-radius:0;border-bottom-right-radius:0}.el-input-group--append .el-input-group__append .el-select .el-select__wrapper{box-shadow:0 1px 0 0 var(--el-input-border-color) inset, 0 -1px 0 0 var(--el-input-border-color) inset, -1px 0 0 0 var(--el-input-border-color) inset;border-top-left-radius:0;border-bottom-left-radius:0}.el-input-hidden{display:none!important}.el-radio{--el-radio-font-size:var(--el-font-size-base);--el-radio-text-color:var(--el-text-color-regular);--el-radio-font-weight:var(--el-font-weight-primary);--el-radio-input-height:14px;--el-radio-input-width:14px;--el-radio-input-border-radius:var(--el-border-radius-circle);--el-radio-input-bg-color:var(--el-fill-color-blank);--el-radio-input-border:var(--el-border);--el-radio-input-border-color:var(--el-border-color);--el-radio-input-border-color-hover:var(--el-color-primary);color:var(--el-radio-text-color);font-weight:var(--el-radio-font-weight);cursor:pointer;white-space:nowrap;font-size:var(--el-font-size-base);-webkit-user-select:none;user-select:none;outline:none;align-items:center;height:32px;margin-right:30px;display:inline-flex;position:relative}.el-radio.el-radio--large{height:40px}.el-radio.el-radio--small{height:24px}.el-radio.is-bordered{border-radius:var(--el-border-radius-base);border:var(--el-border);box-sizing:border-box;padding:0 15px 0 9px}.el-radio.is-bordered.is-checked{border-color:var(--el-color-primary)}.el-radio.is-bordered.is-disabled{cursor:not-allowed;border-color:var(--el-border-color-lighter)}.el-radio.is-bordered.el-radio--large{border-radius:var(--el-border-radius-base);padding:0 19px 0 11px}.el-radio.is-bordered.el-radio--large .el-radio__label{font-size:var(--el-font-size-base)}.el-radio.is-bordered.el-radio--large .el-radio__inner{width:14px;height:14px}.el-radio.is-bordered.el-radio--small{border-radius:var(--el-border-radius-base);padding:0 11px 0 7px}.el-radio.is-bordered.el-radio--small .el-radio__label{font-size:12px}.el-radio.is-bordered.el-radio--small .el-radio__inner{width:12px;height:12px}.el-radio:last-child{margin-right:0}.el-radio__input{white-space:nowrap;cursor:pointer;vertical-align:middle;outline:none;display:inline-flex;position:relative}.el-radio__input.is-disabled .el-radio__inner{background-color:var(--el-disabled-bg-color);border-color:var(--el-disabled-border-color);cursor:not-allowed}.el-radio__input.is-disabled .el-radio__inner:after{cursor:not-allowed;background-color:var(--el-disabled-bg-color)}.el-radio__input.is-disabled .el-radio__inner+.el-radio__label{cursor:not-allowed}.el-radio__input.is-disabled.is-checked .el-radio__inner{background-color:var(--el-disabled-bg-color);border-color:var(--el-disabled-border-color)}.el-radio__input.is-disabled.is-checked .el-radio__inner:after{background-color:var(--el-text-color-placeholder)}.el-radio__input.is-disabled+span.el-radio__label{color:var(--el-text-color-placeholder);cursor:not-allowed}.el-radio__input.is-checked .el-radio__inner{border-color:var(--el-color-primary);background:var(--el-color-primary)}.el-radio__input.is-checked .el-radio__inner:after{background-color:var(--el-color-white);transform:translate(-50%,-50%)scale(1)}.el-radio__input.is-checked+.el-radio__label{color:var(--el-color-primary)}.el-radio__input.is-focus .el-radio__inner{border-color:var(--el-radio-input-border-color-hover)}.el-radio__inner{border:var(--el-radio-input-border);border-radius:var(--el-radio-input-border-radius);width:var(--el-radio-input-width);height:var(--el-radio-input-height);background-color:var(--el-radio-input-bg-color);cursor:pointer;box-sizing:border-box;transition:all .3s;display:inline-block;position:relative}.el-radio__inner:hover{border-color:var(--el-radio-input-border-color-hover)}.el-radio__inner:after{border-radius:var(--el-radio-input-border-radius);content:"";width:4px;height:4px;transition:transform .15s ease-in;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)scale(0)}.el-radio__original{opacity:0;z-index:-1;outline:none;margin:0;position:absolute;top:0;bottom:0;left:0;right:0}.el-radio__original:focus-visible+.el-radio__inner{outline:2px solid var(--el-radio-input-border-color-hover);outline-offset:1px;border-radius:var(--el-radio-input-border-radius)}.el-radio:focus:not(:focus-visible):not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner{box-shadow:0 0 2px 2px var(--el-radio-input-border-color-hover)}.el-radio__label{font-size:var(--el-radio-font-size);padding-left:8px}.el-radio.el-radio--large .el-radio__label{font-size:14px}.el-radio.el-radio--large .el-radio__inner{width:14px;height:14px}.el-radio.el-radio--small .el-radio__label{font-size:12px}.el-radio.el-radio--small .el-radio__inner{width:12px;height:12px}.el-radio-group{flex-wrap:wrap;align-items:center;font-size:0;display:inline-flex}.el-button{--el-button-font-weight:var(--el-font-weight-primary);--el-button-border-color:var(--el-border-color);--el-button-bg-color:var(--el-fill-color-blank);--el-button-text-color:var(--el-text-color-regular);--el-button-disabled-text-color:var(--el-disabled-text-color);--el-button-disabled-bg-color:var(--el-fill-color-blank);--el-button-disabled-border-color:var(--el-border-color-light);--el-button-divide-border-color:#ffffff80;--el-button-hover-text-color:var(--el-color-primary);--el-button-hover-bg-color:var(--el-color-primary-light-9);--el-button-hover-border-color:var(--el-color-primary-light-7);--el-button-active-text-color:var(--el-button-hover-text-color);--el-button-active-border-color:var(--el-color-primary);--el-button-active-bg-color:var(--el-button-hover-bg-color);--el-button-outline-color:var(--el-color-primary-light-5);--el-button-hover-link-text-color:var(--el-text-color-secondary);--el-button-active-color:var(--el-text-color-primary);white-space:nowrap;cursor:pointer;height:32px;color:var(--el-button-text-color);text-align:center;box-sizing:border-box;line-height:1;font-weight:var(--el-button-font-weight);-webkit-user-select:none;user-select:none;vertical-align:middle;-webkit-appearance:none;background-color:var(--el-button-bg-color);border:var(--el-border);border-color:var(--el-button-border-color);outline:none;justify-content:center;align-items:center;transition:all .1s;display:inline-flex}.el-button:hover{color:var(--el-button-hover-text-color);border-color:var(--el-button-hover-border-color);background-color:var(--el-button-hover-bg-color);outline:none}.el-button:active{color:var(--el-button-active-text-color);border-color:var(--el-button-active-border-color);background-color:var(--el-button-active-bg-color);outline:none}.el-button:focus-visible{outline:2px solid var(--el-button-outline-color);outline-offset:1px;transition:outline-offset,outline}.el-button>span{align-items:center;display:inline-flex}.el-button+.el-button{margin-left:12px}.el-button{font-size:var(--el-font-size-base);border-radius:var(--el-border-radius-base);padding:8px 15px}.el-button.is-round{padding:8px 15px}.el-button::-moz-focus-inner{border:0}.el-button [class*=el-icon]+span{margin-left:6px}.el-button [class*=el-icon] svg{vertical-align:bottom}.el-button.is-plain{--el-button-hover-text-color:var(--el-color-primary);--el-button-hover-bg-color:var(--el-fill-color-blank);--el-button-hover-border-color:var(--el-color-primary)}.el-button.is-active{color:var(--el-button-active-text-color);border-color:var(--el-button-active-border-color);background-color:var(--el-button-active-bg-color);outline:none}.el-button.is-disabled,.el-button.is-disabled:hover{color:var(--el-button-disabled-text-color);cursor:not-allowed;background-image:none;background-color:var(--el-button-disabled-bg-color);border-color:var(--el-button-disabled-border-color)}.el-button.is-loading{pointer-events:none;position:relative}.el-button.is-loading:before{z-index:1;pointer-events:none;content:"";border-radius:inherit;background-color:var(--el-mask-color-extra-light);position:absolute;top:-1px;bottom:-1px;left:-1px;right:-1px}.el-button.is-round{border-radius:var(--el-border-radius-round)}.el-button.is-dashed{--el-button-hover-text-color:var(--el-color-primary);--el-button-hover-bg-color:var(--el-fill-color-blank);--el-button-hover-border-color:var(--el-color-primary);border-style:dashed}.el-button.is-circle{border-radius:50%;width:32px;padding:8px}.el-button.is-text{color:var(--el-button-text-color);background-color:#0000;border:0 solid #0000}.el-button.is-text.is-disabled{color:var(--el-button-disabled-text-color);background-color:#0000!important}.el-button.is-text:not(.is-disabled):hover{background-color:var(--el-fill-color-light)}.el-button.is-text:not(.is-disabled):focus-visible{outline:2px solid var(--el-button-outline-color);outline-offset:1px;transition:outline-offset,outline}.el-button.is-text:not(.is-disabled):active{background-color:var(--el-fill-color)}.el-button.is-text:not(.is-disabled).is-has-bg{background-color:var(--el-fill-color-light)}.el-button.is-text:not(.is-disabled).is-has-bg:hover{background-color:var(--el-fill-color)}.el-button.is-text:not(.is-disabled).is-has-bg:active{background-color:var(--el-fill-color-dark)}.el-button__text--expand{letter-spacing:.3em;margin-right:-.3em}.el-button.is-link{color:var(--el-button-text-color);background:0 0;border-color:#0000;height:auto;padding:2px}.el-button.is-link:hover{color:var(--el-button-hover-link-text-color)}.el-button.is-link.is-disabled{color:var(--el-button-disabled-text-color);background-color:#0000!important;border-color:#0000!important}.el-button.is-link:not(.is-disabled):hover{background-color:#0000;border-color:#0000}.el-button.is-link:not(.is-disabled):active{color:var(--el-button-active-color);background-color:#0000;border-color:#0000}.el-button--text{color:var(--el-color-primary);background:0 0;border-color:#0000;padding-left:0;padding-right:0}.el-button--text.is-disabled{color:var(--el-button-disabled-text-color);background-color:#0000!important;border-color:#0000!important}.el-button--text:not(.is-disabled):hover{color:var(--el-color-primary-light-3);background-color:#0000;border-color:#0000}.el-button--text:not(.is-disabled):active{color:var(--el-color-primary-dark-2);background-color:#0000;border-color:#0000}.el-button__link--expand{letter-spacing:.3em;margin-right:-.3em}.el-button--primary{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-primary);--el-button-border-color:var(--el-color-primary);--el-button-outline-color:var(--el-color-primary-light-5);--el-button-active-color:var(--el-color-primary-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-primary-light-5);--el-button-hover-bg-color:var(--el-color-primary-light-3);--el-button-hover-border-color:var(--el-color-primary-light-3);--el-button-active-bg-color:var(--el-color-primary-dark-2);--el-button-active-border-color:var(--el-color-primary-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-primary-light-5);--el-button-disabled-border-color:var(--el-color-primary-light-5)}.el-button--primary.is-plain,.el-button--primary.is-text,.el-button--primary.is-link{--el-button-text-color:var(--el-color-primary);--el-button-bg-color:var(--el-color-primary-light-9);--el-button-border-color:var(--el-color-primary-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-primary);--el-button-hover-border-color:var(--el-color-primary);--el-button-active-text-color:var(--el-color-white)}.el-button--primary.is-plain.is-disabled,.el-button--primary.is-plain.is-disabled:hover,.el-button--primary.is-plain.is-disabled:focus,.el-button--primary.is-plain.is-disabled:active,.el-button--primary.is-text.is-disabled,.el-button--primary.is-text.is-disabled:hover,.el-button--primary.is-text.is-disabled:focus,.el-button--primary.is-text.is-disabled:active,.el-button--primary.is-link.is-disabled,.el-button--primary.is-link.is-disabled:hover,.el-button--primary.is-link.is-disabled:focus,.el-button--primary.is-link.is-disabled:active{color:var(--el-color-primary-light-5);background-color:var(--el-color-primary-light-9);border-color:var(--el-color-primary-light-8)}.el-button--primary.is-dashed{--el-button-text-color:var(--el-color-primary);--el-button-bg-color:var(--el-color-primary-light-9);--el-button-border-color:var(--el-color-primary-light-5);--el-button-hover-text-color:var(--el-color-primary);--el-button-hover-bg-color:var(--el-color-primary-light-9);--el-button-hover-border-color:var(--el-color-primary-light-3);--el-button-active-text-color:var(--el-color-primary-dark-2);--el-button-active-bg-color:var(--el-color-primary-light-9);--el-button-active-border-color:var(--el-color-primary-dark-2)}.el-button--primary.is-dashed.is-disabled,.el-button--primary.is-dashed.is-disabled:hover,.el-button--primary.is-dashed.is-disabled:focus,.el-button--primary.is-dashed.is-disabled:active{color:var(--el-color-primary-light-5);background-color:var(--el-color-primary-light-9);border-color:var(--el-color-primary-light-8)}.el-button--success{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-success);--el-button-border-color:var(--el-color-success);--el-button-outline-color:var(--el-color-success-light-5);--el-button-active-color:var(--el-color-success-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-success-light-5);--el-button-hover-bg-color:var(--el-color-success-light-3);--el-button-hover-border-color:var(--el-color-success-light-3);--el-button-active-bg-color:var(--el-color-success-dark-2);--el-button-active-border-color:var(--el-color-success-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-success-light-5);--el-button-disabled-border-color:var(--el-color-success-light-5)}.el-button--success.is-plain,.el-button--success.is-text,.el-button--success.is-link{--el-button-text-color:var(--el-color-success);--el-button-bg-color:var(--el-color-success-light-9);--el-button-border-color:var(--el-color-success-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-success);--el-button-hover-border-color:var(--el-color-success);--el-button-active-text-color:var(--el-color-white)}.el-button--success.is-plain.is-disabled,.el-button--success.is-plain.is-disabled:hover,.el-button--success.is-plain.is-disabled:focus,.el-button--success.is-plain.is-disabled:active,.el-button--success.is-text.is-disabled,.el-button--success.is-text.is-disabled:hover,.el-button--success.is-text.is-disabled:focus,.el-button--success.is-text.is-disabled:active,.el-button--success.is-link.is-disabled,.el-button--success.is-link.is-disabled:hover,.el-button--success.is-link.is-disabled:focus,.el-button--success.is-link.is-disabled:active{color:var(--el-color-success-light-5);background-color:var(--el-color-success-light-9);border-color:var(--el-color-success-light-8)}.el-button--success.is-dashed{--el-button-text-color:var(--el-color-success);--el-button-bg-color:var(--el-color-success-light-9);--el-button-border-color:var(--el-color-success-light-5);--el-button-hover-text-color:var(--el-color-success);--el-button-hover-bg-color:var(--el-color-success-light-9);--el-button-hover-border-color:var(--el-color-success-light-3);--el-button-active-text-color:var(--el-color-success-dark-2);--el-button-active-bg-color:var(--el-color-success-light-9);--el-button-active-border-color:var(--el-color-success-dark-2)}.el-button--success.is-dashed.is-disabled,.el-button--success.is-dashed.is-disabled:hover,.el-button--success.is-dashed.is-disabled:focus,.el-button--success.is-dashed.is-disabled:active{color:var(--el-color-success-light-5);background-color:var(--el-color-success-light-9);border-color:var(--el-color-success-light-8)}.el-button--warning{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-warning);--el-button-border-color:var(--el-color-warning);--el-button-outline-color:var(--el-color-warning-light-5);--el-button-active-color:var(--el-color-warning-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-warning-light-5);--el-button-hover-bg-color:var(--el-color-warning-light-3);--el-button-hover-border-color:var(--el-color-warning-light-3);--el-button-active-bg-color:var(--el-color-warning-dark-2);--el-button-active-border-color:var(--el-color-warning-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-warning-light-5);--el-button-disabled-border-color:var(--el-color-warning-light-5)}.el-button--warning.is-plain,.el-button--warning.is-text,.el-button--warning.is-link{--el-button-text-color:var(--el-color-warning);--el-button-bg-color:var(--el-color-warning-light-9);--el-button-border-color:var(--el-color-warning-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-warning);--el-button-hover-border-color:var(--el-color-warning);--el-button-active-text-color:var(--el-color-white)}.el-button--warning.is-plain.is-disabled,.el-button--warning.is-plain.is-disabled:hover,.el-button--warning.is-plain.is-disabled:focus,.el-button--warning.is-plain.is-disabled:active,.el-button--warning.is-text.is-disabled,.el-button--warning.is-text.is-disabled:hover,.el-button--warning.is-text.is-disabled:focus,.el-button--warning.is-text.is-disabled:active,.el-button--warning.is-link.is-disabled,.el-button--warning.is-link.is-disabled:hover,.el-button--warning.is-link.is-disabled:focus,.el-button--warning.is-link.is-disabled:active{color:var(--el-color-warning-light-5);background-color:var(--el-color-warning-light-9);border-color:var(--el-color-warning-light-8)}.el-button--warning.is-dashed{--el-button-text-color:var(--el-color-warning);--el-button-bg-color:var(--el-color-warning-light-9);--el-button-border-color:var(--el-color-warning-light-5);--el-button-hover-text-color:var(--el-color-warning);--el-button-hover-bg-color:var(--el-color-warning-light-9);--el-button-hover-border-color:var(--el-color-warning-light-3);--el-button-active-text-color:var(--el-color-warning-dark-2);--el-button-active-bg-color:var(--el-color-warning-light-9);--el-button-active-border-color:var(--el-color-warning-dark-2)}.el-button--warning.is-dashed.is-disabled,.el-button--warning.is-dashed.is-disabled:hover,.el-button--warning.is-dashed.is-disabled:focus,.el-button--warning.is-dashed.is-disabled:active{color:var(--el-color-warning-light-5);background-color:var(--el-color-warning-light-9);border-color:var(--el-color-warning-light-8)}.el-button--danger{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-danger);--el-button-border-color:var(--el-color-danger);--el-button-outline-color:var(--el-color-danger-light-5);--el-button-active-color:var(--el-color-danger-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-danger-light-5);--el-button-hover-bg-color:var(--el-color-danger-light-3);--el-button-hover-border-color:var(--el-color-danger-light-3);--el-button-active-bg-color:var(--el-color-danger-dark-2);--el-button-active-border-color:var(--el-color-danger-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-danger-light-5);--el-button-disabled-border-color:var(--el-color-danger-light-5)}.el-button--danger.is-plain,.el-button--danger.is-text,.el-button--danger.is-link{--el-button-text-color:var(--el-color-danger);--el-button-bg-color:var(--el-color-danger-light-9);--el-button-border-color:var(--el-color-danger-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-danger);--el-button-hover-border-color:var(--el-color-danger);--el-button-active-text-color:var(--el-color-white)}.el-button--danger.is-plain.is-disabled,.el-button--danger.is-plain.is-disabled:hover,.el-button--danger.is-plain.is-disabled:focus,.el-button--danger.is-plain.is-disabled:active,.el-button--danger.is-text.is-disabled,.el-button--danger.is-text.is-disabled:hover,.el-button--danger.is-text.is-disabled:focus,.el-button--danger.is-text.is-disabled:active,.el-button--danger.is-link.is-disabled,.el-button--danger.is-link.is-disabled:hover,.el-button--danger.is-link.is-disabled:focus,.el-button--danger.is-link.is-disabled:active{color:var(--el-color-danger-light-5);background-color:var(--el-color-danger-light-9);border-color:var(--el-color-danger-light-8)}.el-button--danger.is-dashed{--el-button-text-color:var(--el-color-danger);--el-button-bg-color:var(--el-color-danger-light-9);--el-button-border-color:var(--el-color-danger-light-5);--el-button-hover-text-color:var(--el-color-danger);--el-button-hover-bg-color:var(--el-color-danger-light-9);--el-button-hover-border-color:var(--el-color-danger-light-3);--el-button-active-text-color:var(--el-color-danger-dark-2);--el-button-active-bg-color:var(--el-color-danger-light-9);--el-button-active-border-color:var(--el-color-danger-dark-2)}.el-button--danger.is-dashed.is-disabled,.el-button--danger.is-dashed.is-disabled:hover,.el-button--danger.is-dashed.is-disabled:focus,.el-button--danger.is-dashed.is-disabled:active{color:var(--el-color-danger-light-5);background-color:var(--el-color-danger-light-9);border-color:var(--el-color-danger-light-8)}.el-button--info{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-info);--el-button-border-color:var(--el-color-info);--el-button-outline-color:var(--el-color-info-light-5);--el-button-active-color:var(--el-color-info-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-info-light-5);--el-button-hover-bg-color:var(--el-color-info-light-3);--el-button-hover-border-color:var(--el-color-info-light-3);--el-button-active-bg-color:var(--el-color-info-dark-2);--el-button-active-border-color:var(--el-color-info-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-info-light-5);--el-button-disabled-border-color:var(--el-color-info-light-5)}.el-button--info.is-plain,.el-button--info.is-text,.el-button--info.is-link{--el-button-text-color:var(--el-color-info);--el-button-bg-color:var(--el-color-info-light-9);--el-button-border-color:var(--el-color-info-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-info);--el-button-hover-border-color:var(--el-color-info);--el-button-active-text-color:var(--el-color-white)}.el-button--info.is-plain.is-disabled,.el-button--info.is-plain.is-disabled:hover,.el-button--info.is-plain.is-disabled:focus,.el-button--info.is-plain.is-disabled:active,.el-button--info.is-text.is-disabled,.el-button--info.is-text.is-disabled:hover,.el-button--info.is-text.is-disabled:focus,.el-button--info.is-text.is-disabled:active,.el-button--info.is-link.is-disabled,.el-button--info.is-link.is-disabled:hover,.el-button--info.is-link.is-disabled:focus,.el-button--info.is-link.is-disabled:active{color:var(--el-color-info-light-5);background-color:var(--el-color-info-light-9);border-color:var(--el-color-info-light-8)}.el-button--info.is-dashed{--el-button-text-color:var(--el-color-info);--el-button-bg-color:var(--el-color-info-light-9);--el-button-border-color:var(--el-color-info-light-5);--el-button-hover-text-color:var(--el-color-info);--el-button-hover-bg-color:var(--el-color-info-light-9);--el-button-hover-border-color:var(--el-color-info-light-3);--el-button-active-text-color:var(--el-color-info-dark-2);--el-button-active-bg-color:var(--el-color-info-light-9);--el-button-active-border-color:var(--el-color-info-dark-2)}.el-button--info.is-dashed.is-disabled,.el-button--info.is-dashed.is-disabled:hover,.el-button--info.is-dashed.is-disabled:focus,.el-button--info.is-dashed.is-disabled:active{color:var(--el-color-info-light-5);background-color:var(--el-color-info-light-9);border-color:var(--el-color-info-light-8)}.el-button--large{--el-button-size:40px;height:var(--el-button-size)}.el-button--large [class*=el-icon]+span{margin-left:8px}.el-button--large{font-size:var(--el-font-size-base);border-radius:var(--el-border-radius-base);padding:12px 19px}.el-button--large.is-round{padding:12px 19px}.el-button--large.is-circle{width:var(--el-button-size);padding:12px}.el-button--small{--el-button-size:24px;height:var(--el-button-size)}.el-button--small [class*=el-icon]+span{margin-left:4px}.el-button--small{border-radius:calc(var(--el-border-radius-base) - 1px);padding:5px 11px;font-size:12px}.el-button--small.is-round{padding:5px 11px}.el-button--small.is-circle{width:var(--el-button-size);padding:5px}.el-progress{align-items:center;line-height:1;display:flex;position:relative}.el-progress__text{color:var(--el-text-color-regular);min-width:50px;margin-left:5px;font-size:14px;line-height:1}.el-progress__text i{vertical-align:middle;display:block}.el-progress--circle,.el-progress--dashboard{display:inline-block}.el-progress--circle .el-progress__text,.el-progress--dashboard .el-progress__text{text-align:center;width:100%;margin:0;position:absolute;top:50%;left:0;transform:translateY(-50%)}.el-progress--circle .el-progress__text i,.el-progress--dashboard .el-progress__text i{vertical-align:middle;display:inline-block}.el-progress--without-text .el-progress__text{display:none}.el-progress--without-text .el-progress-bar{margin-right:0;padding-right:0;display:block}.el-progress--text-inside .el-progress-bar{margin-right:0;padding-right:0}.el-progress.is-success .el-progress-bar__inner{background-color:var(--el-color-success)}.el-progress.is-success .el-progress__text{color:var(--el-color-success)}.el-progress.is-warning .el-progress-bar__inner{background-color:var(--el-color-warning)}.el-progress.is-warning .el-progress__text{color:var(--el-color-warning)}.el-progress.is-exception .el-progress-bar__inner{background-color:var(--el-color-danger)}.el-progress.is-exception .el-progress__text{color:var(--el-color-danger)}.el-progress-bar{box-sizing:border-box;flex-grow:1}.el-progress-bar__outer{background-color:var(--el-border-color-lighter);vertical-align:middle;border-radius:100px;height:6px;position:relative;overflow:hidden}.el-progress-bar__inner{background-color:var(--el-color-primary);text-align:right;white-space:nowrap;border-radius:100px;height:100%;line-height:1;transition:width .6s;position:absolute;top:0;left:0}.el-progress-bar__inner:after{content:"";vertical-align:middle;height:100%;display:inline-block}.el-progress-bar__inner--indeterminate{animation:3s infinite indeterminate;transform:translateZ(0)}.el-progress-bar__inner--striped{background-image:linear-gradient(45deg,#0000001a 25%,#0000 25% 50%,#0000001a 50% 75%,#0000 75%,#0000);background-size:1.25em 1.25em}.el-progress-bar__inner--striped.el-progress-bar__inner--striped-flow{animation:3s linear infinite striped-flow}.el-progress-bar__innerText{vertical-align:middle;color:#fff;margin:0 5px;font-size:12px;display:inline-block}@keyframes progress{0%{background-position:0 0}to{background-position:32px 0}}@keyframes indeterminate{0%{left:-100%}to{left:100%}}@keyframes striped-flow{0%{background-position:-100%}to{background-position:100%}}.quota-card[data-v-77393e6b]{background:#fff;border:1px solid #e5e7eb;border-radius:8px;min-width:0;padding:16px}.quota-head[data-v-77393e6b],.quota-meta[data-v-77393e6b]{justify-content:space-between;gap:12px;display:flex}.quota-head[data-v-77393e6b]{align-items:center;margin-bottom:12px}.quota-head strong[data-v-77393e6b]{overflow-wrap:anywhere;min-width:0;font-size:15px}.quota-head span[data-v-77393e6b],.quota-meta[data-v-77393e6b]{color:#606266;font-size:13px}.quota-meta[data-v-77393e6b]{flex-wrap:wrap;margin-top:10px}.dashboard[data-v-fca01011]{flex-direction:column;gap:16px;display:flex}.dashboard-head[data-v-fca01011]{justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.dashboard-head h1[data-v-fca01011]{margin:0 0 6px}.dashboard-head p[data-v-fca01011]{color:#606266;margin:0}.dashboard-actions[data-v-fca01011]{flex-wrap:wrap;justify-content:flex-end;gap:8px;display:flex}.dashboard-actions[data-v-fca01011] .el-button{margin-left:0}.subscription-actions[data-v-fca01011]{flex-wrap:wrap;gap:8px;display:flex}.subscription-actions[data-v-fca01011] .el-button{margin-left:0}.reconnect-row[data-v-fca01011]{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.reconnect-row span[data-v-fca01011],.reconnect-row a[data-v-fca01011]{font-size:13px}.quota-grid[data-v-fca01011],.connection-grid[data-v-fca01011]{grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;display:grid}.info-block[data-v-fca01011]{background:#fff;border:1px solid #e5e7eb;border-radius:8px;min-width:0;padding:14px 16px}.info-block span[data-v-fca01011]{color:#606266;margin-bottom:6px;font-size:13px;display:block}.info-block strong[data-v-fca01011]{overflow-wrap:anywhere;font-size:15px;display:block}.model-panel[data-v-fca01011],.update-panel[data-v-fca01011],.slave-panel[data-v-fca01011]{border-top:1px solid #e5e7eb;border-bottom:1px solid #e5e7eb;flex-direction:column;gap:12px;padding:14px 0;display:flex}.section-head h2[data-v-fca01011]{margin:0 0 4px;font-size:16px;line-height:1.35}.section-head p[data-v-fca01011]{color:#606266;overflow-wrap:anywhere;margin:0;font-size:13px}.section-head p span+span[data-v-fca01011]{margin-left:12px}.update-row[data-v-fca01011]{grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:12px;display:grid}.update-summary[data-v-fca01011]{flex-direction:column;gap:4px;min-width:0;display:flex}.update-summary strong[data-v-fca01011],.update-summary span[data-v-fca01011]{overflow-wrap:anywhere}.update-summary span[data-v-fca01011]{color:#606266;font-size:13px}.update-actions[data-v-fca01011]{flex-wrap:wrap;justify-content:flex-end;gap:8px;display:flex}.slave-create[data-v-fca01011]{grid-template-columns:minmax(300px,2fr) minmax(180px,1fr) minmax(180px,auto) auto;align-items:center;gap:10px;display:grid}.folder-select[data-v-fca01011]{gap:8px;min-width:0;display:flex}.folder-select[data-v-fca01011] .el-input{min-width:0}.slave-preview[data-v-fca01011]{color:#606266;overflow-wrap:anywhere;min-width:0;font-size:13px}.slave-list[data-v-fca01011]{flex-direction:column;gap:8px;display:flex}.slave-row[data-v-fca01011]{border-top:1px solid #f0f2f5;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:12px;padding:10px 0;display:grid}.slave-row[data-v-fca01011]:first-child{border-top:0}.slave-main[data-v-fca01011]{flex-direction:column;gap:4px;min-width:0;display:flex}.slave-title-line[data-v-fca01011]{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;display:flex}.slave-title-line strong[data-v-fca01011],.slave-folder[data-v-fca01011],.slave-main em[data-v-fca01011]{overflow-wrap:anywhere}.slave-status[data-v-fca01011]{color:#409eff;flex:none;font-size:12px}.slave-folder[data-v-fca01011],.slave-main a[data-v-fca01011],.slave-main em[data-v-fca01011]{font-size:13px}.slave-folder[data-v-fca01011]{color:#606266}.slave-main em[data-v-fca01011]{color:#c45656;font-style:normal}.slave-actions[data-v-fca01011]{flex-wrap:wrap;justify-content:flex-end;gap:8px;display:flex}.slave-actions[data-v-fca01011] .el-button,.slave-create[data-v-fca01011] .el-button,.update-actions[data-v-fca01011] .el-button{white-space:nowrap;margin-left:0}@media (max-width:560px){.dashboard-head[data-v-fca01011]{flex-direction:column}.dashboard-actions[data-v-fca01011]{justify-content:flex-start;width:100%}.slave-create[data-v-fca01011],.slave-row[data-v-fca01011],.update-row[data-v-fca01011]{grid-template-columns:1fr}.folder-select[data-v-fca01011]{flex-direction:column}.slave-actions[data-v-fca01011],.update-actions[data-v-fca01011]{justify-content:flex-start}}.step[data-v-cee6048b]{background:#fff;border:1px solid #e5e7eb;border-radius:8px;margin:8px 0;padding:16px}.step--active[data-v-cee6048b],.step--in_progress[data-v-cee6048b]{background:#f0f7ff;border-color:#409eff}.step--done[data-v-cee6048b]{color:#909399;background:#fafafa;border-color:#e5e7eb}.step--error[data-v-cee6048b]{background:#fef0f0;border-color:#f56c6c}.step__head[data-v-cee6048b]{justify-content:space-between;align-items:center;font-weight:600;display:flex}.step__icon[data-v-cee6048b]{font-size:18px}.step__body[data-v-cee6048b]{margin-top:12px}.step__body[data-v-cee6048b]:empty{margin-top:0}.step--done .step__icon[data-v-cee6048b]{color:#67c23a}.step--error .step__icon[data-v-cee6048b]{color:#f56c6c}.error-actions[data-v-c7c04702]{gap:8px;margin-top:8px;display:flex}.error-detail[data-v-c7c04702]{white-space:pre-wrap;word-break:break-all;background:#0000000a;border-radius:4px;max-height:200px;margin-top:8px;padding:8px;font-size:12px;overflow:auto}.in-progress[data-v-1c84bc54]{color:#606266;align-items:center;gap:8px;display:flex}.fallback[data-v-1c84bc54]{color:#909399;margin-left:16px;font-size:13px}.is-loading[data-v-1c84bc54]{animation:1s linear infinite rotate-1c84bc54}@keyframes rotate-1c84bc54{to{transform:rotate(360deg)}}.in-progress[data-v-1eb9d389]{color:#606266;align-items:center;gap:8px;display:flex}.is-loading[data-v-1eb9d389]{animation:1s linear infinite rotate-1eb9d389}@keyframes rotate-1eb9d389{to{transform:rotate(360deg)}}.in-progress[data-v-f7fc6084]{color:#606266;flex-direction:column;gap:8px;display:flex}.stage-row[data-v-f7fc6084]{align-items:center;gap:8px;display:flex}.is-loading[data-v-f7fc6084]{animation:1s linear infinite rotate-f7fc6084}@keyframes rotate-f7fc6084{to{transform:rotate(360deg)}}.conn-error[data-v-d1709252]{margin-bottom:16px}body{color:#1f2329;background:#f7f8fa;margin:0;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,PingFang SC,Microsoft YaHei,sans-serif}.container{max-width:720px;margin:40px auto;padding:0 24px}h1{margin-bottom:24px;font-size:22px;font-weight:600} diff --git a/internal/ui/assets/dist/assets/index-D7t_wKSz.css b/internal/ui/assets/dist/assets/index-D7t_wKSz.css deleted file mode 100644 index 863502b..0000000 --- a/internal/ui/assets/dist/assets/index-D7t_wKSz.css +++ /dev/null @@ -1 +0,0 @@ -:root{--el-color-white:#fff;--el-color-black:#000;--el-color-primary-rgb:64, 158, 255;--el-color-success-rgb:103, 194, 58;--el-color-warning-rgb:230, 162, 60;--el-color-danger-rgb:245, 108, 108;--el-color-error-rgb:245, 108, 108;--el-color-info-rgb:144, 147, 153;--el-font-size-extra-large:20px;--el-font-size-large:18px;--el-font-size-medium:16px;--el-font-size-base:14px;--el-font-size-small:13px;--el-font-size-extra-small:12px;--el-font-family:"Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "微软雅黑", Arial, sans-serif;--el-font-weight-primary:500;--el-font-line-height-primary:24px;--el-index-normal:1;--el-index-top:1000;--el-index-popper:2000;--el-border-radius-base:4px;--el-border-radius-small:2px;--el-border-radius-round:20px;--el-border-radius-circle:100%;--el-transition-duration:.3s;--el-transition-duration-fast:.2s;--el-transition-function-ease-in-out-bezier:cubic-bezier(.645, .045, .355, 1);--el-transition-function-fast-bezier:cubic-bezier(.23, 1, .32, 1);--el-transition-all:all var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier);--el-transition-fade:opacity var(--el-transition-duration) var(--el-transition-function-fast-bezier);--el-transition-md-fade:transform var(--el-transition-duration) var(--el-transition-function-fast-bezier), opacity var(--el-transition-duration) var(--el-transition-function-fast-bezier);--el-transition-fade-linear:opacity var(--el-transition-duration-fast) linear;--el-transition-border:border-color var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-transition-box-shadow:box-shadow var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-transition-color:color var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-component-size-large:40px;--el-component-size:32px;--el-component-size-small:24px;--lightningcss-light:initial;--lightningcss-dark: ;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light;--el-color-primary:#409eff;--el-color-primary-light-3:#79bbff;--el-color-primary-light-5:#a0cfff;--el-color-primary-light-7:#c6e2ff;--el-color-primary-light-8:#d9ecff;--el-color-primary-light-9:#ecf5ff;--el-color-primary-dark-2:#337ecc;--el-color-success:#67c23a;--el-color-success-light-3:#95d475;--el-color-success-light-5:#b3e19d;--el-color-success-light-7:#d1edc4;--el-color-success-light-8:#e1f3d8;--el-color-success-light-9:#f0f9eb;--el-color-success-dark-2:#529b2e;--el-color-warning:#e6a23c;--el-color-warning-light-3:#eebe77;--el-color-warning-light-5:#f3d19e;--el-color-warning-light-7:#f8e3c5;--el-color-warning-light-8:#faecd8;--el-color-warning-light-9:#fdf6ec;--el-color-warning-dark-2:#b88230;--el-color-danger:#f56c6c;--el-color-danger-light-3:#f89898;--el-color-danger-light-5:#fab6b6;--el-color-danger-light-7:#fcd3d3;--el-color-danger-light-8:#fde2e2;--el-color-danger-light-9:#fef0f0;--el-color-danger-dark-2:#c45656;--el-color-error:#f56c6c;--el-color-error-light-3:#f89898;--el-color-error-light-5:#fab6b6;--el-color-error-light-7:#fcd3d3;--el-color-error-light-8:#fde2e2;--el-color-error-light-9:#fef0f0;--el-color-error-dark-2:#c45656;--el-color-info:#909399;--el-color-info-light-3:#b1b3b8;--el-color-info-light-5:#c8c9cc;--el-color-info-light-7:#dedfe0;--el-color-info-light-8:#e9e9eb;--el-color-info-light-9:#f4f4f5;--el-color-info-dark-2:#73767a;--el-bg-color:#fff;--el-bg-color-page:#f2f3f5;--el-bg-color-overlay:#fff;--el-text-color-primary:#303133;--el-text-color-regular:#606266;--el-text-color-secondary:#909399;--el-text-color-placeholder:#a8abb2;--el-text-color-disabled:#c0c4cc;--el-border-color:#dcdfe6;--el-border-color-light:#e4e7ed;--el-border-color-lighter:#ebeef5;--el-border-color-extra-light:#f2f6fc;--el-border-color-dark:#d4d7de;--el-border-color-darker:#cdd0d6;--el-fill-color:#f0f2f5;--el-fill-color-light:#f5f7fa;--el-fill-color-lighter:#fafafa;--el-fill-color-extra-light:#fafcff;--el-fill-color-dark:#ebedf0;--el-fill-color-darker:#e6e8eb;--el-fill-color-blank:#fff;--el-box-shadow:0px 12px 32px 4px #0000000a, 0px 8px 20px #00000014;--el-box-shadow-light:0px 0px 12px #0000001f;--el-box-shadow-lighter:0px 0px 6px #0000001f;--el-box-shadow-dark:0px 16px 48px 16px #00000014, 0px 12px 32px #0000001f, 0px 8px 16px -8px #00000029;--el-disabled-bg-color:var(--el-fill-color-light);--el-disabled-text-color:var(--el-text-color-placeholder);--el-disabled-border-color:var(--el-border-color-light);--el-overlay-color:#000c;--el-overlay-color-light:#000000b3;--el-overlay-color-lighter:#00000080;--el-mask-color:#ffffffe6;--el-mask-color-extra-light:#ffffff4d;--el-border-width:1px;--el-border-style:solid;--el-border-color-hover:var(--el-text-color-disabled);--el-border:var(--el-border-width) var(--el-border-style) var(--el-border-color);--el-svg-monochrome-grey:var(--el-border-color)}.fade-in-linear-enter-active,.fade-in-linear-leave-active{transition:var(--el-transition-fade-linear)}.fade-in-linear-enter-from,.fade-in-linear-leave-to{opacity:0}.el-fade-in-linear-enter-active,.el-fade-in-linear-leave-active{transition:var(--el-transition-fade-linear)}.el-fade-in-linear-enter-from,.el-fade-in-linear-leave-to{opacity:0}.el-fade-in-enter-active,.el-fade-in-leave-active{transition:all var(--el-transition-duration) cubic-bezier(.55, 0, .1, 1)}.el-fade-in-enter-from,.el-fade-in-leave-active{opacity:0}.el-zoom-in-center-enter-active,.el-zoom-in-center-leave-active{transition:all var(--el-transition-duration) cubic-bezier(.55, 0, .1, 1)}.el-zoom-in-center-enter-from,.el-zoom-in-center-leave-active{opacity:0;transform:scaleX(0)}.el-zoom-in-top-enter-active,.el-zoom-in-top-leave-active{opacity:1;transition:var(--el-transition-md-fade);transform-origin:top;transform:scaleY(1)}.el-zoom-in-top-enter-active[data-popper-placement^=top],.el-zoom-in-top-leave-active[data-popper-placement^=top]{transform-origin:bottom}.el-zoom-in-top-enter-from,.el-zoom-in-top-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-bottom-enter-active,.el-zoom-in-bottom-leave-active{opacity:1;transition:var(--el-transition-md-fade);transform-origin:bottom;transform:scaleY(1)}.el-zoom-in-bottom-enter-from,.el-zoom-in-bottom-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-left-enter-active,.el-zoom-in-left-leave-active{opacity:1;transition:var(--el-transition-md-fade);transform-origin:0 0;transform:scale(1)}.el-zoom-in-left-enter-from,.el-zoom-in-left-leave-active{opacity:0;transform:scale(.45)}.collapse-transition{transition:var(--el-transition-duration) height ease-in-out, var(--el-transition-duration) padding-top ease-in-out, var(--el-transition-duration) padding-bottom ease-in-out}.el-collapse-transition-leave-active,.el-collapse-transition-enter-active{transition:var(--el-transition-duration) max-height ease-in-out, var(--el-transition-duration) padding-top ease-in-out, var(--el-transition-duration) padding-bottom ease-in-out}.horizontal-collapse-transition{transition:var(--el-transition-duration) width ease-in-out, var(--el-transition-duration) padding-left ease-in-out, var(--el-transition-duration) padding-right ease-in-out}.el-list-enter-active,.el-list-leave-active{transition:all 1s}.el-list-enter-from,.el-list-leave-to{opacity:0;transform:translateY(-30px)}.el-list-leave-active{position:absolute!important}.el-opacity-transition{transition:opacity var(--el-transition-duration) cubic-bezier(.55, 0, .1, 1)}.el-icon--right{margin-left:5px}.el-icon--left{margin-right:5px}@keyframes rotating{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.el-icon{--color:inherit;fill:currentColor;width:1em;height:1em;color:var(--color);line-height:1em;font-size:inherit;justify-content:center;align-items:center;display:inline-flex;position:relative}.el-icon.is-loading{animation:2s linear infinite rotating}.el-icon svg{width:1em;height:1em}.el-alert{--el-alert-padding:8px 16px;--el-alert-border-radius-base:var(--el-border-radius-base);--el-alert-title-font-size:14px;--el-alert-title-with-description-font-size:16px;--el-alert-description-font-size:14px;--el-alert-close-font-size:16px;--el-alert-close-customed-font-size:14px;--el-alert-icon-size:16px;--el-alert-icon-large-size:28px;width:100%;padding:var(--el-alert-padding);box-sizing:border-box;border-radius:var(--el-alert-border-radius-base);background-color:var(--el-color-white);opacity:1;transition:opacity var(--el-transition-duration-fast);align-items:center;margin:0;display:flex;position:relative;overflow:hidden}.el-alert.is-light .el-alert__close-btn{color:var(--el-text-color-placeholder)}.el-alert.is-dark .el-alert__close-btn,.el-alert.is-dark .el-alert__description{color:var(--el-color-white)}.el-alert.is-center{justify-content:center}.el-alert--primary{--el-alert-bg-color:var(--el-color-primary-light-9)}.el-alert--primary.is-light{background-color:var(--el-alert-bg-color);color:var(--el-color-primary)}.el-alert--primary.is-light .el-alert__description{color:var(--el-color-primary)}.el-alert--primary.is-dark{background-color:var(--el-color-primary);color:var(--el-color-white)}.el-alert--success{--el-alert-bg-color:var(--el-color-success-light-9)}.el-alert--success.is-light{background-color:var(--el-alert-bg-color);color:var(--el-color-success)}.el-alert--success.is-light .el-alert__description{color:var(--el-color-success)}.el-alert--success.is-dark{background-color:var(--el-color-success);color:var(--el-color-white)}.el-alert--info{--el-alert-bg-color:var(--el-color-info-light-9)}.el-alert--info.is-light{background-color:var(--el-alert-bg-color);color:var(--el-color-info)}.el-alert--info.is-light .el-alert__description{color:var(--el-color-info)}.el-alert--info.is-dark{background-color:var(--el-color-info);color:var(--el-color-white)}.el-alert--warning{--el-alert-bg-color:var(--el-color-warning-light-9)}.el-alert--warning.is-light{background-color:var(--el-alert-bg-color);color:var(--el-color-warning)}.el-alert--warning.is-light .el-alert__description{color:var(--el-color-warning)}.el-alert--warning.is-dark{background-color:var(--el-color-warning);color:var(--el-color-white)}.el-alert--error{--el-alert-bg-color:var(--el-color-error-light-9)}.el-alert--error.is-light{background-color:var(--el-alert-bg-color);color:var(--el-color-error)}.el-alert--error.is-light .el-alert__description{color:var(--el-color-error)}.el-alert--error.is-dark{background-color:var(--el-color-error);color:var(--el-color-white)}.el-alert__content{flex-direction:column;gap:4px;display:flex}.el-alert .el-alert__icon{font-size:var(--el-alert-icon-size);width:var(--el-alert-icon-size);margin-right:8px}.el-alert .el-alert__icon.is-big{font-size:var(--el-alert-icon-large-size);width:var(--el-alert-icon-large-size);margin-right:12px}.el-alert__title{font-size:var(--el-alert-title-font-size);line-height:24px}.el-alert__title.with-description{font-size:var(--el-alert-title-with-description-font-size)}.el-alert .el-alert__description{font-size:var(--el-alert-description-font-size);margin:0}.el-alert .el-alert__close-btn{font-size:var(--el-alert-close-font-size);opacity:1;cursor:pointer;position:absolute;top:12px;right:16px}.el-alert .el-alert__close-btn.is-customed{font-style:normal;font-size:var(--el-alert-close-customed-font-size);line-height:24px;top:8px}.el-alert-fade-enter-from,.el-alert-fade-leave-active{opacity:0}.el-textarea{--el-input-text-color:var(--el-text-color-regular);--el-input-border:var(--el-border);--el-input-hover-border:var(--el-border-color-hover);--el-input-focus-border:var(--el-color-primary);--el-input-transparent-border:0 0 0 1px transparent inset;--el-input-border-color:var(--el-border-color);--el-input-border-radius:var(--el-border-radius-base);--el-input-bg-color:var(--el-fill-color-blank);--el-input-icon-color:var(--el-text-color-placeholder);--el-input-placeholder-color:var(--el-text-color-placeholder);--el-input-hover-border-color:var(--el-border-color-hover);--el-input-clear-hover-color:var(--el-text-color-secondary);--el-input-focus-border-color:var(--el-color-primary);--el-input-width:100%;vertical-align:bottom;width:100%;font-size:var(--el-font-size-base);display:inline-block;position:relative}.el-textarea__inner{resize:vertical;box-sizing:border-box;width:100%;line-height:1.5;font-size:inherit;color:var(--el-input-text-color,var(--el-text-color-regular));background-color:var(--el-input-bg-color,var(--el-fill-color-blank));-webkit-appearance:none;box-shadow:0 0 0 1px var(--el-input-border-color,var(--el-border-color)) inset;border-radius:var(--el-input-border-radius,var(--el-border-radius-base));transition:var(--el-transition-box-shadow);background-image:none;border:none;padding:5px 11px;font-family:inherit;display:block;position:relative}.el-textarea__inner.is-clearable{padding:5px 26px 5px 11px}.el-textarea__inner::placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-textarea__inner:hover{box-shadow:0 0 0 1px var(--el-input-hover-border-color) inset}.el-textarea__inner:focus{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset;outline:none}.el-textarea__clear{color:var(--el-input-icon-color);cursor:pointer;font-size:14px;position:absolute;top:15px;right:11px;transform:translateY(-50%)}.el-textarea__clear:hover{color:var(--el-input-clear-hover-color)}.el-textarea .el-input__count{color:var(--el-color-info);background:var(--el-fill-color-blank);font-size:12px;line-height:14px;position:absolute;bottom:5px;right:10px}.el-textarea .el-input__count.is-outside{top:100%;right:0;bottom:unset;background:0 0;padding-top:2px;line-height:1;position:absolute}.el-textarea.is-disabled .el-textarea__inner{box-shadow:0 0 0 1px var(--el-disabled-border-color) inset;background-color:var(--el-disabled-bg-color);color:var(--el-disabled-text-color);cursor:not-allowed}.el-textarea.is-disabled .el-textarea__inner::placeholder{color:var(--el-text-color-placeholder)}.el-textarea.is-exceed .el-textarea__inner{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-textarea.is-exceed .el-input__count{color:var(--el-color-danger)}.el-input{--el-input-text-color:var(--el-text-color-regular);--el-input-border:var(--el-border);--el-input-hover-border:var(--el-border-color-hover);--el-input-focus-border:var(--el-color-primary);--el-input-transparent-border:0 0 0 1px transparent inset;--el-input-border-color:var(--el-border-color);--el-input-border-radius:var(--el-border-radius-base);--el-input-bg-color:var(--el-fill-color-blank);--el-input-icon-color:var(--el-text-color-placeholder);--el-input-placeholder-color:var(--el-text-color-placeholder);--el-input-hover-border-color:var(--el-border-color-hover);--el-input-clear-hover-color:var(--el-text-color-secondary);--el-input-focus-border-color:var(--el-color-primary);--el-input-width:100%;--el-input-height:var(--el-component-size);font-size:var(--el-font-size-base);width:var(--el-input-width);line-height:var(--el-input-height);box-sizing:border-box;vertical-align:middle;display:inline-flex;position:relative}.el-input::-webkit-scrollbar{z-index:11;width:6px}.el-input::-webkit-scrollbar:horizontal{height:6px}.el-input::-webkit-scrollbar-thumb{background:var(--el-text-color-disabled);border-radius:5px;width:6px}.el-input::-webkit-scrollbar-corner{background:var(--el-fill-color-blank)}.el-input::-webkit-scrollbar-track{background:var(--el-fill-color-blank)}.el-input::-webkit-scrollbar-track-piece{background:var(--el-fill-color-blank);width:6px}.el-input .el-input__clear,.el-input .el-input__password{color:var(--el-input-icon-color);cursor:pointer;font-size:14px}.el-input .el-input__clear:hover,.el-input .el-input__password:hover{color:var(--el-input-clear-hover-color)}.el-input .el-input__count{height:100%;color:var(--el-color-info);align-items:center;font-size:12px;display:inline-flex}.el-input .el-input__count .el-input__count-inner{background:var(--el-fill-color-blank);line-height:initial;padding-left:8px;display:inline-block}.el-input .el-input__count.is-outside{height:unset;padding-top:2px;position:absolute;top:100%;right:0}.el-input .el-input__count.is-outside .el-input__count-inner{background:0 0;padding-left:0;line-height:1}.el-input__wrapper{background-color:var(--el-input-bg-color,var(--el-fill-color-blank));border-radius:var(--el-input-border-radius,var(--el-border-radius-base));cursor:text;transition:var(--el-transition-box-shadow);box-shadow:0 0 0 1px var(--el-input-border-color,var(--el-border-color)) inset;background-image:none;flex-grow:1;justify-content:center;align-items:center;padding:1px 11px;display:inline-flex;transform:translate(0)}.el-input__wrapper:hover{box-shadow:0 0 0 1px var(--el-input-hover-border-color) inset}.el-input__wrapper.is-focus{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset}.el-input{--el-input-inner-height:calc(var(--el-input-height,32px) - 2px)}.el-input__inner{-webkit-appearance:none;width:100%;color:var(--el-input-text-color,var(--el-text-color-regular));font-size:inherit;height:var(--el-input-inner-height);line-height:var(--el-input-inner-height);box-sizing:border-box;background:0 0;border:none;outline:none;flex-grow:1;padding:0}.el-input__inner:focus{outline:none}.el-input__inner::placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-input__inner[type=password]::-ms-reveal{display:none}.el-input__inner[type=number]{line-height:1}.el-input__prefix{white-space:nowrap;height:100%;line-height:var(--el-input-inner-height);text-align:center;color:var(--el-input-icon-color,var(--el-text-color-placeholder));transition:all var(--el-transition-duration);pointer-events:none;flex-wrap:nowrap;flex-shrink:0;display:inline-flex}.el-input__prefix-inner{pointer-events:all;justify-content:center;align-items:center;display:inline-flex}.el-input__prefix-inner>:last-child{margin-right:8px}.el-input__prefix-inner>:first-child,.el-input__prefix-inner>:first-child.el-input__icon{margin-left:0}.el-input__suffix{white-space:nowrap;height:100%;line-height:var(--el-input-inner-height);text-align:center;color:var(--el-input-icon-color,var(--el-text-color-placeholder));transition:all var(--el-transition-duration);pointer-events:none;flex-wrap:nowrap;flex-shrink:0;display:inline-flex}.el-input__suffix-inner{pointer-events:all;justify-content:center;align-items:center;display:inline-flex}.el-input__suffix-inner>:first-child{margin-left:8px}.el-input .el-input__icon{height:inherit;line-height:inherit;transition:all var(--el-transition-duration);justify-content:center;align-items:center;margin-left:8px;display:flex}.el-input .el-input__clear{transition:color var(--el-transition-duration)}.el-input__validateIcon{pointer-events:none}.el-input.is-active .el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-focus-color, ) inset}.el-input.is-disabled{cursor:not-allowed}.el-input.is-disabled .el-input__wrapper{background-color:var(--el-disabled-bg-color);cursor:not-allowed;box-shadow:0 0 0 1px var(--el-disabled-border-color) inset}.el-input.is-disabled .el-input__inner{color:var(--el-disabled-text-color);-webkit-text-fill-color:var(--el-disabled-text-color);cursor:not-allowed}.el-input.is-disabled .el-input__inner::placeholder{color:var(--el-text-color-placeholder)}.el-input.is-disabled .el-input__icon{cursor:not-allowed}.el-input.is-disabled .el-input__prefix-inner,.el-input.is-disabled .el-input__suffix-inner{pointer-events:none}.el-input.is-exceed .el-input__wrapper{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-input.is-exceed .el-input__suffix .el-input__count{color:var(--el-color-danger)}.el-input--large{--el-input-height:var(--el-component-size-large);font-size:14px}.el-input--large .el-input__wrapper{padding:1px 15px}.el-input--large{--el-input-inner-height:calc(var(--el-input-height,40px) - 2px)}.el-input--small{--el-input-height:var(--el-component-size-small);font-size:12px}.el-input--small .el-input__wrapper{padding:1px 7px}.el-input--small{--el-input-inner-height:calc(var(--el-input-height,24px) - 2px)}.el-input-group{align-items:stretch;width:100%;display:inline-flex}.el-input-group__append,.el-input-group__prepend{background-color:var(--el-fill-color-light);color:var(--el-color-info);border-radius:var(--el-input-border-radius);white-space:nowrap;justify-content:center;align-items:center;min-height:100%;padding:0 20px;display:inline-flex;position:relative}.el-input-group__append:focus,.el-input-group__prepend:focus{outline:none}.el-input-group__append .el-select,.el-input-group__append .el-button,.el-input-group__prepend .el-select,.el-input-group__prepend .el-button{flex:1;margin:0 -20px;display:inline-block}.el-input-group__append button.el-button,.el-input-group__append button.el-button:hover,.el-input-group__append div.el-select .el-select__wrapper,.el-input-group__append div.el-select:hover .el-select__wrapper,.el-input-group__prepend button.el-button,.el-input-group__prepend button.el-button:hover,.el-input-group__prepend div.el-select .el-select__wrapper,.el-input-group__prepend div.el-select:hover .el-select__wrapper{color:inherit;background-color:#0000;border-color:#0000}.el-input-group__append .el-button,.el-input-group__append .el-input,.el-input-group__prepend .el-button,.el-input-group__prepend .el-input{font-size:inherit}.el-input-group__prepend{box-shadow:1px 0 0 0 var(--el-input-border-color) inset, 0 1px 0 0 var(--el-input-border-color) inset, 0 -1px 0 0 var(--el-input-border-color) inset;border-right:0;border-top-right-radius:0;border-bottom-right-radius:0}.el-input-group__append{box-shadow:0 1px 0 0 var(--el-input-border-color) inset, 0 -1px 0 0 var(--el-input-border-color) inset, -1px 0 0 0 var(--el-input-border-color) inset;border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.el-input-group--prepend>.el-input__wrapper{border-top-left-radius:0;border-bottom-left-radius:0}.el-input-group--prepend .el-input-group__prepend .el-select .el-select__wrapper{box-shadow:1px 0 0 0 var(--el-input-border-color) inset, 0 1px 0 0 var(--el-input-border-color) inset, 0 -1px 0 0 var(--el-input-border-color) inset;border-top-right-radius:0;border-bottom-right-radius:0}.el-input-group--append>.el-input__wrapper{border-top-right-radius:0;border-bottom-right-radius:0}.el-input-group--append .el-input-group__append .el-select .el-select__wrapper{box-shadow:0 1px 0 0 var(--el-input-border-color) inset, 0 -1px 0 0 var(--el-input-border-color) inset, -1px 0 0 0 var(--el-input-border-color) inset;border-top-left-radius:0;border-bottom-left-radius:0}.el-input-hidden{display:none!important}.el-button{--el-button-font-weight:var(--el-font-weight-primary);--el-button-border-color:var(--el-border-color);--el-button-bg-color:var(--el-fill-color-blank);--el-button-text-color:var(--el-text-color-regular);--el-button-disabled-text-color:var(--el-disabled-text-color);--el-button-disabled-bg-color:var(--el-fill-color-blank);--el-button-disabled-border-color:var(--el-border-color-light);--el-button-divide-border-color:#ffffff80;--el-button-hover-text-color:var(--el-color-primary);--el-button-hover-bg-color:var(--el-color-primary-light-9);--el-button-hover-border-color:var(--el-color-primary-light-7);--el-button-active-text-color:var(--el-button-hover-text-color);--el-button-active-border-color:var(--el-color-primary);--el-button-active-bg-color:var(--el-button-hover-bg-color);--el-button-outline-color:var(--el-color-primary-light-5);--el-button-hover-link-text-color:var(--el-text-color-secondary);--el-button-active-color:var(--el-text-color-primary);white-space:nowrap;cursor:pointer;height:32px;color:var(--el-button-text-color);text-align:center;box-sizing:border-box;line-height:1;font-weight:var(--el-button-font-weight);-webkit-user-select:none;user-select:none;vertical-align:middle;-webkit-appearance:none;background-color:var(--el-button-bg-color);border:var(--el-border);border-color:var(--el-button-border-color);outline:none;justify-content:center;align-items:center;transition:all .1s;display:inline-flex}.el-button:hover{color:var(--el-button-hover-text-color);border-color:var(--el-button-hover-border-color);background-color:var(--el-button-hover-bg-color);outline:none}.el-button:active{color:var(--el-button-active-text-color);border-color:var(--el-button-active-border-color);background-color:var(--el-button-active-bg-color);outline:none}.el-button:focus-visible{outline:2px solid var(--el-button-outline-color);outline-offset:1px;transition:outline-offset,outline}.el-button>span{align-items:center;display:inline-flex}.el-button+.el-button{margin-left:12px}.el-button{font-size:var(--el-font-size-base);border-radius:var(--el-border-radius-base);padding:8px 15px}.el-button.is-round{padding:8px 15px}.el-button::-moz-focus-inner{border:0}.el-button [class*=el-icon]+span{margin-left:6px}.el-button [class*=el-icon] svg{vertical-align:bottom}.el-button.is-plain{--el-button-hover-text-color:var(--el-color-primary);--el-button-hover-bg-color:var(--el-fill-color-blank);--el-button-hover-border-color:var(--el-color-primary)}.el-button.is-active{color:var(--el-button-active-text-color);border-color:var(--el-button-active-border-color);background-color:var(--el-button-active-bg-color);outline:none}.el-button.is-disabled,.el-button.is-disabled:hover{color:var(--el-button-disabled-text-color);cursor:not-allowed;background-image:none;background-color:var(--el-button-disabled-bg-color);border-color:var(--el-button-disabled-border-color)}.el-button.is-loading{pointer-events:none;position:relative}.el-button.is-loading:before{z-index:1;pointer-events:none;content:"";border-radius:inherit;background-color:var(--el-mask-color-extra-light);position:absolute;top:-1px;bottom:-1px;left:-1px;right:-1px}.el-button.is-round{border-radius:var(--el-border-radius-round)}.el-button.is-dashed{--el-button-hover-text-color:var(--el-color-primary);--el-button-hover-bg-color:var(--el-fill-color-blank);--el-button-hover-border-color:var(--el-color-primary);border-style:dashed}.el-button.is-circle{border-radius:50%;width:32px;padding:8px}.el-button.is-text{color:var(--el-button-text-color);background-color:#0000;border:0 solid #0000}.el-button.is-text.is-disabled{color:var(--el-button-disabled-text-color);background-color:#0000!important}.el-button.is-text:not(.is-disabled):hover{background-color:var(--el-fill-color-light)}.el-button.is-text:not(.is-disabled):focus-visible{outline:2px solid var(--el-button-outline-color);outline-offset:1px;transition:outline-offset,outline}.el-button.is-text:not(.is-disabled):active{background-color:var(--el-fill-color)}.el-button.is-text:not(.is-disabled).is-has-bg{background-color:var(--el-fill-color-light)}.el-button.is-text:not(.is-disabled).is-has-bg:hover{background-color:var(--el-fill-color)}.el-button.is-text:not(.is-disabled).is-has-bg:active{background-color:var(--el-fill-color-dark)}.el-button__text--expand{letter-spacing:.3em;margin-right:-.3em}.el-button.is-link{color:var(--el-button-text-color);background:0 0;border-color:#0000;height:auto;padding:2px}.el-button.is-link:hover{color:var(--el-button-hover-link-text-color)}.el-button.is-link.is-disabled{color:var(--el-button-disabled-text-color);background-color:#0000!important;border-color:#0000!important}.el-button.is-link:not(.is-disabled):hover{background-color:#0000;border-color:#0000}.el-button.is-link:not(.is-disabled):active{color:var(--el-button-active-color);background-color:#0000;border-color:#0000}.el-button--text{color:var(--el-color-primary);background:0 0;border-color:#0000;padding-left:0;padding-right:0}.el-button--text.is-disabled{color:var(--el-button-disabled-text-color);background-color:#0000!important;border-color:#0000!important}.el-button--text:not(.is-disabled):hover{color:var(--el-color-primary-light-3);background-color:#0000;border-color:#0000}.el-button--text:not(.is-disabled):active{color:var(--el-color-primary-dark-2);background-color:#0000;border-color:#0000}.el-button__link--expand{letter-spacing:.3em;margin-right:-.3em}.el-button--primary{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-primary);--el-button-border-color:var(--el-color-primary);--el-button-outline-color:var(--el-color-primary-light-5);--el-button-active-color:var(--el-color-primary-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-primary-light-5);--el-button-hover-bg-color:var(--el-color-primary-light-3);--el-button-hover-border-color:var(--el-color-primary-light-3);--el-button-active-bg-color:var(--el-color-primary-dark-2);--el-button-active-border-color:var(--el-color-primary-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-primary-light-5);--el-button-disabled-border-color:var(--el-color-primary-light-5)}.el-button--primary.is-plain,.el-button--primary.is-text,.el-button--primary.is-link{--el-button-text-color:var(--el-color-primary);--el-button-bg-color:var(--el-color-primary-light-9);--el-button-border-color:var(--el-color-primary-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-primary);--el-button-hover-border-color:var(--el-color-primary);--el-button-active-text-color:var(--el-color-white)}.el-button--primary.is-plain.is-disabled,.el-button--primary.is-plain.is-disabled:hover,.el-button--primary.is-plain.is-disabled:focus,.el-button--primary.is-plain.is-disabled:active,.el-button--primary.is-text.is-disabled,.el-button--primary.is-text.is-disabled:hover,.el-button--primary.is-text.is-disabled:focus,.el-button--primary.is-text.is-disabled:active,.el-button--primary.is-link.is-disabled,.el-button--primary.is-link.is-disabled:hover,.el-button--primary.is-link.is-disabled:focus,.el-button--primary.is-link.is-disabled:active{color:var(--el-color-primary-light-5);background-color:var(--el-color-primary-light-9);border-color:var(--el-color-primary-light-8)}.el-button--primary.is-dashed{--el-button-text-color:var(--el-color-primary);--el-button-bg-color:var(--el-color-primary-light-9);--el-button-border-color:var(--el-color-primary-light-5);--el-button-hover-text-color:var(--el-color-primary);--el-button-hover-bg-color:var(--el-color-primary-light-9);--el-button-hover-border-color:var(--el-color-primary-light-3);--el-button-active-text-color:var(--el-color-primary-dark-2);--el-button-active-bg-color:var(--el-color-primary-light-9);--el-button-active-border-color:var(--el-color-primary-dark-2)}.el-button--primary.is-dashed.is-disabled,.el-button--primary.is-dashed.is-disabled:hover,.el-button--primary.is-dashed.is-disabled:focus,.el-button--primary.is-dashed.is-disabled:active{color:var(--el-color-primary-light-5);background-color:var(--el-color-primary-light-9);border-color:var(--el-color-primary-light-8)}.el-button--success{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-success);--el-button-border-color:var(--el-color-success);--el-button-outline-color:var(--el-color-success-light-5);--el-button-active-color:var(--el-color-success-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-success-light-5);--el-button-hover-bg-color:var(--el-color-success-light-3);--el-button-hover-border-color:var(--el-color-success-light-3);--el-button-active-bg-color:var(--el-color-success-dark-2);--el-button-active-border-color:var(--el-color-success-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-success-light-5);--el-button-disabled-border-color:var(--el-color-success-light-5)}.el-button--success.is-plain,.el-button--success.is-text,.el-button--success.is-link{--el-button-text-color:var(--el-color-success);--el-button-bg-color:var(--el-color-success-light-9);--el-button-border-color:var(--el-color-success-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-success);--el-button-hover-border-color:var(--el-color-success);--el-button-active-text-color:var(--el-color-white)}.el-button--success.is-plain.is-disabled,.el-button--success.is-plain.is-disabled:hover,.el-button--success.is-plain.is-disabled:focus,.el-button--success.is-plain.is-disabled:active,.el-button--success.is-text.is-disabled,.el-button--success.is-text.is-disabled:hover,.el-button--success.is-text.is-disabled:focus,.el-button--success.is-text.is-disabled:active,.el-button--success.is-link.is-disabled,.el-button--success.is-link.is-disabled:hover,.el-button--success.is-link.is-disabled:focus,.el-button--success.is-link.is-disabled:active{color:var(--el-color-success-light-5);background-color:var(--el-color-success-light-9);border-color:var(--el-color-success-light-8)}.el-button--success.is-dashed{--el-button-text-color:var(--el-color-success);--el-button-bg-color:var(--el-color-success-light-9);--el-button-border-color:var(--el-color-success-light-5);--el-button-hover-text-color:var(--el-color-success);--el-button-hover-bg-color:var(--el-color-success-light-9);--el-button-hover-border-color:var(--el-color-success-light-3);--el-button-active-text-color:var(--el-color-success-dark-2);--el-button-active-bg-color:var(--el-color-success-light-9);--el-button-active-border-color:var(--el-color-success-dark-2)}.el-button--success.is-dashed.is-disabled,.el-button--success.is-dashed.is-disabled:hover,.el-button--success.is-dashed.is-disabled:focus,.el-button--success.is-dashed.is-disabled:active{color:var(--el-color-success-light-5);background-color:var(--el-color-success-light-9);border-color:var(--el-color-success-light-8)}.el-button--warning{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-warning);--el-button-border-color:var(--el-color-warning);--el-button-outline-color:var(--el-color-warning-light-5);--el-button-active-color:var(--el-color-warning-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-warning-light-5);--el-button-hover-bg-color:var(--el-color-warning-light-3);--el-button-hover-border-color:var(--el-color-warning-light-3);--el-button-active-bg-color:var(--el-color-warning-dark-2);--el-button-active-border-color:var(--el-color-warning-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-warning-light-5);--el-button-disabled-border-color:var(--el-color-warning-light-5)}.el-button--warning.is-plain,.el-button--warning.is-text,.el-button--warning.is-link{--el-button-text-color:var(--el-color-warning);--el-button-bg-color:var(--el-color-warning-light-9);--el-button-border-color:var(--el-color-warning-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-warning);--el-button-hover-border-color:var(--el-color-warning);--el-button-active-text-color:var(--el-color-white)}.el-button--warning.is-plain.is-disabled,.el-button--warning.is-plain.is-disabled:hover,.el-button--warning.is-plain.is-disabled:focus,.el-button--warning.is-plain.is-disabled:active,.el-button--warning.is-text.is-disabled,.el-button--warning.is-text.is-disabled:hover,.el-button--warning.is-text.is-disabled:focus,.el-button--warning.is-text.is-disabled:active,.el-button--warning.is-link.is-disabled,.el-button--warning.is-link.is-disabled:hover,.el-button--warning.is-link.is-disabled:focus,.el-button--warning.is-link.is-disabled:active{color:var(--el-color-warning-light-5);background-color:var(--el-color-warning-light-9);border-color:var(--el-color-warning-light-8)}.el-button--warning.is-dashed{--el-button-text-color:var(--el-color-warning);--el-button-bg-color:var(--el-color-warning-light-9);--el-button-border-color:var(--el-color-warning-light-5);--el-button-hover-text-color:var(--el-color-warning);--el-button-hover-bg-color:var(--el-color-warning-light-9);--el-button-hover-border-color:var(--el-color-warning-light-3);--el-button-active-text-color:var(--el-color-warning-dark-2);--el-button-active-bg-color:var(--el-color-warning-light-9);--el-button-active-border-color:var(--el-color-warning-dark-2)}.el-button--warning.is-dashed.is-disabled,.el-button--warning.is-dashed.is-disabled:hover,.el-button--warning.is-dashed.is-disabled:focus,.el-button--warning.is-dashed.is-disabled:active{color:var(--el-color-warning-light-5);background-color:var(--el-color-warning-light-9);border-color:var(--el-color-warning-light-8)}.el-button--danger{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-danger);--el-button-border-color:var(--el-color-danger);--el-button-outline-color:var(--el-color-danger-light-5);--el-button-active-color:var(--el-color-danger-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-danger-light-5);--el-button-hover-bg-color:var(--el-color-danger-light-3);--el-button-hover-border-color:var(--el-color-danger-light-3);--el-button-active-bg-color:var(--el-color-danger-dark-2);--el-button-active-border-color:var(--el-color-danger-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-danger-light-5);--el-button-disabled-border-color:var(--el-color-danger-light-5)}.el-button--danger.is-plain,.el-button--danger.is-text,.el-button--danger.is-link{--el-button-text-color:var(--el-color-danger);--el-button-bg-color:var(--el-color-danger-light-9);--el-button-border-color:var(--el-color-danger-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-danger);--el-button-hover-border-color:var(--el-color-danger);--el-button-active-text-color:var(--el-color-white)}.el-button--danger.is-plain.is-disabled,.el-button--danger.is-plain.is-disabled:hover,.el-button--danger.is-plain.is-disabled:focus,.el-button--danger.is-plain.is-disabled:active,.el-button--danger.is-text.is-disabled,.el-button--danger.is-text.is-disabled:hover,.el-button--danger.is-text.is-disabled:focus,.el-button--danger.is-text.is-disabled:active,.el-button--danger.is-link.is-disabled,.el-button--danger.is-link.is-disabled:hover,.el-button--danger.is-link.is-disabled:focus,.el-button--danger.is-link.is-disabled:active{color:var(--el-color-danger-light-5);background-color:var(--el-color-danger-light-9);border-color:var(--el-color-danger-light-8)}.el-button--danger.is-dashed{--el-button-text-color:var(--el-color-danger);--el-button-bg-color:var(--el-color-danger-light-9);--el-button-border-color:var(--el-color-danger-light-5);--el-button-hover-text-color:var(--el-color-danger);--el-button-hover-bg-color:var(--el-color-danger-light-9);--el-button-hover-border-color:var(--el-color-danger-light-3);--el-button-active-text-color:var(--el-color-danger-dark-2);--el-button-active-bg-color:var(--el-color-danger-light-9);--el-button-active-border-color:var(--el-color-danger-dark-2)}.el-button--danger.is-dashed.is-disabled,.el-button--danger.is-dashed.is-disabled:hover,.el-button--danger.is-dashed.is-disabled:focus,.el-button--danger.is-dashed.is-disabled:active{color:var(--el-color-danger-light-5);background-color:var(--el-color-danger-light-9);border-color:var(--el-color-danger-light-8)}.el-button--info{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-info);--el-button-border-color:var(--el-color-info);--el-button-outline-color:var(--el-color-info-light-5);--el-button-active-color:var(--el-color-info-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-info-light-5);--el-button-hover-bg-color:var(--el-color-info-light-3);--el-button-hover-border-color:var(--el-color-info-light-3);--el-button-active-bg-color:var(--el-color-info-dark-2);--el-button-active-border-color:var(--el-color-info-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-info-light-5);--el-button-disabled-border-color:var(--el-color-info-light-5)}.el-button--info.is-plain,.el-button--info.is-text,.el-button--info.is-link{--el-button-text-color:var(--el-color-info);--el-button-bg-color:var(--el-color-info-light-9);--el-button-border-color:var(--el-color-info-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-info);--el-button-hover-border-color:var(--el-color-info);--el-button-active-text-color:var(--el-color-white)}.el-button--info.is-plain.is-disabled,.el-button--info.is-plain.is-disabled:hover,.el-button--info.is-plain.is-disabled:focus,.el-button--info.is-plain.is-disabled:active,.el-button--info.is-text.is-disabled,.el-button--info.is-text.is-disabled:hover,.el-button--info.is-text.is-disabled:focus,.el-button--info.is-text.is-disabled:active,.el-button--info.is-link.is-disabled,.el-button--info.is-link.is-disabled:hover,.el-button--info.is-link.is-disabled:focus,.el-button--info.is-link.is-disabled:active{color:var(--el-color-info-light-5);background-color:var(--el-color-info-light-9);border-color:var(--el-color-info-light-8)}.el-button--info.is-dashed{--el-button-text-color:var(--el-color-info);--el-button-bg-color:var(--el-color-info-light-9);--el-button-border-color:var(--el-color-info-light-5);--el-button-hover-text-color:var(--el-color-info);--el-button-hover-bg-color:var(--el-color-info-light-9);--el-button-hover-border-color:var(--el-color-info-light-3);--el-button-active-text-color:var(--el-color-info-dark-2);--el-button-active-bg-color:var(--el-color-info-light-9);--el-button-active-border-color:var(--el-color-info-dark-2)}.el-button--info.is-dashed.is-disabled,.el-button--info.is-dashed.is-disabled:hover,.el-button--info.is-dashed.is-disabled:focus,.el-button--info.is-dashed.is-disabled:active{color:var(--el-color-info-light-5);background-color:var(--el-color-info-light-9);border-color:var(--el-color-info-light-8)}.el-button--large{--el-button-size:40px;height:var(--el-button-size)}.el-button--large [class*=el-icon]+span{margin-left:8px}.el-button--large{font-size:var(--el-font-size-base);border-radius:var(--el-border-radius-base);padding:12px 19px}.el-button--large.is-round{padding:12px 19px}.el-button--large.is-circle{width:var(--el-button-size);padding:12px}.el-button--small{--el-button-size:24px;height:var(--el-button-size)}.el-button--small [class*=el-icon]+span{margin-left:4px}.el-button--small{border-radius:calc(var(--el-border-radius-base) - 1px);padding:5px 11px;font-size:12px}.el-button--small.is-round{padding:5px 11px}.el-button--small.is-circle{width:var(--el-button-size);padding:5px}.el-progress{align-items:center;line-height:1;display:flex;position:relative}.el-progress__text{color:var(--el-text-color-regular);min-width:50px;margin-left:5px;font-size:14px;line-height:1}.el-progress__text i{vertical-align:middle;display:block}.el-progress--circle,.el-progress--dashboard{display:inline-block}.el-progress--circle .el-progress__text,.el-progress--dashboard .el-progress__text{text-align:center;width:100%;margin:0;position:absolute;top:50%;left:0;transform:translateY(-50%)}.el-progress--circle .el-progress__text i,.el-progress--dashboard .el-progress__text i{vertical-align:middle;display:inline-block}.el-progress--without-text .el-progress__text{display:none}.el-progress--without-text .el-progress-bar{margin-right:0;padding-right:0;display:block}.el-progress--text-inside .el-progress-bar{margin-right:0;padding-right:0}.el-progress.is-success .el-progress-bar__inner{background-color:var(--el-color-success)}.el-progress.is-success .el-progress__text{color:var(--el-color-success)}.el-progress.is-warning .el-progress-bar__inner{background-color:var(--el-color-warning)}.el-progress.is-warning .el-progress__text{color:var(--el-color-warning)}.el-progress.is-exception .el-progress-bar__inner{background-color:var(--el-color-danger)}.el-progress.is-exception .el-progress__text{color:var(--el-color-danger)}.el-progress-bar{box-sizing:border-box;flex-grow:1}.el-progress-bar__outer{background-color:var(--el-border-color-lighter);vertical-align:middle;border-radius:100px;height:6px;position:relative;overflow:hidden}.el-progress-bar__inner{background-color:var(--el-color-primary);text-align:right;white-space:nowrap;border-radius:100px;height:100%;line-height:1;transition:width .6s;position:absolute;top:0;left:0}.el-progress-bar__inner:after{content:"";vertical-align:middle;height:100%;display:inline-block}.el-progress-bar__inner--indeterminate{animation:3s infinite indeterminate;transform:translateZ(0)}.el-progress-bar__inner--striped{background-image:linear-gradient(45deg,#0000001a 25%,#0000 25% 50%,#0000001a 50% 75%,#0000 75%,#0000);background-size:1.25em 1.25em}.el-progress-bar__inner--striped.el-progress-bar__inner--striped-flow{animation:3s linear infinite striped-flow}.el-progress-bar__innerText{vertical-align:middle;color:#fff;margin:0 5px;font-size:12px;display:inline-block}@keyframes progress{0%{background-position:0 0}to{background-position:32px 0}}@keyframes indeterminate{0%{left:-100%}to{left:100%}}@keyframes striped-flow{0%{background-position:-100%}to{background-position:100%}}.quota-card[data-v-77393e6b]{background:#fff;border:1px solid #e5e7eb;border-radius:8px;min-width:0;padding:16px}.quota-head[data-v-77393e6b],.quota-meta[data-v-77393e6b]{justify-content:space-between;gap:12px;display:flex}.quota-head[data-v-77393e6b]{align-items:center;margin-bottom:12px}.quota-head strong[data-v-77393e6b]{overflow-wrap:anywhere;min-width:0;font-size:15px}.quota-head span[data-v-77393e6b],.quota-meta[data-v-77393e6b]{color:#606266;font-size:13px}.quota-meta[data-v-77393e6b]{flex-wrap:wrap;margin-top:10px}.dashboard[data-v-0a403077]{flex-direction:column;gap:16px;display:flex}.dashboard-head[data-v-0a403077]{justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.dashboard-head h1[data-v-0a403077]{margin:0 0 6px}.dashboard-head p[data-v-0a403077]{color:#606266;margin:0}.dashboard-actions[data-v-0a403077]{flex-wrap:wrap;justify-content:flex-end;gap:8px;display:flex}.dashboard-actions[data-v-0a403077] .el-button{margin-left:0}.subscription-actions[data-v-0a403077]{flex-wrap:wrap;gap:8px;display:flex}.subscription-actions[data-v-0a403077] .el-button{margin-left:0}.reconnect-row[data-v-0a403077]{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.reconnect-row span[data-v-0a403077],.reconnect-row a[data-v-0a403077]{font-size:13px}.quota-grid[data-v-0a403077],.connection-grid[data-v-0a403077]{grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;display:grid}.info-block[data-v-0a403077]{background:#fff;border:1px solid #e5e7eb;border-radius:8px;min-width:0;padding:14px 16px}.info-block span[data-v-0a403077]{color:#606266;margin-bottom:6px;font-size:13px;display:block}.info-block strong[data-v-0a403077]{overflow-wrap:anywhere;font-size:15px;display:block}.update-panel[data-v-0a403077],.slave-panel[data-v-0a403077]{border-top:1px solid #e5e7eb;border-bottom:1px solid #e5e7eb;flex-direction:column;gap:12px;padding:14px 0;display:flex}.section-head h2[data-v-0a403077]{margin:0 0 4px;font-size:16px;line-height:1.35}.section-head p[data-v-0a403077]{color:#606266;overflow-wrap:anywhere;margin:0;font-size:13px}.section-head p span+span[data-v-0a403077]{margin-left:12px}.update-row[data-v-0a403077]{grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:12px;display:grid}.update-summary[data-v-0a403077]{flex-direction:column;gap:4px;min-width:0;display:flex}.update-summary strong[data-v-0a403077],.update-summary span[data-v-0a403077]{overflow-wrap:anywhere}.update-summary span[data-v-0a403077]{color:#606266;font-size:13px}.update-actions[data-v-0a403077]{flex-wrap:wrap;justify-content:flex-end;gap:8px;display:flex}.slave-create[data-v-0a403077]{grid-template-columns:minmax(300px,2fr) minmax(180px,1fr) minmax(180px,auto) auto;align-items:center;gap:10px;display:grid}.folder-select[data-v-0a403077]{gap:8px;min-width:0;display:flex}.folder-select[data-v-0a403077] .el-input{min-width:0}.slave-preview[data-v-0a403077]{color:#606266;overflow-wrap:anywhere;min-width:0;font-size:13px}.slave-list[data-v-0a403077]{flex-direction:column;gap:8px;display:flex}.slave-row[data-v-0a403077]{border-top:1px solid #f0f2f5;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:12px;padding:10px 0;display:grid}.slave-row[data-v-0a403077]:first-child{border-top:0}.slave-main[data-v-0a403077]{flex-direction:column;gap:4px;min-width:0;display:flex}.slave-title-line[data-v-0a403077]{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;display:flex}.slave-title-line strong[data-v-0a403077],.slave-folder[data-v-0a403077],.slave-main em[data-v-0a403077]{overflow-wrap:anywhere}.slave-status[data-v-0a403077]{color:#409eff;flex:none;font-size:12px}.slave-folder[data-v-0a403077],.slave-main a[data-v-0a403077],.slave-main em[data-v-0a403077]{font-size:13px}.slave-folder[data-v-0a403077]{color:#606266}.slave-main em[data-v-0a403077]{color:#c45656;font-style:normal}.slave-actions[data-v-0a403077]{flex-wrap:wrap;justify-content:flex-end;gap:8px;display:flex}.slave-actions[data-v-0a403077] .el-button,.slave-create[data-v-0a403077] .el-button,.update-actions[data-v-0a403077] .el-button{white-space:nowrap;margin-left:0}@media (max-width:560px){.dashboard-head[data-v-0a403077]{flex-direction:column}.dashboard-actions[data-v-0a403077]{justify-content:flex-start;width:100%}.slave-create[data-v-0a403077],.slave-row[data-v-0a403077],.update-row[data-v-0a403077]{grid-template-columns:1fr}.folder-select[data-v-0a403077]{flex-direction:column}.slave-actions[data-v-0a403077],.update-actions[data-v-0a403077]{justify-content:flex-start}}.step[data-v-cee6048b]{background:#fff;border:1px solid #e5e7eb;border-radius:8px;margin:8px 0;padding:16px}.step--active[data-v-cee6048b],.step--in_progress[data-v-cee6048b]{background:#f0f7ff;border-color:#409eff}.step--done[data-v-cee6048b]{color:#909399;background:#fafafa;border-color:#e5e7eb}.step--error[data-v-cee6048b]{background:#fef0f0;border-color:#f56c6c}.step__head[data-v-cee6048b]{justify-content:space-between;align-items:center;font-weight:600;display:flex}.step__icon[data-v-cee6048b]{font-size:18px}.step__body[data-v-cee6048b]{margin-top:12px}.step__body[data-v-cee6048b]:empty{margin-top:0}.step--done .step__icon[data-v-cee6048b]{color:#67c23a}.step--error .step__icon[data-v-cee6048b]{color:#f56c6c}.error-actions[data-v-c7c04702]{gap:8px;margin-top:8px;display:flex}.error-detail[data-v-c7c04702]{white-space:pre-wrap;word-break:break-all;background:#0000000a;border-radius:4px;max-height:200px;margin-top:8px;padding:8px;font-size:12px;overflow:auto}.in-progress[data-v-1c84bc54]{color:#606266;align-items:center;gap:8px;display:flex}.fallback[data-v-1c84bc54]{color:#909399;margin-left:16px;font-size:13px}.is-loading[data-v-1c84bc54]{animation:1s linear infinite rotate-1c84bc54}@keyframes rotate-1c84bc54{to{transform:rotate(360deg)}}.in-progress[data-v-1eb9d389]{color:#606266;align-items:center;gap:8px;display:flex}.is-loading[data-v-1eb9d389]{animation:1s linear infinite rotate-1eb9d389}@keyframes rotate-1eb9d389{to{transform:rotate(360deg)}}.in-progress[data-v-f7fc6084]{color:#606266;flex-direction:column;gap:8px;display:flex}.stage-row[data-v-f7fc6084]{align-items:center;gap:8px;display:flex}.is-loading[data-v-f7fc6084]{animation:1s linear infinite rotate-f7fc6084}@keyframes rotate-f7fc6084{to{transform:rotate(360deg)}}.conn-error[data-v-d1709252]{margin-bottom:16px}body{color:#1f2329;background:#f7f8fa;margin:0;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue,PingFang SC,Microsoft YaHei,sans-serif}.container{max-width:720px;margin:40px auto;padding:0 24px}h1{margin-bottom:24px;font-size:22px;font-weight:600} diff --git a/internal/ui/assets/dist/assets/index-DkqrYw97.js b/internal/ui/assets/dist/assets/index-DkqrYw97.js deleted file mode 100644 index 8473786..0000000 --- a/internal/ui/assets/dist/assets/index-DkqrYw97.js +++ /dev/null @@ -1,13 +0,0 @@ -(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),e.crossOrigin===`use-credentials`?t.credentials=`include`:e.crossOrigin===`anonymous`?t.credentials=`omit`:t.credentials=`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();function e(e){let t=Object.create(null);for(let n of e.split(`,`))t[n]=1;return e=>e in t}var t={},n=[],r=()=>{},i=()=>!1,a=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),o=e=>e.startsWith(`onUpdate:`),s=Object.assign,c=(e,t)=>{let n=e.indexOf(t);n>-1&&e.splice(n,1)},l=Object.prototype.hasOwnProperty,u=(e,t)=>l.call(e,t),d=Array.isArray,f=e=>x(e)===`[object Map]`,p=e=>x(e)===`[object Set]`,m=e=>x(e)===`[object Date]`,h=e=>typeof e==`function`,g=e=>typeof e==`string`,_=e=>typeof e==`symbol`,v=e=>typeof e==`object`&&!!e,y=e=>(v(e)||h(e))&&h(e.then)&&h(e.catch),b=Object.prototype.toString,x=e=>b.call(e),S=e=>x(e).slice(8,-1),C=e=>x(e)===`[object Object]`,w=e=>g(e)&&e!==`NaN`&&e[0]!==`-`&&``+parseInt(e,10)===e,ee=e(`,key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted`),T=e=>{let t=Object.create(null);return(n=>t[n]||(t[n]=e(n)))},E=/-\w/g,D=T(e=>e.replace(E,e=>e.slice(1).toUpperCase())),O=/\B([A-Z])/g,k=T(e=>e.replace(O,`-$1`).toLowerCase()),te=T(e=>e.charAt(0).toUpperCase()+e.slice(1)),ne=T(e=>e?`on${te(e)}`:``),re=(e,t)=>!Object.is(e,t),ie=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},ae=e=>{let t=parseFloat(e);return isNaN(t)?e:t},oe=e=>{let t=g(e)?Number(e):NaN;return isNaN(t)?e:t},se,ce=()=>se||(se=typeof globalThis<`u`?globalThis:typeof self<`u`?self:typeof window<`u`?window:typeof global<`u`?global:{});function le(e){if(d(e)){let t={};for(let n=0;n{if(e){let n=e.split(de);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function j(e){let t=``;if(g(e))t=e;else if(d(e))for(let n=0;n!!(e&&e.__v_isRef===!0),N=e=>g(e)?e:e==null?``:d(e)||v(e)&&(e.toString===b||!h(e.toString))?ve(e)?N(e.value):JSON.stringify(e,ye,2):String(e),ye=(e,t)=>ve(t)?ye(e,t.value):f(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((e,[t,n],r)=>(e[be(t,r)+` =>`]=n,e),{})}:p(t)?{[`Set(${t.size})`]:[...t.values()].map(e=>be(e))}:_(t)?be(t):v(t)&&!d(t)&&!C(t)?String(t):t,be=(e,t=``)=>_(e)?`Symbol(${e.description??t})`:e,P,xe=class{constructor(e=!1){this.detached=e,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this._warnOnRun=!0,this.__v_skip=!0,!e&&P&&(P.active?(this.parent=P,this.index=(P.scopes||(P.scopes=[])).push(this)-1):(this._active=!1,this._warnOnRun=!1))}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let e,t;if(this.scopes)for(e=0,t=this.scopes.length;e0&&--this._on===0){if(P===this)P=this.prevScope;else{let e=P;for(;e;){if(e.prevScope===this){e.prevScope=this.prevScope;break}e=e.prevScope}}this.prevScope=void 0}}stop(e){if(this._active){this._active=!1;let t,n;for(t=0,n=this.effects.length;t0)return;if(Oe){let e=Oe;for(Oe=void 0;e;){let t=e.next;e.next=void 0,e.flags&=-9,e=t}}let e;for(;De;){let t=De;for(De=void 0;t;){let n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(t){e||(e=t)}t=n}}if(e)throw e}function Me(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Ne(e){let t,n=e.depsTail,r=n;for(;r;){let e=r.prevDep;r.version===-1?(r===n&&(n=e),Ie(r),Le(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=e}e.deps=t,e.depsTail=n}function Pe(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Fe(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Fe(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Ue)||(e.globalVersion=Ue,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Pe(e))))return;e.flags|=2;let t=e.dep,n=F,r=Re;F=e,Re=!0;try{Me(e);let n=e.fn(e._value);(t.version===0||re(n,e._value))&&(e.flags|=128,e._value=n,t.version++)}catch(e){throw t.version++,e}finally{F=n,Re=r,Ne(e),e.flags&=-3}}function Ie(e,t=!1){let{dep:n,prevSub:r,nextSub:i}=e;if(r&&(r.nextSub=i,e.prevSub=void 0),i&&(i.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let e=n.computed.deps;e;e=e.nextDep)Ie(e,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Le(e){let{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}var Re=!0,ze=[];function Be(){ze.push(Re),Re=!1}function Ve(){let e=ze.pop();Re=e===void 0?!0:e}function He(e){let{cleanup:t}=e;if(e.cleanup=void 0,t){let e=F;F=void 0;try{t()}finally{F=e}}}var Ue=0,We=class{constructor(e,t){this.sub=e,this.dep=t,this.version=t.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}},Ge=class{constructor(e){this.computed=e,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(e){if(!F||!Re||F===this.computed)return;let t=this.activeLink;if(t===void 0||t.sub!==F)t=this.activeLink=new We(F,this),F.deps?(t.prevDep=F.depsTail,F.depsTail.nextDep=t,F.depsTail=t):F.deps=F.depsTail=t,Ke(t);else if(t.version===-1&&(t.version=this.version,t.nextDep)){let e=t.nextDep;e.prevDep=t.prevDep,t.prevDep&&(t.prevDep.nextDep=e),t.prevDep=F.depsTail,t.nextDep=void 0,F.depsTail.nextDep=t,F.depsTail=t,F.deps===t&&(F.deps=e)}return t}trigger(e){this.version++,Ue++,this.notify(e)}notify(e){Ae();try{for(let e=this.subs;e;e=e.prevSub)e.sub.notify()&&e.sub.dep.notify()}finally{je()}}};function Ke(e){if(e.dep.sc++,e.sub.flags&4){let t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let e=t.deps;e;e=e.nextDep)Ke(e)}let n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}var qe=new WeakMap,Je=Symbol(``),Ye=Symbol(``),Xe=Symbol(``);function Ze(e,t,n){if(Re&&F){let t=qe.get(e);t||qe.set(e,t=new Map);let r=t.get(n);r||(t.set(n,r=new Ge),r.map=t,r.key=n),r.track()}}function Qe(e,t,n,r,i,a){let o=qe.get(e);if(!o){Ue++;return}let s=e=>{e&&e.trigger()};if(Ae(),t===`clear`)o.forEach(s);else{let i=d(e),a=i&&w(n);if(i&&n===`length`){let e=Number(r);o.forEach((t,n)=>{(n===`length`||n===Xe||!_(n)&&n>=e)&&s(t)})}else switch((n!==void 0||o.has(void 0))&&s(o.get(n)),a&&s(o.get(Xe)),t){case`add`:i?a&&s(o.get(`length`)):(s(o.get(Je)),f(e)&&s(o.get(Ye)));break;case`delete`:i||(s(o.get(Je)),f(e)&&s(o.get(Ye)));break;case`set`:f(e)&&s(o.get(Je));break}}je()}function $e(e,t){let n=qe.get(e);return n&&n.get(t)}function et(e){let t=I(e);return t===e?t:(Ze(t,`iterate`,Xe),zt(e)?t:t.map(Ht))}function tt(e){return Ze(e=I(e),`iterate`,Xe),e}function nt(e,t){return Rt(e)?Ut(Lt(e)?Ht(t):t):Ht(t)}var rt={__proto__:null,[Symbol.iterator](){return it(this,Symbol.iterator,e=>nt(this,e))},concat(...e){return et(this).concat(...e.map(e=>d(e)?et(e):e))},entries(){return it(this,`entries`,e=>(e[1]=nt(this,e[1]),e))},every(e,t){return ot(this,`every`,e,t,void 0,arguments)},filter(e,t){return ot(this,`filter`,e,t,e=>e.map(e=>nt(this,e)),arguments)},find(e,t){return ot(this,`find`,e,t,e=>nt(this,e),arguments)},findIndex(e,t){return ot(this,`findIndex`,e,t,void 0,arguments)},findLast(e,t){return ot(this,`findLast`,e,t,e=>nt(this,e),arguments)},findLastIndex(e,t){return ot(this,`findLastIndex`,e,t,void 0,arguments)},forEach(e,t){return ot(this,`forEach`,e,t,void 0,arguments)},includes(...e){return ct(this,`includes`,e)},indexOf(...e){return ct(this,`indexOf`,e)},join(e){return et(this).join(e)},lastIndexOf(...e){return ct(this,`lastIndexOf`,e)},map(e,t){return ot(this,`map`,e,t,void 0,arguments)},pop(){return lt(this,`pop`)},push(...e){return lt(this,`push`,e)},reduce(e,...t){return st(this,`reduce`,e,t)},reduceRight(e,...t){return st(this,`reduceRight`,e,t)},shift(){return lt(this,`shift`)},some(e,t){return ot(this,`some`,e,t,void 0,arguments)},splice(...e){return lt(this,`splice`,e)},toReversed(){return et(this).toReversed()},toSorted(e){return et(this).toSorted(e)},toSpliced(...e){return et(this).toSpliced(...e)},unshift(...e){return lt(this,`unshift`,e)},values(){return it(this,`values`,e=>nt(this,e))}};function it(e,t,n){let r=tt(e),i=r[t]();return r!==e&&!zt(e)&&(i._next=i.next,i.next=()=>{let e=i._next();return e.done||(e.value=n(e.value)),e}),i}var at=Array.prototype;function ot(e,t,n,r,i,a){let o=tt(e),s=o!==e&&!zt(e),c=o[t];if(c!==at[t]){let t=c.apply(e,a);return s?Ht(t):t}let l=n;o!==e&&(s?l=function(t,r){return n.call(this,nt(e,t),r,e)}:n.length>2&&(l=function(t,r){return n.call(this,t,r,e)}));let u=c.call(o,l,r);return s&&i?i(u):u}function st(e,t,n,r){let i=tt(e),a=i!==e&&!zt(e),o=n,s=!1;i!==e&&(a?(s=r.length===0,o=function(t,r,i){return s&&(s=!1,t=nt(e,t)),n.call(this,t,nt(e,r),i,e)}):n.length>3&&(o=function(t,r,i){return n.call(this,t,r,i,e)}));let c=i[t](o,...r);return s?nt(e,c):c}function ct(e,t,n){let r=I(e);Ze(r,`iterate`,Xe);let i=r[t](...n);return(i===-1||i===!1)&&Bt(n[0])?(n[0]=I(n[0]),r[t](...n)):i}function lt(e,t,n=[]){Be(),Ae();let r=I(e)[t].apply(e,n);return je(),Ve(),r}var ut=e(`__proto__,__v_isRef,__isVue`),dt=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!==`arguments`&&e!==`caller`).map(e=>Symbol[e]).filter(_));function ft(e){_(e)||(e=String(e));let t=I(this);return Ze(t,`has`,e),t.hasOwnProperty(e)}var pt=class{constructor(e=!1,t=!1){this._isReadonly=e,this._isShallow=t}get(e,t,n){if(t===`__v_skip`)return e.__v_skip;let r=this._isReadonly,i=this._isShallow;if(t===`__v_isReactive`)return!r;if(t===`__v_isReadonly`)return r;if(t===`__v_isShallow`)return i;if(t===`__v_raw`)return n===(r?i?jt:At:i?kt:Ot).get(e)||Object.getPrototypeOf(e)===Object.getPrototypeOf(n)?e:void 0;let a=d(e);if(!r){let e;if(a&&(e=rt[t]))return e;if(t===`hasOwnProperty`)return ft}let o=Reflect.get(e,t,L(e)?e:n);if((_(t)?dt.has(t):ut(t))||(r||Ze(e,`get`,t),i))return o;if(L(o)){let e=a&&w(t)?o:o.value;return r&&v(e)?Ft(e):e}return v(o)?r?Ft(o):Nt(o):o}},mt=class extends pt{constructor(e=!1){super(!1,e)}set(e,t,n,r){let i=e[t],a=d(e)&&w(t);if(!this._isShallow){let e=Rt(i);if(!zt(n)&&!Rt(n)&&(i=I(i),n=I(n)),!a&&L(i)&&!L(n))return e||(i.value=n),!0}let o=a?Number(t)e,bt=e=>Reflect.getPrototypeOf(e);function xt(e,t,n){return function(...r){let i=this.__v_raw,a=I(i),o=f(a),c=e===`entries`||e===Symbol.iterator&&o,l=e===`keys`&&o,u=i[e](...r),d=n?yt:t?Ut:Ht;return!t&&Ze(a,`iterate`,l?Ye:Je),s(Object.create(u),{next(){let{value:e,done:t}=u.next();return t?{value:e,done:t}:{value:c?[d(e[0]),d(e[1])]:d(e),done:t}}})}}function St(e){return function(...t){return e===`delete`?!1:e===`clear`?void 0:this}}function Ct(e,t){let n={get(n){let r=this.__v_raw,i=I(r),a=I(n);e||(re(n,a)&&Ze(i,`get`,n),Ze(i,`get`,a));let{has:o}=bt(i),s=t?yt:e?Ut:Ht;if(o.call(i,n))return s(r.get(n));if(o.call(i,a))return s(r.get(a));r!==i&&r.get(n)},get size(){let t=this.__v_raw;return!e&&Ze(I(t),`iterate`,Je),t.size},has(t){let n=this.__v_raw,r=I(n),i=I(t);return e||(re(t,i)&&Ze(r,`has`,t),Ze(r,`has`,i)),t===i?n.has(t):n.has(t)||n.has(i)},forEach(n,r){let i=this,a=i.__v_raw,o=I(a),s=t?yt:e?Ut:Ht;return!e&&Ze(o,`iterate`,Je),a.forEach((e,t)=>n.call(r,s(e),s(t),i))}};return s(n,e?{add:St(`add`),set:St(`set`),delete:St(`delete`),clear:St(`clear`)}:{add(e){let n=I(this),r=bt(n),i=I(e),a=!t&&!zt(e)&&!Rt(e)?i:e;return r.has.call(n,a)||re(e,a)&&r.has.call(n,e)||re(i,a)&&r.has.call(n,i)||(n.add(a),Qe(n,`add`,a,a)),this},set(e,n){!t&&!zt(n)&&!Rt(n)&&(n=I(n));let r=I(this),{has:i,get:a}=bt(r),o=i.call(r,e);o||(e=I(e),o=i.call(r,e));let s=a.call(r,e);return r.set(e,n),o?re(n,s)&&Qe(r,`set`,e,n,s):Qe(r,`add`,e,n),this},delete(e){let t=I(this),{has:n,get:r}=bt(t),i=n.call(t,e);i||(e=I(e),i=n.call(t,e));let a=r?r.call(t,e):void 0,o=t.delete(e);return i&&Qe(t,`delete`,e,void 0,a),o},clear(){let e=I(this),t=e.size!==0,n=e.clear();return t&&Qe(e,`clear`,void 0,void 0,void 0),n}}),[`keys`,`values`,`entries`,Symbol.iterator].forEach(r=>{n[r]=xt(r,e,t)}),n}function wt(e,t){let n=Ct(e,t);return(t,r,i)=>r===`__v_isReactive`?!e:r===`__v_isReadonly`?e:r===`__v_raw`?t:Reflect.get(u(n,r)&&r in t?n:t,r,i)}var Tt={get:wt(!1,!1)},Et={get:wt(!1,!0)},Dt={get:wt(!0,!1)},Ot=new WeakMap,kt=new WeakMap,At=new WeakMap,jt=new WeakMap;function Mt(e){switch(e){case`Object`:case`Array`:return 1;case`Map`:case`Set`:case`WeakMap`:case`WeakSet`:return 2;default:return 0}}function Nt(e){return Rt(e)?e:It(e,!1,gt,Tt,Ot)}function Pt(e){return It(e,!1,vt,Et,kt)}function Ft(e){return It(e,!0,_t,Dt,At)}function It(e,t,n,r,i){if(!v(e)||e.__v_raw&&!(t&&e.__v_isReactive)||e.__v_skip||!Object.isExtensible(e))return e;let a=i.get(e);if(a)return a;let o=Mt(S(e));if(o===0)return e;let s=new Proxy(e,o===2?r:n);return i.set(e,s),s}function Lt(e){return Rt(e)?Lt(e.__v_raw):!!(e&&e.__v_isReactive)}function Rt(e){return!!(e&&e.__v_isReadonly)}function zt(e){return!!(e&&e.__v_isShallow)}function Bt(e){return e?!!e.__v_raw:!1}function I(e){let t=e&&e.__v_raw;return t?I(t):e}function Vt(e){return!u(e,`__v_skip`)&&Object.isExtensible(e)&&A(e,`__v_skip`,!0),e}var Ht=e=>v(e)?Nt(e):e,Ut=e=>v(e)?Ft(e):e;function L(e){return e?e.__v_isRef===!0:!1}function R(e){return Gt(e,!1)}function Wt(e){return Gt(e,!0)}function Gt(e,t){return L(e)?e:new Kt(e,t)}var Kt=class{constructor(e,t){this.dep=new Ge,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=t?e:I(e),this._value=t?e:Ht(e),this.__v_isShallow=t}get value(){return this.dep.track(),this._value}set value(e){let t=this._rawValue,n=this.__v_isShallow||zt(e)||Rt(e);e=n?e:I(e),re(e,t)&&(this._rawValue=e,this._value=n?e:Ht(e),this.dep.trigger())}};function z(e){return L(e)?e.value:e}function qt(e){return h(e)?e():z(e)}var Jt={get:(e,t,n)=>t===`__v_raw`?e:z(Reflect.get(e,t,n)),set:(e,t,n,r)=>{let i=e[t];return L(i)&&!L(n)?(i.value=n,!0):Reflect.set(e,t,n,r)}};function Yt(e){return Lt(e)?e:new Proxy(e,Jt)}function Xt(e){let t=d(e)?Array(e.length):{};for(let n in e)t[n]=en(e,n);return t}var Zt=class{constructor(e,t,n){this._object=e,this._defaultValue=n,this.__v_isRef=!0,this._value=void 0,this._key=_(t)?t:String(t),this._raw=I(e);let r=!0,i=e;if(!d(e)||_(this._key)||!w(this._key))do r=!Bt(i)||zt(i);while(r&&(i=i.__v_raw));this._shallow=r}get value(){let e=this._object[this._key];return this._shallow&&(e=z(e)),this._value=e===void 0?this._defaultValue:e}set value(e){if(this._shallow&&L(this._raw[this._key])){let t=this._object[this._key];if(L(t)){t.value=e;return}}this._object[this._key]=e}get dep(){return $e(this._raw,this._key)}},Qt=class{constructor(e){this._getter=e,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}};function $t(e,t,n){return L(e)?e:h(e)?new Qt(e):v(e)&&arguments.length>1?en(e,t,n):R(e)}function en(e,t,n){return new Zt(e,t,n)}var tn=class{constructor(e,t,n){this.fn=e,this.setter=t,this._value=void 0,this.dep=new Ge(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Ue-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!t,this.isSSR=n}notify(){if(this.flags|=16,!(this.flags&8)&&F!==this)return ke(this,!0),!0}get value(){let e=this.dep.track();return Fe(this),e&&(e.version=this.dep.version),this._value}set value(e){this.setter&&this.setter(e)}};function nn(e,t,n=!1){let r,i;return h(e)?r=e:(r=e.get,i=e.set),new tn(r,i,n)}var rn={},an=new WeakMap,on=void 0;function sn(e,t=!1,n=on){if(n){let t=an.get(n);t||an.set(n,t=[]),t.push(e)}}function cn(e,n,i=t){let{immediate:a,deep:o,once:s,scheduler:l,augmentJob:u,call:f}=i,p=e=>o?e:zt(e)||o===!1||o===0?ln(e,1):ln(e),m,g,_,v,y=!1,b=!1;if(L(e)?(g=()=>e.value,y=zt(e)):Lt(e)?(g=()=>p(e),y=!0):d(e)?(b=!0,y=e.some(e=>Lt(e)||zt(e)),g=()=>e.map(e=>{if(L(e))return e.value;if(Lt(e))return p(e);if(h(e))return f?f(e,2):e()})):g=h(e)?n?f?()=>f(e,2):e:()=>{if(_){Be();try{_()}finally{Ve()}}let t=on;on=m;try{return f?f(e,3,[v]):e(v)}finally{on=t}}:r,n&&o){let e=g,t=o===!0?1/0:o;g=()=>ln(e(),t)}let x=Se(),S=()=>{m.stop(),x&&x.active&&c(x.effects,m)};if(s&&n){let e=n;n=(...t)=>{e(...t),S()}}let C=b?Array(e.length).fill(rn):rn,w=e=>{if(!(!(m.flags&1)||!m.dirty&&!e))if(n){let e=m.run();if(o||y||(b?e.some((e,t)=>re(e,C[t])):re(e,C))){_&&_();let t=on;on=m;try{let t=[e,C===rn?void 0:b&&C[0]===rn?[]:C,v];C=e,f?f(n,3,t):n(...t)}finally{on=t}}}else m.run()};return u&&u(w),m=new Te(g),m.scheduler=l?()=>l(w,!1):w,v=e=>sn(e,!1,m),_=m.onStop=()=>{let e=an.get(m);if(e){if(f)f(e,4);else for(let t of e)t();an.delete(m)}},n?a?w(!0):C=m.run():l?l(w.bind(null,!0),!0):m.run(),S.pause=m.pause.bind(m),S.resume=m.resume.bind(m),S.stop=S,S}function ln(e,t=1/0,n){if(t<=0||!v(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,L(e))ln(e.value,t,n);else if(d(e))for(let r=0;r{ln(e,t,n)});else if(C(e)){for(let r in e)ln(e[r],t,n);for(let r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&ln(e[r],t,n)}return e}function un(e,t,n,r){try{return r?e(...r):e()}catch(e){fn(e,t,n)}}function dn(e,t,n,r){if(h(e)){let i=un(e,t,n,r);return i&&y(i)&&i.catch(e=>{fn(e,t,n)}),i}if(d(e)){let i=[];for(let a=0;a>>1,i=mn[r],a=On(i);a=On(n)?mn.push(e):mn.splice(Sn(t),0,e),e.flags|=1,wn()}}function wn(){bn||(bn=yn.then(kn))}function Tn(e){d(e)?gn.push(...e):_n&&e.id===-1?_n.splice(vn+1,0,e):e.flags&1||(gn.push(e),e.flags|=1),wn()}function En(e,t,n=hn+1){for(;nOn(e)-On(t));if(gn.length=0,_n){_n.push(...e);return}for(_n=e,vn=0;vn<_n.length;vn++){let e=_n[vn];e.flags&4&&(e.flags&=-2),e.flags&8||e(),e.flags&=-2}_n=null,vn=0}}var On=e=>e.id==null?e.flags&2?-1:1/0:e.id;function kn(e){try{for(hn=0;hn{r._d&&oa(-1);let i=Mn(t),a;try{a=e(...n)}finally{Mn(i),r._d&&oa(1)}return a};return r._n=!0,r._c=!0,r._d=!0,r}function Nn(e,n){if(An===null)return e;let r=za(An),i=e.dirs||(e.dirs=[]);for(let e=0;e1)return n&&h(t)?t.call(r&&r.proxy):t}}var Ln=Symbol.for(`v-scx`),Rn=()=>In(Ln);function zn(e,t){return Bn(e,null,t)}function V(e,t,n){return Bn(e,t,n)}function Bn(e,n,i=t){let{immediate:a,deep:o,flush:c,once:l}=i,u=s({},i),d=n&&a||!n&&c!==`post`,f;if(Aa){if(c===`sync`){let e=Rn();f=e.__watcherHandles||(e.__watcherHandles=[])}else if(!d){let e=()=>{};return e.stop=r,e.resume=r,e.pause=r,e}}let p=Ca;u.call=(e,t,n)=>dn(e,p,t,n);let m=!1;c===`post`?u.scheduler=e=>{Bi(e,p&&p.suspense)}:c!==`sync`&&(m=!0,u.scheduler=(e,t)=>{t?e():Cn(e)}),u.augmentJob=e=>{n&&(e.flags|=4),m&&(e.flags|=2,p&&(e.id=p.uid,e.i=p))};let h=cn(e,n,u);return Aa&&(f?f.push(h):d&&h()),h}function Vn(e,t,n){let r=this.proxy,i=g(e)?e.includes(`.`)?Hn(r,e):()=>r[e]:e.bind(r,r),a;h(t)?a=t:(a=t.handler,n=t);let o=Da(this),s=Bn(i,a.bind(r),n);return o(),s}function Hn(e,t){let n=t.split(`.`);return()=>{let t=e;for(let e=0;ee.__isTeleport,Gn=Symbol(`_leaveCb`),Kn=Symbol(`_enterCb`);function qn(){let e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return br(()=>{e.isMounted=!0}),Cr(()=>{e.isUnmounting=!0}),e}var Jn=[Function,Array],Yn={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Jn,onEnter:Jn,onAfterEnter:Jn,onEnterCancelled:Jn,onBeforeLeave:Jn,onLeave:Jn,onAfterLeave:Jn,onLeaveCancelled:Jn,onBeforeAppear:Jn,onAppear:Jn,onAfterAppear:Jn,onAppearCancelled:Jn},Xn=e=>{let t=e.subTree;return t.component?Xn(t.component):t},Zn={name:`BaseTransition`,props:Yn,setup(e,{slots:t}){let n=wa(),r=qn();return()=>{let i=t.default&&ar(t.default(),!0),a=i&&i.length?Qn(i):n.subTree?Z():void 0;if(!a)return;let o=I(e),{mode:s}=o;if(r.isLeaving)return nr(a);let c=rr(a);if(!c)return nr(a);let l=tr(c,o,r,n,e=>l=e);c.type!==ea&&ir(c,l);let u=n.subTree&&rr(n.subTree);if(u&&u.type!==ea&&!la(u,c)&&Xn(n).type!==ea){let e=tr(u,o,r,n);if(ir(u,e),s===`out-in`&&c.type!==ea)return r.isLeaving=!0,e.afterLeave=()=>{r.isLeaving=!1,n.job.flags&8||n.update(),delete e.afterLeave,u=void 0},nr(a);s===`in-out`&&c.type!==ea?e.delayLeave=(e,t,n)=>{let i=er(r,u);i[String(u.key)]=u,e[Gn]=()=>{t(),e[Gn]=void 0,delete l.delayedLeave,u=void 0},l.delayedLeave=()=>{n(),delete l.delayedLeave,u=void 0}}:u=void 0}else u&&(u=void 0);return a}}};function Qn(e){let t=e[0];if(e.length>1){for(let n of e)if(n.type!==ea){t=n;break}}return t}var $n=Zn;function er(e,t){let{leavingVNodes:n}=e,r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function tr(e,t,n,r,i){let{appear:a,mode:o,persisted:s=!1,onBeforeEnter:c,onEnter:l,onAfterEnter:u,onEnterCancelled:f,onBeforeLeave:p,onLeave:m,onAfterLeave:h,onLeaveCancelled:g,onBeforeAppear:_,onAppear:v,onAfterAppear:y,onAppearCancelled:b}=t,x=String(e.key),S=er(n,e),C=(e,t)=>{e&&dn(e,r,9,t)},w=(e,t)=>{let n=t[1];C(e,t),d(e)?e.every(e=>e.length<=1)&&n():e.length<=1&&n()},ee={mode:o,persisted:s,beforeEnter(t){let r=c;if(!n.isMounted)if(a)r=_||c;else return;t[Gn]&&t[Gn](!0);let i=S[x];i&&la(e,i)&&i.el[Gn]&&i.el[Gn](),C(r,[t])},enter(t){if(S[x]===e)return;let r=l,i=u,o=f;if(!n.isMounted)if(a)r=v||l,i=y||u,o=b||f;else return;let s=!1;t[Kn]=e=>{s||(s=!0,C(e?o:i,[t]),ee.delayedLeave&&ee.delayedLeave(),t[Kn]=void 0)};let c=t[Kn].bind(null,!1);r?w(r,[t,c]):c()},leave(t,r){let i=String(e.key);if(t[Kn]&&t[Kn](!0),n.isUnmounting)return r();C(p,[t]);let a=!1;t[Gn]=n=>{a||(a=!0,r(),C(n?g:h,[t]),t[Gn]=void 0,S[i]===e&&delete S[i])};let o=t[Gn].bind(null,!1);S[i]=e,m?w(m,[t,o]):o()},clone(e){let a=tr(e,t,n,r,i);return i&&i(a),a}};return ee}function nr(e){if(fr(e))return e=ma(e),e.children=null,e}function rr(e){if(!fr(e))return Wn(e.type)&&e.children?Qn(e.children):e;if(e.component)return e.component.subTree;let{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&h(n.default))return n.default()}}function ir(e,t){e.shapeFlag&6&&e.component?(e.transition=t,ir(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function ar(e,t=!1,n){let r=[],i=0;for(let a=0;a1)for(let e=0;elr(e,n&&(d(n)?n[t]:n),r,a,o));return}if(dr(a)&&!o){a.shapeFlag&512&&a.type.__asyncResolved&&a.component.subTree.component&&lr(e,n,r,a.component.subTree);return}let s=a.shapeFlag&4?za(a.component):a.el,l=o?null:s,{i:f,r:p}=e,m=n&&n.r,_=f.refs===t?f.refs={}:f.refs,v=f.setupState,y=I(v),b=v===t?i:e=>sr(_,e)?!1:u(y,e),x=(e,t)=>!(t&&sr(_,t));if(m!=null&&m!==p){if(ur(n),g(m))_[m]=null,b(m)&&(v[m]=null);else if(L(m)){let e=n;x(m,e.k)&&(m.value=null),e.k&&(_[e.k]=null)}}if(h(p))un(p,f,12,[l,_]);else{let t=g(p),n=L(p);if(t||n){let i=()=>{if(e.f){let n=t?b(p)?v[p]:_[p]:x(p)||!e.k?p.value:_[e.k];if(o)d(n)&&c(n,s);else if(d(n))n.includes(s)||n.push(s);else if(t)_[p]=[s],b(p)&&(v[p]=_[p]);else{let t=[s];x(p,e.k)&&(p.value=t),e.k&&(_[e.k]=t)}}else t?(_[p]=l,b(p)&&(v[p]=l)):n&&(x(p,e.k)&&(p.value=l),e.k&&(_[e.k]=l))};if(l){let t=()=>{i(),cr.delete(e)};t.id=-1,cr.set(e,t),Bi(t,r)}else ur(e),i()}}}function ur(e){let t=cr.get(e);t&&(t.flags|=8,cr.delete(e))}ce().requestIdleCallback,ce().cancelIdleCallback;var dr=e=>!!e.type.__asyncLoader,fr=e=>e.type.__isKeepAlive;function pr(e,t){hr(e,`a`,t)}function mr(e,t){hr(e,`da`,t)}function hr(e,t,n=Ca){let r=e.__wdc||(e.__wdc=()=>{let t=n;for(;t;){if(t.isDeactivated)return;t=t.parent}return e()});if(_r(t,r,n),n){let e=n.parent;for(;e&&e.parent;)fr(e.parent.vnode)&&gr(r,t,n,e),e=e.parent}}function gr(e,t,n,r){let i=_r(t,e,r,!0);wr(()=>{c(r[t],i)},n)}function _r(e,t,n=Ca,r=!1){if(n){let i=n[e]||(n[e]=[]),a=t.__weh||(t.__weh=(...r)=>{Be();let i=Da(n),a=dn(t,n,e,r);return i(),Ve(),a});return r?i.unshift(a):i.push(a),a}}var vr=e=>(t,n=Ca)=>{(!Aa||e===`sp`)&&_r(e,(...e)=>t(...e),n)},yr=vr(`bm`),br=vr(`m`),xr=vr(`bu`),Sr=vr(`u`),Cr=vr(`bum`),wr=vr(`um`),Tr=vr(`sp`),Er=vr(`rtg`),Dr=vr(`rtc`);function Or(e,t=Ca){_r(`ec`,e,t)}var kr=`components`;function Ar(e,t){return Nr(kr,e,!0,t)||e}var jr=Symbol.for(`v-ndc`);function Mr(e){return g(e)?Nr(kr,e,!1)||e:e||jr}function Nr(e,t,n=!0,r=!1){let i=An||Ca;if(i){let n=i.type;if(e===kr){let e=Ba(n,!1);if(e&&(e===t||e===D(t)||e===te(D(t))))return n}let a=Pr(i[e]||n[e],t)||Pr(i.appContext[e],t);return!a&&r?n:a}}function Pr(e,t){return e&&(e[t]||e[D(t)]||e[te(D(t))])}function Fr(e,t,n,r){let i,a=n&&n[r],o=d(e);if(o||g(e)){let n=o&&Lt(e),r=!1,s=!1;n&&(r=!zt(e),s=Rt(e),e=tt(e)),i=Array(e.length);for(let n=0,o=e.length;nt(e,n,void 0,a&&a[n]));else{let n=Object.keys(e);i=Array(n.length);for(let r=0,o=n.length;r0;return t!=="default"&&(n.name=t),G(),q(W,null,[Y(`slot`,n,r&&r())],e?-2:64)}let a=e[t];a&&a._c&&(a._d=!1),G();let o=a&&Ir(a(n)),s=n.key||o&&o.key,c=q(W,{key:(s&&!_(s)?s:`_${t}`)+(!o&&r?`_fb`:``)},o||(r?r():[]),o&&e._===1?64:-2);return!i&&c.scopeId&&(c.slotScopeIds=[c.scopeId+`-s`]),a&&a._c&&(a._d=!0),c}function Ir(e){return e.some(e=>ca(e)?!(e.type===ea||e.type===W&&!Ir(e.children)):!0)?e:null}var Lr=e=>e?ka(e)?za(e):Lr(e.parent):null,Rr=s(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Lr(e.parent),$root:e=>Lr(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Xr(e),$forceUpdate:e=>e.f||(e.f=()=>{Cn(e.update)}),$nextTick:e=>e.n||(e.n=xn.bind(e.proxy)),$watch:e=>Vn.bind(e)}),zr=(e,n)=>e!==t&&!e.__isScriptSetup&&u(e,n),Br={get({_:e},n){if(n===`__v_skip`)return!0;let{ctx:r,setupState:i,data:a,props:o,accessCache:s,type:c,appContext:l}=e;if(n[0]!==`$`){let e=s[n];if(e!==void 0)switch(e){case 1:return i[n];case 2:return a[n];case 4:return r[n];case 3:return o[n]}else if(zr(i,n))return s[n]=1,i[n];else if(a!==t&&u(a,n))return s[n]=2,a[n];else if(u(o,n))return s[n]=3,o[n];else if(r!==t&&u(r,n))return s[n]=4,r[n];else Gr&&(s[n]=0)}let d=Rr[n],f,p;if(d)return n===`$attrs`&&Ze(e.attrs,`get`,``),d(e);if((f=c.__cssModules)&&(f=f[n]))return f;if(r!==t&&u(r,n))return s[n]=4,r[n];if(p=l.config.globalProperties,u(p,n))return p[n]},set({_:e},n,r){let{data:i,setupState:a,ctx:o}=e;return zr(a,n)?(a[n]=r,!0):i!==t&&u(i,n)?(i[n]=r,!0):u(e.props,n)||n[0]===`$`&&n.slice(1)in e?!1:(o[n]=r,!0)},has({_:{data:e,setupState:n,accessCache:r,ctx:i,appContext:a,props:o,type:s}},c){let l;return!!(r[c]||e!==t&&c[0]!==`$`&&u(e,c)||zr(n,c)||u(o,c)||u(i,c)||u(Rr,c)||u(a.config.globalProperties,c)||(l=s.__cssModules)&&l[c])},defineProperty(e,t,n){return n.get==null?u(n,`value`)&&this.set(e,t,n.value,null):e._.accessCache[t]=0,Reflect.defineProperty(e,t,n)}};function Vr(){return Ur(`useSlots`).slots}function Hr(){return Ur(`useAttrs`).attrs}function Ur(e){let t=wa();return t.setupContext||(t.setupContext=Ra(t))}function Wr(e){return d(e)?e.reduce((e,t)=>(e[t]=null,e),{}):e}var Gr=!0;function Kr(e){let t=Xr(e),n=e.proxy,i=e.ctx;Gr=!1,t.beforeCreate&&Jr(t.beforeCreate,e,`bc`);let{data:a,computed:o,methods:s,watch:c,provide:l,inject:u,created:f,beforeMount:p,mounted:m,beforeUpdate:g,updated:_,activated:y,deactivated:b,beforeDestroy:x,beforeUnmount:S,destroyed:C,unmounted:w,render:ee,renderTracked:T,renderTriggered:E,errorCaptured:D,serverPrefetch:O,expose:k,inheritAttrs:te,components:ne,directives:re,filters:ie}=t;if(u&&qr(u,i,null),s)for(let e in s){let t=s[e];h(t)&&(i[e]=t.bind(n))}if(a){let t=a.call(n,n);v(t)&&(e.data=Nt(t))}if(Gr=!0,o)for(let e in o){let t=o[e],a=Q({get:h(t)?t.bind(n,n):h(t.get)?t.get.bind(n,n):r,set:!h(t)&&h(t.set)?t.set.bind(n):r});Object.defineProperty(i,e,{enumerable:!0,configurable:!0,get:()=>a.value,set:e=>a.value=e})}if(c)for(let e in c)Yr(c[e],i,n,e);if(l){let e=h(l)?l.call(n):l;Reflect.ownKeys(e).forEach(t=>{Fn(t,e[t])})}f&&Jr(f,e,`c`);function A(e,t){d(t)?t.forEach(t=>e(t.bind(n))):t&&e(t.bind(n))}if(A(yr,p),A(br,m),A(xr,g),A(Sr,_),A(pr,y),A(mr,b),A(Or,D),A(Dr,T),A(Er,E),A(Cr,S),A(wr,w),A(Tr,O),d(k))if(k.length){let t=e.exposed||(e.exposed={});k.forEach(e=>{Object.defineProperty(t,e,{get:()=>n[e],set:t=>n[e]=t,enumerable:!0})})}else e.exposed||(e.exposed={});ee&&e.render===r&&(e.render=ee),te!=null&&(e.inheritAttrs=te),ne&&(e.components=ne),re&&(e.directives=re),O&&or(e)}function qr(e,t,n=r){d(e)&&(e=ti(e));for(let n in e){let r=e[n],i;i=v(r)?`default`in r?In(r.from||n,r.default,!0):In(r.from||n):In(r),L(i)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>i.value,set:e=>i.value=e}):t[n]=i}}function Jr(e,t,n){dn(d(e)?e.map(e=>e.bind(t.proxy)):e.bind(t.proxy),t,n)}function Yr(e,t,n,r){let i=r.includes(`.`)?Hn(n,r):()=>n[r];if(g(e)){let n=t[e];h(n)&&V(i,n)}else if(h(e))V(i,e.bind(n));else if(v(e))if(d(e))e.forEach(e=>Yr(e,t,n,r));else{let r=h(e.handler)?e.handler.bind(n):t[e.handler];h(r)&&V(i,r,e)}}function Xr(e){let t=e.type,{mixins:n,extends:r}=t,{mixins:i,optionsCache:a,config:{optionMergeStrategies:o}}=e.appContext,s=a.get(t),c;return s?c=s:!i.length&&!n&&!r?c=t:(c={},i.length&&i.forEach(e=>Zr(c,e,o,!0)),Zr(c,t,o)),v(t)&&a.set(t,c),c}function Zr(e,t,n,r=!1){let{mixins:i,extends:a}=t;a&&Zr(e,a,n,!0),i&&i.forEach(t=>Zr(e,t,n,!0));for(let i in t)if(!(r&&i===`expose`)){let r=Qr[i]||n&&n[i];e[i]=r?r(e[i],t[i]):t[i]}return e}var Qr={data:$r,props:ii,emits:ii,methods:ri,computed:ri,beforeCreate:ni,created:ni,beforeMount:ni,mounted:ni,beforeUpdate:ni,updated:ni,beforeDestroy:ni,beforeUnmount:ni,destroyed:ni,unmounted:ni,activated:ni,deactivated:ni,errorCaptured:ni,serverPrefetch:ni,components:ri,directives:ri,watch:ai,provide:$r,inject:ei};function $r(e,t){return t?e?function(){return s(h(e)?e.call(this,this):e,h(t)?t.call(this,this):t)}:t:e}function ei(e,t){return ri(ti(e),ti(t))}function ti(e){if(d(e)){let t={};for(let n=0;nt===`modelValue`||t===`model-value`?e.modelModifiers:e[`${t}Modifiers`]||e[`${D(t)}Modifiers`]||e[`${k(t)}Modifiers`];function di(e,n,...r){if(e.isUnmounted)return;let i=e.vnode.props||t,a=r,o=n.startsWith(`update:`),s=o&&ui(i,n.slice(7));s&&(s.trim&&(a=r.map(e=>g(e)?e.trim():e)),s.number&&(a=r.map(ae)));let c,l=i[c=ne(n)]||i[c=ne(D(n))];!l&&o&&(l=i[c=ne(k(n))]),l&&dn(l,e,6,a);let u=i[c+`Once`];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[c])return;e.emitted[c]=!0,dn(u,e,6,a)}}var fi=new WeakMap;function pi(e,t,n=!1){let r=n?fi:t.emitsCache,i=r.get(e);if(i!==void 0)return i;let a=e.emits,o={},c=!1;if(!h(e)){let r=e=>{let n=pi(e,t,!0);n&&(c=!0,s(o,n))};!n&&t.mixins.length&&t.mixins.forEach(r),e.extends&&r(e.extends),e.mixins&&e.mixins.forEach(r)}return!a&&!c?(v(e)&&r.set(e,null),null):(d(a)?a.forEach(e=>o[e]=null):s(o,a),v(e)&&r.set(e,o),o)}function mi(e,t){return!e||!a(t)?!1:(t=t.slice(2).replace(/Once$/,``),u(e,t[0].toLowerCase()+t.slice(1))||u(e,k(t))||u(e,t))}function hi(e){let{type:t,vnode:n,proxy:r,withProxy:i,propsOptions:[a],slots:s,attrs:c,emit:l,render:u,renderCache:d,props:f,data:p,setupState:m,ctx:h,inheritAttrs:g}=e,_=Mn(e),v,y;try{if(n.shapeFlag&4){let e=i||r,t=e;v=ha(u.call(t,e,d,f,m,p,h)),y=c}else{let e=t;v=ha(e.length>1?e(f,{attrs:c,slots:s,emit:l}):e(f,null)),y=t.props?c:gi(c)}}catch(t){na.length=0,fn(t,e,1),v=Y(ea)}let b=v;if(y&&g!==!1){let e=Object.keys(y),{shapeFlag:t}=b;e.length&&t&7&&(a&&e.some(o)&&(y=_i(y,a)),b=ma(b,y,!1,!0))}return n.dirs&&(b=ma(b,null,!1,!0),b.dirs=b.dirs?b.dirs.concat(n.dirs):n.dirs),n.transition&&ir(b,n.transition),v=b,Mn(_),v}var gi=e=>{let t;for(let n in e)(n===`class`||n===`style`||a(n))&&((t||(t={}))[n]=e[n]);return t},_i=(e,t)=>{let n={};for(let r in e)(!o(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function vi(e,t,n){let{props:r,children:i,component:a}=e,{props:o,children:s,patchFlag:c}=t,l=a.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return r?yi(r,o,l):!!o;if(c&8){let e=t.dynamicProps;for(let t=0;tObject.create(Si),wi=e=>Object.getPrototypeOf(e)===Si;function Ti(e,t,n,r=!1){let i={},a=Ci();e.propsDefaults=Object.create(null),Di(e,t,i,a);for(let t in e.propsOptions[0])t in i||(i[t]=void 0);n?e.props=r?i:Pt(i):e.type.props?e.props=i:e.props=a,e.attrs=a}function Ei(e,t,n,r){let{props:i,attrs:a,vnode:{patchFlag:o}}=e,s=I(i),[c]=e.propsOptions,l=!1;if((r||o>0)&&!(o&16)){if(o&8){let n=e.vnode.dynamicProps;for(let r=0;r{p=!0;let[t,n]=Ai(e,r,!0);s(l,t),n&&f.push(...n)};!i&&r.mixins.length&&r.mixins.forEach(t),e.extends&&t(e.extends),e.mixins&&e.mixins.forEach(t)}if(!c&&!p)return v(e)&&a.set(e,n),n;if(d(c))for(let e=0;ee===`_`||e===`_ctx`||e===`$stable`,Ni=e=>d(e)?e.map(ha):[ha(e)],Pi=(e,t,n)=>{if(t._n)return t;let r=B((...e)=>Ni(t(...e)),n);return r._c=!1,r},Fi=(e,t,n)=>{let r=e._ctx;for(let n in e){if(Mi(n))continue;let i=e[n];if(h(i))t[n]=Pi(n,i,r);else if(i!=null){let e=Ni(i);t[n]=()=>e}}},Ii=(e,t)=>{let n=Ni(t);e.slots.default=()=>n},Li=(e,t,n)=>{for(let r in t)(n||!Mi(r))&&(e[r]=t[r])},Ri=(e,t,n)=>{let r=e.slots=Ci();if(e.vnode.shapeFlag&32){let e=t._;e?(Li(r,t,n),n&&A(r,`_`,e,!0)):Fi(t,r)}else t&&Ii(e,t)},zi=(e,n,r)=>{let{vnode:i,slots:a}=e,o=!0,s=t;if(i.shapeFlag&32){let e=n._;e?r&&e===1?o=!1:Li(a,n,r):(o=!n.$stable,Fi(n,a)),s=n}else n&&(Ii(e,n),s={default:1});if(o)for(let e in a)!Mi(e)&&s[e]==null&&delete a[e]},Bi=Qi;function Vi(e){return Hi(e)}function Hi(e,i){let a=ce();a.__VUE__=!0;let{insert:o,remove:s,patchProp:c,createElement:l,createText:u,createComment:d,setText:f,setElementText:p,parentNode:m,nextSibling:h,setScopeId:g=r,insertStaticContent:_}=e,v=(e,t,n,r=null,i=null,a=null,o=void 0,s=null,c=!!t.dynamicChildren)=>{if(e===t)return;e&&!la(e,t)&&(r=ge(e),pe(e,i,a,!0),e=null),t.patchFlag===-2&&(c=!1,t.dynamicChildren=null);let{type:l,ref:u,shapeFlag:d}=t;switch(l){case $i:y(e,t,n,r);break;case ea:b(e,t,n,r);break;case ta:e??x(t,n,r,o);break;case W:ne(e,t,n,r,i,a,o,s,c);break;default:d&1?w(e,t,n,r,i,a,o,s,c):d&6?re(e,t,n,r,i,a,o,s,c):(d&64||d&128)&&l.process(e,t,n,r,i,a,o,s,c,N)}u!=null&&i?lr(u,e&&e.ref,a,t||e,!t):u==null&&e&&e.ref!=null&&lr(e.ref,null,a,e,!0)},y=(e,t,n,r)=>{if(e==null)o(t.el=u(t.children),n,r);else{let n=t.el=e.el;t.children!==e.children&&f(n,t.children)}},b=(e,t,n,r)=>{e==null?o(t.el=d(t.children||``),n,r):t.el=e.el},x=(e,t,n,r)=>{[e.el,e.anchor]=_(e.children,t,n,r,e.el,e.anchor)},S=({el:e,anchor:t},n,r)=>{let i;for(;e&&e!==t;)i=h(e),o(e,n,r),e=i;o(t,n,r)},C=({el:e,anchor:t})=>{let n;for(;e&&e!==t;)n=h(e),s(e),e=n;s(t)},w=(e,t,n,r,i,a,o,s,c)=>{if(t.type===`svg`?o=`svg`:t.type===`math`&&(o=`mathml`),e==null)T(t,n,r,i,a,o,s,c);else{let n=e.el&&e.el._isVueCE?e.el:null;try{n&&n._beginPatch(),O(e,t,i,a,o,s,c)}finally{n&&n._endPatch()}}},T=(e,t,n,r,i,a,s,u)=>{let d,f,{props:m,shapeFlag:h,transition:g,dirs:_}=e;if(d=e.el=l(e.type,a,m&&m.is,m),h&8?p(d,e.children):h&16&&D(e.children,d,null,r,i,Ui(e,a),s,u),_&&Pn(e,null,r,`created`),E(d,e,e.scopeId,s,r),m){for(let e in m)e!==`value`&&!ee(e)&&c(d,e,null,m[e],a,r);`value`in m&&c(d,`value`,null,m.value,a),(f=m.onVnodeBeforeMount)&&ya(f,r,e)}_&&Pn(e,null,r,`beforeMount`);let v=Gi(i,g);v&&g.beforeEnter(d),o(d,t,n),((f=m&&m.onVnodeMounted)||v||_)&&Bi(()=>{try{f&&ya(f,r,e),v&&g.enter(d),_&&Pn(e,null,r,`mounted`)}finally{}},i)},E=(e,t,n,r,i)=>{if(n&&g(e,n),r)for(let t=0;t{for(let l=c;l{let l=n.el=e.el,{patchFlag:u,dynamicChildren:d,dirs:f}=n;u|=e.patchFlag&16;let m=e.props||t,h=n.props||t,g;if(r&&Wi(r,!1),(g=h.onVnodeBeforeUpdate)&&ya(g,r,n,e),f&&Pn(n,e,r,`beforeUpdate`),r&&Wi(r,!0),(m.innerHTML&&h.innerHTML==null||m.textContent&&h.textContent==null)&&p(l,``),d?k(e.dynamicChildren,d,l,r,i,Ui(n,a),o):s||le(e,n,l,null,r,i,Ui(n,a),o,!1),u>0){if(u&16)te(l,m,h,r,a);else if(u&2&&m.class!==h.class&&c(l,`class`,null,h.class,a),u&4&&c(l,`style`,m.style,h.style,a),u&8){let e=n.dynamicProps;for(let t=0;t{g&&ya(g,r,n,e),f&&Pn(n,e,r,`updated`)},i)},k=(e,t,n,r,i,a,o)=>{for(let s=0;s{if(n!==r){if(n!==t)for(let t in n)!ee(t)&&!(t in r)&&c(e,t,n[t],null,a,i);for(let t in r){if(ee(t))continue;let o=r[t],s=n[t];o!==s&&t!==`value`&&c(e,t,s,o,a,i)}`value`in r&&c(e,`value`,n.value,r.value,a)}},ne=(e,t,n,r,i,a,s,c,l)=>{let d=t.el=e?e.el:u(``),f=t.anchor=e?e.anchor:u(``),{patchFlag:p,dynamicChildren:m,slotScopeIds:h}=t;h&&(c=c?c.concat(h):h),e==null?(o(d,n,r),o(f,n,r),D(t.children||[],n,f,i,a,s,c,l)):p>0&&p&64&&m&&e.dynamicChildren&&e.dynamicChildren.length===m.length?(k(e.dynamicChildren,m,n,i,a,s,c),(t.key!=null||i&&t===i.subTree)&&Ki(e,t,!0)):le(e,t,n,f,i,a,s,c,l)},re=(e,t,n,r,i,a,o,s,c)=>{t.slotScopeIds=s,e==null?t.shapeFlag&512?i.ctx.activate(t,n,r,o,c):A(t,n,r,i,a,o,c):ae(e,t,c)},A=(e,t,n,r,i,a,o)=>{let s=e.component=Sa(e,r,i);if(fr(e)&&(s.ctx.renderer=N),ja(s,!1,o),s.asyncDep){if(i&&i.registerDep(s,oe,o),!e.el){let r=s.subTree=Y(ea);b(null,r,t,n),e.placeholder=r.el}}else oe(s,e,t,n,i,a,o)},ae=(e,t,n)=>{let r=t.component=e.component;if(vi(e,t,n))if(r.asyncDep&&!r.asyncResolved){se(r,t,n);return}else r.next=t,r.update();else t.el=e.el,r.vnode=t},oe=(e,t,n,r,i,a,o)=>{let s=()=>{if(e.isMounted){let{next:t,bu:n,u:r,parent:s,vnode:c}=e;{let n=Ji(e);if(n){t&&(t.el=c.el,se(e,t,o)),n.asyncDep.then(()=>{Bi(()=>{e.isUnmounted||l()},i)});return}}let u=t,d;Wi(e,!1),t?(t.el=c.el,se(e,t,o)):t=c,n&&ie(n),(d=t.props&&t.props.onVnodeBeforeUpdate)&&ya(d,s,t,c),Wi(e,!0);let f=hi(e),p=e.subTree;e.subTree=f,v(p,f,m(p.el),ge(p),e,i,a),t.el=f.el,u===null&&xi(e,f.el),r&&Bi(r,i),(d=t.props&&t.props.onVnodeUpdated)&&Bi(()=>ya(d,s,t,c),i)}else{let o,{el:s,props:c}=t,{bm:l,m:u,parent:d,root:f,type:p}=e,m=dr(t);if(Wi(e,!1),l&&ie(l),!m&&(o=c&&c.onVnodeBeforeMount)&&ya(o,d,t),Wi(e,!0),s&&be){let t=()=>{e.subTree=hi(e),be(s,e.subTree,e,i,null)};m&&p.__asyncHydrate?p.__asyncHydrate(s,e,t):t()}else{f.ce&&f.ce._hasShadowRoot()&&f.ce._injectChildStyle(p,e.parent?e.parent.type:void 0);let o=e.subTree=hi(e);v(null,o,n,r,e,i,a),t.el=o.el}if(u&&Bi(u,i),!m&&(o=c&&c.onVnodeMounted)){let e=t;Bi(()=>ya(o,d,e),i)}(t.shapeFlag&256||d&&dr(d.vnode)&&d.vnode.shapeFlag&256)&&e.a&&Bi(e.a,i),e.isMounted=!0,t=n=r=null}};e.scope.on();let c=e.effect=new Te(s);e.scope.off();let l=e.update=c.run.bind(c),u=e.job=c.runIfDirty.bind(c);u.i=e,u.id=e.uid,c.scheduler=()=>Cn(u),Wi(e,!0),l()},se=(e,t,n)=>{t.component=e;let r=e.vnode.props;e.vnode=t,e.next=null,Ei(e,t.props,r,n),zi(e,t.children,n),Be(),En(e),Ve()},le=(e,t,n,r,i,a,o,s,c=!1)=>{let l=e&&e.children,u=e?e.shapeFlag:0,d=t.children,{patchFlag:f,shapeFlag:m}=t;if(f>0){if(f&128){de(l,d,n,r,i,a,o,s,c);return}else if(f&256){ue(l,d,n,r,i,a,o,s,c);return}}m&8?(u&16&&he(l,i,a),d!==l&&p(n,d)):u&16?m&16?de(l,d,n,r,i,a,o,s,c):he(l,i,a,!0):(u&8&&p(n,``),m&16&&D(d,n,r,i,a,o,s,c))},ue=(e,t,r,i,a,o,s,c,l)=>{e=e||n,t=t||n;let u=e.length,d=t.length,f=Math.min(u,d),p;for(p=0;pd?he(e,a,o,!0,!1,f):D(t,r,i,a,o,s,c,l,f)},de=(e,t,r,i,a,o,s,c,l)=>{let u=0,d=t.length,f=e.length-1,p=d-1;for(;u<=f&&u<=p;){let n=e[u],i=t[u]=l?ga(t[u]):ha(t[u]);if(la(n,i))v(n,i,r,null,a,o,s,c,l);else break;u++}for(;u<=f&&u<=p;){let n=e[f],i=t[p]=l?ga(t[p]):ha(t[p]);if(la(n,i))v(n,i,r,null,a,o,s,c,l);else break;f--,p--}if(u>f){if(u<=p){let e=p+1,n=ep)for(;u<=f;)pe(e[u],a,o,!0),u++;else{let m=u,h=u,g=new Map;for(u=h;u<=p;u++){let e=t[u]=l?ga(t[u]):ha(t[u]);e.key!=null&&g.set(e.key,u)}let _,y=0,b=p-h+1,x=!1,S=0,C=Array(b);for(u=0;u=b){pe(n,a,o,!0);continue}let i;if(n.key!=null)i=g.get(n.key);else for(_=h;_<=p;_++)if(C[_-h]===0&&la(n,t[_])){i=_;break}i===void 0?pe(n,a,o,!0):(C[i-h]=u+1,i>=S?S=i:x=!0,v(n,t[i],r,null,a,o,s,c,l),y++)}let w=x?qi(C):n;for(_=w.length-1,u=b-1;u>=0;u--){let e=h+u,n=t[e],f=t[e+1],p=e+1{let{el:a,type:c,transition:l,children:u,shapeFlag:d}=e;if(d&6){fe(e.component.subTree,t,n,r);return}if(d&128){e.suspense.move(t,n,r);return}if(d&64){c.move(e,t,n,N);return}if(c===W){o(a,t,n);for(let e=0;el.enter(a),i));else{let{leave:r,delayLeave:i,afterLeave:c}=l,u=()=>{e.ctx.isUnmounted?s(a):o(a,t,n)},d=()=>{let e=a._isLeaving||!!a[Gn];a._isLeaving&&a[Gn](!0),l.persisted&&!e?u():r(a,()=>{u(),c&&c()})};i?i(a,u,d):d()}else o(a,t,n)},pe=(e,t,n,r=!1,i=!1)=>{let{type:a,props:o,ref:s,children:c,dynamicChildren:l,shapeFlag:u,patchFlag:d,dirs:f,cacheIndex:p,memo:m}=e;if(d===-2&&(i=!1),s!=null&&(Be(),lr(s,null,n,e,!0),Ve()),p!=null&&(t.renderCache[p]=void 0),u&256){t.ctx.deactivate(e);return}let h=u&1&&f,g=!dr(e),_;if(g&&(_=o&&o.onVnodeBeforeUnmount)&&ya(_,t,e),u&6)me(e.component,n,r);else{if(u&128){e.suspense.unmount(n,r);return}h&&Pn(e,null,t,`beforeUnmount`),u&64?e.type.remove(e,t,n,N,r):l&&!l.hasOnce&&(a!==W||d>0&&d&64)?he(l,t,n,!1,!0):(a===W&&d&384||!i&&u&16)&&he(c,t,n),r&&j(e)}let v=m!=null&&p==null;(g&&(_=o&&o.onVnodeUnmounted)||h||v)&&Bi(()=>{_&&ya(_,t,e),h&&Pn(e,null,t,`unmounted`),v&&(e.el=null)},n)},j=e=>{let{type:t,el:n,anchor:r,transition:i}=e;if(t===W){M(n,r);return}if(t===ta){C(e);return}let a=()=>{s(n),i&&!i.persisted&&i.afterLeave&&i.afterLeave()};if(e.shapeFlag&1&&i&&!i.persisted){let{leave:t,delayLeave:r}=i,o=()=>t(n,a);r?r(e.el,a,o):o()}else a()},M=(e,t)=>{let n;for(;e!==t;)n=h(e),s(e),e=n;s(t)},me=(e,t,n)=>{let{bum:r,scope:i,job:a,subTree:o,um:s,m:c,a:l}=e;Yi(c),Yi(l),r&&ie(r),i.stop(),a&&(a.flags|=8,pe(o,e,t,n)),s&&Bi(s,t),Bi(()=>{e.isUnmounted=!0},t)},he=(e,t,n,r=!1,i=!1,a=0)=>{for(let o=a;o{if(e.shapeFlag&6)return ge(e.component.subTree);if(e.shapeFlag&128)return e.suspense.next();let t=h(e.anchor||e.el),n=t&&t[Un];return n?h(n):t},_e=!1,ve=(e,t,n)=>{let r;e==null?t._vnode&&(pe(t._vnode,null,null,!0),r=t._vnode.component):v(t._vnode||null,e,t,null,null,null,n),t._vnode=e,_e||(_e=!0,En(r),Dn(),_e=!1)},N={p:v,um:pe,m:fe,r:j,mt:A,mc:D,pc:le,pbc:k,n:ge,o:e},ye,be;return i&&([ye,be]=i(N)),{render:ve,hydrate:ye,createApp:ci(ve,ye)}}function Ui({type:e,props:t},n){return n===`svg`&&e===`foreignObject`||n===`mathml`&&e===`annotation-xml`&&t&&t.encoding&&t.encoding.includes(`html`)?void 0:n}function Wi({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Gi(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Ki(e,t,n=!1){let r=e.children,i=t.children;if(d(r)&&d(i))for(let e=0;e>1,e[n[s]]0&&(t[r]=n[a-1]),n[a]=r)}}for(a=n.length,o=n[a-1];a-- >0;)n[a]=o,o=t[o];return n}function Ji(e){let t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Ji(t)}function Yi(e){if(e)for(let t=0;te.__isSuspense;function Qi(e,t){t&&t.pendingBranch?d(e)?t.effects.push(...e):t.effects.push(e):Tn(e)}var W=Symbol.for(`v-fgt`),$i=Symbol.for(`v-txt`),ea=Symbol.for(`v-cmt`),ta=Symbol.for(`v-stc`),na=[],ra=null;function G(e=!1){na.push(ra=e?null:[])}function ia(){na.pop(),ra=na[na.length-1]||null}var aa=1;function oa(e,t=!1){aa+=e,e<0&&ra&&t&&(ra.hasOnce=!0)}function sa(e){return e.dynamicChildren=aa>0?ra||n:null,ia(),aa>0&&ra&&ra.push(e),e}function K(e,t,n,r,i,a){return sa(J(e,t,n,r,i,a,!0))}function q(e,t,n,r,i){return sa(Y(e,t,n,r,i,!0))}function ca(e){return e?e.__v_isVNode===!0:!1}function la(e,t){return e.type===t.type&&e.key===t.key}var ua=({key:e})=>e??null,da=({ref:e,ref_key:t,ref_for:n})=>(typeof e==`number`&&(e=``+e),e==null?null:g(e)||L(e)||h(e)?{i:An,r:e,k:t,f:!!n}:e);function J(e,t=null,n=null,r=0,i=null,a=e===W?0:1,o=!1,s=!1){let c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&ua(t),ref:t&&da(t),scopeId:jn,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:a,patchFlag:r,dynamicProps:i,dynamicChildren:null,appContext:null,ctx:An};return s?(_a(c,n),a&128&&e.normalize(c)):n&&(c.shapeFlag|=g(n)?8:16),aa>0&&!o&&ra&&(c.patchFlag>0||a&6)&&c.patchFlag!==32&&ra.push(c),c}var Y=fa;function fa(e,t=null,n=null,r=0,i=null,a=!1){if((!e||e===jr)&&(e=ea),ca(e)){let r=ma(e,t,!0);return n&&_a(r,n),aa>0&&!a&&ra&&(r.shapeFlag&6?ra[ra.indexOf(e)]=r:ra.push(r)),r.patchFlag=-2,r}if(Va(e)&&(e=e.__vccOpts),t){t=pa(t);let{class:e,style:n}=t;e&&!g(e)&&(t.class=j(e)),v(n)&&(Bt(n)&&!d(n)&&(n=s({},n)),t.style=le(n))}let o=g(e)?1:Zi(e)?128:Wn(e)?64:v(e)?4:h(e)?2:0;return J(e,t,n,r,i,o,a,!0)}function pa(e){return e?Bt(e)||wi(e)?s({},e):e:null}function ma(e,t,n=!1,r=!1){let{props:i,ref:a,patchFlag:o,children:s,transition:c}=e,l=t?va(i||{},t):i,u={__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&ua(l),ref:t&&t.ref?n&&a?d(a)?a.concat(da(t)):[a,da(t)]:da(t):a,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:s,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==W?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&ma(e.ssContent),ssFallback:e.ssFallback&&ma(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&r&&ir(u,c.clone(u)),u}function X(e=` `,t=0){return Y($i,null,e,t)}function Z(e=``,t=!1){return t?(G(),q(ea,null,e)):Y(ea,null,e)}function ha(e){return e==null||typeof e==`boolean`?Y(ea):d(e)?Y(W,null,e.slice()):ca(e)?ga(e):Y($i,null,String(e))}function ga(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:ma(e)}function _a(e,t){let n=0,{shapeFlag:r}=e;if(t==null)t=null;else if(d(t))n=16;else if(typeof t==`object`)if(r&65){let n=t.default;n&&(n._c&&(n._d=!1),_a(e,n()),n._c&&(n._d=!0));return}else{n=32;let r=t._;!r&&!wi(t)?t._ctx=An:r===3&&An&&(An.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else h(t)?(t={default:t,_ctx:An},n=32):(t=String(t),r&64?(n=16,t=[X(t)]):n=8);e.children=t,e.shapeFlag|=n}function va(...e){let t={};for(let n=0;nCa||An,Ta,Ea;{let e=ce(),t=(t,n)=>{let r;return(r=e[t])||(r=e[t]=[]),r.push(n),e=>{r.length>1?r.forEach(t=>t(e)):r[0](e)}};Ta=t(`__VUE_INSTANCE_SETTERS__`,e=>Ca=e),Ea=t(`__VUE_SSR_SETTERS__`,e=>Aa=e)}var Da=e=>{let t=Ca;return Ta(e),e.scope.on(),()=>{e.scope.off(),Ta(t)}},Oa=()=>{Ca&&Ca.scope.off(),Ta(null)};function ka(e){return e.vnode.shapeFlag&4}var Aa=!1;function ja(e,t=!1,n=!1){t&&Ea(t);let{props:r,children:i}=e.vnode,a=ka(e);Ti(e,r,a,t),Ri(e,i,n||t);let o=a?Ma(e,t):void 0;return t&&Ea(!1),o}function Ma(e,t){let n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Br);let{setup:r}=n;if(r){Be();let n=e.setupContext=r.length>1?Ra(e):null,i=Da(e),a=un(r,e,0,[e.props,n]),o=y(a);if(Ve(),i(),(o||e.sp)&&!dr(e)&&or(e),o){if(a.then(Oa,Oa),t)return a.then(n=>{Na(e,n,t)}).catch(t=>{fn(t,e,0)});e.asyncDep=a}else Na(e,a,t)}else Ia(e,t)}function Na(e,t,n){h(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:v(t)&&(e.setupState=Yt(t)),Ia(e,n)}var Pa,Fa;function Ia(e,t,n){let i=e.type;if(!e.render){if(!t&&Pa&&!i.render){let t=i.template||Xr(e).template;if(t){let{isCustomElement:n,compilerOptions:r}=e.appContext.config,{delimiters:a,compilerOptions:o}=i;i.render=Pa(t,s(s({isCustomElement:n,delimiters:a},r),o))}}e.render=i.render||r,Fa&&Fa(e)}{let t=Da(e);Be();try{Kr(e)}finally{Ve(),t()}}}var La={get(e,t){return Ze(e,`get`,``),e[t]}};function Ra(e){return{attrs:new Proxy(e.attrs,La),slots:e.slots,emit:e.emit,expose:t=>{e.exposed=t||{}}}}function za(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Yt(Vt(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Rr)return Rr[n](e)},has(e,t){return t in e||t in Rr}})):e.proxy}function Ba(e,t=!0){return h(e)?e.displayName||e.name:e.name||t&&e.__name}function Va(e){return h(e)&&`__vccOpts`in e}var Q=(e,t)=>nn(e,t,Aa);function Ha(e,t,n){try{oa(-1);let r=arguments.length;return r===2?v(t)&&!d(t)?ca(t)?Y(e,null,[t]):Y(e,t):Y(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&ca(n)&&(n=[n]),Y(e,t,n))}finally{oa(1)}}var Ua=`3.5.35`,Wa=r,Ga=void 0,Ka=typeof window<`u`&&window.trustedTypes;if(Ka)try{Ga=Ka.createPolicy(`vue`,{createHTML:e=>e})}catch{}var qa=Ga?e=>Ga.createHTML(e):e=>e,Ja=`http://www.w3.org/2000/svg`,Ya=`http://www.w3.org/1998/Math/MathML`,Xa=typeof document<`u`?document:null,Za=Xa&&Xa.createElement(`template`),Qa={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{let t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{let i=t===`svg`?Xa.createElementNS(Ja,e):t===`mathml`?Xa.createElementNS(Ya,e):n?Xa.createElement(e,{is:n}):Xa.createElement(e);return e===`select`&&r&&r.multiple!=null&&i.setAttribute(`multiple`,r.multiple),i},createText:e=>Xa.createTextNode(e),createComment:e=>Xa.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Xa.querySelector(e),setScopeId(e,t){e.setAttribute(t,``)},insertStaticContent(e,t,n,r,i,a){let o=n?n.previousSibling:t.lastChild;if(i&&(i===a||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),n),!(i===a||!(i=i.nextSibling)););else{Za.innerHTML=qa(r===`svg`?`${e}`:r===`mathml`?`${e}`:e);let i=Za.content;if(r===`svg`||r===`mathml`){let e=i.firstChild;for(;e.firstChild;)i.appendChild(e.firstChild);i.removeChild(e)}t.insertBefore(i,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},$a=`transition`,eo=`animation`,to=Symbol(`_vtc`),no={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},ro=s({},Yn,no),io=(e=>(e.displayName=`Transition`,e.props=ro,e))((e,{slots:t})=>Ha($n,so(e),t)),ao=(e,t=[])=>{d(e)?e.forEach(e=>e(...t)):e&&e(...t)},oo=e=>e?d(e)?e.some(e=>e.length>1):e.length>1:!1;function so(e){let t={};for(let n in e)n in no||(t[n]=e[n]);if(e.css===!1)return t;let{name:n=`v`,type:r,duration:i,enterFromClass:a=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:c=`${n}-enter-to`,appearFromClass:l=a,appearActiveClass:u=o,appearToClass:d=c,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:m=`${n}-leave-to`}=e,h=co(i),g=h&&h[0],_=h&&h[1],{onBeforeEnter:v,onEnter:y,onEnterCancelled:b,onLeave:x,onLeaveCancelled:S,onBeforeAppear:C=v,onAppear:w=y,onAppearCancelled:ee=b}=t,T=(e,t,n,r)=>{e._enterCancelled=r,fo(e,t?d:c),fo(e,t?u:o),n&&n()},E=(e,t)=>{e._isLeaving=!1,fo(e,f),fo(e,m),fo(e,p),t&&t()},D=e=>(t,n)=>{let i=e?w:y,o=()=>T(t,e,n);ao(i,[t,o]),po(()=>{fo(t,e?l:a),uo(t,e?d:c),oo(i)||ho(t,r,g,o)})};return s(t,{onBeforeEnter(e){ao(v,[e]),uo(e,a),uo(e,o)},onBeforeAppear(e){ao(C,[e]),uo(e,l),uo(e,u)},onEnter:D(!1),onAppear:D(!0),onLeave(e,t){e._isLeaving=!0;let n=()=>E(e,t);uo(e,f),e._enterCancelled?(uo(e,p),yo(e)):(yo(e),uo(e,p)),po(()=>{e._isLeaving&&(fo(e,f),uo(e,m),oo(x)||ho(e,r,_,n))}),ao(x,[e,n])},onEnterCancelled(e){T(e,!1,void 0,!0),ao(b,[e])},onAppearCancelled(e){T(e,!0,void 0,!0),ao(ee,[e])},onLeaveCancelled(e){E(e),ao(S,[e])}})}function co(e){if(e==null)return null;if(v(e))return[lo(e.enter),lo(e.leave)];{let t=lo(e);return[t,t]}}function lo(e){return oe(e)}function uo(e,t){t.split(/\s+/).forEach(t=>t&&e.classList.add(t)),(e[to]||(e[to]=new Set)).add(t)}function fo(e,t){t.split(/\s+/).forEach(t=>t&&e.classList.remove(t));let n=e[to];n&&(n.delete(t),n.size||(e[to]=void 0))}function po(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}var mo=0;function ho(e,t,n,r){let i=e._endId=++mo,a=()=>{i===e._endId&&r()};if(n!=null)return setTimeout(a,n);let{type:o,timeout:s,propCount:c}=go(e,t);if(!o)return r();let l=o+`end`,u=0,d=()=>{e.removeEventListener(l,f),a()},f=t=>{t.target===e&&++u>=c&&d()};setTimeout(()=>{u(n[e]||``).split(`, `),i=r(`${$a}Delay`),a=r(`${$a}Duration`),o=_o(i,a),s=r(`${eo}Delay`),c=r(`${eo}Duration`),l=_o(s,c),u=null,d=0,f=0;t===$a?o>0&&(u=$a,d=o,f=a.length):t===eo?l>0&&(u=eo,d=l,f=c.length):(d=Math.max(o,l),u=d>0?o>l?$a:eo:null,f=u?u===$a?a.length:c.length:0);let p=u===$a&&/\b(?:transform|all)(?:,|$)/.test(r(`${$a}Property`).toString());return{type:u,timeout:d,propCount:f,hasTransform:p}}function _o(e,t){for(;e.lengthvo(t)+vo(e[n])))}function vo(e){return e===`auto`?0:Number(e.slice(0,-1).replace(`,`,`.`))*1e3}function yo(e){return(e?e.ownerDocument:document).body.offsetHeight}function bo(e,t,n){let r=e[to];r&&(t=(t?[t,...r]:[...r]).join(` `)),t==null?e.removeAttribute(`class`):n?e.setAttribute(`class`,t):e.className=t}var xo=Symbol(`_vod`),So=Symbol(`_vsh`),Co={name:`show`,beforeMount(e,{value:t},{transition:n}){e[xo]=e.style.display===`none`?``:e.style.display,n&&t?n.beforeEnter(e):wo(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),wo(e,!0),r.enter(e)):r.leave(e,()=>{wo(e,!1)}):wo(e,t))},beforeUnmount(e,{value:t}){wo(e,t)}};function wo(e,t){e.style.display=t?e[xo]:`none`,e[So]=!t}var To=Symbol(``),Eo=/(?:^|;)\s*display\s*:/;function Do(e,t,n){let r=e.style,i=g(n),a=!1;if(n&&!i){if(t)if(g(t))for(let e of t.split(`;`)){let t=e.slice(0,e.indexOf(`:`)).trim();n[t]??ko(r,t,``)}else for(let e in t)n[e]??ko(r,e,``);for(let i in n){i===`display`&&(a=!0);let o=n[i];o==null?ko(r,i,``):No(e,i,!g(t)&&t?t[i]:void 0,o)||ko(r,i,o)}}else if(i){if(t!==n){let e=r[To];e&&(n+=`;`+e),r.cssText=n,a=Eo.test(n)}}else t&&e.removeAttribute(`style`);xo in e&&(e[xo]=a?r.display:``,e[So]&&(r.display=`none`))}var Oo=/\s*!important$/;function ko(e,t,n){if(d(n))n.forEach(n=>ko(e,t,n));else if(n??(n=``),t.startsWith(`--`))e.setProperty(t,n);else{let r=Mo(e,t);Oo.test(n)?e.setProperty(k(r),n.replace(Oo,``),`important`):e[r]=n}}var Ao=[`Webkit`,`Moz`,`ms`],jo={};function Mo(e,t){let n=jo[t];if(n)return n;let r=D(t);if(r!==`filter`&&r in e)return jo[t]=r;r=te(r);for(let n=0;nUo||(Wo.then(()=>Uo=0),Uo=Date.now());function Ko(e,t){let n=e=>{if(!e._vts)e._vts=Date.now();else if(e._vts<=n.attached)return;let r=n.value;if(d(r)){let n=e.stopImmediatePropagation;e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0};let i=r.slice(),a=[e];for(let n=0;ne.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Jo=(e,t,n,r,i,s)=>{let c=i===`svg`;t===`class`?bo(e,r,c):t===`style`?Do(e,n,r):a(t)?o(t)||Bo(e,t,n,r,s):(t[0]===`.`?(t=t.slice(1),!0):t[0]===`^`?(t=t.slice(1),!1):Yo(e,t,r,c))?(Io(e,t,r),!e.tagName.includes(`-`)&&(t===`value`||t===`checked`||t===`selected`)&&Fo(e,t,r,c,s,t!==`value`)):e._isVueCE&&(Xo(e,t)||e._def.__asyncLoader&&(/[A-Z]/.test(t)||!g(r)))?Io(e,D(t),r,s,t):(t===`true-value`?e._trueValue=r:t===`false-value`&&(e._falseValue=r),Fo(e,t,r,c))};function Yo(e,t,n,r){if(r)return!!(t===`innerHTML`||t===`textContent`||t in e&&qo(t)&&h(n));if(t===`spellcheck`||t===`draggable`||t===`translate`||t===`autocorrect`||t===`sandbox`&&e.tagName===`IFRAME`||t===`form`||t===`list`&&e.tagName===`INPUT`||t===`type`&&e.tagName===`TEXTAREA`)return!1;if(t===`width`||t===`height`){let t=e.tagName;if(t===`IMG`||t===`VIDEO`||t===`CANVAS`||t===`SOURCE`)return!1}return qo(t)&&g(n)?!1:t in e}function Xo(e,t){let n=e._def.props;if(!n)return!1;let r=D(t);return Array.isArray(n)?n.some(e=>D(e)===r):Object.keys(n).some(e=>D(e)===r)}var Zo=[`ctrl`,`shift`,`alt`,`meta`],Qo={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>`button`in e&&e.button!==0,middle:e=>`button`in e&&e.button!==1,right:e=>`button`in e&&e.button!==2,exact:(e,t)=>Zo.some(n=>e[`${n}Key`]&&!t.includes(n))},$o=(e,t)=>{if(!e)return e;let n=e._withMods||(e._withMods={}),r=t.join(`.`);return n[r]||(n[r]=((n,...r)=>{for(let e=0;e{let n=e._withKeys||(e._withKeys={}),r=t.join(`.`);return n[r]||(n[r]=(n=>{if(!(`key`in n))return;let r=k(n.key);if(t.some(e=>e===r||es[e]===r))return e(n)}))},ns=s({patchProp:Jo},Qa),rs;function is(){return rs||(rs=Vi(ns))}var as=((...e)=>{is().render(...e)}),os=((...e)=>{let t=is().createApp(...e),{mount:n}=t;return t.mount=e=>{let r=cs(e);if(!r)return;let i=t._component;!h(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent=``);let a=n(r,!1,ss(r));return r instanceof Element&&(r.removeAttribute(`v-cloak`),r.setAttribute(`data-v-app`,``)),a},t});function ss(e){if(e instanceof SVGElement)return`svg`;if(typeof MathMLElement==`function`&&e instanceof MathMLElement)return`mathml`}function cs(e){return g(e)?document.querySelector(e):e}var ls={tab:`Tab`,enter:`Enter`,space:`Space`,left:`ArrowLeft`,up:`ArrowUp`,right:`ArrowRight`,down:`ArrowDown`,esc:`Escape`,delete:`Delete`,backspace:`Backspace`,numpadEnter:`NumpadEnter`,pageUp:`PageUp`,pageDown:`PageDown`,home:`Home`,end:`End`},us=`update:modelValue`,ds=`change`,fs=`input`,ps=[``,`default`,`small`,`large`],ms=typeof global==`object`&&global&&global.Object===Object&&global,hs=typeof self==`object`&&self&&self.Object===Object&&self,gs=ms||hs||Function(`return this`)(),_s=gs.Symbol,vs=Object.prototype,ys=vs.hasOwnProperty,bs=vs.toString,xs=_s?_s.toStringTag:void 0;function Ss(e){var t=ys.call(e,xs),n=e[xs];try{e[xs]=void 0;var r=!0}catch{}var i=bs.call(e);return r&&(t?e[xs]=n:delete e[xs]),i}var Cs=Object.prototype.toString;function ws(e){return Cs.call(e)}var Ts=`[object Null]`,Es=`[object Undefined]`,Ds=_s?_s.toStringTag:void 0;function Os(e){return e==null?e===void 0?Es:Ts:Ds&&Ds in Object(e)?Ss(e):ws(e)}function ks(e){return typeof e==`object`&&!!e}var As=`[object Symbol]`;function js(e){return typeof e==`symbol`||ks(e)&&Os(e)==As}function Ms(e,t){for(var n=-1,r=e==null?0:e.length,i=Array(r);++n0){if(++t>=_c)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}function xc(e){return function(){return e}}var Sc=function(){try{var e=hc(Object,`defineProperty`);return e({},``,{}),e}catch{}}(),Cc=bc(Sc?function(e,t){return Sc(e,`toString`,{configurable:!0,enumerable:!1,value:xc(t),writable:!0})}:Ys),wc=9007199254740991,Tc=/^(?:0|[1-9]\d*)$/;function Ec(e,t){var n=typeof e;return t=t??wc,!!t&&(n==`number`||n!=`symbol`&&Tc.test(e))&&e>-1&&e%1==0&&e-1&&e%1==0&&e<=Nc}var Fc=`[object Arguments]`;function Ic(e){return ks(e)&&Os(e)==Fc}var Lc=Object.prototype,Rc=Lc.hasOwnProperty,zc=Lc.propertyIsEnumerable,Bc=Ic(function(){return arguments}())?Ic:function(e){return ks(e)&&Rc.call(e,`callee`)&&!zc.call(e,`callee`)};function Vc(e,t){return function(n){return e(t(n))}}var Hc=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Uc=/^\w*$/;function Wc(e,t){if(Ns(e))return!1;var n=typeof e;return n==`number`||n==`symbol`||n==`boolean`||e==null||js(e)?!0:Uc.test(e)||!Hc.test(e)||t!=null&&e in Object(t)}var Gc=hc(Object,`create`);function Kc(){this.__data__=Gc?Gc(null):{},this.size=0}function qc(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=+!!t,t}var Jc=`__lodash_hash_undefined__`,Yc=Object.prototype.hasOwnProperty;function Xc(e){var t=this.__data__;if(Gc){var n=t[e];return n===Jc?void 0:n}return Yc.call(t,e)?t[e]:void 0}var Zc=Object.prototype.hasOwnProperty;function Qc(e){var t=this.__data__;return Gc?t[e]!==void 0:Zc.call(t,e)}var $c=`__lodash_hash_undefined__`;function el(e,t){var n=this.__data__;return this.size+=+!this.has(e),n[e]=Gc&&t===void 0?$c:t,this}function tl(e){var t=-1,n=e==null?0:e.length;for(this.clear();++t-1}function cl(e,t){var n=this.__data__,r=rl(n,e);return r<0?(++this.size,n.push([e,t])):n[r][1]=t,this}function ll(e){var t=-1,n=e==null?0:e.length;for(this.clear();++t0&&n(s)?t>1?Fl(s,t-1,n,r,i):Ml(i,s):r||(i[i.length]=s)}return i}function Il(e){return e!=null&&e.length?Fl(e,1):[]}function Ll(e){return Cc(Mc(e,void 0,Il),e+``)}var Rl=Vc(Object.getPrototypeOf,Object),zl=`[object Object]`,Bl=Function.prototype,Vl=Object.prototype,Hl=Bl.toString,Ul=Vl.hasOwnProperty,Wl=Hl.call(Object);function Gl(e){if(!ks(e)||Os(e)!=zl)return!1;var t=Rl(e);if(t===null)return!0;var n=Ul.call(t,`constructor`)&&t.constructor;return typeof n==`function`&&n instanceof n&&Hl.call(n)==Wl}function Kl(e,t,n){return e===e&&(n!==void 0&&(e=e<=n?e:n),t!==void 0&&(e=e>=t?e:t)),e}function ql(e,t,n){return n===void 0&&(n=t,t=void 0),n!==void 0&&(n=Js(n),n=n===n?n:0),t!==void 0&&(t=Js(t),t=t===t?t:0),Kl(Js(e),t,n)}function Jl(e,t){return e!=null&&t in Object(e)}function Yl(e,t,n){t=Dl(t,e);for(var r=-1,i=t.length,a=!1;++re===void 0,iu=e=>typeof e==`number`,au=e=>typeof Element>`u`?!1:e instanceof Element,ou=e=>g(e)?!Number.isNaN(Number(e)):!1,su=e=>Object.keys(e),cu=`__epPropKey`,lu=e=>e,uu=e=>v(e)&&!!e.__epPropKey,du=(e,t)=>{if(!v(e)||uu(e))return e;let{values:n,required:r,default:i,type:a,validator:o}=e,s={type:a,required:!!r,validator:n||o?r=>{let a=!1,s=[];if(n&&(s=Array.from(n),u(e,`default`)&&s.push(i),a||(a=s.includes(r))),o&&(a||(a=o(r))),!a&&s.length>0){let e=[...new Set(s)].map(e=>JSON.stringify(e)).join(`, `);Wa(`Invalid prop: validation failed${t?` for prop "${t}"`:``}. Expected one of [${e}], got value ${JSON.stringify(r)}.`)}return a}:void 0,[cu]:!0};return u(e,`default`)&&(s.default=i),s},fu=e=>Zl(Object.entries(e).map(([e,t])=>[e,du(t,e)])),pu=class extends Error{constructor(e){super(e),this.name=`ElementPlusError`}};function mu(e,t){throw new pu(`[${e}] ${t}`)}function hu(e,t){{let n=g(e)?new pu(`[${e}] ${t}`):e;console.warn(n)}}var gu=[`class`,`style`],_u=/^on[A-Z]/,vu=(e={})=>{let{excludeListeners:t=!1,excludeKeys:n}=e,r=Q(()=>(n?.value||[]).concat(gu)),i=wa();return i?Q(()=>Zl(Object.entries(i.proxy?.$attrs).filter(([e])=>!r.value.includes(e)&&!(t&&_u.test(e))))):(hu(`use-attrs`,`getCurrentInstance() returned null. useAttrs() must be called at the top of a setup function`),Q(()=>({})))};function yu(e,t){let n=Wt();return zn(()=>{n.value=e()},{...t,flush:t?.flush??`sync`}),Ft(n)}function bu(e,t){return Se()?(Ce(e,t),!0):!1}var xu=typeof window<`u`&&typeof document<`u`;typeof WorkerGlobalScope<`u`&&globalThis instanceof WorkerGlobalScope;var Su=Object.prototype.toString,Cu=e=>Su.call(e)===`[object Object]`;function wu(e){return Array.isArray(e)?e:[e]}function Tu(e,t,n){return V(e,t,{...n,immediate:!0})}var Eu=xu?window:void 0;xu&&window.document,xu&&window.navigator,xu&&window.location;function Du(e){let t=qt(e);return t?.$el??t}function Ou(...e){let t=(e,t,n,r)=>(e.addEventListener(t,n,r),()=>e.removeEventListener(t,n,r)),n=Q(()=>{let t=wu(qt(e[0])).filter(e=>e!=null);return t.every(e=>typeof e!=`string`)?t:void 0});return Tu(()=>[n.value?.map(e=>Du(e))??[Eu].filter(e=>e!=null),wu(qt(n.value?e[1]:e[0])),wu(z(n.value?e[2]:e[1])),qt(n.value?e[3]:e[2])],([e,n,r,i],a,o)=>{if(!e?.length||!n?.length||!r?.length)return;let s=Cu(i)?{...i}:i,c=e.flatMap(e=>n.flatMap(n=>r.map(r=>t(e,n,r,s))));o(()=>{c.forEach(e=>e())})},{flush:`post`})}function ku(){let e=Wt(!1),t=wa();return t&&br(()=>{e.value=!0},t),e}function Au(e){let t=ku();return Q(()=>(t.value,!!e()))}function ju(e,t,n={}){let{window:r=Eu,...i}=n,a,o=Au(()=>r&&`ResizeObserver`in r),s=()=>{a&&(a.disconnect(),a=void 0)},c=V(Q(()=>{let t=qt(e);return Array.isArray(t)?t.map(e=>Du(e)):[Du(t)]}),e=>{if(s(),o.value&&r){a=new ResizeObserver(t);for(let t of e)t&&a.observe(t,i)}},{immediate:!0,flush:`post`}),l=()=>{s(),c()};return bu(l),{isSupported:o,stop:l}}var Mu=({from:e,replacement:t,scope:n,version:r,ref:i,type:a=`API`},o)=>{V(()=>z(o),o=>{o&&hu(n,`[${a}] ${e} is about to be deprecated in version ${r}, please use ${t} instead. -For more detail, please visit: ${i} -`)},{immediate:!0})},Nu=`a[href],button:not([disabled]),button:not([hidden]),:not([tabindex="-1"]),input:not([disabled]),input:not([type="hidden"]),select:not([disabled]),textarea:not([disabled])`,Pu=e=>typeof ShadowRoot>`u`?!1:e instanceof ShadowRoot,Fu=e=>typeof Element>`u`?!1:e instanceof Element,Iu=e=>getComputedStyle(e).position===`fixed`?!1:e.offsetParent!==null,Lu=e=>Array.from(e.querySelectorAll(Nu)).filter(e=>Ru(e)&&Iu(e)),Ru=e=>{if(e.tabIndex>0||e.tabIndex===0&&e.getAttribute(`tabIndex`)!==null)return!0;if(e.tabIndex<0||e.hasAttribute(`disabled`)||e.getAttribute(`aria-disabled`)===`true`)return!1;switch(e.nodeName){case`A`:return!!e.href&&e.rel!==`ignore`;case`INPUT`:return!(e.type===`hidden`||e.type===`file`);case`BUTTON`:case`SELECT`:case`TEXTAREA`:return!0;default:return!1}},zu=(e,t)=>{if(!e||!e.focus)return;let n=!1;Fu(e)&&!Ru(e)&&!e.getAttribute(`tabindex`)&&(e.setAttribute(`tabindex`,`-1`),n=!0),e.focus(t),Fu(e)&&n&&e.removeAttribute(`tabindex`)},Bu=()=>xu&&/firefox/i.test(window.navigator.userAgent),Vu=()=>xu&&/android/i.test(window.navigator.userAgent),Hu=`utils/dom/style`,Uu=(e=``)=>e.split(` `).filter(e=>!!e.trim()),Wu=(e,t)=>{if(!e||!t)return!1;if(t.includes(` `))throw Error(`className should not contain space.`);return e.classList.contains(t)},Gu=(e,t)=>{!e||!t.trim()||e.classList.add(...Uu(t))},Ku=(e,t)=>{!e||!t.trim()||e.classList.remove(...Uu(t))},qu=(e,t)=>{if(!xu||!e||!t||Pu(e))return``;let n=D(t);n===`float`&&(n=`cssFloat`);try{let t=e.style[n];if(t)return t;let r=document.defaultView?.getComputedStyle(e,``);return r?r[n]:``}catch{return e.style[n]}};function Ju(e,t=`px`){if(!e&&e!==0)return``;if(iu(e)||ou(e))return`${e}${t}`;if(g(e))return e;hu(Hu,`binding value must be a string or number`)}var Yu=(e,t,n,r)=>{let i={offsetX:0,offsetY:0},a=R(!1),o=(t,n)=>{if(e.value){let{offsetX:a,offsetY:o}=i,s=e.value.getBoundingClientRect(),c=Math.max(s.left,0),l=Math.max(s.top,0),u=s.width,d=s.height,f=document.documentElement.clientWidth,p=document.documentElement.clientHeight,m=-c+a,h=-l+o,g=f-c-u+a,_=p-l-(d{let t=e.clientX,n=e.clientY,{offsetX:r,offsetY:s}=i,c=e=>{a.value||(a.value=!0),o(r+e.clientX-t,s+e.clientY-n)},l=()=>{a.value=!1,document.removeEventListener(`mousemove`,c),document.removeEventListener(`mouseup`,l)};document.addEventListener(`mousemove`,c),document.addEventListener(`mouseup`,l)},c=()=>{t.value&&e.value&&(t.value.addEventListener(`mousedown`,s),window.addEventListener(`resize`,d))},l=()=>{t.value&&e.value&&(t.value.removeEventListener(`mousedown`,s),window.removeEventListener(`resize`,d))},u=()=>{i.offsetX=0,i.offsetY=0,e.value&&(e.value.style.transform=``)},d=()=>{let{offsetX:e,offsetY:t}=i;o(e,t)};return br(()=>{zn(()=>{n.value?c():l()})}),Cr(()=>{l()}),{isDragging:a,resetPosition:u,updatePosition:d}},Xu={name:`en`,el:{breadcrumb:{label:`Breadcrumb`},colorpicker:{confirm:`OK`,clear:`Clear`,defaultLabel:`color picker`,description:`current color is {color}. press enter to select a new color.`,alphaLabel:`pick alpha value`,alphaDescription:`alpha {alpha}, current color is {color}`,hueLabel:`pick hue value`,hueDescription:`hue {hue}, current color is {color}`,svLabel:`pick saturation and brightness value`,svDescription:`saturation {saturation}, brightness {brightness}, current color is {color}`,predefineDescription:`select {value} as the color`},datepicker:{now:`Now`,today:`Today`,cancel:`Cancel`,clear:`Clear`,confirm:`OK`,dateTablePrompt:`Use the arrow keys and enter to select the day of the month`,monthTablePrompt:`Use the arrow keys and enter to select the month`,yearTablePrompt:`Use the arrow keys and enter to select the year`,selectedDate:`Selected date`,selectDate:`Select date`,selectTime:`Select time`,startDate:`Start Date`,startTime:`Start Time`,endDate:`End Date`,endTime:`End Time`,prevYear:`Previous Year`,nextYear:`Next Year`,prevMonth:`Previous Month`,nextMonth:`Next Month`,year:``,month1:`January`,month2:`February`,month3:`March`,month4:`April`,month5:`May`,month6:`June`,month7:`July`,month8:`August`,month9:`September`,month10:`October`,month11:`November`,month12:`December`,weeks:{sun:`Sun`,mon:`Mon`,tue:`Tue`,wed:`Wed`,thu:`Thu`,fri:`Fri`,sat:`Sat`},weeksFull:{sun:`Sunday`,mon:`Monday`,tue:`Tuesday`,wed:`Wednesday`,thu:`Thursday`,fri:`Friday`,sat:`Saturday`},months:{jan:`Jan`,feb:`Feb`,mar:`Mar`,apr:`Apr`,may:`May`,jun:`Jun`,jul:`Jul`,aug:`Aug`,sep:`Sep`,oct:`Oct`,nov:`Nov`,dec:`Dec`}},inputNumber:{decrease:`decrease number`,increase:`increase number`},select:{loading:`Loading`,noMatch:`No matching data`,noData:`No data`,placeholder:`Select`},mention:{loading:`Loading`},dropdown:{toggleDropdown:`Toggle Dropdown`},cascader:{noMatch:`No matching data`,loading:`Loading`,placeholder:`Select`,noData:`No data`},pagination:{goto:`Go to`,pagesize:`/page`,total:`Total {total}`,pageClassifier:``,page:`Page`,prev:`Go to previous page`,next:`Go to next page`,currentPage:`page {pager}`,prevPages:`Previous {pager} pages`,nextPages:`Next {pager} pages`,deprecationWarning:`Deprecated usages detected, please refer to the el-pagination documentation for more details`},dialog:{close:`Close this dialog`},drawer:{close:`Close this dialog`},messagebox:{title:`Message`,confirm:`OK`,cancel:`Cancel`,error:`Illegal input`,close:`Close this dialog`},upload:{deleteTip:`press delete to remove`,delete:`Delete`,preview:`Preview`,continue:`Continue`},slider:{defaultLabel:`slider between {min} and {max}`,defaultRangeStartLabel:`pick start value`,defaultRangeEndLabel:`pick end value`},table:{emptyText:`No Data`,confirmFilter:`Confirm`,resetFilter:`Reset`,clearFilter:`All`,sumText:`Sum`,selectAllLabel:`Select all rows`,selectRowLabel:`Select this row`,expandRowLabel:`Expand this row`,collapseRowLabel:`Collapse this row`,sortLabel:`Sort by {column}`,filterLabel:`Filter by {column}`},tag:{close:`Close this tag`},tour:{next:`Next`,previous:`Previous`,finish:`Finish`,close:`Close this dialog`},tree:{emptyText:`No Data`},transfer:{noMatch:`No matching data`,noData:`No data`,titles:[`List 1`,`List 2`],filterPlaceholder:`Enter keyword`,noCheckedFormat:`{total} items`,hasCheckedFormat:`{checked}/{total} checked`},image:{error:`FAILED`},pageHeader:{title:`Back`},popconfirm:{confirmButtonText:`Yes`,cancelButtonText:`No`},carousel:{leftArrow:`Carousel arrow left`,rightArrow:`Carousel arrow right`,indicator:`Carousel switch to index {index}`},inputOTP:{groupLabel:`OTP Input`,defaultLabel:`Please enter OTP character {index}`}}},Zu=e=>(t,n)=>Qu(t,n,z(e)),Qu=(e,t,n)=>jl(n,e,e).replace(/\{(\w+)\}/g,(e,n)=>`${t?.[n]??`{${n}}`}`),$u=e=>({lang:Q(()=>z(e).name),locale:L(e)?e:R(e),t:Zu(e)}),ed=Symbol(`localeContextKey`),td=e=>{let t=e||In(ed,R());return $u(Q(()=>t.value||Xu))},nd=`is-`,rd=(e,t,n,r,i)=>{let a=`${e}-${t}`;return n&&(a+=`-${n}`),r&&(a+=`__${r}`),i&&(a+=`--${i}`),a},id=Symbol(`namespaceContextKey`),ad=e=>{let t=e||(wa()?In(id,R(`el`)):R(`el`));return Q(()=>z(t)||`el`)},od=(e,t)=>{let n=ad(t);return{namespace:n,b:(t=``)=>rd(n.value,e,t,``,``),e:t=>t?rd(n.value,e,``,t,``):``,m:t=>t?rd(n.value,e,``,``,t):``,be:(t,r)=>t&&r?rd(n.value,e,t,r,``):``,em:(t,r)=>t&&r?rd(n.value,e,``,t,r):``,bm:(t,r)=>t&&r?rd(n.value,e,t,``,r):``,bem:(t,r,i)=>t&&r&&i?rd(n.value,e,t,r,i):``,is:(e,...t)=>{let n=t.length>=1?t[0]:!0;return e&&n?`${nd}${e}`:``},cssVar:e=>{let t={};for(let r in e)e[r]&&(t[`--${n.value}-${r}`]=e[r]);return t},cssVarName:e=>`--${n.value}-${e}`,cssVarBlock:t=>{let r={};for(let i in t)t[i]&&(r[`--${n.value}-${e}-${i}`]=t[i]);return r},cssVarBlockName:t=>`--${n.value}-${e}-${t}`}},sd=e=>xu?window.requestAnimationFrame(e):setTimeout(e,16),cd=e=>xu?window.cancelAnimationFrame(e):clearTimeout(e),ld,ud=e=>{if(!xu)return 0;if(ld!==void 0)return ld;let t=document.createElement(`div`);t.className=`${e}-scrollbar__wrap`,t.style.visibility=`hidden`,t.style.width=`100px`,t.style.position=`absolute`,t.style.top=`-9999px`,document.body.appendChild(t);let n=t.offsetWidth;t.style.overflow=`scroll`;let r=document.createElement(`div`);r.style.width=`100%`,t.appendChild(r);let i=r.offsetWidth;return t.parentNode?.removeChild(t),ld=n-i,ld},dd=(e,t={})=>{L(e)||mu(`[useLockscreen]`,`You need to pass a ref param to this function`);let n=t.ns||od(`popup`),r=Q(()=>n.bm(`parent`,`hidden`)),i=0,a=!1,o=`0`,s=!1,c=()=>{s||(s=!0,setTimeout(()=>{typeof document>`u`||a&&document&&(document.body.style.width=o,Ku(document.body,r.value))},200))};V(e,e=>{if(!e){c();return}s=!1,a=!Wu(document.body,r.value),a&&(o=document.body.style.width,Gu(document.body,r.value)),i=ud(n.namespace.value);let t=document.documentElement.clientHeight0&&(t||l===`scroll`)&&a&&(document.body.style.width=`calc(100% - ${i}px)`)}),Ce(()=>c())},fd=e=>{if(e.code&&e.code!==`Unidentified`)return e.code;let t=pd(e);if(t){if(Object.values(ls).includes(t))return t;switch(t){case` `:return ls.space;default:return``}}return``},pd=e=>{let t=e.key&&e.key!==`Unidentified`?e.key:``;if(!t&&e.type===`keyup`&&Vu()){let n=e.target;t=n.value.charAt(n.selectionStart-1)}return t},md=e=>{let t=wa();return Q(()=>t?.proxy?.$props?.[e])},hd=e=>{if(!e)return{onClick:r,onMousedown:r,onMouseup:r};let t=!1,n=!1;return{onClick:r=>{t&&n&&e(r),t=n=!1},onMousedown:e=>{t=e.target===e.currentTarget},onMouseup:e=>{n=e.target===e.currentTarget}}},gd={prefix:Math.floor(Math.random()*1e4),current:0},_d=Symbol(`elIdInjection`),vd=()=>wa()?In(_d,gd):gd,yd=e=>{let t=vd();!xu&&t===gd&&hu(`IdInjection`,`Looks like you are using server rendering, you must provide a id provider to ensure the hydration process to be succeed -usage: app.provide(ID_INJECTION_KEY, { - prefix: number, - current: number, -})`);let n=ad();return yu(()=>z(e)||`${n.value}-id-${t.prefix}-${t.current++}`)},bd=[],xd=e=>{fd(e)===ls.esc&&bd.forEach(t=>t(e))},Sd=e=>{br(()=>{bd.length===0&&document.addEventListener(`keydown`,xd),xu&&bd.push(e)}),Cr(()=>{bd=bd.filter(t=>t!==e),bd.length===0&&xu&&document.removeEventListener(`keydown`,xd)})},Cd={current:0},wd=R(0),Td=2e3,Ed=Symbol(`elZIndexContextKey`),Dd=Symbol(`zIndexContextKey`),Od=e=>{let t=wa()?In(Ed,Cd):Cd,n=e||(wa()?In(Dd,void 0):void 0),r=Q(()=>{let e=z(n);return iu(e)?e:Td}),i=Q(()=>r.value+wd.value);return!xu&&!In(Ed)&&hu(`ZIndexInjection`,`Looks like you are using server rendering, you must provide a z-index provider to ensure the hydration process to be succeed -usage: app.provide(ZINDEX_INJECTION_KEY, { current: 0 })`),{initialZIndex:r,currentZIndex:i,nextZIndex:()=>(t.current++,wd.value=t.current,i.value)}};function kd(e){let t;function n(){if(e.value==null)return;let{selectionStart:n,selectionEnd:r,value:i}=e.value;n==null||r==null||(t={selectionStart:n,selectionEnd:r,value:i,beforeTxt:i.slice(0,Math.max(0,n)),afterTxt:i.slice(Math.max(0,r))})}function r(){if(e.value==null||t==null)return;let{value:n}=e.value,{beforeTxt:r,afterTxt:i,selectionStart:a}=t;if(r==null||i==null||a==null)return;let o=n.length;if(n.endsWith(i))o=n.length-i.length;else if(n.startsWith(r))o=r.length;else{let e=r[a-1],t=n.indexOf(e,a-1);t!==-1&&(o=t+1)}e.value.setSelectionRange(o,o)}return[n,r]}function Ad(e){return ca(e)&&e.type===ea}var jd=e=>{let t=d(e)?e:[e],n=[];return t.forEach(e=>{d(e)?n.push(...jd(e)):ca(e)&&e.component?.subTree?n.push(e,...jd(e.component.subTree)):ca(e)&&d(e.children)?n.push(...jd(e.children)):ca(e)&&e.shapeFlag===2?n.push(...jd(e.type())):n.push(e)}),n},Md=du({type:String,values:ps,required:!1}),Nd=Symbol(`size`),Pd=()=>{let e=In(Nd,{});return Q(()=>z(e.size)||``)};function Fd(e,{disabled:t,beforeFocus:n,afterFocus:r,beforeBlur:i,afterBlur:a}={}){let{emit:o}=wa(),s=Wt(),c=R(!1),l=e=>{let i=h(n)?n(e):!1;z(t)||c.value||i||(c.value=!0,o(`focus`,e),r?.())},u=e=>{let n=h(i)?i(e):!1;z(t)||e.relatedTarget&&s.value?.contains(e.relatedTarget)||n||(c.value=!1,o(`blur`,e),a?.())};return V([s,()=>z(t)],([e,t])=>{e&&(t?e.removeAttribute(`tabindex`):e.setAttribute(`tabindex`,`-1`))}),Ou(s,`focus`,l,!0),Ou(s,`blur`,u,!0),Ou(s,`click`,n=>{z(t)||Ru(n.target)||s.value?.contains(document.activeElement)&&s.value!==document.activeElement||e.value?.focus()},!0),{isFocused:c,wrapperRef:s,handleFocus:l,handleBlur:u}}function Id({afterComposition:e,emit:t}){let n=R(!1),r=e=>{t?.(`compositionstart`,e),n.value=!0},i=e=>{t?.(`compositionupdate`,e),n.value=!0},a=r=>{t?.(`compositionend`,r),n.value&&(n.value=!1,xn(()=>e(r)))};return{isComposing:n,handleComposition:e=>{e.type===`compositionend`?a(e):i(e)},handleCompositionStart:r,handleCompositionUpdate:i,handleCompositionEnd:a}}var Ld=Symbol(`emptyValuesContextKey`);fu({emptyValues:Array,valueOnClear:{type:lu([String,Number,Boolean,Function]),default:void 0,validator:e=>(e=h(e)?e():e,d(e)?e.every(e=>!e):!e)}});var Rd=fu({ariaLabel:String,ariaOrientation:{type:String,values:[`horizontal`,`vertical`,`undefined`]},ariaControls:String}),zd=e=>nu(Rd,e),Bd=e=>{let t=e.props,n=d(t)?Zl(t.map(e=>[e,{}])):t;e.setPropsDefaults=t=>{if(n){for(let[e,r]of Object.entries(t)){let t=n[e];if(u(n,e)){if(Gl(t)){n[e]={...t,default:r};continue}n[e]={type:t,default:r}}}e.props=n}}},Vd=(e,t)=>{if(e.install=n=>{for(let r of[e,...Object.values(t??{})])n.component(r.name,r)},t)for(let[n,r]of Object.entries(t))e[n]=r;return Bd(e),e},Hd=e=>(e.install=r,Bd(e),e),Ud=H({name:`Check`,__name:`check`,setup(e){return(e,t)=>(G(),K(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 1024 1024`},[J(`path`,{fill:`currentColor`,d:`M406.656 706.944 195.84 496.256a32 32 0 1 0-45.248 45.248l256 256 512-512a32 32 0 0 0-45.248-45.248L406.592 706.944z`})]))}}),Wd=H({name:`CircleCheck`,__name:`circle-check`,setup(e){return(e,t)=>(G(),K(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 1024 1024`},[J(`path`,{fill:`currentColor`,d:`M512 896a384 384 0 1 0 0-768 384 384 0 0 0 0 768m0 64a448 448 0 1 1 0-896 448 448 0 0 1 0 896`}),J(`path`,{fill:`currentColor`,d:`M745.344 361.344a32 32 0 0 1 45.312 45.312l-288 288a32 32 0 0 1-45.312 0l-160-160a32 32 0 1 1 45.312-45.312L480 626.752z`})]))}}),Gd=H({name:`CircleCloseFilled`,__name:`circle-close-filled`,setup(e){return(e,t)=>(G(),K(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 1024 1024`},[J(`path`,{fill:`currentColor`,d:`M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m0 393.664L407.936 353.6a38.4 38.4 0 1 0-54.336 54.336L457.664 512 353.6 616.064a38.4 38.4 0 1 0 54.336 54.336L512 566.336 616.064 670.4a38.4 38.4 0 1 0 54.336-54.336L566.336 512 670.4 407.936a38.4 38.4 0 1 0-54.336-54.336z`})]))}}),Kd=H({name:`CircleClose`,__name:`circle-close`,setup(e){return(e,t)=>(G(),K(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 1024 1024`},[J(`path`,{fill:`currentColor`,d:`m466.752 512-90.496-90.496a32 32 0 0 1 45.248-45.248L512 466.752l90.496-90.496a32 32 0 1 1 45.248 45.248L557.248 512l90.496 90.496a32 32 0 1 1-45.248 45.248L512 557.248l-90.496 90.496a32 32 0 0 1-45.248-45.248z`}),J(`path`,{fill:`currentColor`,d:`M512 896a384 384 0 1 0 0-768 384 384 0 0 0 0 768m0 64a448 448 0 1 1 0-896 448 448 0 0 1 0 896`})]))}}),qd=H({name:`Close`,__name:`close`,setup(e){return(e,t)=>(G(),K(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 1024 1024`},[J(`path`,{fill:`currentColor`,d:`M764.288 214.592 512 466.88 259.712 214.592a31.936 31.936 0 0 0-45.12 45.12L466.752 512 214.528 764.224a31.936 31.936 0 1 0 45.12 45.184L512 557.184l252.288 252.288a31.936 31.936 0 0 0 45.12-45.12L557.12 512.064l252.288-252.352a31.936 31.936 0 1 0-45.12-45.184z`})]))}}),Jd=H({name:`FolderOpened`,__name:`folder-opened`,setup(e){return(e,t)=>(G(),K(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 1024 1024`},[J(`path`,{fill:`currentColor`,d:`M878.08 448H241.92l-96 384h636.16zM832 384v-64H485.76L357.504 192H128v448l57.92-231.744A32 32 0 0 1 216.96 384zm-24.96 512H96a32 32 0 0 1-32-32V160a32 32 0 0 1 32-32h287.872l128.384 128H864a32 32 0 0 1 32 32v96h23.04a32 32 0 0 1 31.04 39.744l-112 448A32 32 0 0 1 807.04 896`})]))}}),Yd=H({name:`Hide`,__name:`hide`,setup(e){return(e,t)=>(G(),K(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 1024 1024`},[J(`path`,{fill:`currentColor`,d:`M876.8 156.8c0-9.6-3.2-16-9.6-22.4s-12.8-9.6-22.4-9.6-16 3.2-22.4 9.6L736 220.8c-64-32-137.6-51.2-224-60.8-160 16-288 73.6-377.6 176S0 496 0 512s48 73.6 134.4 176c22.4 25.6 44.8 48 73.6 67.2l-86.4 89.6c-6.4 6.4-9.6 12.8-9.6 22.4s3.2 16 9.6 22.4 12.8 9.6 22.4 9.6 16-3.2 22.4-9.6l704-710.4c3.2-6.4 6.4-12.8 6.4-22.4m-646.4 528Q115.2 579.2 76.8 512q43.2-72 153.6-172.8C304 272 400 230.4 512 224c64 3.2 124.8 19.2 176 44.8l-54.4 54.4C598.4 300.8 560 288 512 288c-64 0-115.2 22.4-160 64s-64 96-64 160c0 48 12.8 89.6 35.2 124.8L256 707.2c-9.6-6.4-19.2-16-25.6-22.4m140.8-96Q352 555.2 352 512c0-44.8 16-83.2 48-112s67.2-48 112-48c28.8 0 54.4 6.4 73.6 19.2zM889.599 336c-12.8-16-28.8-28.8-41.6-41.6l-48 48c73.6 67.2 124.8 124.8 150.4 169.6q-43.2 72-153.6 172.8c-73.6 67.2-172.8 108.8-284.8 115.2-51.2-3.2-99.2-12.8-140.8-28.8l-48 48c57.6 22.4 118.4 38.4 188.8 44.8 160-16 288-73.6 377.6-176S1024 528 1024 512s-48.001-73.6-134.401-176`}),J(`path`,{fill:`currentColor`,d:`M511.998 672c-12.8 0-25.6-3.2-38.4-6.4l-51.2 51.2c28.8 12.8 57.6 19.2 89.6 19.2 64 0 115.2-22.4 160-64 41.6-41.6 64-96 64-160 0-32-6.4-64-19.2-89.6l-51.2 51.2c3.2 12.8 6.4 25.6 6.4 38.4 0 44.8-16 83.2-48 112s-67.2 48-112 48`})]))}}),Xd=H({name:`InfoFilled`,__name:`info-filled`,setup(e){return(e,t)=>(G(),K(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 1024 1024`},[J(`path`,{fill:`currentColor`,d:`M512 64a448 448 0 1 1 0 896.064A448 448 0 0 1 512 64m67.2 275.072c33.28 0 60.288-23.104 60.288-57.344s-27.072-57.344-60.288-57.344c-33.28 0-60.16 23.104-60.16 57.344s26.88 57.344 60.16 57.344M590.912 699.2c0-6.848 2.368-24.64 1.024-34.752l-52.608 60.544c-10.88 11.456-24.512 19.392-30.912 17.28a12.99 12.99 0 0 1-8.256-14.72l87.68-276.992c7.168-35.136-12.544-67.2-54.336-71.296-44.096 0-108.992 44.736-148.48 101.504 0 6.784-1.28 23.68.064 33.792l52.544-60.608c10.88-11.328 23.552-19.328 29.952-17.152a12.8 12.8 0 0 1 7.808 16.128L388.48 728.576c-10.048 32.256 8.96 63.872 55.04 71.04 67.84 0 107.904-43.648 147.456-100.416z`})]))}}),Zd=H({name:`Loading`,__name:`loading`,setup(e){return(e,t)=>(G(),K(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 1024 1024`},[J(`path`,{fill:`currentColor`,d:`M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32m0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32m448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32m-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32M195.2 195.2a32 32 0 0 1 45.248 0L376.32 331.008a32 32 0 0 1-45.248 45.248L195.2 240.448a32 32 0 0 1 0-45.248m452.544 452.544a32 32 0 0 1 45.248 0L828.8 783.552a32 32 0 0 1-45.248 45.248L647.744 692.992a32 32 0 0 1 0-45.248M828.8 195.264a32 32 0 0 1 0 45.184L692.992 376.32a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0m-452.544 452.48a32 32 0 0 1 0 45.248L240.448 828.8a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0`})]))}}),Qd=H({name:`SuccessFilled`,__name:`success-filled`,setup(e){return(e,t)=>(G(),K(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 1024 1024`},[J(`path`,{fill:`currentColor`,d:`M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m-55.808 536.384-99.52-99.584a38.4 38.4 0 1 0-54.336 54.336l126.72 126.72a38.27 38.27 0 0 0 54.336 0l262.4-262.464a38.4 38.4 0 1 0-54.272-54.336z`})]))}}),$d=H({name:`View`,__name:`view`,setup(e){return(e,t)=>(G(),K(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 1024 1024`},[J(`path`,{fill:`currentColor`,d:`M512 160c320 0 512 352 512 352S832 864 512 864 0 512 0 512s192-352 512-352m0 64c-225.28 0-384.128 208.064-436.8 288 52.608 79.872 211.456 288 436.8 288 225.28 0 384.128-208.064 436.8-288-52.608-79.872-211.456-288-436.8-288m0 64a224 224 0 1 1 0 448 224 224 0 0 1 0-448m0 64a160.19 160.19 0 0 0-160 160c0 88.192 71.744 160 160 160s160-71.808 160-160-71.744-160-160-160`})]))}}),ef=H({name:`WarningFilled`,__name:`warning-filled`,setup(e){return(e,t)=>(G(),K(`svg`,{xmlns:`http://www.w3.org/2000/svg`,viewBox:`0 0 1024 1024`},[J(`path`,{fill:`currentColor`,d:`M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m0 192a58.43 58.43 0 0 0-58.24 63.744l23.36 256.384a35.072 35.072 0 0 0 69.76 0l23.296-256.384A58.43 58.43 0 0 0 512 256m0 512a51.2 51.2 0 1 0 0-102.4 51.2 51.2 0 0 0 0 102.4`})]))}}),tf=lu([String,Object,Function]),nf={Close:qd,SuccessFilled:Qd,InfoFilled:Xd,WarningFilled:ef,CircleCloseFilled:Gd},rf={primary:Xd,success:Qd,warning:ef,error:Gd,info:Xd},af={validating:Zd,success:Wd,error:Kd},of=fu({title:{type:String,default:``},description:{type:String,default:``},type:{type:String,values:su(rf),default:`info`},closable:{type:Boolean,default:!0},closeText:{type:String,default:``},showIcon:Boolean,center:Boolean,effect:{type:String,values:[`light`,`dark`],default:`light`}}),sf={close:e=>e instanceof MouseEvent},cf=Vd(H({name:`ElIcon`,inheritAttrs:!1,__name:`icon`,props:fu({size:{type:lu([Number,String])},color:{type:String}}),setup(e){let t=e,n=od(`icon`),r=Q(()=>{let{size:e,color:n}=t,r=Ju(e);return!r&&!n?{}:{fontSize:r,"--color":n}});return(e,t)=>(G(),K(`i`,va({class:z(n).b(),style:r.value},e.$attrs),[U(e.$slots,`default`)],16))}})),lf=Vd(H({name:`ElAlert`,__name:`alert`,props:of,emits:sf,setup(e,{emit:t}){let{Close:n}=nf,r=e,i=t,a=Vr(),o=od(`alert`),s=R(!0),c=Q(()=>rf[r.type]),l=Q(()=>{if(r.description)return!0;let e=a.default?.();return e?jd(e).some(e=>!Ad(e)):!1}),u=e=>{s.value=!1,i(`close`,e)};return(t,r)=>(G(),q(io,{name:z(o).b(`fade`),persisted:``},{default:B(()=>[Nn(J(`div`,{class:j([z(o).b(),z(o).m(e.type),z(o).is(`center`,e.center),z(o).is(e.effect)]),role:`alert`},[e.showIcon&&(t.$slots.icon||c.value)?(G(),q(z(cf),{key:0,class:j([z(o).e(`icon`),z(o).is(`big`,l.value)])},{default:B(()=>[U(t.$slots,`icon`,{},()=>[(G(),q(Mr(c.value)))])]),_:3},8,[`class`])):Z(`v-if`,!0),J(`div`,{class:j(z(o).e(`content`))},[e.title||t.$slots.title?(G(),K(`span`,{key:0,class:j([z(o).e(`title`),{"with-description":l.value}])},[U(t.$slots,`title`,{},()=>[X(N(e.title),1)])],2)):Z(`v-if`,!0),l.value?(G(),K(`p`,{key:1,class:j(z(o).e(`description`))},[U(t.$slots,`default`,{},()=>[X(N(e.description),1)])],2)):Z(`v-if`,!0),e.closable?(G(),K(W,{key:2},[e.closeText?(G(),K(`div`,{key:0,class:j([z(o).e(`close-btn`),z(o).is(`customed`)]),onClick:u},N(e.closeText),3)):(G(),q(z(cf),{key:1,class:j(z(o).e(`close-btn`)),onClick:u},{default:B(()=>[Y(z(n))]),_:1},8,[`class`]))],64)):Z(`v-if`,!0)],2)],2),[[Co,s.value]])]),_:3},8,[`name`]))}})),uf=Symbol(`formContextKey`),df=Symbol(`formItemContextKey`),ff=(e,t={})=>{let n=R(void 0),r=t.prop?n:md(`size`),i=t.global?n:Pd(),a=t.form?{size:void 0}:In(uf,void 0),o=t.formItem?{size:void 0}:In(df,void 0);return Q(()=>r.value||z(e)||o?.size||a?.size||i.value||``)},pf=e=>{let t=md(`disabled`),n=In(uf,void 0);return Q(()=>t.value??z(e)??n?.disabled??!1)},mf=()=>({form:In(uf,void 0),formItem:In(df,void 0)}),hf=(e,{formItemContext:t,disableIdGeneration:n,disableIdManagement:r})=>{n||(n=R(!1)),r||(r=R(!1));let i=wa(),a=()=>{let e=i?.parent;for(;e;){if(e.type.name===`ElFormItem`)return!1;if(e.type.name===`ElLabelWrap`)return!0;e=e.parent}return!1},o=R(),s,c=Q(()=>!!(!(e.label||e.ariaLabel)&&t&&t.inputIds&&t.inputIds?.length<=1));return br(()=>{s=V([$t(e,`id`),n],([e,n])=>{let i=e??(n?void 0:yd().value);i!==o.value&&(t?.removeInputId&&!a()&&(o.value&&t.removeInputId(o.value),!r?.value&&!n&&i&&t.addInputId(i)),o.value=i)},{immediate:!0})}),wr(()=>{s&&s(),t?.removeInputId&&o.value&&t.removeInputId(o.value)}),{isLabeledByFormItem:c,inputId:o}},gf=`focus-trap.focus-after-trapped`,_f=`focus-trap.focus-after-released`,vf=`focus-trap.focusout-prevented`,yf={cancelable:!0,bubbles:!1},bf={cancelable:!0,bubbles:!1},xf=`focusAfterTrapped`,Sf=`focusAfterReleased`,Cf=Symbol(`elFocusTrap`),wf=R(),Tf=R(0),Ef=R(0),Df=0,Of=e=>{let t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:e=>{let t=e.tagName===`INPUT`&&e.type===`hidden`;return e.disabled||e.hidden||t?NodeFilter.FILTER_SKIP:e.tabIndex>=0||e===document.activeElement?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t},kf=(e,t)=>{for(let n of e)if(!Af(n,t))return n},Af=(e,t)=>{if(getComputedStyle(e).visibility===`hidden`)return!0;for(;e;){if(t&&e===t)return!1;if(getComputedStyle(e).display===`none`)return!0;e=e.parentElement}return!1},jf=e=>{let t=Of(e);return[kf(t,e),kf(t.reverse(),e)]},Mf=e=>e instanceof HTMLInputElement&&`select`in e,Nf=(e,t)=>{if(e){let n=document.activeElement;zu(e,{preventScroll:!0}),Ef.value=window.performance.now(),e!==n&&Mf(e)&&t&&e.select()}};function Pf(e,t){let n=[...e],r=e.indexOf(t);return r!==-1&&n.splice(r,1),n}var Ff=()=>{let e=[];return{push:t=>{let n=e[0];n&&t!==n&&n.pause(),e=Pf(e,t),e.unshift(t)},remove:t=>{e=Pf(e,t),e[0]?.resume?.()}}},If=(e,t=!1)=>{let n=document.activeElement;for(let r of e)if(Nf(r,t),document.activeElement!==n)return},Lf=Ff(),Rf=()=>Tf.value>Ef.value,zf=()=>{wf.value=`pointer`,Tf.value=window.performance.now()},Bf=()=>{wf.value=`keyboard`,Tf.value=window.performance.now()},Vf=()=>(br(()=>{Df===0&&(document.addEventListener(`mousedown`,zf),document.addEventListener(`touchstart`,zf),document.addEventListener(`keydown`,Bf)),Df++}),Cr(()=>{Df--,Df<=0&&(document.removeEventListener(`mousedown`,zf),document.removeEventListener(`touchstart`,zf),document.removeEventListener(`keydown`,Bf))}),{focusReason:wf,lastUserFocusTimestamp:Tf,lastAutomatedFocusTimestamp:Ef}),Hf=e=>new CustomEvent(vf,{...bf,detail:e}),Uf=H({name:`ElFocusTrap`,inheritAttrs:!1,props:{loop:Boolean,trapped:Boolean,focusTrapEl:Object,focusStartEl:{type:[Object,String],default:`first`}},emits:[xf,Sf,`focusin`,`focusout`,`focusout-prevented`,`release-requested`],setup(e,{emit:t}){let n=R(),r,i,{focusReason:a}=Vf();Sd(n=>{e.trapped&&!o.paused&&t(`release-requested`,n)});let o={paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}},s=n=>{if(!e.loop&&!e.trapped||o.paused)return;let{altKey:r,ctrlKey:i,metaKey:s,currentTarget:c,shiftKey:l}=n,{loop:u}=e,d=fd(n)===ls.tab&&!r&&!i&&!s,f=document.activeElement;if(d&&f){let e=c,[r,i]=jf(e);if(!(r&&i)){if(f===e){let e=Hf({focusReason:a.value});t(`focusout-prevented`,e),e.defaultPrevented||n.preventDefault()}}else if(!l&&f===i){let e=Hf({focusReason:a.value});t(`focusout-prevented`,e),e.defaultPrevented||(n.preventDefault(),u&&Nf(r,!0))}else if(l&&[r,e].includes(f)){let e=Hf({focusReason:a.value});t(`focusout-prevented`,e),e.defaultPrevented||(n.preventDefault(),u&&Nf(i,!0))}}};Fn(Cf,{focusTrapRef:n,onKeydown:s}),V(()=>e.focusTrapEl,e=>{e&&(n.value=e)},{immediate:!0}),V([n],([e],[t])=>{e&&(e.addEventListener(`keydown`,s),e.addEventListener(`focusin`,u),e.addEventListener(`focusout`,d)),t&&(t.removeEventListener(`keydown`,s),t.removeEventListener(`focusin`,u),t.removeEventListener(`focusout`,d))});let c=e=>{t(xf,e)},l=e=>t(Sf,e),u=a=>{let s=z(n);if(!s)return;let c=a.target,l=a.relatedTarget,u=c&&s.contains(c);e.trapped||l&&s.contains(l)||(r=l),u&&t(`focusin`,a),!o.paused&&e.trapped&&(u?i=c:Nf(i,!0))},d=r=>{let s=z(n);if(!(o.paused||!s))if(e.trapped){let n=r.relatedTarget;!Ql(n)&&!s.contains(n)&&setTimeout(()=>{if(!o.paused&&e.trapped){let e=Hf({focusReason:a.value});t(`focusout-prevented`,e),e.defaultPrevented||Nf(i,!0)}},0)}else{let e=r.target;e&&s.contains(e)||t(`focusout`,r)}};async function f(){await xn();let t=z(n);if(t){Lf.push(o);let n=t.contains(document.activeElement)?r:document.activeElement;if(r=n,!t.contains(n)){let r=new Event(gf,yf);t.addEventListener(gf,c),t.dispatchEvent(r),r.defaultPrevented||xn(()=>{let r=e.focusStartEl;g(r)||(Nf(r),document.activeElement!==r&&(r=`first`)),r===`first`&&If(Of(t),!0),(document.activeElement===n||r===`container`)&&Nf(t)})}}}function p(){let e=z(n);if(e){e.removeEventListener(gf,c);let t=new CustomEvent(_f,{...yf,detail:{focusReason:a.value}});e.addEventListener(_f,l),e.dispatchEvent(t),!t.defaultPrevented&&(a.value==`keyboard`||!Rf()||e.contains(document.activeElement))&&Nf(r??document.body),e.removeEventListener(_f,l),Lf.remove(o),r=null,i=null}}return br(()=>{e.trapped&&f(),V(()=>e.trapped,e=>{e?f():p()})}),Cr(()=>{e.trapped&&p(),n.value&&(n.value.removeEventListener(`keydown`,s),n.value.removeEventListener(`focusin`,u),n.value.removeEventListener(`focusout`,d),n.value=void 0),r=null,i=null}),{onKeydown:s}}}),Wf=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n};function Gf(e,t,n,r,i,a){return U(e.$slots,`default`,{handleKeydown:e.onKeydown})}var Kf=Wf(Uf,[[`render`,Gf]]),qf=e=>e,Jf=fu({id:{type:String,default:void 0},size:Md,disabled:{type:Boolean,default:void 0},modelValue:{type:lu([String,Number,Object]),default:``},modelModifiers:{type:lu(Object),default:()=>({})},maxlength:{type:[String,Number]},minlength:{type:[String,Number]},type:{type:lu(String),default:`text`},resize:{type:String,values:[`none`,`both`,`horizontal`,`vertical`]},autosize:{type:lu([Boolean,Object]),default:!1},autocomplete:{type:lu(String),default:`off`},formatter:{type:Function},parser:{type:Function},placeholder:{type:String},form:{type:String},readonly:Boolean,clearable:Boolean,clearIcon:{type:tf,default:Kd},showPassword:Boolean,showWordLimit:Boolean,wordLimitPosition:{type:String,values:[`inside`,`outside`],default:`inside`},suffixIcon:{type:tf},prefixIcon:{type:tf},containerRole:{type:String,default:void 0},tabindex:{type:[String,Number],default:0},validateEvent:{type:Boolean,default:!0},inputStyle:{type:lu([Object,Array,String,Boolean]),default:()=>qf({})},countGraphemes:{type:lu(Function)},autofocus:Boolean,rows:{type:Number,default:2},...zd([`ariaLabel`]),inputmode:{type:lu(String),default:void 0},name:String}),Yf={[us]:e=>g(e),input:e=>g(e),change:(e,t)=>g(e)&&(t instanceof Event||t===void 0),focus:e=>e instanceof FocusEvent,blur:e=>e instanceof FocusEvent,clear:e=>e===void 0||e instanceof MouseEvent,mouseleave:e=>e instanceof MouseEvent,mouseenter:e=>e instanceof MouseEvent,keydown:e=>e instanceof Event,compositionstart:e=>e instanceof CompositionEvent,compositionupdate:e=>e instanceof CompositionEvent,compositionend:e=>e instanceof CompositionEvent};Vt(Kd);var Xf=void 0,Zf={height:`0`,visibility:`hidden`,overflow:Bu()?``:`hidden`,position:`absolute`,"z-index":`-1000`,top:`0`,right:`0`},Qf=[`letter-spacing`,`line-height`,`padding-top`,`padding-bottom`,`font-family`,`font-weight`,`font-size`,`text-rendering`,`text-transform`,`width`,`text-indent`,`padding-left`,`padding-right`,`border-width`,`box-sizing`,`word-break`],$f=e=>{let t=Number.parseFloat(e);return Number.isNaN(t)?e:t};function ep(e){let t=window.getComputedStyle(e),n=t.getPropertyValue(`box-sizing`),r=Number.parseFloat(t.getPropertyValue(`padding-bottom`))+Number.parseFloat(t.getPropertyValue(`padding-top`)),i=Number.parseFloat(t.getPropertyValue(`border-bottom-width`))+Number.parseFloat(t.getPropertyValue(`border-top-width`));return{contextStyle:Qf.map(e=>[e,t.getPropertyValue(e)]),paddingSize:r,borderSize:i,boxSizing:n}}function tp(e,t=1,n){if(!Xf){Xf=document.createElement(`textarea`);let t=document.body;!Bu()&&e.parentNode&&(t=e.parentNode),t.appendChild(Xf)}let{paddingSize:r,borderSize:i,boxSizing:a,contextStyle:o}=ep(e);o.forEach(([e,t])=>Xf?.style.setProperty(e,t)),Object.entries(Zf).forEach(([e,t])=>Xf?.style.setProperty(e,t,`important`)),Xf.value=e.value||e.placeholder||``;let s=Xf.scrollHeight,c={};a===`border-box`?s+=i:a===`content-box`&&(s-=r),Xf.value=``;let l=Xf.scrollHeight-r;if(iu(t)){let e=l*t;a===`border-box`&&(e=e+r+i),s=Math.max(e,s),c.minHeight=`${e}px`}if(iu(n)){let e=l*n;a===`border-box`&&(e=e+r+i),s=Math.min(e,s)}return c.height=`${s}px`,Xf.parentNode?.removeChild(Xf),Xf=void 0,c}var np=[`id`,`name`,`minlength`,`maxlength`,`type`,`disabled`,`readonly`,`autocomplete`,`tabindex`,`aria-label`,`placeholder`,`form`,`autofocus`,`role`,`inputmode`],rp=[`id`,`name`,`minlength`,`maxlength`,`tabindex`,`disabled`,`readonly`,`autocomplete`,`aria-label`,`placeholder`,`form`,`autofocus`,`rows`,`role`,`inputmode`],ip=`ElInput`,ap=Vd(H({name:ip,inheritAttrs:!1,__name:`input`,props:Jf,emits:Yf,setup(e,{expose:t,emit:n}){let i=e,a=n,o=Hr(),s=Vr(),c=Q(()=>[i.type===`textarea`?y.b():_.b(),_.m(h.value),_.is(`disabled`,g.value),_.is(`exceed`,he.value),{[_.b(`group`)]:s.prepend||s.append,[_.m(`prefix`)]:s.prefix||i.prefixIcon,[_.m(`suffix`)]:s.suffix||i.suffixIcon||i.clearable||i.showPassword,[_.bm(`suffix`,`password-clear`)]:fe.value&&pe.value,[_.b(`hidden`)]:i.type===`hidden`},o.class]),l=Q(()=>[_.e(`wrapper`),_.is(`focus`,te.value)]),u=vu(),d=Q(()=>i.maxlength?.toString()),{form:f,formItem:p}=mf(),{inputId:m}=hf(i,{formItemContext:p}),h=ff(),g=pf(),_=od(`input`),y=od(`textarea`),b=Wt(),x=Wt(),S=R(!1),C=R(!1),w=R(),ee=R(),T=Wt(i.inputStyle),E=R(``),D=R(),O=Q(()=>b.value||x.value),{wrapperRef:k,isFocused:te,handleFocus:ne,handleBlur:re}=Fd(O,{disabled:g,afterBlur(){i.validateEvent&&p?.validate?.(`blur`).catch(r)}}),ie=Q(()=>f?.statusIcon??!1),A=Q(()=>p?.validateState||``),ae=Q(()=>A.value&&af[A.value]),oe=Q(()=>C.value?$d:Yd),se=Q(()=>[o.style]),ce=Q(()=>[i.inputStyle,T.value,{resize:i.resize},D.value?{height:D.value}:void 0]),ue=Q(()=>Ql(i.modelValue)?``:String(i.modelValue)),de=Q(()=>i.clearable&&!g.value&&!i.readonly),fe=Q(()=>de.value&&!!ue.value&&(te.value||S.value)),pe=Q(()=>i.showPassword&&!g.value&&!!ue.value),M=Q(()=>i.showWordLimit&&!!d.value&&(i.type===`text`||i.type===`textarea`)&&!g.value&&!i.readonly&&!i.showPassword),me=Q(()=>i.countGraphemes&&i.showWordLimit?i.countGraphemes(ue.value):ue.value.length),he=Q(()=>!!M.value&&me.value>Number(d.value)),ge=Q(()=>!!s.suffix||!!i.suffixIcon||i.clearable||i.showPassword||M.value||!!A.value&&ie.value),_e=Q(()=>!!Object.keys(i.modelModifiers).length),[ve,ye]=kd(b),be;ju(x,e=>{if(xe(),!M.value&&!de.value||i.resize!==`both`&&i.resize!==`horizontal`)return;let{width:t}=e[0].target.getBoundingClientRect();be&&cd(be),be=sd(()=>{be=void 0,w.value={right:`calc(100% - ${t-10}px)`},ee.value={right:`calc(100% - ${t-11}px)`}})});let P=()=>{let{type:e,autosize:t}=i;if(!(!xu||e!==`textarea`||!x.value))if(t){let e=v(t)?t.minRows:void 0,n=v(t)?t.maxRows:void 0,r=tp(x.value,e,n);T.value={overflowY:`hidden`,...r},xn(()=>{x.value.offsetHeight,T.value=r})}else T.value={minHeight:tp(x.value).minHeight}},xe=(e=>{let t=!1;return()=>{if(t||!i.autosize){i.resize!==`none`&&setTimeout(()=>{D.value=x.value?.style.height});return}x.value?.offsetParent!==null&&(setTimeout(e),t=!0)}})(P),Se=()=>{let e=O.value,t=i.formatter?i.formatter(ue.value):ue.value;!e||e.value===t||i.type===`file`||(e.value=t)},Ce=e=>{let{trim:t,number:n}=i.modelModifiers;return t&&(e=e.trim()),n&&(e=`${$f(e)}`),i.formatter&&i.parser&&(e=i.parser(e)),e},F=async e=>{if(Te.value)return;let{lazy:t}=i.modelModifiers,{value:n}=e.target,r=!1;if(t){a(fs,n);return}if(n=Ce(n),i.countGraphemes&&d.value!=null){let e=Number(d.value),t=i.countGraphemes(n),a=i.countGraphemes(E.value);if(t>e&&t>a)if(a>e)n=E.value,r=!0;else{let t=E.value,o=n,s=0;for(;ss&&l>s&&t[c-1]===o[l-1];)c--,l--;let u=o.slice(0,s),d=t.slice(s,c),f=o.slice(s,l),p=o.slice(l),m=a-i.countGraphemes(d),h=Math.max(0,e-m),g=``;if(h>0)if(typeof Intl<`u`&&`Segmenter`in Intl){let e=new Intl.Segmenter(void 0,{granularity:`grapheme`});for(let{segment:t}of e.segment(f)){let e=g+t;if(i.countGraphemes(e)>h)break;g=e}}else for(let e of Array.from(f)){let t=g+e;if(i.countGraphemes(t)>h)break;g=t}n=u+g+p,r=!0}}if(String(n)===ue.value){if(i.formatter||r){let t=e.target,n=t.value,i=t.selectionStart,a=t.selectionEnd;if(Se(),r&&O.value&&i!=null&&a!=null){let e=O.value.value,t=n.slice(Math.max(0,a)),r=Math.min(i,e.length);t&&e.endsWith(t)&&(r=e.length-t.length),O.value.setSelectionRange(r,r)}}return}E.value=n,ve(),a(us,n),a(fs,n),await xn(),(i.formatter&&i.parser||!_e.value)&&Se(),ye()},we=async e=>{let{value:t}=e.target;t=Ce(t),i.modelModifiers.lazy&&a(us,t),a(ds,t,e),await xn(),Se()},{isComposing:Te,handleCompositionStart:Ee,handleCompositionUpdate:De,handleCompositionEnd:Oe}=Id({emit:a,afterComposition:F}),ke=()=>{C.value=!C.value},Ae=()=>O.value?.focus(),je=()=>O.value?.blur(),Me=e=>{S.value=!1,a(`mouseleave`,e)},Ne=e=>{S.value=!0,a(`mouseenter`,e)},Pe=e=>{a(`keydown`,e)},Fe=()=>{O.value?.select()},Ie=e=>{a(us,``),a(ds,``),a(`clear`,e),a(fs,``)};return V(()=>i.modelValue,()=>{xn(()=>{P(),i.autosize&&(D.value=void 0)}),i.validateEvent&&p?.validate?.(`change`).catch(r)}),V(()=>ue.value,e=>{E.value=e},{immediate:!0}),V(ue,e=>{if(!O.value)return;let{trim:t,number:n}=i.modelModifiers,r=O.value.value,a=(n||i.type===`number`)&&!/^0\d/.test(r)?`${$f(r)}`:r;a!==e&&(document.activeElement===O.value&&O.value.type!==`range`&&t&&a.trim()===e||Se())}),V(()=>i.type,async()=>{await xn(),Se(),P()}),br(()=>{!i.formatter&&i.parser&&hu(ip,`If you set the parser, you also need to set the formatter.`),Se(),xn(P)}),Cr(()=>{be&&cd(be)}),t({input:b,textarea:x,ref:O,textareaStyle:ce,autosize:$t(i,`autosize`),isComposing:Te,passwordVisible:C,focus:Ae,blur:je,select:Fe,clear:Ie,resizeTextarea:P}),(t,n)=>(G(),K(`div`,{class:j([c.value,{[z(_).bm(`group`,`append`)]:t.$slots.append,[z(_).bm(`group`,`prepend`)]:t.$slots.prepend}]),style:le(se.value),onMouseenter:Ne,onMouseleave:Me},[Z(` input `),e.type===`textarea`?(G(),K(W,{key:1},[Z(` textarea `),J(`textarea`,va({id:z(m),ref_key:`textarea`,ref:x,class:[z(y).e(`inner`),z(_).is(`focus`,z(te)),z(y).is(`clearable`,e.clearable)]},z(u),{name:e.name,minlength:e.countGraphemes?void 0:e.minlength,maxlength:e.countGraphemes?void 0:d.value,tabindex:e.tabindex,disabled:z(g),readonly:e.readonly,autocomplete:e.autocomplete,style:ce.value,"aria-label":e.ariaLabel,placeholder:e.placeholder,form:e.form,autofocus:e.autofocus,rows:e.rows,role:e.containerRole,inputmode:e.inputmode,onCompositionstart:n[3]||(n[3]=(...e)=>z(Ee)&&z(Ee)(...e)),onCompositionupdate:n[4]||(n[4]=(...e)=>z(De)&&z(De)(...e)),onCompositionend:n[5]||(n[5]=(...e)=>z(Oe)&&z(Oe)(...e)),onInput:F,onFocus:n[6]||(n[6]=(...e)=>z(ne)&&z(ne)(...e)),onBlur:n[7]||(n[7]=(...e)=>z(re)&&z(re)(...e)),onChange:we,onKeydown:Pe}),null,16,rp),fe.value?(G(),q(z(cf),{key:0,class:j([z(y).e(`icon`),z(y).e(`clear`)]),style:le(ee.value),onMousedown:$o(z(r),[`prevent`]),onClick:Ie},{default:B(()=>[(G(),q(Mr(e.clearIcon)))]),_:1},8,[`class`,`style`,`onMousedown`])):Z(`v-if`,!0),M.value?(G(),K(`span`,{key:1,style:le(w.value),class:j([z(_).e(`count`),z(_).is(`outside`,e.wordLimitPosition===`outside`)])},N(me.value)+` / `+N(d.value),7)):Z(`v-if`,!0)],64)):(G(),K(W,{key:0},[Z(` prepend slot `),t.$slots.prepend?(G(),K(`div`,{key:0,class:j(z(_).be(`group`,`prepend`))},[U(t.$slots,`prepend`)],2)):Z(`v-if`,!0),J(`div`,{ref_key:`wrapperRef`,ref:k,class:j(l.value)},[Z(` prefix slot `),t.$slots.prefix||e.prefixIcon?(G(),K(`span`,{key:0,class:j(z(_).e(`prefix`))},[J(`span`,{class:j(z(_).e(`prefix-inner`))},[U(t.$slots,`prefix`),e.prefixIcon?(G(),q(z(cf),{key:0,class:j(z(_).e(`icon`))},{default:B(()=>[(G(),q(Mr(e.prefixIcon)))]),_:1},8,[`class`])):Z(`v-if`,!0)],2)],2)):Z(`v-if`,!0),J(`input`,va({id:z(m),ref_key:`input`,ref:b,class:z(_).e(`inner`)},z(u),{name:e.name,minlength:e.countGraphemes?void 0:e.minlength,maxlength:e.countGraphemes?void 0:d.value,type:e.showPassword?C.value?`text`:`password`:e.type,disabled:z(g),readonly:e.readonly,autocomplete:e.autocomplete,tabindex:e.tabindex,"aria-label":e.ariaLabel,placeholder:e.placeholder,style:e.inputStyle,form:e.form,autofocus:e.autofocus,role:e.containerRole,inputmode:e.inputmode,onCompositionstart:n[0]||(n[0]=(...e)=>z(Ee)&&z(Ee)(...e)),onCompositionupdate:n[1]||(n[1]=(...e)=>z(De)&&z(De)(...e)),onCompositionend:n[2]||(n[2]=(...e)=>z(Oe)&&z(Oe)(...e)),onInput:F,onChange:we,onKeydown:Pe}),null,16,np),Z(` suffix slot `),ge.value?(G(),K(`span`,{key:1,class:j(z(_).e(`suffix`))},[J(`span`,{class:j(z(_).e(`suffix-inner`))},[de.value?(G(),q(z(cf),{key:0,class:j([z(_).e(`icon`),z(_).e(`clear`)]),style:le({visibility:fe.value?`visible`:`hidden`}),onMousedown:$o(z(r),[`prevent`]),onClick:Ie},{default:B(()=>[(G(),q(Mr(e.clearIcon)))]),_:1},8,[`class`,`style`,`onMousedown`])):Z(`v-if`,!0),!fe.value||!pe.value||!M.value?(G(),K(W,{key:1},[U(t.$slots,`suffix`),e.suffixIcon?(G(),q(z(cf),{key:0,class:j(z(_).e(`icon`))},{default:B(()=>[(G(),q(Mr(e.suffixIcon)))]),_:1},8,[`class`])):Z(`v-if`,!0)],64)):Z(`v-if`,!0),pe.value?(G(),q(z(cf),{key:2,class:j([z(_).e(`icon`),z(_).e(`password`)]),onClick:ke,onMousedown:$o(z(r),[`prevent`]),onMouseup:$o(z(r),[`prevent`])},{default:B(()=>[U(t.$slots,`password-icon`,{visible:C.value},()=>[(G(),q(Mr(oe.value)))])]),_:3},8,[`class`,`onMousedown`,`onMouseup`])):Z(`v-if`,!0),M.value?(G(),K(`span`,{key:3,class:j([z(_).e(`count`),z(_).is(`outside`,e.wordLimitPosition===`outside`)])},[J(`span`,{class:j(z(_).e(`count-inner`))},N(me.value)+` / `+N(d.value),3)],2)):Z(`v-if`,!0),A.value&&ae.value&&ie.value?(G(),q(z(cf),{key:4,class:j([z(_).e(`icon`),z(_).e(`validateIcon`),z(_).is(`loading`,A.value===`validating`)])},{default:B(()=>[(G(),q(Mr(ae.value)))]),_:1},8,[`class`])):Z(`v-if`,!0)],2)],2)):Z(`v-if`,!0)],2),Z(` append slot `),t.$slots.append?(G(),K(`div`,{key:1,class:j(z(_).be(`group`,`append`))},[U(t.$slots,`append`)],2)):Z(`v-if`,!0)],64))],38))}})),op=fu({size:Md,disabled:{type:Boolean,default:void 0},type:{type:String,values:[`default`,`primary`,`success`,`warning`,`info`,`danger`,`text`,``],default:``},icon:{type:tf},nativeType:{type:String,values:[`button`,`submit`,`reset`],default:`button`},loading:Boolean,loadingIcon:{type:tf,default:()=>Zd},plain:{type:Boolean,default:void 0},text:{type:Boolean,default:void 0},link:Boolean,bg:Boolean,autofocus:Boolean,round:{type:Boolean,default:void 0},circle:Boolean,dashed:{type:Boolean,default:void 0},color:String,dark:Boolean,autoInsertSpace:{type:Boolean,default:void 0},tag:{type:lu([String,Object]),default:`button`}}),sp={click:e=>e instanceof MouseEvent},cp=Symbol(),lp=R();function up(e,t=void 0){let n=wa()?In(cp,lp):lp;return e?Q(()=>n.value?.[e]??t):n}function dp(e,t){let n=up(),r=od(e,Q(()=>n.value?.namespace||`el`)),i=td(Q(()=>n.value?.locale)),a=Od(Q(()=>{let e=n.value?.zIndex;return Ql(e)||Number.isNaN(e)?Td:e})),o=Q(()=>z(t)||n.value?.size||``);return fp(Q(()=>z(n)||{})),{ns:r,locale:i,zIndex:a,size:o}}var fp=(e,t,n=!1)=>{let r=!!wa(),i=r?up():void 0,a=t?.provide??(r?Fn:void 0);if(!a){hu(`provideGlobalConfig`,`provideGlobalConfig() can only be used inside setup().`);return}let o=Q(()=>{let t=z(e);return i?.value?pp(i.value,t):t});return a(cp,o),a(ed,Q(()=>o.value.locale)),a(id,Q(()=>o.value.namespace)),a(Dd,Q(()=>o.value.zIndex)),a(Nd,{size:Q(()=>o.value.size||``)}),a(Ld,Q(()=>({emptyValues:o.value.emptyValues,valueOnClear:o.value.valueOnClear}))),(n||!lp.value)&&(lp.value=o.value),o},pp=(e,t)=>{let n=[...new Set([...su(e),...su(t)])],r={};for(let i of n)r[i]=t[i]===void 0?e[i]:t[i];return r},mp=Symbol(`buttonGroupContextKey`),hp=(e,t)=>{Mu({from:`type.text`,replacement:`link`,version:`3.0.0`,scope:`props`,ref:`https://element-plus.org/en-US/component/button.html#button-attributes`},Q(()=>e.type===`text`));let n=In(mp,void 0),r=up(`button`),{form:i}=mf(),a=ff(Q(()=>n?.size)),o=pf(),s=R(),c=Vr(),l=Q(()=>e.type||n?.type||r.value?.type||``),u=Q(()=>e.autoInsertSpace??r.value?.autoInsertSpace??!1),d=Q(()=>e.plain??r.value?.plain??!1),f=Q(()=>e.round??r.value?.round??!1),p=Q(()=>e.text??r.value?.text??!1),m=Q(()=>e.dashed??r.value?.dashed??!1);return{_disabled:o,_size:a,_type:l,_ref:s,_props:Q(()=>e.tag===`button`?{ariaDisabled:o.value||e.loading,disabled:o.value||e.loading,autofocus:e.autofocus,type:e.nativeType}:{}),_plain:d,_round:f,_text:p,_dashed:m,shouldAddSpace:Q(()=>{let e=c.default?.();if(u.value&&e?.length===1){let t=e[0];if(t?.type===$i){let e=t.children;return/^\p{Unified_Ideograph}{2}$/u.test(e.trim())}}return!1}),handleClick:n=>{if(o.value||e.loading){n.stopPropagation();return}e.nativeType===`reset`&&i?.resetFields(),t(`click`,n)}}};function gp(e,t){vp(e)&&(e=`100%`);let n=yp(e);return e=t===360?e:Math.min(t,Math.max(0,parseFloat(e))),n&&(e=parseInt(String(e*t),10)/100),Math.abs(e-t)<1e-6?1:(e=t===360?(e<0?e%t+t:e%t)/parseFloat(String(t)):e%t/parseFloat(String(t)),e)}function _p(e){return Math.min(1,Math.max(0,e))}function vp(e){return typeof e==`string`&&e.indexOf(`.`)!==-1&&parseFloat(e)===1}function yp(e){return typeof e==`string`&&e.indexOf(`%`)!==-1}function bp(e){return e=parseFloat(e),(isNaN(e)||e<0||e>1)&&(e=1),e}function xp(e){return Number(e)<=1?`${Number(e)*100}%`:e}function Sp(e){return e.length===1?`0`+e:String(e)}function Cp(e,t,n){return{r:gp(e,255)*255,g:gp(t,255)*255,b:gp(n,255)*255}}function wp(e,t,n){e=gp(e,255),t=gp(t,255),n=gp(n,255);let r=Math.max(e,t,n),i=Math.min(e,t,n),a=0,o=0,s=(r+i)/2;if(r===i)o=0,a=0;else{let c=r-i;switch(o=s>.5?c/(2-r-i):c/(r+i),r){case e:a=(t-n)/c+(t1&&--n,n<1/6?e+(t-e)*(6*n):n<1/2?t:n<2/3?e+(t-e)*(2/3-n)*6:e}function Ep(e,t,n){let r,i,a;if(e=gp(e,360),t=gp(t,100),n=gp(n,100),t===0)i=n,a=n,r=n;else{let o=n<.5?n*(1+t):n+t-n*t,s=2*n-o;r=Tp(s,o,e+1/3),i=Tp(s,o,e),a=Tp(s,o,e-1/3)}return{r:r*255,g:i*255,b:a*255}}function Dp(e,t,n){e=gp(e,255),t=gp(t,255),n=gp(n,255);let r=Math.max(e,t,n),i=Math.min(e,t,n),a=0,o=r,s=r-i,c=r===0?0:s/r;if(r===i)a=0;else{switch(r){case e:a=(t-n)/s+(t>16,g:(e&65280)>>8,b:e&255}}var Lp={aliceblue:`#f0f8ff`,antiquewhite:`#faebd7`,aqua:`#00ffff`,aquamarine:`#7fffd4`,azure:`#f0ffff`,beige:`#f5f5dc`,bisque:`#ffe4c4`,black:`#000000`,blanchedalmond:`#ffebcd`,blue:`#0000ff`,blueviolet:`#8a2be2`,brown:`#a52a2a`,burlywood:`#deb887`,cadetblue:`#5f9ea0`,chartreuse:`#7fff00`,chocolate:`#d2691e`,coral:`#ff7f50`,cornflowerblue:`#6495ed`,cornsilk:`#fff8dc`,crimson:`#dc143c`,cyan:`#00ffff`,darkblue:`#00008b`,darkcyan:`#008b8b`,darkgoldenrod:`#b8860b`,darkgray:`#a9a9a9`,darkgreen:`#006400`,darkgrey:`#a9a9a9`,darkkhaki:`#bdb76b`,darkmagenta:`#8b008b`,darkolivegreen:`#556b2f`,darkorange:`#ff8c00`,darkorchid:`#9932cc`,darkred:`#8b0000`,darksalmon:`#e9967a`,darkseagreen:`#8fbc8f`,darkslateblue:`#483d8b`,darkslategray:`#2f4f4f`,darkslategrey:`#2f4f4f`,darkturquoise:`#00ced1`,darkviolet:`#9400d3`,deeppink:`#ff1493`,deepskyblue:`#00bfff`,dimgray:`#696969`,dimgrey:`#696969`,dodgerblue:`#1e90ff`,firebrick:`#b22222`,floralwhite:`#fffaf0`,forestgreen:`#228b22`,fuchsia:`#ff00ff`,gainsboro:`#dcdcdc`,ghostwhite:`#f8f8ff`,goldenrod:`#daa520`,gold:`#ffd700`,gray:`#808080`,green:`#008000`,greenyellow:`#adff2f`,grey:`#808080`,honeydew:`#f0fff0`,hotpink:`#ff69b4`,indianred:`#cd5c5c`,indigo:`#4b0082`,ivory:`#fffff0`,khaki:`#f0e68c`,lavenderblush:`#fff0f5`,lavender:`#e6e6fa`,lawngreen:`#7cfc00`,lemonchiffon:`#fffacd`,lightblue:`#add8e6`,lightcoral:`#f08080`,lightcyan:`#e0ffff`,lightgoldenrodyellow:`#fafad2`,lightgray:`#d3d3d3`,lightgreen:`#90ee90`,lightgrey:`#d3d3d3`,lightpink:`#ffb6c1`,lightsalmon:`#ffa07a`,lightseagreen:`#20b2aa`,lightskyblue:`#87cefa`,lightslategray:`#778899`,lightslategrey:`#778899`,lightsteelblue:`#b0c4de`,lightyellow:`#ffffe0`,lime:`#00ff00`,limegreen:`#32cd32`,linen:`#faf0e6`,magenta:`#ff00ff`,maroon:`#800000`,mediumaquamarine:`#66cdaa`,mediumblue:`#0000cd`,mediumorchid:`#ba55d3`,mediumpurple:`#9370db`,mediumseagreen:`#3cb371`,mediumslateblue:`#7b68ee`,mediumspringgreen:`#00fa9a`,mediumturquoise:`#48d1cc`,mediumvioletred:`#c71585`,midnightblue:`#191970`,mintcream:`#f5fffa`,mistyrose:`#ffe4e1`,moccasin:`#ffe4b5`,navajowhite:`#ffdead`,navy:`#000080`,oldlace:`#fdf5e6`,olive:`#808000`,olivedrab:`#6b8e23`,orange:`#ffa500`,orangered:`#ff4500`,orchid:`#da70d6`,palegoldenrod:`#eee8aa`,palegreen:`#98fb98`,paleturquoise:`#afeeee`,palevioletred:`#db7093`,papayawhip:`#ffefd5`,peachpuff:`#ffdab9`,peru:`#cd853f`,pink:`#ffc0cb`,plum:`#dda0dd`,powderblue:`#b0e0e6`,purple:`#800080`,rebeccapurple:`#663399`,red:`#ff0000`,rosybrown:`#bc8f8f`,royalblue:`#4169e1`,saddlebrown:`#8b4513`,salmon:`#fa8072`,sandybrown:`#f4a460`,seagreen:`#2e8b57`,seashell:`#fff5ee`,sienna:`#a0522d`,silver:`#c0c0c0`,skyblue:`#87ceeb`,slateblue:`#6a5acd`,slategray:`#708090`,slategrey:`#708090`,snow:`#fffafa`,springgreen:`#00ff7f`,steelblue:`#4682b4`,tan:`#d2b48c`,teal:`#008080`,thistle:`#d8bfd8`,tomato:`#ff6347`,turquoise:`#40e0d0`,violet:`#ee82ee`,wheat:`#f5deb3`,white:`#ffffff`,whitesmoke:`#f5f5f5`,yellow:`#ffff00`,yellowgreen:`#9acd32`};function Rp(e){let t={r:0,g:0,b:0},n=1,r=null,i=null,a=null,o=!1,s=!1;return typeof e==`string`&&(e=Bp(e)),typeof e==`object`&&(Vp(e.r)&&Vp(e.g)&&Vp(e.b)?(t=Cp(e.r,e.g,e.b),o=!0,s=String(e.r).substr(-1)===`%`?`prgb`:`rgb`):Vp(e.h)&&Vp(e.s)&&Vp(e.v)?(r=xp(e.s),i=xp(e.v),t=Op(e.h,r,i),o=!0,s=`hsv`):Vp(e.h)&&Vp(e.s)&&Vp(e.l)?(r=xp(e.s),a=xp(e.l),t=Ep(e.h,r,a),o=!0,s=`hsl`):Vp(e.c)&&Vp(e.m)&&Vp(e.y)&&Vp(e.k)&&(t=jp(e.c,e.m,e.y,e.k),o=!0,s=`cmyk`),Object.prototype.hasOwnProperty.call(e,`a`)&&(n=e.a)),n=bp(n),{ok:o,format:e.format||s,r:Math.min(255,Math.max(t.r,0)),g:Math.min(255,Math.max(t.g,0)),b:Math.min(255,Math.max(t.b,0)),a:n}}var zp={CSS_UNIT:RegExp(`(?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?)`),rgb:RegExp(`rgb[\\s|\\(]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))\\s*\\)?`),rgba:RegExp(`rgba[\\s|\\(]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))\\s*\\)?`),hsl:RegExp(`hsl[\\s|\\(]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))\\s*\\)?`),hsla:RegExp(`hsla[\\s|\\(]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))\\s*\\)?`),hsv:RegExp(`hsv[\\s|\\(]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))\\s*\\)?`),hsva:RegExp(`hsva[\\s|\\(]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))\\s*\\)?`),cmyk:RegExp(`cmyk[\\s|\\(]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))[,|\\s]+((?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?))\\s*\\)?`),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/};function Bp(e){if(e=e.trim().toLowerCase(),e.length===0)return!1;let t=!1;if(Lp[e])e=Lp[e],t=!0;else if(e===`transparent`)return{r:0,g:0,b:0,a:0,format:`name`};let n=zp.rgb.exec(e);return n?{r:n[1],g:n[2],b:n[3]}:(n=zp.rgba.exec(e),n?{r:n[1],g:n[2],b:n[3],a:n[4]}:(n=zp.hsl.exec(e),n?{h:n[1],s:n[2],l:n[3]}:(n=zp.hsla.exec(e),n?{h:n[1],s:n[2],l:n[3],a:n[4]}:(n=zp.hsv.exec(e),n?{h:n[1],s:n[2],v:n[3]}:(n=zp.hsva.exec(e),n?{h:n[1],s:n[2],v:n[3],a:n[4]}:(n=zp.cmyk.exec(e),n?{c:n[1],m:n[2],y:n[3],k:n[4]}:(n=zp.hex8.exec(e),n?{r:Fp(n[1]),g:Fp(n[2]),b:Fp(n[3]),a:Pp(n[4]),format:t?`name`:`hex8`}:(n=zp.hex6.exec(e),n?{r:Fp(n[1]),g:Fp(n[2]),b:Fp(n[3]),format:t?`name`:`hex`}:(n=zp.hex4.exec(e),n?{r:Fp(n[1]+n[1]),g:Fp(n[2]+n[2]),b:Fp(n[3]+n[3]),a:Pp(n[4]+n[4]),format:t?`name`:`hex8`}:(n=zp.hex3.exec(e),n?{r:Fp(n[1]+n[1]),g:Fp(n[2]+n[2]),b:Fp(n[3]+n[3]),format:t?`name`:`hex`}:!1))))))))))}function Vp(e){return typeof e==`number`?!Number.isNaN(e):zp.CSS_UNIT.test(e)}var Hp=class e{constructor(t=``,n={}){if(t instanceof e)return t;typeof t==`number`&&(t=Ip(t)),this.originalInput=t;let r=Rp(t);this.originalInput=t,this.r=r.r,this.g=r.g,this.b=r.b,this.a=r.a,this.roundA=Math.round(100*this.a)/100,this.format=n.format??r.format,this.gradientType=n.gradientType,this.r<1&&(this.r=Math.round(this.r)),this.g<1&&(this.g=Math.round(this.g)),this.b<1&&(this.b=Math.round(this.b)),this.isValid=r.ok}isDark(){return this.getBrightness()<128}isLight(){return!this.isDark()}getBrightness(){let e=this.toRgb();return(e.r*299+e.g*587+e.b*114)/1e3}getLuminance(){let e=this.toRgb(),t,n,r,i=e.r/255,a=e.g/255,o=e.b/255;return t=i<=.03928?i/12.92:((i+.055)/1.055)**2.4,n=a<=.03928?a/12.92:((a+.055)/1.055)**2.4,r=o<=.03928?o/12.92:((o+.055)/1.055)**2.4,.2126*t+.7152*n+.0722*r}getAlpha(){return this.a}setAlpha(e){return this.a=bp(e),this.roundA=Math.round(100*this.a)/100,this}isMonochrome(){let{s:e}=this.toHsl();return e===0}toHsv(){let e=Dp(this.r,this.g,this.b);return{h:e.h*360,s:e.s,v:e.v,a:this.a}}toHsvString(){let e=Dp(this.r,this.g,this.b),t=Math.round(e.h*360),n=Math.round(e.s*100),r=Math.round(e.v*100);return this.a===1?`hsv(${t}, ${n}%, ${r}%)`:`hsva(${t}, ${n}%, ${r}%, ${this.roundA})`}toHsl(){let e=wp(this.r,this.g,this.b);return{h:e.h*360,s:e.s,l:e.l,a:this.a}}toHslString(){let e=wp(this.r,this.g,this.b),t=Math.round(e.h*360),n=Math.round(e.s*100),r=Math.round(e.l*100);return this.a===1?`hsl(${t}, ${n}%, ${r}%)`:`hsla(${t}, ${n}%, ${r}%, ${this.roundA})`}toHex(e=!1){return kp(this.r,this.g,this.b,e)}toHexString(e=!1){return`#`+this.toHex(e)}toHex8(e=!1){return Ap(this.r,this.g,this.b,this.a,e)}toHex8String(e=!1){return`#`+this.toHex8(e)}toHexShortString(e=!1){return this.a===1?this.toHexString(e):this.toHex8String(e)}toRgb(){return{r:Math.round(this.r),g:Math.round(this.g),b:Math.round(this.b),a:this.a}}toRgbString(){let e=Math.round(this.r),t=Math.round(this.g),n=Math.round(this.b);return this.a===1?`rgb(${e}, ${t}, ${n})`:`rgba(${e}, ${t}, ${n}, ${this.roundA})`}toPercentageRgb(){let e=e=>`${Math.round(gp(e,255)*100)}%`;return{r:e(this.r),g:e(this.g),b:e(this.b),a:this.a}}toPercentageRgbString(){let e=e=>Math.round(gp(e,255)*100);return this.a===1?`rgb(${e(this.r)}%, ${e(this.g)}%, ${e(this.b)}%)`:`rgba(${e(this.r)}%, ${e(this.g)}%, ${e(this.b)}%, ${this.roundA})`}toCmyk(){return{...Mp(this.r,this.g,this.b)}}toCmykString(){let{c:e,m:t,y:n,k:r}=Mp(this.r,this.g,this.b);return`cmyk(${e}, ${t}, ${n}, ${r})`}toName(){if(this.a===0)return`transparent`;if(this.a<1)return!1;let e=`#`+kp(this.r,this.g,this.b,!1);for(let[t,n]of Object.entries(Lp))if(e===n)return t;return!1}toString(e){let t=!!e;e=e??this.format;let n=!1,r=this.a<1&&this.a>=0;return!t&&r&&(e.startsWith(`hex`)||e===`name`)?e===`name`&&this.a===0?this.toName():this.toRgbString():(e===`rgb`&&(n=this.toRgbString()),e===`prgb`&&(n=this.toPercentageRgbString()),(e===`hex`||e===`hex6`)&&(n=this.toHexString()),e===`hex3`&&(n=this.toHexString(!0)),e===`hex4`&&(n=this.toHex8String(!0)),e===`hex8`&&(n=this.toHex8String()),e===`name`&&(n=this.toName()),e===`hsl`&&(n=this.toHslString()),e===`hsv`&&(n=this.toHsvString()),e===`cmyk`&&(n=this.toCmykString()),n||this.toHexString())}toNumber(){return(Math.round(this.r)<<16)+(Math.round(this.g)<<8)+Math.round(this.b)}clone(){return new e(this.toString())}lighten(t=10){let n=this.toHsl();return n.l+=t/100,n.l=_p(n.l),new e(n)}brighten(t=10){let n=this.toRgb();return n.r=Math.max(0,Math.min(255,n.r-Math.round(255*-(t/100)))),n.g=Math.max(0,Math.min(255,n.g-Math.round(255*-(t/100)))),n.b=Math.max(0,Math.min(255,n.b-Math.round(255*-(t/100)))),new e(n)}darken(t=10){let n=this.toHsl();return n.l-=t/100,n.l=_p(n.l),new e(n)}tint(e=10){return this.mix(`white`,e)}shade(e=10){return this.mix(`black`,e)}desaturate(t=10){let n=this.toHsl();return n.s-=t/100,n.s=_p(n.s),new e(n)}saturate(t=10){let n=this.toHsl();return n.s+=t/100,n.s=_p(n.s),new e(n)}greyscale(){return this.desaturate(100)}spin(t){let n=this.toHsl(),r=(n.h+t)%360;return n.h=r<0?360+r:r,new e(n)}mix(t,n=50){let r=this.toRgb(),i=new e(t).toRgb(),a=n/100;return new e({r:(i.r-r.r)*a+r.r,g:(i.g-r.g)*a+r.g,b:(i.b-r.b)*a+r.b,a:(i.a-r.a)*a+r.a})}analogous(t=6,n=30){let r=this.toHsl(),i=360/n,a=[this];for(r.h=(r.h-(i*t>>1)+720)%360;--t;)r.h=(r.h+i)%360,a.push(new e(r));return a}complement(){let t=this.toHsl();return t.h=(t.h+180)%360,new e(t)}monochromatic(t=6){let n=this.toHsv(),{h:r}=n,{s:i}=n,{v:a}=n,o=[],s=1/t;for(;t--;)o.push(new e({h:r,s:i,v:a})),a=(a+s)%1;return o}splitcomplement(){let t=this.toHsl(),{h:n}=t;return[this,new e({h:(n+72)%360,s:t.s,l:t.l}),new e({h:(n+216)%360,s:t.s,l:t.l})]}onBackground(t){let n=this.toRgb(),r=new e(t).toRgb(),i=n.a+r.a*(1-n.a);return new e({r:(n.r*n.a+r.r*r.a*(1-n.a))/i,g:(n.g*n.a+r.g*r.a*(1-n.a))/i,b:(n.b*n.a+r.b*r.a*(1-n.a))/i,a:i})}triad(){return this.polyad(3)}tetrad(){return this.polyad(4)}polyad(t){let n=this.toHsl(),{h:r}=n,i=[this],a=360/t;for(let o=1;o{let r={},i=e.color;if(i){let a=i.match(/var\((.*?)\)/);a&&(i=window.getComputedStyle(window.document.documentElement).getPropertyValue(a[1]));let o=new Hp(i),s=e.dark?o.tint(20).toString():Up(o,20);if(e.plain)r=n.cssVarBlock({"bg-color":e.dark?Up(o,90):o.tint(90).toString(),"text-color":i,"border-color":e.dark?Up(o,50):o.tint(50).toString(),"hover-text-color":`var(${n.cssVarName(`color-white`)})`,"hover-bg-color":i,"hover-border-color":i,"active-bg-color":s,"active-text-color":`var(${n.cssVarName(`color-white`)})`,"active-border-color":s}),t.value&&(r[n.cssVarBlockName(`disabled-bg-color`)]=e.dark?Up(o,90):o.tint(90).toString(),r[n.cssVarBlockName(`disabled-text-color`)]=e.dark?Up(o,50):o.tint(50).toString(),r[n.cssVarBlockName(`disabled-border-color`)]=e.dark?Up(o,80):o.tint(80).toString());else if(e.link||e.text){let a=e.dark?Up(o,30):o.tint(30).toString();if(r=n.cssVarBlock({"text-color":i,"hover-text-color":a,"active-text-color":s}),e.link&&(r[n.cssVarBlockName(`hover-link-text-color`)]=a,r[n.cssVarBlockName(`active-color`)]=s),t.value){let t=e.dark?Up(o,50):o.tint(50).toString();r[n.cssVarBlockName(`disabled-bg-color`)]=`transparent`,r[n.cssVarBlockName(`disabled-text-color`)]=t,r[n.cssVarBlockName(`disabled-border-color`)]=`transparent`}}else{let a=e.dark?Up(o,30):o.tint(30).toString(),c=o.isDark()?`var(${n.cssVarName(`color-white`)})`:`var(${n.cssVarName(`color-black`)})`;if(r=n.cssVarBlock({"bg-color":i,"text-color":c,"border-color":i,"hover-bg-color":a,"hover-text-color":c,"hover-border-color":a,"active-bg-color":s,"active-border-color":s}),t.value){let t=e.dark?Up(o,50):o.tint(50).toString();r[n.cssVarBlockName(`disabled-bg-color`)]=t,r[n.cssVarBlockName(`disabled-text-color`)]=e.dark?`rgba(255, 255, 255, 0.5)`:`var(${n.cssVarName(`color-white`)})`,r[n.cssVarBlockName(`disabled-border-color`)]=t}}}return r})}var Gp=H({name:`ElButton`,__name:`button`,props:op,emits:sp,setup(e,{expose:t,emit:n}){let r=e,i=n,a=Wp(r),o=od(`button`),{_ref:s,_size:c,_type:l,_disabled:u,_props:d,_plain:f,_round:p,_text:m,_dashed:h,shouldAddSpace:g,handleClick:_}=hp(r,i),v=Q(()=>[o.b(),o.m(l.value),o.m(c.value),o.is(`disabled`,u.value),o.is(`loading`,r.loading),o.is(`plain`,f.value),o.is(`round`,p.value),o.is(`circle`,r.circle),o.is(`text`,m.value),o.is(`dashed`,h.value),o.is(`link`,r.link),o.is(`has-bg`,r.bg)]);return t({ref:s,size:c,type:l,disabled:u,shouldAddSpace:g}),(t,n)=>(G(),q(Mr(e.tag),va({ref_key:`_ref`,ref:s},z(d),{class:v.value,style:z(a),onClick:z(_)}),{default:B(()=>[e.loading?(G(),K(W,{key:0},[t.$slots.loading?U(t.$slots,`loading`,{key:0}):(G(),q(z(cf),{key:1,class:j(z(o).is(`loading`))},{default:B(()=>[(G(),q(Mr(e.loadingIcon)))]),_:1},8,[`class`]))],64)):e.icon||t.$slots.icon?(G(),q(z(cf),{key:1},{default:B(()=>[e.icon?(G(),q(Mr(e.icon),{key:0})):U(t.$slots,`icon`,{key:1})]),_:3})):Z(`v-if`,!0),t.$slots.default?(G(),K(`span`,{key:2,class:j({[z(o).em(`text`,`expand`)]:z(g)})},[U(t.$slots,`default`)],2)):Z(`v-if`,!0)]),_:3},16,[`class`,`style`,`onClick`]))}}),Kp=H({name:`ElButtonGroup`,__name:`button-group`,props:{size:op.size,type:op.type,direction:{type:lu(String),values:[`horizontal`,`vertical`],default:`horizontal`}},setup(e){let t=e;Fn(mp,Nt({size:$t(t,`size`),type:$t(t,`type`)}));let n=od(`button`);return(e,r)=>(G(),K(`div`,{class:j([z(n).b(`group`),z(n).bm(`group`,t.direction)])},[U(e.$slots,`default`)],2))}}),qp=Vd(Gp,{ButtonGroup:Kp});Hd(Kp);var Jp=`_trap-focus-children`,Yp=[],Xp=e=>{if(Yp.length===0)return;let t=fd(e),n=Yp[Yp.length-1][Jp];if(n.length>0&&t===ls.tab){if(n.length===1){e.preventDefault(),document.activeElement!==n[0]&&n[0].focus();return}let t=e.shiftKey,r=e.target===n[0],i=e.target===n[n.length-1];r&&t&&(e.preventDefault(),n[n.length-1].focus()),i&&!t&&(e.preventDefault(),n[0].focus())}},Zp={beforeMount(e){e[Jp]=Lu(e),Yp.push(e),Yp.length<=1&&document.addEventListener(`keydown`,Xp)},updated(e){xn(()=>{e[Jp]=Lu(e)})},unmounted(){Yp.shift(),Yp.length===0&&document.removeEventListener(`keydown`,Xp)}},Qp=fu({mask:{type:Boolean,default:!0},customMaskEvent:Boolean,overlayClass:{type:lu([String,Array,Object])},zIndex:{type:lu([String,Number])}}),$p={click:e=>e instanceof MouseEvent},em=`overlay`,tm=H({name:`ElOverlay`,props:Qp,emits:$p,setup(e,{slots:t,emit:n}){let r=od(em),{onClick:i,onMousedown:a,onMouseup:o}=hd(e.customMaskEvent?void 0:e=>{n(`click`,e)});return()=>e.mask?Y(`div`,{class:[r.b(),e.overlayClass],style:{zIndex:e.zIndex},onClick:i,onMousedown:a,onMouseup:o},[U(t,`default`)],14,[`onClick`,`onMouseup`,`onMousedown`]):Ha(`div`,{class:e.overlayClass,style:{zIndex:e.zIndex,position:`fixed`,top:`0px`,right:`0px`,bottom:`0px`,left:`0px`}},[U(t,`default`)])}}),nm=fu({type:{type:String,default:`line`,values:[`line`,`circle`,`dashboard`]},percentage:{type:Number,default:0,validator:e=>e>=0&&e<=100},status:{type:String,default:``,values:[``,`success`,`exception`,`warning`]},indeterminate:Boolean,duration:{type:Number,default:3},strokeWidth:{type:Number,default:6},strokeLinecap:{type:lu(String),default:`round`},textInside:Boolean,width:{type:Number,default:126},showText:{type:Boolean,default:!0},color:{type:lu([String,Array,Function]),default:``},striped:Boolean,stripedFlow:Boolean,format:{type:lu(Function),default:e=>`${e}%`}}),rm=[`aria-valuenow`],im={viewBox:`0 0 100 100`},am=[`d`,`stroke`,`stroke-linecap`,`stroke-width`],om=[`d`,`stroke`,`opacity`,`stroke-linecap`,`stroke-width`],sm={key:0},cm=Vd(H({name:`ElProgress`,__name:`progress`,props:nm,setup(e){let t={success:`#13ce66`,exception:`#ff4949`,warning:`#e6a23c`,default:`#20a0ff`},n=e,r=od(`progress`),i=Q(()=>{let e={width:`${n.percentage}%`,animationDuration:`${n.duration}s`},t=b(n.percentage);return t.includes(`gradient`)?e.background=t:e.backgroundColor=t,e}),a=Q(()=>(n.strokeWidth/n.width*100).toFixed(1)),o=Q(()=>[`circle`,`dashboard`].includes(n.type)?Number.parseInt(`${50-Number.parseFloat(a.value)/2}`,10):0),s=Q(()=>{let e=o.value,t=n.type===`dashboard`;return` - M 50 50 - m 0 ${t?``:`-`}${e} - a ${e} ${e} 0 1 1 0 ${t?`-`:``}${e*2} - a ${e} ${e} 0 1 1 0 ${t?``:`-`}${e*2} - `}),c=Q(()=>2*Math.PI*o.value),l=Q(()=>n.type===`dashboard`?.75:1),u=Q(()=>`${-1*c.value*(1-l.value)/2}px`),d=Q(()=>({strokeDasharray:`${c.value*l.value}px, ${c.value}px`,strokeDashoffset:u.value})),f=Q(()=>({strokeDasharray:`${c.value*l.value*(n.percentage/100)}px, ${c.value}px`,strokeDashoffset:u.value,transition:`stroke-dasharray 0.6s ease 0s, stroke 0.6s ease, opacity ease 0.6s`})),p=Q(()=>{let e;return e=n.color?b(n.percentage):t[n.status]||t.default,e}),m=Q(()=>n.status===`warning`?ef:n.type===`line`?n.status===`success`?Wd:Kd:n.status===`success`?Ud:qd),_=Q(()=>n.type===`line`?12+n.strokeWidth*.4:n.width*.111111+2),v=Q(()=>n.format(n.percentage));function y(e){let t=100/e.length;return e.map((e,n)=>g(e)?{color:e,percentage:(n+1)*t}:e).sort((e,t)=>e.percentage-t.percentage)}let b=e=>{let{color:t}=n;if(h(t))return t(e);if(g(t))return t;{let n=y(t);for(let t of n)if(t.percentage>e)return t.color;return n[n.length-1]?.color}};return(t,n)=>(G(),K(`div`,{class:j([z(r).b(),z(r).m(e.type),z(r).is(e.status),{[z(r).m(`without-text`)]:!e.showText,[z(r).m(`text-inside`)]:e.textInside}]),role:`progressbar`,"aria-valuenow":e.percentage,"aria-valuemin":`0`,"aria-valuemax":`100`},[e.type===`line`?(G(),K(`div`,{key:0,class:j(z(r).b(`bar`))},[J(`div`,{class:j(z(r).be(`bar`,`outer`)),style:le({height:`${e.strokeWidth}px`})},[J(`div`,{class:j([z(r).be(`bar`,`inner`),{[z(r).bem(`bar`,`inner`,`indeterminate`)]:e.indeterminate},{[z(r).bem(`bar`,`inner`,`striped`)]:e.striped},{[z(r).bem(`bar`,`inner`,`striped-flow`)]:e.stripedFlow}]),style:le(i.value)},[(e.showText||t.$slots.default)&&e.textInside?(G(),K(`div`,{key:0,class:j(z(r).be(`bar`,`innerText`))},[U(t.$slots,`default`,{percentage:e.percentage},()=>[J(`span`,null,N(v.value),1)])],2)):Z(`v-if`,!0)],6)],6)],2)):(G(),K(`div`,{key:1,class:j(z(r).b(`circle`)),style:le({height:`${e.width}px`,width:`${e.width}px`})},[(G(),K(`svg`,im,[J(`path`,{class:j(z(r).be(`circle`,`track`)),d:s.value,stroke:`var(${z(r).cssVarName(`fill-color-light`)}, #e5e9f2)`,"stroke-linecap":e.strokeLinecap,"stroke-width":a.value,fill:`none`,style:le(d.value)},null,14,am),J(`path`,{class:j(z(r).be(`circle`,`path`)),d:s.value,stroke:p.value,fill:`none`,opacity:+!!e.percentage,"stroke-linecap":e.strokeLinecap,"stroke-width":a.value,style:le(f.value)},null,14,om)]))],6)),(e.showText||t.$slots.default)&&!e.textInside?(G(),K(`div`,{key:2,class:j(z(r).e(`text`)),style:le({fontSize:`${_.value}px`})},[U(t.$slots,`default`,{percentage:e.percentage},()=>[e.status?(G(),q(z(cf),{key:1},{default:B(()=>[(G(),q(Mr(m.value)))]),_:1})):(G(),K(`span`,sm,N(v.value),1))])],6)):Z(`v-if`,!0)],10,rm))}})),lm=e=>[``,...ps].includes(e),um=H({name:`ElMessageBox`,directives:{TrapFocus:Zp},components:{ElButton:qp,ElFocusTrap:Kf,ElInput:ap,ElOverlay:tm,ElIcon:cf,...nf},inheritAttrs:!1,props:{buttonSize:{type:String,validator:lm},modal:{type:Boolean,default:!0},lockScroll:{type:Boolean,default:!0},showClose:{type:Boolean,default:!0},closeOnClickModal:{type:Boolean,default:!0},closeOnPressEscape:{type:Boolean,default:!0},closeOnHashChange:{type:Boolean,default:!0},center:Boolean,draggable:Boolean,overflow:Boolean,roundButton:Boolean,container:{type:String,default:`body`},boxType:{type:String,default:``}},emits:[`vanish`,`action`],setup(e,{emit:t}){let{locale:n,zIndex:r,ns:i,size:a}=dp(`message-box`,Q(()=>e.buttonSize)),{t:o}=n,{nextZIndex:s}=r,c=R(!1),l=Nt({autofocus:!0,beforeClose:null,callback:null,cancelButtonText:``,cancelButtonClass:``,confirmButtonText:``,confirmButtonClass:``,cancelButtonType:``,confirmButtonType:`primary`,customClass:``,customStyle:{},dangerouslyUseHTMLString:!1,distinguishCancelAndClose:!1,icon:``,closeIcon:``,inputPattern:null,inputPlaceholder:``,inputType:`text`,inputValue:``,inputValidator:void 0,inputErrorMessage:``,message:``,modalFade:!0,modalClass:``,showCancelButton:!1,showConfirmButton:!0,type:``,title:void 0,showInput:!1,action:``,confirmButtonLoading:!1,cancelButtonLoading:!1,confirmButtonLoadingIcon:Vt(Zd),cancelButtonLoadingIcon:Vt(Zd),confirmButtonDisabled:!1,editorErrorMessage:``,validateError:!1,zIndex:s()}),u=Q(()=>{let e=l.type;return{[i.bm(`icon`,e)]:e&&rf[e]}}),d=yd(),f=yd(),p=Q(()=>{let e=l.type;return l.icon||e&&rf[e]||``}),m=Q(()=>!!l.message),_=R(),v=R(),y=R(),b=R(),x=R(),S=Q(()=>l.confirmButtonClass);V(()=>l.inputValue,async t=>{await xn(),e.boxType===`prompt`&&t&&O()},{immediate:!0}),V(()=>c.value,t=>{t&&(e.boxType!==`prompt`&&(l.autofocus?y.value=x.value?.$el??_.value:y.value=_.value),l.zIndex=s()),e.boxType===`prompt`&&(t?xn().then(()=>{b.value&&b.value.$el&&(l.autofocus?y.value=k()??_.value:y.value=_.value)}):(l.editorErrorMessage=``,l.validateError=!1))});let{isDragging:C}=Yu(_,v,Q(()=>e.draggable),Q(()=>e.overflow));br(async()=>{await xn(),e.closeOnHashChange&&window.addEventListener(`hashchange`,w)}),Cr(()=>{e.closeOnHashChange&&window.removeEventListener(`hashchange`,w)});function w(){c.value&&(c.value=!1,xn(()=>{l.action&&t(`action`,l.action)}))}let ee=()=>{e.closeOnClickModal&&D(l.distinguishCancelAndClose?`close`:`cancel`)},T=hd(ee),E=e=>{if(l.inputType!==`textarea`&&!b.value?.isComposing)return e.preventDefault(),D(`confirm`)},D=t=>{e.boxType===`prompt`&&t===`confirm`&&!O()||(l.action=t,l.beforeClose?l.beforeClose?.(t,l,w):w())},O=()=>{if(e.boxType===`prompt`){let e=l.inputPattern;if(e&&!e.test(l.inputValue||``))return l.editorErrorMessage=l.inputErrorMessage||o(`el.messagebox.error`),l.validateError=!0,!1;let t=l.inputValidator;if(h(t)){let e=t(l.inputValue);if(e===!1)return l.editorErrorMessage=l.inputErrorMessage||o(`el.messagebox.error`),l.validateError=!0,!1;if(g(e))return l.editorErrorMessage=e,l.validateError=!0,!1}}return l.editorErrorMessage=``,l.validateError=!1,!0},k=()=>{let e=b.value?.$refs;return e?.input??e?.textarea},te=()=>{D(`close`)},ne=()=>{e.closeOnPressEscape&&te()};return e.lockScroll&&dd(c,{ns:i}),{...Xt(l),ns:i,overlayEvent:T,visible:c,hasMessage:m,typeClass:u,contentId:d,inputId:f,btnSize:a,iconComponent:p,confirmButtonClasses:S,rootRef:_,focusStartRef:y,headerRef:v,inputRef:b,isDragging:C,confirmRef:x,doClose:w,handleClose:te,onCloseRequested:ne,handleWrapperClick:ee,handleInputEnter:E,handleAction:D,t:o}}}),dm=[`aria-label`,`aria-describedby`],fm=[`aria-label`],pm=[`id`];function mm(e,t,n,r,i,a){let o=Ar(`el-icon`),s=Ar(`el-input`),c=Ar(`el-button`),l=Ar(`el-focus-trap`),u=Ar(`el-overlay`);return G(),q(io,{name:`fade-in-linear`,onAfterLeave:t[11]||(t[11]=t=>e.$emit(`vanish`)),persisted:``},{default:B(()=>[Nn(Y(u,{"z-index":e.zIndex,"overlay-class":[e.ns.is(`message-box`),e.modalClass],mask:e.modal},{default:B(()=>[J(`div`,{role:`dialog`,"aria-label":e.title,"aria-modal":`true`,"aria-describedby":e.showInput?void 0:e.contentId,class:j(`${e.ns.namespace.value}-overlay-message-box`),onClick:t[8]||(t[8]=(...t)=>e.overlayEvent.onClick&&e.overlayEvent.onClick(...t)),onMousedown:t[9]||(t[9]=(...t)=>e.overlayEvent.onMousedown&&e.overlayEvent.onMousedown(...t)),onMouseup:t[10]||(t[10]=(...t)=>e.overlayEvent.onMouseup&&e.overlayEvent.onMouseup(...t))},[Y(l,{loop:``,trapped:e.visible,"focus-trap-el":e.rootRef,"focus-start-el":e.focusStartRef,onReleaseRequested:e.onCloseRequested},{default:B(()=>[J(`div`,{ref:`rootRef`,class:j([e.ns.b(),e.customClass,e.ns.is(`draggable`,e.draggable),e.ns.is(`dragging`,e.isDragging),{[e.ns.m(`center`)]:e.center}]),style:le(e.customStyle),tabindex:`-1`,onClick:t[7]||(t[7]=$o(()=>{},[`stop`]))},[e.title!==null&&e.title!==void 0?(G(),K(`div`,{key:0,ref:`headerRef`,class:j([e.ns.e(`header`),{"show-close":e.showClose}])},[J(`div`,{class:j(e.ns.e(`title`))},[e.iconComponent&&e.center?(G(),q(o,{key:0,class:j([e.ns.e(`status`),e.typeClass])},{default:B(()=>[(G(),q(Mr(e.iconComponent)))]),_:1},8,[`class`])):Z(`v-if`,!0),J(`span`,null,N(e.title),1)],2),e.showClose?(G(),K(`button`,{key:0,type:`button`,class:j(e.ns.e(`headerbtn`)),"aria-label":e.t(`el.messagebox.close`),onClick:t[0]||(t[0]=t=>e.handleAction(e.distinguishCancelAndClose?`close`:`cancel`)),onKeydown:t[1]||(t[1]=ts($o(t=>e.handleAction(e.distinguishCancelAndClose?`close`:`cancel`),[`prevent`]),[`enter`]))},[Y(o,{class:j(e.ns.e(`close`))},{default:B(()=>[(G(),q(Mr(e.closeIcon||`close`)))]),_:1},8,[`class`])],42,fm)):Z(`v-if`,!0)],2)):Z(`v-if`,!0),J(`div`,{id:e.contentId,class:j(e.ns.e(`content`))},[J(`div`,{class:j(e.ns.e(`container`))},[e.iconComponent&&!e.center&&e.hasMessage?(G(),q(o,{key:0,class:j([e.ns.e(`status`),e.typeClass])},{default:B(()=>[(G(),q(Mr(e.iconComponent)))]),_:1},8,[`class`])):Z(`v-if`,!0),e.hasMessage?(G(),K(`div`,{key:1,class:j(e.ns.e(`message`))},[U(e.$slots,`default`,{},()=>[e.dangerouslyUseHTMLString?(G(),q(Mr(e.showInput?`label`:`p`),{key:1,for:e.showInput?e.inputId:void 0,innerHTML:e.message},null,8,[`for`,`innerHTML`])):(G(),q(Mr(e.showInput?`label`:`p`),{key:0,for:e.showInput?e.inputId:void 0,textContent:N(e.message)},null,8,[`for`,`textContent`]))])],2)):Z(`v-if`,!0)],2),Nn(J(`div`,{class:j(e.ns.e(`input`))},[Y(s,{id:e.inputId,ref:`inputRef`,modelValue:e.inputValue,"onUpdate:modelValue":t[2]||(t[2]=t=>e.inputValue=t),type:e.inputType,placeholder:e.inputPlaceholder,"aria-invalid":e.validateError,class:j({invalid:e.validateError}),onKeydown:ts(e.handleInputEnter,[`enter`])},null,8,[`id`,`modelValue`,`type`,`placeholder`,`aria-invalid`,`class`,`onKeydown`]),J(`div`,{class:j(e.ns.e(`errormsg`)),style:le({visibility:e.editorErrorMessage?`visible`:`hidden`})},N(e.editorErrorMessage),7)],2),[[Co,e.showInput]])],10,pm),e.showCancelButton||e.showConfirmButton?(G(),K(`div`,{key:1,class:j(e.ns.e(`btns`))},[e.showCancelButton?(G(),q(c,{key:0,type:e.cancelButtonType===`text`?``:e.cancelButtonType,text:e.cancelButtonType===`text`,loading:e.cancelButtonLoading,"loading-icon":e.cancelButtonLoadingIcon,class:j([e.cancelButtonClass]),round:e.roundButton,size:e.btnSize,onClick:t[3]||(t[3]=t=>e.handleAction(`cancel`)),onKeydown:t[4]||(t[4]=ts($o(t=>e.handleAction(`cancel`),[`prevent`]),[`enter`]))},{default:B(()=>[X(N(e.cancelButtonText||e.t(`el.messagebox.cancel`)),1)]),_:1},8,[`type`,`text`,`loading`,`loading-icon`,`class`,`round`,`size`])):Z(`v-if`,!0),Nn(Y(c,{ref:`confirmRef`,type:e.confirmButtonType===`text`?``:e.confirmButtonType,text:e.confirmButtonType===`text`,loading:e.confirmButtonLoading,"loading-icon":e.confirmButtonLoadingIcon,class:j([e.confirmButtonClasses]),round:e.roundButton,disabled:e.confirmButtonDisabled,size:e.btnSize,onClick:t[5]||(t[5]=t=>e.handleAction(`confirm`)),onKeydown:t[6]||(t[6]=ts($o(t=>e.handleAction(`confirm`),[`prevent`]),[`enter`]))},{default:B(()=>[X(N(e.confirmButtonText||e.t(`el.messagebox.confirm`)),1)]),_:1},8,[`type`,`text`,`loading`,`loading-icon`,`class`,`round`,`disabled`,`size`]),[[Co,e.showConfirmButton]])],2)):Z(`v-if`,!0)],6)]),_:3},8,[`trapped`,`focus-trap-el`,`focus-start-el`,`onReleaseRequested`])],42,dm)]),_:3},8,[`z-index`,`overlay-class`,`mask`]),[[Co,e.visible]])]),_:3})}var hm=Wf(um,[[`render`,mm]]),gm=new Map,_m=e=>{let t=document.body;return e.appendTo&&(g(e.appendTo)&&(t=document.querySelector(e.appendTo)),au(e.appendTo)&&(t=e.appendTo),au(t)||(hu(`ElMessageBox`,`the appendTo option is not an HTMLElement. Falling back to document.body.`),t=document.body)),t},vm=(e,t)=>{let n=e.component?.proxy;return()=>n.handleAction(t)},ym=(e,t,n=null)=>{let r=Y(hm,e,h(e.message)||ca(e.message)?{default:h(e.message)?()=>e.message({confirm:vm(r,`confirm`),cancel:vm(r,`cancel`),close:vm(r,`close`)}):()=>e.message}:null);return r.appContext=n,as(r,t),_m(e).appendChild(t.firstElementChild),r.component},bm=()=>document.createElement(`div`),xm=(e,t)=>{let n=bm();e.onVanish=()=>{as(null,n),gm.delete(i)},e.onAction=t=>{let n=gm.get(i),a;a=e.showInput?{value:i.inputValue,action:t}:t,e.callback?e.callback(a,r.proxy):t===`cancel`||t===`close`?e.distinguishCancelAndClose&&t!==`cancel`?n.reject(`close`):n.reject(`cancel`):n.resolve(a)};let r=ym(e,n,t),i=r.proxy;for(let t in e)u(e,t)&&!u(i.$props,t)&&(t===`closeIcon`&&v(e[t])?i[t]=Vt(e[t]):i[t]=e[t]);return i.visible=!0,i};function Sm(e,t=null){if(!xu)return Promise.reject();let n;return g(e)||ca(e)?e={message:e}:n=e.callback,new Promise((r,i)=>{let a=xm(e,t??Sm._context);gm.set(a,{options:e,callback:n,resolve:r,reject:i})})}var Cm=[`alert`,`confirm`,`prompt`],wm={alert:{closeOnPressEscape:!1,closeOnClickModal:!1},confirm:{showCancelButton:!0},prompt:{showCancelButton:!0,showInput:!0}};Cm.forEach(e=>{Sm[e]=Tm(e)});function Tm(e){return(t,n,r,i)=>{let a=``;return v(n)?(r=n,a=``):a=ru(n)?``:n,Sm(Object.assign({title:a,message:t,type:``,...wm[e]},r,{boxType:e}),i)}}Sm.close=()=>{gm.forEach((e,t)=>{t.doClose()}),gm.clear()},Sm._context=null;var Em=Sm;Em.install=e=>{Em._context=e._context,e.config.globalProperties.$msgbox=Em,e.config.globalProperties.$messageBox=Em,e.config.globalProperties.$alert=Em.alert,e.config.globalProperties.$confirm=Em.confirm,e.config.globalProperties.$prompt=Em.prompt};var Dm=Em,Om=[{id:`modelserver_login`,label:`连接大模型`,kind:`oauth`,autoStart:!1},{id:`agentserver_login`,label:`连接星池工作区`,kind:`oauth`,autoStart:!1},{id:`codex_desktop_install`,label:`安装 Codex Desktop 智能助手`,kind:`progress`,autoStart:!0},{id:`codex_desktop_configure`,label:`准备 Codex Desktop 智能助手`,kind:`action`,autoStart:!0},{id:`finalize`,label:`完成`,kind:`action`,autoStart:!1}],km=[{id:`modelserver_login`,label:`连接大模型`,kind:`oauth`,autoStart:!1},{id:`agentserver_login`,label:`连接星池工作区`,kind:`oauth`,autoStart:!1},{id:`vscode_install`,label:`安装极简工作台`,kind:`progress`,autoStart:!0},{id:`vscode_configure`,label:`准备极简工作台`,kind:`action`,autoStart:!0},{id:`finalize`,label:`完成`,kind:`action`,autoStart:!1}],Am=[{id:`modelserver_login`,label:`连接大模型`,kind:`oauth`,autoStart:!1},{id:`agentserver_login`,label:`连接星池工作区`,kind:`oauth`,autoStart:!1},{id:`opencode_desktop_install`,label:`安装 OpenCode Desktop 智能助手`,kind:`progress`,autoStart:!0},{id:`opencode_desktop_configure`,label:`准备 OpenCode Desktop 智能助手`,kind:`action`,autoStart:!0},{id:`finalize`,label:`完成`,kind:`action`,autoStart:!1}];function jm(e){return e===`opencode_desktop`?`opencode_desktop`:e===`minimal_vscode`?`minimal_vscode`:`codex_desktop`}function Mm(e){let t=jm(e);return t===`minimal_vscode`?km:t===`opencode_desktop`?Am:Om}function Nm(e){let t=jm(e);return t===`minimal_vscode`?{modelserver_login:`modelserver_login`,agentserver_login:`agentserver_login`,vscode_installed:`vscode_install`,vscode_configured:`vscode_configure`,shortcuts_created:`finalize`}:t===`opencode_desktop`?{modelserver_login:`modelserver_login`,agentserver_login:`agentserver_login`,opencode_desktop_installed:`opencode_desktop_install`,opencode_desktop_configured:`opencode_desktop_configure`,shortcuts_created:`finalize`}:{modelserver_login:`modelserver_login`,agentserver_login:`agentserver_login`,codex_desktop_installed:`codex_desktop_install`,codex_desktop_configured:`codex_desktop_configure`,shortcuts_created:`finalize`}}function Pm(e){"@babel/helpers - typeof";return Pm=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},Pm(e)}function Fm(e,t){if(Pm(e)!=`object`||!e)return e;var n=e[Symbol.toPrimitive];if(n!==void 0){var r=n.call(e,t||`default`);if(Pm(r)!=`object`)return r;throw TypeError(`@@toPrimitive must return a primitive value.`)}return(t===`string`?String:Number)(e)}function Im(e){var t=Fm(e,`string`);return Pm(t)==`symbol`?t:t+``}function Lm(e,t,n){return(t=Im(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var Rm=class extends Error{constructor(e,t,n){super(e),Lm(this,`status`,void 0),Lm(this,`detail`,void 0),this.status=t,this.detail=n,this.name=`OnboardingError`}},zm=`X-AgentServer-Console-Token`;function Bm(){return typeof document>`u`?``:document.querySelector(`meta[name="agentserver-console-token"]`)?.content.trim()??``}function Vm(e){let t=Bm();if(!t)return e;let n=new Headers(e?.headers);return n.set(zm,t),{...e,headers:n}}async function $(e,t){let n;try{n=await fetch(e,t)}catch(e){throw new Rm(`网络错误: `+(e instanceof Error?e.message:String(e)))}if(!n.ok){let t=``;try{t=await n.text()}catch{}throw new Rm(`${e} 返回 ${n.status}: ${t||n.statusText}`,n.status,t)}return n.json()}var Hm=()=>$(`/api/state`),Um=e=>$(`/api/step/${e}`,{method:`POST`}),Wm=e=>$(`/api/step/${e}/status`,{method:`POST`}),Gm=()=>$(`/api/step/frontend_install`,{method:`POST`}),Km=()=>$(`/api/step/frontend_configure`,{method:`POST`}),qm=()=>$(`/api/finalize`,{method:`POST`}),Jm=()=>$(`/api/console/state`),Ym=()=>$(`/api/console/refresh`,Vm({method:`POST`})),Xm=()=>$(`/api/console/open-frontend`,Vm({method:`POST`})),Zm=()=>$(`/api/console/open-subscription`,Vm({method:`POST`})),Qm=()=>$(`/api/console/logout-modelserver`,Vm({method:`POST`})),$m=()=>$(`/api/console/slaves`),eh=e=>$(`/api/console/slaves`,Vm({method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)})),th=()=>$(`/api/console/select-folder`,Vm({method:`POST`})),nh=e=>$(`/api/console/slaves/${encodeURIComponent(e)}/restart`,Vm({method:`POST`})),rh=e=>$(`/api/console/slaves/${encodeURIComponent(e)}/pause`,Vm({method:`POST`})),ih=e=>$(`/api/console/slaves/${encodeURIComponent(e)}/open-remote`,Vm({method:`POST`})),ah=e=>$(`/api/console/slaves/${encodeURIComponent(e)}`,Vm({method:`DELETE`})),oh=()=>$(`/api/console/update`),sh=()=>$(`/api/console/update/check`,Vm({method:`POST`})),ch=()=>$(`/api/console/update/install`,Vm({method:`POST`}));function lh(){let e=R(`codex_desktop`),t=R(`Codex Desktop`),n=R(Mm(e.value).map(e=>({...e,runtime:{status:`pending`}}))),r=R(null),i=R(new Set),a=R(`pending`),o=Q(()=>n.value.find(e=>e.runtime.status!==`success`)),s=Q(()=>a.value===`complete`);function c(e){return n.value.find(t=>t.id===e)}function l(r,i){let a=jm(r),o=Mm(a),s=n.value.map(e=>e.id).join(`,`),c=o.map(e=>e.id).join(`,`);e.value=a,t.value=i||(a===`minimal_vscode`?`极简界面`:a===`opencode_desktop`?`OpenCode Desktop`:`Codex Desktop`),s!==c&&(n.value=o.map(e=>({...e,runtime:{status:`pending`}})))}function u(){let t=new Set,r=Nm(e.value);for(let e of Array.from(i.value)){let n=r[e];n&&t.add(n)}if(a.value===`complete`){for(let e of n.value)e.runtime={status:`success`};return}let o=!1;for(let e of n.value)t.has(e.id)?e.runtime={status:`success`}:!o&&e.runtime.status!==`in_progress`&&e.runtime.status!==`error`?(e.runtime={status:`active`},o=!0):e.runtime.status===`success`&&!t.has(e.id)&&(e.runtime=o?{status:`pending`}:{status:`active`},o||(o=!0))}async function d(){try{let e=await Hm();r.value=null,l(e.frontend_mode,e.frontend_name),i.value=new Set(e.completed_steps??[]),a.value=e.onboarding_status,u()}catch(e){r.value=e instanceof Error?e.message:String(e)}}async function f(){await d()}function p(e,t){let n=c(e);n&&(n.runtime={...n.runtime,status:`in_progress`,stage:t,errorMessage:void 0,errorDetail:void 0})}function m(e){let t=c(e);if(!t)return;t.runtime={status:`success`};let r=n.value.findIndex(t=>t.id===e);if(r>=0&&r+1{let i=cm;return G(),K(`section`,uh,[J(`div`,dh,[J(`strong`,null,N(t(e.quota.window)),1),J(`span`,null,`已用 `+N(e.quota.percentage)+`%`,1)]),Y(i,{percentage:e.quota.percentage,"stroke-width":10},null,8,[`percentage`]),J(`div`,fh,[J(`span`,null,`剩余约 `+N(e.quota.remaining_percentage)+`%`,1),e.quota.resets_at?(G(),K(`span`,ph,`重置 `+N(new Date(e.quota.resets_at).toLocaleString()),1)):Z(``,!0)])])}}}),hh=(e,t)=>{let n=e.__vccOpts||e;for(let[e,r]of t)n[e]=r;return n},gh=hh(mh,[[`__scopeId`,`data-v-77393e6b`]]),_h={class:`dashboard`},vh={class:`dashboard-head`},yh={class:`dashboard-actions`},bh={key:3,class:`reconnect-row`},xh={key:0},Sh=[`href`],Ch={key:5,class:`reconnect-row`},wh={key:0},Th=[`href`],Eh={class:`quota-grid`},Dh={class:`connection-grid`},Oh={class:`info-block`},kh={class:`info-block`},Ah={class:`update-panel`},jh={class:`section-head`},Mh={key:0},Nh={key:1},Ph={key:2},Fh={class:`update-row`},Ih={class:`update-summary`},Lh={key:0},Rh={key:1},zh={class:`update-actions`},Bh={class:`slave-panel`},Vh={class:`section-head`},Hh={class:`slave-create`},Uh={class:`folder-select`},Wh={class:`slave-preview`},Gh={class:`slave-list`},Kh={class:`slave-main`},qh={class:`slave-title-line`},Jh={class:`slave-status`},Yh={class:`slave-folder`},Xh=[`href`],Zh={key:1},Qh={class:`slave-actions`},$h={class:`subscription-actions`},eg=3e3,tg=hh(H({__name:`Dashboard`,setup(e){let t=R(null),n=R(null),r=R(``),i=R(``),a=R(``),o=R(``),s=R(``),c=R(!1),l=R(!1),u=R(!1),d=R(!1),f=R(!1),p=R(!1),m=R(!1),h=R(``),g=R(``),_=R(``),v=R(!1),y=R(``),b=R(``),x=R(``),S=R(null),C=R([]),w=R(``),ee=R(``),T=R(``),E=R(``),D=R(!1),O=R(!1),k=R({}),te=R({}),ne=0,re=0,ie,A=!1,ae=Q(()=>[{key:`status`,message:r.value},{key:`update`,message:i.value},{key:`frontend`,message:a.value},{key:`subscription`,message:o.value},{key:`logout-modelserver`,message:s.value},{key:`reconnect`,message:_.value},{key:`agentserver-reconnect`,message:x.value},{key:`slave`,message:T.value}].filter(e=>e.message)),oe=Q(()=>{let e=t.value?.agentserver;return e?.workspace_name?e.workspace_name:e?.workspace_id?`工作空间 ${j(e.workspace_id)}`:`未读取到工作空间`}),se=Q(()=>S.value?.computer_name||`未初始化`),ce=Q(()=>{let e=Me()||`文件夹名`;return`${se.value}-${e}`}),le=Q(()=>{let e=n.value;return e?e.status===`available`&&e.update?`发现新版本 ${e.update.version}`:e.status===`latest`?`已是最新版本`:e.status===`checking`?`正在检查更新`:e.status===`downloading`?`正在下载更新`:e.status===`installer_started`?`安装程序已启动`:e.status===`error`?e.last_error||`更新检查失败`:`未检查更新`:`正在读取更新状态`}),ue=Q(()=>l.value||u.value),de=Q(()=>ue.value),fe=Q(()=>{let e=n.value;return!!e?.update&&(e.status===`available`||e.status===`error`)}),pe=Q(()=>{let e=n.value;return e?.last_error?e.status===`error`?``:e.last_error:``});function j(e){return e.length<=8?e:e.slice(-8)}function M(e){return e instanceof Error?e.message:String(e)}async function me(e){try{return await Dm.confirm(e,`确认操作`,{confirmButtonText:`确定`,cancelButtonText:`取消`,type:`warning`}),!0}catch{return!1}}async function he(){try{t.value=await Jm(),r.value=``}catch(e){r.value=M(e)}}async function ge(){let e=++ne;try{let t=await oh();if(!A||e!==ne)return;n.value=t,i.value=``}catch(t){if(!A||e!==ne)return;i.value=M(t)}}async function _e(){let e=++re;try{let t=await $m();if(!A||e!==re)return;S.value=t.machine,C.value=t.slaves||[],T.value=``,xe()}catch(t){if(!A||e!==re)return;T.value=M(t),xe()}}async function ve(){if(ue.value)return;let e=++ne;l.value=!0;try{let t=await sh();if(!A||e!==ne)return;n.value=t,i.value=``}catch(t){if(!A||e!==ne)return;i.value=M(t)}finally{A&&(l.value=!1)}}async function ye(){if(ue.value||!fe.value||!n.value?.update)return;let e=n.value.update.version;if(!await me(`安装星池指挥官更新 ${e}?安装程序启动后可能需要按提示完成更新。`))return;let t=++ne;u.value=!0;try{let e=await ch();if(!A||t!==ne)return;n.value=e,i.value=``}catch(e){if(!A||t!==ne)return;let n=M(e);if(i.value=n,await ge(),!A)return;i.value=n}finally{A&&(u.value=!1)}}function be(e){return e.status===`starting`||e.status===`auth_required`}function P(){ie!==void 0&&(window.clearTimeout(ie),ie=void 0)}function xe(){P(),A&&C.value.some(be)&&(ie=window.setTimeout(()=>{ie=void 0,_e()},eg))}async function Se(){if(!c.value){c.value=!0;try{t.value=await Ym(),r.value=``,await _e()}catch(e){r.value=M(e)}finally{c.value=!1}}}async function Ce(){if(!d.value){d.value=!0;try{await Xm(),a.value=``}catch(e){a.value=M(e)}finally{d.value=!1}}}async function F(){if(!(f.value||!t.value?.subscription_url)){f.value=!0;try{await Zm(),o.value=``}catch(e){o.value=M(e)}finally{f.value=!1}}}async function we(){if(!(p.value||!t.value)&&await me(`退出大模型登录后需要重新连接大模型。确定退出大模型登录吗?`)){p.value=!0;try{await Qm(),t.value=await Ym(),s.value=``}catch(e){s.value=M(e)}finally{p.value=!1}}}async function Te(){if(!m.value){m.value=!0,_.value=``,g.value=``,h.value=`正在打开登录页面…`;try{let e=await Um(`modelserver_login`);e.oauth_url&&(g.value=e.oauth_url),h.value=`请在浏览器中完成大模型连接…`,await Ee()}catch(e){_.value=M(e)}finally{m.value=!1}}}async function Ee(){for(;;){let e=await Wm(`modelserver_login`);if(e.state===`success`){t.value=await Ym(),h.value=``,g.value=``;return}if(e.error&&!ke(e.error))throw Error(e.error);await je(3e3)}}async function De(){if(!v.value){v.value=!0,x.value=``,b.value=``,y.value=`正在打开登录页面…`;try{let e=await Um(`agentserver_login`);e.oauth_url&&(b.value=e.oauth_url),y.value=`请在浏览器中完成星池工作区连接…`,await Oe()}catch(e){x.value=M(e)}finally{v.value=!1}}}async function Oe(){for(;;){let e=await Wm(`agentserver_login`);if(e.state===`success`){t.value=await Ym(),y.value=``,b.value=``;return}if(e.error&&!ke(e.error))throw Error(e.error);await je(3e3)}}function ke(e){return e.includes(`context deadline exceeded`)||e.includes(`deadline exceeded`)}function Ae(e){if(!e)return``;try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`?e:``}catch{return``}}function je(e){return new Promise(t=>window.setTimeout(t,e))}function Me(){return ee.value.trim()||w.value.trim().replace(/\\/g,`/`).replace(/\/+$/,``).split(`/`).pop()||``}async function Ne(){if(D.value)return;let e=w.value.trim(),t=Me();if(!e){T.value=`请选择文件夹`;return}if(Array.from(t).length>20){T.value=`名称最多 20 个字符`;return}D.value=!0,E.value=``;try{await eh({folder:e,name:t}),w.value=``,ee.value=``,await _e()}catch(e){T.value=M(e)}finally{D.value=!1}}async function Pe(){if(!O.value){O.value=!0,E.value=``;try{let e=await th();e.folder&&(w.value=e.folder),T.value=``}catch(e){T.value=M(e)}finally{O.value=!1}}}async function Fe(e){E.value=``,await ze(e,()=>nh(e))}async function Ie(e){E.value=``,await ze(e,()=>rh(e))}async function Le(e){let t=!1;if(!te.value[e]){if(k.value[e])return;Be(e,!0),E.value=``;try{if((await ih(e)).state===`opened`){te.value[e]=!0,E.value=`已打开 agentserver 页面。请先在网页中删除远程记录,完成后再次点击删除来清理本机配置和进程。`,T.value=``;return}}catch(e){t=!0,T.value=``,E.value=`未能自动打开 agentserver 页面:${M(e)}。远程记录可能需要手动清理。`}finally{Be(e,!1)}}await me(Re(e,t))&&await ze(e,async()=>{await ah(e),Ve(e),E.value=``})}function Re(e,t){return te.value[e]?`我已在 agentserver 网页删除远程记录,现在删除这台电脑上的本地配置和进程。确定继续吗?`:t?`未能自动打开 agentserver 页面,远程记录可能需要手动清理。现在删除这台电脑上的本地配置和进程。确定继续吗?`:`删除这台电脑上的本地配置和进程。确定删除吗?`}async function ze(e,t){if(!k.value[e]){Be(e,!0);try{await t(),await _e()}catch(e){T.value=M(e)}finally{Be(e,!1)}}}function Be(e,t){if(t){k.value[e]=!0;return}delete k.value[e]}function Ve(e){delete te.value[e]}function He(e){return{stopped:`已停止`,starting:`启动中`,auth_required:`待认证`,running:`运行中`,paused:`已暂停`,error:`出错`}[e]||e}return br(()=>{A=!0,he(),ge(),_e()}),Cr(()=>{A=!1,P()}),(e,r)=>{let i=qp,a=lf,o=ap;return G(),K(`div`,_h,[J(`header`,vh,[J(`div`,null,[r[2]||(r[2]=J(`h1`,null,`星池指挥官`,-1)),J(`p`,null,N(t.value?.frontend_name||`正在读取状态`),1)]),J(`div`,yh,[Y(i,{loading:c.value,disabled:c.value,onClick:Se},{default:B(()=>[...r[3]||(r[3]=[X(`刷新状态`,-1)])]),_:1},8,[`loading`,`disabled`]),Y(i,{type:`primary`,loading:d.value,disabled:d.value,onClick:Ce},{default:B(()=>[X(` 打开 `+N(t.value?.frontend_name||`前端`),1)]),_:1},8,[`loading`,`disabled`])])]),(G(!0),K(W,null,Fr(ae.value,e=>(G(),q(a,{key:e.key,type:`error`,title:e.message,closable:!1,"show-icon":``},null,8,[`title`]))),128)),E.value?(G(),q(a,{key:0,type:`info`,title:E.value,closable:!1,"show-icon":``},null,8,[`title`])):Z(``,!0),t.value?.quota_error?(G(),q(a,{key:1,type:`warning`,title:t.value.quota_error,closable:!1,"show-icon":``},null,8,[`title`])):Z(``,!0),t.value?.modelserver.reconnect_required?(G(),q(a,{key:2,type:`warning`,title:t.value.modelserver.auth_message||`大模型连接已失效,请重新连接。`,closable:!1,"show-icon":``},null,8,[`title`])):Z(``,!0),t.value?.modelserver.reconnect_required?(G(),K(`div`,bh,[Y(i,{type:`primary`,loading:m.value,disabled:m.value,onClick:Te},{default:B(()=>[...r[4]||(r[4]=[X(` 重新连接大模型 `,-1)])]),_:1},8,[`loading`,`disabled`]),h.value?(G(),K(`span`,xh,N(h.value),1)):Z(``,!0),Ae(g.value)?(G(),K(`a`,{key:1,href:Ae(g.value),target:`_blank`,rel:`noopener noreferrer`},` 浏览器没自动打开? 点这里 `,8,Sh)):Z(``,!0)])):Z(``,!0),t.value?.agentserver.reconnect_required?(G(),q(a,{key:4,type:`warning`,title:t.value.agentserver.auth_message||`星池工作区连接已失效,请重新连接。`,closable:!1,"show-icon":``},null,8,[`title`])):Z(``,!0),t.value?.agentserver.reconnect_required?(G(),K(`div`,Ch,[Y(i,{type:`primary`,loading:v.value,disabled:v.value,onClick:De},{default:B(()=>[...r[5]||(r[5]=[X(` 重新连接星池工作区 `,-1)])]),_:1},8,[`loading`,`disabled`]),y.value?(G(),K(`span`,wh,N(y.value),1)):Z(``,!0),Ae(b.value)?(G(),K(`a`,{key:1,href:Ae(b.value),target:`_blank`,rel:`noopener noreferrer`},` 浏览器没自动打开? 点这里 `,8,Th)):Z(``,!0)])):Z(``,!0),J(`section`,Eh,[(G(!0),K(W,null,Fr(t.value?.quotas||[],e=>(G(),q(gh,{key:e.window,quota:e},null,8,[`quota`]))),128))]),J(`section`,Dh,[J(`div`,Oh,[r[6]||(r[6]=J(`span`,null,`modelserver 项目`,-1)),J(`strong`,null,N(t.value?.modelserver.project_name||t.value?.modelserver.project_id||`未读取到项目`),1)]),J(`div`,kh,[r[7]||(r[7]=J(`span`,null,`agentserver 工作空间`,-1)),J(`strong`,null,N(oe.value),1)])]),J(`section`,Ah,[J(`div`,jh,[r[8]||(r[8]=J(`h2`,null,`星池指挥官更新`,-1)),J(`p`,null,[n.value?(G(),K(`span`,Mh,`当前版本 `+N(n.value.current_version),1)):(G(),K(`span`,Nh,`正在读取当前版本`)),n.value?.last_checked_at?(G(),K(`span`,Ph,`上次检查 `+N(n.value.last_checked_at),1)):Z(``,!0)])]),J(`div`,Fh,[J(`div`,Ih,[J(`strong`,null,N(le.value),1),n.value?.update?.notes?(G(),K(`span`,Lh,N(n.value.update.notes),1)):Z(``,!0),pe.value?(G(),K(`span`,Rh,N(pe.value),1)):Z(``,!0)]),J(`div`,zh,[Y(i,{"data-test":`check-console-update`,loading:l.value,disabled:de.value,onClick:ve},{default:B(()=>[...r[9]||(r[9]=[X(` 检查更新 `,-1)])]),_:1},8,[`loading`,`disabled`]),fe.value?(G(),q(i,{key:0,"data-test":`install-console-update`,type:`primary`,loading:u.value,disabled:de.value,onClick:ye},{default:B(()=>[...r[10]||(r[10]=[X(` 安装更新 `,-1)])]),_:1},8,[`loading`,`disabled`])):Z(``,!0)])])]),J(`section`,Bh,[J(`div`,Vh,[r[11]||(r[11]=J(`h2`,null,`允许被远程控制的文件夹(智能体形式提供)`,-1)),J(`p`,null,`本机:`+N(se.value),1)]),J(`div`,Hh,[J(`div`,Uh,[Y(o,{modelValue:w.value,"onUpdate:modelValue":r[0]||(r[0]=e=>w.value=e),"data-test":`slave-folder-input`,placeholder:`请选择文件夹`,readonly:``,clearable:``},null,8,[`modelValue`]),Y(i,{"data-test":`select-slave-folder`,icon:z(Jd),loading:O.value,disabled:O.value,onClick:Pe},{default:B(()=>[...r[12]||(r[12]=[X(` 选择文件夹 `,-1)])]),_:1},8,[`icon`,`loading`,`disabled`])]),Y(o,{modelValue:ee.value,"onUpdate:modelValue":r[1]||(r[1]=e=>ee.value=e),"data-test":`slave-name-input`,maxlength:`20`,"show-word-limit":``,placeholder:`名称,默认使用文件夹名`,clearable:``},null,8,[`modelValue`]),J(`span`,Wh,`预览:`+N(ce.value),1),Y(i,{"data-test":`create-slave`,type:`primary`,loading:D.value,disabled:D.value,onClick:Ne},{default:B(()=>[...r[13]||(r[13]=[X(` 创建并启动 `,-1)])]),_:1},8,[`loading`,`disabled`])]),J(`div`,Gh,[(G(!0),K(W,null,Fr(C.value,e=>(G(),K(`div`,{key:e.id,class:`slave-row`},[J(`div`,Kh,[J(`div`,qh,[J(`strong`,null,N(e.display_name),1),J(`span`,Jh,N(He(e.status)),1)]),J(`span`,Yh,N(e.folder),1),e.status===`auth_required`&&Ae(e.auth_url)?(G(),K(`a`,{key:0,href:Ae(e.auth_url),target:`_blank`,rel:`noopener noreferrer`},` 完成认证 `,8,Xh)):Z(``,!0),e.last_error?(G(),K(`em`,Zh,N(e.last_error),1)):Z(``,!0)]),J(`div`,Qh,[Y(i,{"data-test":`restart-slave-${e.id}`,loading:k.value[e.id],disabled:k.value[e.id],onClick:t=>Fe(e.id)},{default:B(()=>[...r[14]||(r[14]=[X(` 启动/重启 `,-1)])]),_:1},8,[`data-test`,`loading`,`disabled`,`onClick`]),Y(i,{"data-test":`pause-slave-${e.id}`,loading:k.value[e.id],disabled:k.value[e.id],onClick:t=>Ie(e.id)},{default:B(()=>[...r[15]||(r[15]=[X(` 暂停 `,-1)])]),_:1},8,[`data-test`,`loading`,`disabled`,`onClick`]),Y(i,{"data-test":`delete-slave-${e.id}`,type:`danger`,plain:``,loading:k.value[e.id],disabled:k.value[e.id],onClick:t=>Le(e.id)},{default:B(()=>[...r[16]||(r[16]=[X(` 删除 `,-1)])]),_:1},8,[`data-test`,`loading`,`disabled`,`onClick`])])]))),128))])]),J(`div`,$h,[Y(i,{loading:f.value,disabled:f.value||!t.value?.subscription_url,onClick:F},{default:B(()=>[...r[17]||(r[17]=[X(` 打开订阅页 `,-1)])]),_:1},8,[`loading`,`disabled`]),Y(i,{type:`danger`,plain:``,loading:p.value,disabled:p.value||!t.value,onClick:we},{default:B(()=>[...r[18]||(r[18]=[X(` 退出大模型登录 `,-1)])]),_:1},8,[`loading`,`disabled`])])])}}}),[[`__scopeId`,`data-v-0a403077`]]),ng={class:`step__head`},rg={class:`step__label`},ig={key:0,class:`step__icon`},ag={class:`step__body`},og=hh(H({__name:`StepCard`,props:{step:{}},setup(e){let t=e,n=Q(()=>{switch(t.step.runtime.status){case`active`:return`step--active`;case`in_progress`:return`step--in_progress`;case`success`:return`step--done`;case`error`:return`step--error`;default:return``}}),r=Q(()=>{switch(t.step.runtime.status){case`success`:return`✓`;case`error`:return`✗`;case`in_progress`:return`⏳`;default:return``}});return(t,i)=>(G(),K(`div`,{class:j([`step`,n.value])},[J(`div`,ng,[J(`span`,rg,N(e.step.label),1),r.value?(G(),K(`span`,ig,N(r.value),1)):Z(``,!0)]),J(`div`,ag,[U(t.$slots,`action`,{},void 0,!0)])],2))}}),[[`__scopeId`,`data-v-cee6048b`]]),sg={class:`error-actions`},cg={key:0,class:`error-detail`},lg=hh(H({__name:`ErrorPanel`,props:{message:{},detail:{}},emits:[`retry`],setup(e,{emit:t}){let n=t,r=R(!1);return(t,i)=>{let a=qp,o=lf;return G(),q(o,{type:`error`,closable:!1,"show-icon":``},{title:B(()=>[X(N(e.message),1)]),default:B(()=>[J(`div`,sg,[Y(a,{size:`small`,type:`primary`,onClick:i[0]||(i[0]=e=>n(`retry`))},{default:B(()=>[...i[2]||(i[2]=[X(`重试`,-1)])]),_:1}),e.detail?(G(),q(a,{key:0,size:`small`,link:``,onClick:i[1]||(i[1]=e=>r.value=!r.value)},{default:B(()=>[X(N(r.value?`收起详情`:`查看详情`),1)]),_:1})):Z(``,!0)]),r.value&&e.detail?(G(),K(`pre`,cg,N(e.detail),1)):Z(``,!0)]),_:1})}}}),[[`__scopeId`,`data-v-c7c04702`]]),ug={key:0},dg={key:1,class:`in-progress`},fg=[`href`],pg=hh(H({__name:`OauthStep`,props:{step:{},onboarding:{}},setup(e){let t=e,n=R(null);async function r(){t.onboarding.markStepInProgress(t.step.id,`正在打开浏览器…`);try{let e=await Um(t.step.id);e.oauth_url&&t.onboarding.setOauthUrl(t.step.id,e.oauth_url),t.onboarding.markStepInProgress(t.step.id,`请在弹出的浏览器中完成登录…`),i()}catch(e){let n=e;t.onboarding.markStepError(t.step.id,n.message,n.detail)}}async function i(){if(n.value)return;let e=async()=>{try{let r=await Wm(t.step.id);if(r.state===`success`){a(),t.onboarding.markStepSuccess(t.step.id),await t.onboarding.refreshState();return}if(r.error&&!s(r.error)){a(),t.onboarding.markStepError(t.step.id,r.error);return}n.value=window.setTimeout(e,3e3)}catch(e){a();let n=e;t.onboarding.markStepError(t.step.id,n.message,n.detail)}};n.value=window.setTimeout(e,100)}function a(){n.value!==null&&(clearTimeout(n.value),n.value=null)}function o(){a(),r()}function s(e){return e.includes(`context deadline exceeded`)||e.includes(`deadline exceeded`)}function c(e){if(!e)return``;try{let t=new URL(e);return t.protocol===`http:`||t.protocol===`https:`?e:``}catch{return``}}return wr(a),br(()=>{t.step.runtime.status===`in_progress`&&i()}),(t,n)=>{let i=qp,a=Ar(`Loading`),s=cf;return e.step.runtime.status===`active`?(G(),K(`div`,ug,[Y(i,{type:`primary`,onClick:r},{default:B(()=>[...n[0]||(n[0]=[X(`开始`,-1)])]),_:1})])):e.step.runtime.status===`in_progress`?(G(),K(`div`,dg,[Y(s,{class:`is-loading`},{default:B(()=>[Y(a)]),_:1}),J(`span`,null,N(e.step.runtime.stage),1),c(e.step.runtime.oauthUrl)?(G(),K(`a`,{key:0,href:c(e.step.runtime.oauthUrl),target:`_blank`,rel:`noopener noreferrer`,class:`fallback`},` 浏览器没自动打开? 点这里 `,8,fg)):Z(``,!0)])):e.step.runtime.status===`error`?(G(),q(lg,{key:2,message:e.step.runtime.errorMessage||`未知错误`,detail:e.step.runtime.errorDetail,onRetry:o},null,8,[`message`,`detail`])):Z(``,!0)}}}),[[`__scopeId`,`data-v-1c84bc54`]]),mg={key:0},hg={key:1,class:`in-progress`},gg=hh(H({__name:`ActionStep`,props:{step:{},onboarding:{}},setup(e){let t=e;async function n(){t.onboarding.markStepInProgress(t.step.id,`处理中…`);try{if(t.step.id===`vscode_configure`||t.step.id===`codex_desktop_configure`||t.step.id===`opencode_desktop_configure`)await Km();else if(t.step.id===`finalize`)await qm();else throw new Rm(`ActionStep doesn't know step ${t.step.id}`);t.onboarding.markStepSuccess(t.step.id),await t.onboarding.refreshState()}catch(e){let n=e;t.onboarding.markStepError(t.step.id,n.message,n.detail)}}function r(){n()}return br(()=>{t.onboarding.shouldAutoAdvance(t.step)&&n()}),(t,i)=>{let a=qp,o=Ar(`Loading`),s=cf;return e.step.runtime.status===`active`?(G(),K(`div`,mg,[Y(a,{type:`primary`,onClick:n},{default:B(()=>[X(N(e.step.id===`finalize`?`完成`:`开始`),1)]),_:1})])):e.step.runtime.status===`in_progress`?(G(),K(`div`,hg,[Y(s,{class:`is-loading`},{default:B(()=>[Y(o)]),_:1}),J(`span`,null,N(e.step.runtime.stage),1)])):e.step.runtime.status===`error`?(G(),q(lg,{key:2,message:e.step.runtime.errorMessage||`未知错误`,detail:e.step.runtime.errorDetail,onRetry:r},null,8,[`message`,`detail`])):Z(``,!0)}}}),[[`__scopeId`,`data-v-1eb9d389`]]);function _g(e){let t=R([]),n=R(),r=R(!1),i=R(null),a=new EventSource(`/api/events?stream=${encodeURIComponent(e)}`);a.onmessage=e=>{try{let r=JSON.parse(e.data);t.value.push(r),n.value=r}catch(e){i.value=`解析事件失败: `+(e instanceof Error?e.message:String(e))}},a.onerror=()=>{a.readyState===EventSource.CLOSED||a.close(),r.value=!0};function o(){a.close(),r.value=!0}return wa()&&wr(o),{events:t,latest:n,done:r,error:i,close:o}}var vg={key:0},yg={key:1,class:`in-progress`},bg={class:`stage-row`},xg=hh(H({__name:`ProgressStep`,props:{step:{},onboarding:{}},setup(e){let t=e,n=Wt(null),r=R(),i=[];async function a(){c(),t.onboarding.markStepInProgress(t.step.id,`准备中…`),r.value=void 0;try{n.value=_g((await Gm()).stream_id),i=[V(()=>n.value?.latest.value,e=>{e&&(o(e),e.stage===`error`&&(r.value=e.msg||`安装失败`))}),V(()=>n.value?.done.value,async e=>{e&&(await t.onboarding.refreshState(),t.onboarding.steps.value.find(e=>e.id===t.step.id)?.runtime.status===`success`||t.onboarding.markStepError(t.step.id,`安装未完成`,r.value||`请重试;如果仍失败,请查看 launcher 日志获取详情。`))})]}catch(e){let n=e;t.onboarding.markStepError(t.step.id,n.message,n.detail)}}function o(e){let n=e.msg||e.stage||`处理中…`,r=e.total&&e.downloaded!=null?Math.round(e.downloaded/e.total*100):void 0;t.onboarding.updateProgress(t.step.id,{stage:n,percent:r})}function s(){a()}function c(){for(let e of i)e();i=[],n.value?.close(),n.value=null}return br(()=>{t.onboarding.shouldAutoAdvance(t.step)&&a()}),Cr(()=>{c()}),(t,n)=>{let r=qp,i=Ar(`Loading`),o=cf,c=cm;return e.step.runtime.status===`active`?(G(),K(`div`,vg,[Y(r,{type:`primary`,onClick:a},{default:B(()=>[...n[0]||(n[0]=[X(`开始`,-1)])]),_:1})])):e.step.runtime.status===`in_progress`?(G(),K(`div`,yg,[J(`div`,bg,[Y(o,{class:`is-loading`},{default:B(()=>[Y(i)]),_:1}),J(`span`,null,N(e.step.runtime.stage),1)]),typeof e.step.runtime.percent==`number`?(G(),q(c,{key:0,percentage:e.step.runtime.percent,"stroke-width":8},null,8,[`percentage`])):Z(``,!0)])):e.step.runtime.status===`error`?(G(),q(lg,{key:2,message:e.step.runtime.errorMessage||`未知错误`,detail:e.step.runtime.errorDetail,onRetry:s},null,8,[`message`,`detail`])):Z(``,!0)}}}),[[`__scopeId`,`data-v-f7fc6084`]]),Sg={class:`container`};os(hh(H({__name:`App`,setup(e){let t=lh();return br(async()=>{await t.init()}),(e,n)=>{let r=lf;return G(),K(`div`,Sg,[z(t).isComplete.value?(G(),q(tg,{key:0})):(G(),K(W,{key:1},[n[0]||(n[0]=J(`h1`,null,`星池指挥官配置向导`,-1)),z(t).connectionError.value?(G(),q(r,{key:0,type:`error`,title:z(t).connectionError.value,closable:!1,"show-icon":``,class:`conn-error`},null,8,[`title`])):Z(``,!0),(G(!0),K(W,null,Fr(z(t).steps.value,e=>(G(),q(og,{key:e.id,step:e},{action:B(()=>[e.kind===`oauth`&&(e.runtime.status===`active`||e.runtime.status===`in_progress`||e.runtime.status===`error`)?(G(),q(pg,{key:0,step:e,onboarding:z(t)},null,8,[`step`,`onboarding`])):e.kind===`progress`&&(e.runtime.status===`active`||e.runtime.status===`in_progress`||e.runtime.status===`error`)?(G(),q(xg,{key:1,step:e,onboarding:z(t)},null,8,[`step`,`onboarding`])):e.kind===`action`&&(e.runtime.status===`active`||e.runtime.status===`in_progress`||e.runtime.status===`error`)?(G(),q(gg,{key:2,step:e,onboarding:z(t)},null,8,[`step`,`onboarding`])):Z(``,!0)]),_:2},1032,[`step`]))),128))],64))])}}}),[[`__scopeId`,`data-v-d1709252`]])).mount(`#app`); \ No newline at end of file diff --git a/internal/ui/assets/dist/index.html b/internal/ui/assets/dist/index.html index af22580..53e1a1c 100644 --- a/internal/ui/assets/dist/index.html +++ b/internal/ui/assets/dist/index.html @@ -4,8 +4,8 @@ agentserver-app 配置向导 - - + +
diff --git a/internal/ui/console.go b/internal/ui/console.go index 8531473..4b51fa5 100644 --- a/internal/ui/console.go +++ b/internal/ui/console.go @@ -23,6 +23,7 @@ type ConsoleController interface { OpenFrontend(context.Context) error OpenSubscription(context.Context) error LogoutModelserver(context.Context) error + SetCodexModel(context.Context, string) error Quit(context.Context) error UpdateState(context.Context) (updater.State, error) CheckUpdate(context.Context, bool) (updater.State, error) @@ -64,6 +65,9 @@ func (noopConsoleController) OpenSubscription(context.Context) error { return ni func (noopConsoleController) LogoutModelserver(context.Context) error { return nil } +func (noopConsoleController) SetCodexModel(context.Context, string) error { + return errors.New("console: model switch unavailable") +} func (noopConsoleController) Quit(context.Context) error { return nil } func (noopConsoleController) UpdateState(context.Context) (updater.State, error) { return updater.State{}, errors.New("console: updater unavailable") diff --git a/internal/ui/server.go b/internal/ui/server.go index 48ce7fd..0d0a768 100644 --- a/internal/ui/server.go +++ b/internal/ui/server.go @@ -77,6 +77,7 @@ func NewServerWithConsoleToken(o Orchestrator, c ConsoleController, token string mux.HandleFunc("/api/console/open-frontend", s.handleConsoleOpenFrontend) mux.HandleFunc("/api/console/open-subscription", s.handleConsoleOpenSubscription) mux.HandleFunc("/api/console/logout-modelserver", s.handleConsoleLogoutModelserver) + mux.HandleFunc("/api/console/model", s.handleConsoleSetModel) mux.HandleFunc("/api/console/quit", s.handleConsoleQuit) mux.HandleFunc("/api/console/select-folder", s.handleConsoleSelectFolder) mux.HandleFunc("/api/console/slaves", s.handleConsoleSlaves) @@ -629,6 +630,32 @@ func (s *server) handleConsoleLogoutModelserver(w http.ResponseWriter, r *http.R writeJSON(w, 200, map[string]string{"state": "logged_out"}) } +func (s *server) handleConsoleSetModel(w http.ResponseWriter, r *http.Request) { + if !requireMethod(w, r, http.MethodPost) { + return + } + if !s.requireTrustedConsoleMutation(w, r) { + return + } + var body struct { + Model string `json:"model"` + } + if err := json.NewDecoder(http.MaxBytesReader(w, r.Body, 4*1024)).Decode(&body); err != nil { + writeErr(w, 400, err) + return + } + model := strings.TrimSpace(body.Model) + if model == "" { + writeErr(w, 400, errors.New("model required")) + return + } + if err := s.c.SetCodexModel(r.Context(), model); err != nil { + writeErr(w, 400, err) + return + } + writeJSON(w, 200, map[string]string{"state": "set", "model": model}) +} + func (s *server) handleConsoleQuit(w http.ResponseWriter, r *http.Request) { if !requireMethod(w, r, http.MethodPost) { return diff --git a/internal/ui/server_test.go b/internal/ui/server_test.go index d6829f0..0a56a72 100644 --- a/internal/ui/server_test.go +++ b/internal/ui/server_test.go @@ -740,6 +740,44 @@ func TestServerConsoleLogoutModelserverEndpoint(t *testing.T) { } } +func TestServerConsoleSetModelEndpoint(t *testing.T) { + cc := &fakeConsoleController{} + srv := httptest.NewServer(NewServerWithConsole(noopOrchestrator{}, cc)) + defer srv.Close() + resp, err := http.Post(srv.URL+"/api/console/model", "application/json", strings.NewReader(`{"model":"glm-5.2"}`)) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.StatusCode != 200 { + t.Fatalf("status=%d", resp.StatusCode) + } + var body map[string]string + if err := json.NewDecoder(resp.Body).Decode(&body); err != nil { + t.Fatal(err) + } + if body["model"] != "glm-5.2" || body["state"] != "set" { + t.Fatalf("body=%+v", body) + } + if cc.setModelCalled != "glm-5.2" { + t.Fatalf("SetCodexModel not called with glm-5.2, got %q", cc.setModelCalled) + } +} + +func TestServerConsoleSetModelRejectsEmpty(t *testing.T) { + cc := &fakeConsoleController{} + srv := httptest.NewServer(NewServerWithConsole(noopOrchestrator{}, cc)) + defer srv.Close() + resp, err := http.Post(srv.URL+"/api/console/model", "application/json", strings.NewReader(`{"model":""}`)) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.StatusCode != 400 { + t.Fatalf("status=%d, want 400", resp.StatusCode) + } +} + func TestServerConsoleSlavesEndpointReturnsMachineAndSlaves(t *testing.T) { cc := &fakeConsoleController{ machine: slave.Machine{MachineID: "machine-1", ComputerName: "PC"}, @@ -1355,6 +1393,8 @@ type fakeConsoleController struct { installedManifest updater.Manifest installUpdateState updater.State installUpdateErr error + setModelCalled string + setModelErr error } func (f *fakeConsoleController) State(context.Context) (console.State, error) { @@ -1383,6 +1423,10 @@ func (f *fakeConsoleController) LogoutModelserver(context.Context) error { f.loggedOutModelserver = true return nil } +func (f *fakeConsoleController) SetCodexModel(_ context.Context, model string) error { + f.setModelCalled = model + return f.setModelErr +} func (f *fakeConsoleController) Quit(context.Context) error { f.quit = true return nil diff --git a/internal/ui/web/src/__tests__/Dashboard.spec.ts b/internal/ui/web/src/__tests__/Dashboard.spec.ts index edd7a0b..2d28773 100644 --- a/internal/ui/web/src/__tests__/Dashboard.spec.ts +++ b/internal/ui/web/src/__tests__/Dashboard.spec.ts @@ -16,6 +16,12 @@ function consoleState(): api.ConsoleState { { window: '5h', percentage: 58, remaining_percentage: 42 }, { window: '7d', percentage: 22, remaining_percentage: 78 }, ], + current_model: 'gpt-5.5', + available_models: [ + { name: 'gpt-5.5', display_name: 'GPT-5.5' }, + { name: 'deepseek-v4-pro', display_name: 'DeepSeek v4 Pro' }, + { name: 'glm-5.2', display_name: '智谱 GLM-5.2' }, + ], last_refreshed_at: '2026-06-07T12:00:00Z', }; } @@ -69,6 +75,35 @@ describe('Dashboard', () => { }); afterEach(() => vi.useRealTimers()); + it('renders the model selector with the current model preselected', async () => { + mockConsoleState(); + const w = mount(Dashboard); + await flushPromises(); + expect(w.text()).toContain('Codex 模型'); + expect(w.text()).toContain('GPT-5.5'); + expect(w.text()).toContain('智谱 GLM-5.2'); + expect(w.text()).toContain('DeepSeek v4 Pro'); + }); + + it('switches the model via the picker and refreshes state', async () => { + mockConsoleState(); + const setSpy = vi.spyOn(api, 'setConsoleModel').mockResolvedValue({ state: 'set', model: 'glm-5.2' }); + const refreshSpy = vi.spyOn(api, 'refreshConsoleState').mockResolvedValue({ + ...consoleState(), + current_model: 'glm-5.2', + }); + const w = mount(Dashboard); + await flushPromises(); + // Find the underlying radio input whose value is glm-5.2 and click it. + const inputs = w.findAll('.el-radio input'); + const glmInput = inputs.find(i => i.attributes('value') === 'glm-5.2'); + expect(glmInput?.exists()).toBe(true); + await glmInput!.setValue(); + await flushPromises(); + expect(setSpy).toHaveBeenCalledWith('glm-5.2'); + expect(refreshSpy).toHaveBeenCalled(); + }); + it('loads and renders console update state on mount', async () => { const getUpdateSpy = vi.spyOn(api, 'getConsoleUpdate').mockResolvedValue(consoleUpdate({ current_version: '1.2.3', diff --git a/internal/ui/web/src/api.ts b/internal/ui/web/src/api.ts index 8e0064d..68cd0c9 100644 --- a/internal/ui/web/src/api.ts +++ b/internal/ui/web/src/api.ts @@ -43,6 +43,11 @@ export interface ConsoleQuota { resets_at?: string; } +export interface ConsoleModelOption { + name: string; + display_name?: string; +} + export interface ConsoleState { frontend_mode: 'codex_desktop' | 'opencode_desktop' | 'minimal_vscode'; frontend_name: string; @@ -62,6 +67,8 @@ export interface ConsoleState { quotas: ConsoleQuota[]; quota_error?: string; subscription_url?: string; + current_model?: string; + available_models?: ConsoleModelOption[]; last_refreshed_at?: string; } @@ -219,6 +226,13 @@ export const openConsoleSubscription = () => export const logoutConsoleModelserver = () => request<{ state: 'logged_out' }>('/api/console/logout-modelserver', withConsoleToken({ method: 'POST' })); +export const setConsoleModel = (model: string) => + request<{ state: 'set'; model: string }>('/api/console/model', withConsoleToken({ + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ model }), + })); + export const getConsoleSlaves = () => request('/api/console/slaves'); diff --git a/internal/ui/web/src/components/Dashboard.vue b/internal/ui/web/src/components/Dashboard.vue index 7a53ccc..ce33c8b 100644 --- a/internal/ui/web/src/components/Dashboard.vue +++ b/internal/ui/web/src/components/Dashboard.vue @@ -1,7 +1,7 @@