diff --git a/.gitignore b/.gitignore index 248de91..3bc73cd 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,5 @@ cmd/amcs-server/__debug_* bin/ .cache/ OB1/ +ui/node_modules/ +ui/.svelte-kit/ diff --git a/Dockerfile b/Dockerfile index 003e303..5c7913d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,13 @@ +FROM node:22-bookworm AS ui-builder + +WORKDIR /src/ui + +COPY ui/package.json ui/package-lock.json ./ +RUN npm ci + +COPY ui/ ./ +RUN npm run build + FROM golang:1.26.1-bookworm AS builder WORKDIR /src @@ -6,6 +16,7 @@ COPY go.mod go.sum ./ RUN go mod download COPY . . +COPY --from=ui-builder /src/internal/app/ui/dist ./internal/app/ui/dist RUN set -eu; \ VERSION_TAG="$(git describe --tags --exact-match 2>/dev/null || echo dev)"; \ diff --git a/Makefile b/Makefile index dc24f94..386af36 100644 --- a/Makefile +++ b/Makefile @@ -3,6 +3,8 @@ GO_CACHE_DIR := $(CURDIR)/.cache/go-build SERVER_BIN := $(BIN_DIR)/amcs-server CMD_SERVER := ./cmd/amcs-server BUILDINFO_PKG := git.warky.dev/wdevs/amcs/internal/buildinfo +UI_DIR := $(CURDIR)/ui +UI_DIST_DIR := $(CURDIR)/internal/app/ui/dist PATCH_INCREMENT ?= 1 VERSION_TAG ?= $(shell git describe --tags --exact-match 2>/dev/null || echo dev) COMMIT_SHA ?= $(shell git rev-parse --short HEAD 2>/dev/null || echo unknown) @@ -13,15 +15,27 @@ LDFLAGS := -s -w \ -X $(BUILDINFO_PKG).Commit=$(COMMIT_SHA) \ -X $(BUILDINFO_PKG).BuildDate=$(BUILD_DATE) -.PHONY: all build clean migrate release-version test +.PHONY: all build clean migrate release-version test ui-install ui-build ui-dev ui-check all: build -build: +build: ui-build @mkdir -p $(BIN_DIR) go build -ldflags "$(LDFLAGS)" -o $(SERVER_BIN) $(CMD_SERVER) -test: +ui-install: + npm --prefix $(UI_DIR) ci + +ui-build: ui-install + npm --prefix $(UI_DIR) run build + +ui-dev: ui-install + npm --prefix $(UI_DIR) run dev + +ui-check: ui-install + npm --prefix $(UI_DIR) run check + +test: ui-check @mkdir -p $(GO_CACHE_DIR) GOCACHE=$(GO_CACHE_DIR) go test ./... diff --git a/README.md b/README.md index 11fdb3c..719b753 100644 --- a/README.md +++ b/README.md @@ -531,7 +531,33 @@ Run the SQL migrations against a local database with: `DATABASE_URL=postgres://... make migrate` -LLM integration instructions are served at `/llm`. +### Backend + embedded UI build + +The web UI now lives in the top-level `ui/` module and is embedded into the Go binary at build time with `go:embed`. + +- `make build` — builds the Svelte/Tailwind frontend, then compiles the Go server +- `make test` — runs `svelte-check` for the frontend and `go test ./...` for the backend +- `make ui-build` — builds only the frontend into `internal/app/ui/dist` +- `make ui-dev` — starts the Vite dev server with hot reload on `http://localhost:5173` + +### Local UI workflow + +For the normal production-style local flow: + +1. Start the backend: `./scripts/run-local.sh configs/dev.yaml` +2. Open `http://localhost:8080` + +For frontend iteration with hot reload and no Go rebuilds: + +1. Start the backend once: `go run ./cmd/amcs-server --config configs/dev.yaml` +2. In another shell start the UI dev server: `make ui-dev` +3. Open `http://localhost:5173` + +The Vite dev server proxies backend routes such as `/api/status`, `/llm`, `/healthz`, `/readyz`, `/files`, `/mcp`, and the OAuth endpoints back to the Go server on `http://127.0.0.1:8080` by default. Override that target with `AMCS_UI_BACKEND` if needed. + +The root page (`/`) is now the Svelte frontend. It preserves the existing landing-page content and status information by fetching data from `GET /api/status`. + +LLM integration instructions are still served at `/llm`. ## Containers diff --git a/internal/app/app.go b/internal/app/app.go index 939cc0d..adac527 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -212,6 +212,7 @@ func routes(logger *slog.Logger, cfg *config.Config, info buildinfo.Info, db *st mux.HandleFunc("/images/project.jpg", serveHomeImage) mux.HandleFunc("/images/icon.png", serveIcon) mux.HandleFunc("/llm", serveLLMInstructions) + mux.HandleFunc("/api/status", statusAPIHandler(info, accessTracker, oauthEnabled)) mux.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) diff --git a/internal/app/status.go b/internal/app/status.go index 457ddb0..63a590a 100644 --- a/internal/app/status.go +++ b/internal/app/status.go @@ -1,9 +1,11 @@ package app import ( - "fmt" - "html" + "bytes" + "encoding/json" + "io/fs" "net/http" + "path" "strings" "time" @@ -13,131 +15,33 @@ import ( const connectedWindow = 10 * time.Minute -type statusPageData struct { - Version string - BuildDate string - Commit string - ConnectedCount int - TotalKnown int - Entries []auth.AccessSnapshot - OAuthEnabled bool +type statusAPIResponse struct { + Title string `json:"title"` + Description string `json:"description"` + Version string `json:"version"` + BuildDate string `json:"build_date"` + Commit string `json:"commit"` + ConnectedCount int `json:"connected_count"` + TotalKnown int `json:"total_known"` + ConnectedWindow string `json:"connected_window"` + Entries []auth.AccessSnapshot `json:"entries"` + OAuthEnabled bool `json:"oauth_enabled"` } -func renderHomePage(info buildinfo.Info, tracker *auth.AccessTracker, oauthEnabled bool, now time.Time) string { +func statusSnapshot(info buildinfo.Info, tracker *auth.AccessTracker, oauthEnabled bool, now time.Time) statusAPIResponse { entries := tracker.Snapshot() - data := statusPageData{ - Version: fallback(info.Version, "dev"), - BuildDate: fallback(info.BuildDate, "unknown"), - Commit: fallback(info.Commit, "unknown"), - ConnectedCount: tracker.ConnectedCount(now, connectedWindow), - TotalKnown: len(entries), - Entries: entries, - OAuthEnabled: oauthEnabled, + return statusAPIResponse{ + Title: "Avelon Memory Crystal Server (AMCS)", + Description: "AMCS is a memory server that captures, links, and retrieves structured project thoughts for AI assistants using semantic search, summaries, and MCP tools.", + Version: fallback(info.Version, "dev"), + BuildDate: fallback(info.BuildDate, "unknown"), + Commit: fallback(info.Commit, "unknown"), + ConnectedCount: tracker.ConnectedCount(now, connectedWindow), + TotalKnown: len(entries), + ConnectedWindow: "last 10 minutes", + Entries: entries, + OAuthEnabled: oauthEnabled, } - - var b strings.Builder - b.WriteString(` - - - - - AMCS - - - -
- Avelon Memory Crystal project image -
-

Avelon Memory Crystal Server (AMCS)

-

AMCS is a memory server that captures, links, and retrieves structured project thoughts for AI assistants using semantic search, summaries, and MCP tools.

-
- LLM Instructions - Health Check - Readiness Check`) - if data.OAuthEnabled { - b.WriteString(` - OAuth Authorization Server`) - } - b.WriteString(` -
- -
-
- Connected users - ` + fmt.Sprintf("%d", data.ConnectedCount) + ` -
-
- Known principals - ` + fmt.Sprintf("%d", data.TotalKnown) + ` -
-
- Version - ` + html.EscapeString(data.Version) + ` -
-
- -
- Build date: ` + html.EscapeString(data.BuildDate) + `  •  - Commit: ` + html.EscapeString(data.Commit) + `  •  - Connected window: last 10 minutes -
- -

Recent access

`) - if len(data.Entries) == 0 { - b.WriteString(` -

No authenticated access recorded yet.

`) - } else { - b.WriteString(` - - - - - - - - - - `) - for _, entry := range data.Entries { - b.WriteString(` - - - - - - `) - } - b.WriteString(` - -
PrincipalLast accessedLast pathRequests
` + html.EscapeString(entry.KeyID) + `` + html.EscapeString(entry.LastAccessedAt.UTC().Format(time.RFC3339)) + `` + html.EscapeString(entry.LastPath) + `` + fmt.Sprintf("%d", entry.RequestCount) + `
`) - } - b.WriteString(` -
-
- -`) - - return b.String() } func fallback(value, defaultValue string) string { @@ -147,25 +51,90 @@ func fallback(value, defaultValue string) string { return value } -func homeHandler(info buildinfo.Info, tracker *auth.AccessTracker, oauthEnabled bool) http.HandlerFunc { +func statusAPIHandler(info buildinfo.Info, tracker *auth.AccessTracker, oauthEnabled bool) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - if r.URL.Path != "/" { + if r.URL.Path != "/api/status" { http.NotFound(w, r) return } - if r.Method != http.MethodGet && r.Method != http.MethodHead { w.Header().Set("Allow", "GET, HEAD") http.Error(w, "method not allowed", http.StatusMethodNotAllowed) return } - w.Header().Set("Content-Type", "text/html; charset=utf-8") + w.Header().Set("Content-Type", "application/json; charset=utf-8") w.WriteHeader(http.StatusOK) if r.Method == http.MethodHead { return } - _, _ = w.Write([]byte(renderHomePage(info, tracker, oauthEnabled, time.Now()))) + _ = json.NewEncoder(w).Encode(statusSnapshot(info, tracker, oauthEnabled, time.Now())) } } + +func homeHandler(_ buildinfo.Info, _ *auth.AccessTracker, _ bool) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodGet && r.Method != http.MethodHead { + w.Header().Set("Allow", "GET, HEAD") + http.Error(w, "method not allowed", http.StatusMethodNotAllowed) + return + } + + requestPath := strings.TrimPrefix(path.Clean(r.URL.Path), "/") + if requestPath == "." { + requestPath = "" + } + + if requestPath != "" { + if serveUIAsset(w, r, requestPath) { + return + } + http.NotFound(w, r) + return + } + + serveUIIndex(w, r) + } +} + +func serveUIAsset(w http.ResponseWriter, r *http.Request, name string) bool { + if uiDistFS == nil { + return false + } + if strings.Contains(name, "..") { + return false + } + file, err := uiDistFS.Open(name) + if err != nil { + return false + } + defer file.Close() + + info, err := file.Stat() + if err != nil || info.IsDir() { + return false + } + + data, err := fs.ReadFile(uiDistFS, name) + if err != nil { + return false + } + + http.ServeContent(w, r, info.Name(), info.ModTime(), bytes.NewReader(data)) + return true +} + +func serveUIIndex(w http.ResponseWriter, r *http.Request) { + if indexHTML == nil { + http.Error(w, "ui assets not built", http.StatusServiceUnavailable) + return + } + + w.Header().Set("Content-Type", "text/html; charset=utf-8") + w.WriteHeader(http.StatusOK) + if r.Method == http.MethodHead { + return + } + _, _ = w.Write(indexHTML) +} diff --git a/internal/app/status_test.go b/internal/app/status_test.go index 9c1a67d..d3255e3 100644 --- a/internal/app/status_test.go +++ b/internal/app/status_test.go @@ -1,6 +1,7 @@ package app import ( + "encoding/json" "io" "log/slog" "net/http" @@ -14,29 +15,62 @@ import ( "git.warky.dev/wdevs/amcs/internal/config" ) -func TestRenderHomePageHidesOAuthLinkWhenDisabled(t *testing.T) { +func TestStatusSnapshotHidesOAuthLinkWhenDisabled(t *testing.T) { tracker := auth.NewAccessTracker() - page := renderHomePage(buildinfo.Info{Version: "v1.2.3", BuildDate: "2026-04-04", Commit: "abc123"}, tracker, false, time.Date(2026, 4, 4, 12, 0, 0, 0, time.UTC)) + snapshot := statusSnapshot(buildinfo.Info{Version: "v1.2.3", BuildDate: "2026-04-04", Commit: "abc123"}, tracker, false, time.Date(2026, 4, 4, 12, 0, 0, 0, time.UTC)) - if strings.Contains(page, "/oauth-authorization-server") { - t.Fatal("page unexpectedly contains OAuth link") + if snapshot.OAuthEnabled { + t.Fatal("OAuthEnabled = true, want false") } - if !strings.Contains(page, "Connected users") { - t.Fatal("page missing Connected users stat") + if snapshot.ConnectedCount != 0 { + t.Fatalf("ConnectedCount = %d, want 0", snapshot.ConnectedCount) + } + if snapshot.Title == "" { + t.Fatal("Title = empty, want non-empty") } } -func TestRenderHomePageShowsTrackedAccess(t *testing.T) { +func TestStatusSnapshotShowsTrackedAccess(t *testing.T) { tracker := auth.NewAccessTracker() now := time.Date(2026, 4, 4, 12, 0, 0, 0, time.UTC) tracker.Record("client-a", "/files", "127.0.0.1:1234", "tester", now) - page := renderHomePage(buildinfo.Info{Version: "v1.2.3"}, tracker, true, now) + snapshot := statusSnapshot(buildinfo.Info{Version: "v1.2.3"}, tracker, true, now) - for _, needle := range []string{"client-a", "/files", "1", "/oauth-authorization-server"} { - if !strings.Contains(page, needle) { - t.Fatalf("page missing %q", needle) - } + if !snapshot.OAuthEnabled { + t.Fatal("OAuthEnabled = false, want true") + } + if snapshot.ConnectedCount != 1 { + t.Fatalf("ConnectedCount = %d, want 1", snapshot.ConnectedCount) + } + if len(snapshot.Entries) != 1 { + t.Fatalf("len(Entries) = %d, want 1", len(snapshot.Entries)) + } + if snapshot.Entries[0].KeyID != "client-a" || snapshot.Entries[0].LastPath != "/files" { + t.Fatalf("entry = %+v, want keyID client-a and path /files", snapshot.Entries[0]) + } +} + +func TestStatusAPIHandlerReturnsJSON(t *testing.T) { + handler := statusAPIHandler(buildinfo.Info{Version: "v1"}, auth.NewAccessTracker(), true) + req := httptest.NewRequest(http.MethodGet, "/api/status", nil) + rec := httptest.NewRecorder() + + handler.ServeHTTP(rec, req) + + if rec.Code != http.StatusOK { + t.Fatalf("status = %d, want %d", rec.Code, http.StatusOK) + } + if got := rec.Header().Get("Content-Type"); !strings.Contains(got, "application/json") { + t.Fatalf("content-type = %q, want application/json", got) + } + + var payload statusAPIResponse + if err := json.Unmarshal(rec.Body.Bytes(), &payload); err != nil { + t.Fatalf("json.Unmarshal() error = %v", err) + } + if payload.Version != "v1" { + t.Fatalf("version = %q, want %q", payload.Version, "v1") } } @@ -55,6 +89,21 @@ func TestHomeHandlerAllowsHead(t *testing.T) { } } +func TestHomeHandlerServesIndex(t *testing.T) { + handler := homeHandler(buildinfo.Info{Version: "v1"}, auth.NewAccessTracker(), false) + req := httptest.NewRequest(http.MethodGet, "/", nil) + rec := httptest.NewRecorder() + + handler.ServeHTTP(rec, req) + + if rec.Code != http.StatusOK { + t.Fatalf("status = %d, want %d", rec.Code, http.StatusOK) + } + if !strings.Contains(rec.Body.String(), "
") { + t.Fatalf("body = %q, want embedded UI index", rec.Body.String()) + } +} + func TestMiddlewareRecordsAuthenticatedAccess(t *testing.T) { keyring, err := auth.NewKeyring([]config.APIKey{{ID: "client-a", Value: "secret"}}) if err != nil { diff --git a/internal/app/ui/dist/assets/index-BDhMN0_9.css b/internal/app/ui/dist/assets/index-BDhMN0_9.css new file mode 100644 index 0000000..2772c33 --- /dev/null +++ b/internal/app/ui/dist/assets/index-BDhMN0_9.css @@ -0,0 +1 @@ +/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-emerald-400:oklch(76.5% .177 163.223);--color-cyan-100:oklch(95.6% .045 203.388);--color-cyan-200:oklch(91.7% .08 205.041);--color-cyan-300:oklch(86.5% .127 207.078);--color-cyan-400:oklch(78.9% .154 211.53);--color-violet-100:oklch(94.3% .029 294.588);--color-violet-300:oklch(81.1% .111 293.571);--color-violet-400:oklch(70.2% .183 293.541);--color-rose-100:oklch(94.1% .03 12.58);--color-rose-400:oklch(71.2% .194 13.428);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-900:oklch(20.8% .042 265.755);--color-slate-950:oklch(12.9% .042 264.695);--color-white:#fff;--spacing:.25rem;--container-3xl:48rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.mx-auto{margin-inline:auto}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-6{margin-top:calc(var(--spacing) * 6)}.flex{display:flex}.grid{display:grid}.inline-flex{display:inline-flex}.h-2{height:calc(var(--spacing) * 2)}.h-64{height:calc(var(--spacing) * 64)}.min-h-screen{min-height:100vh}.w-2{width:calc(var(--spacing) * 2)}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.max-w-7xl{max-width:var(--container-7xl)}.min-w-full{min-width:100%}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-8{gap:calc(var(--spacing) * 8)}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-white\/5>:not(:last-child)){border-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){:where(.divide-white\/5>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}:where(.divide-white\/10>:not(:last-child)){border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){:where(.divide-white\/10>:not(:last-child)){border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-cyan-300\/20{border-color:#53eafd33}@supports (color:color-mix(in lab,red,red)){.border-cyan-300\/20{border-color:color-mix(in oklab,var(--color-cyan-300) 20%,transparent)}}.border-cyan-400\/20{border-color:#00d2ef33}@supports (color:color-mix(in lab,red,red)){.border-cyan-400\/20{border-color:color-mix(in oklab,var(--color-cyan-400) 20%,transparent)}}.border-rose-400\/30{border-color:#ff667f4d}@supports (color:color-mix(in lab,red,red)){.border-rose-400\/30{border-color:color-mix(in oklab,var(--color-rose-400) 30%,transparent)}}.border-violet-300\/20{border-color:#c4b4ff33}@supports (color:color-mix(in lab,red,red)){.border-violet-300\/20{border-color:color-mix(in oklab,var(--color-violet-300) 20%,transparent)}}.border-white\/10{border-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.border-white\/10{border-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.bg-cyan-400\/10{background-color:#00d2ef1a}@supports (color:color-mix(in lab,red,red)){.bg-cyan-400\/10{background-color:color-mix(in oklab,var(--color-cyan-400) 10%,transparent)}}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-rose-400\/10{background-color:#ff667f1a}@supports (color:color-mix(in lab,red,red)){.bg-rose-400\/10{background-color:color-mix(in oklab,var(--color-rose-400) 10%,transparent)}}.bg-slate-900{background-color:var(--color-slate-900)}.bg-slate-900\/80{background-color:#0f172bcc}@supports (color:color-mix(in lab,red,red)){.bg-slate-900\/80{background-color:color-mix(in oklab,var(--color-slate-900) 80%,transparent)}}.bg-slate-950{background-color:var(--color-slate-950)}.bg-slate-950\/30{background-color:#0206184d}@supports (color:color-mix(in lab,red,red)){.bg-slate-950\/30{background-color:color-mix(in oklab,var(--color-slate-950) 30%,transparent)}}.bg-slate-950\/40{background-color:#02061866}@supports (color:color-mix(in lab,red,red)){.bg-slate-950\/40{background-color:color-mix(in oklab,var(--color-slate-950) 40%,transparent)}}.bg-slate-950\/50{background-color:#02061880}@supports (color:color-mix(in lab,red,red)){.bg-slate-950\/50{background-color:color-mix(in oklab,var(--color-slate-950) 50%,transparent)}}.bg-violet-400\/10{background-color:#a685ff1a}@supports (color:color-mix(in lab,red,red)){.bg-violet-400\/10{background-color:color-mix(in oklab,var(--color-violet-400) 10%,transparent)}}.bg-white\/5{background-color:#ffffff0d}@supports (color:color-mix(in lab,red,red)){.bg-white\/5{background-color:color-mix(in oklab,var(--color-white) 5%,transparent)}}.object-cover{object-fit:cover}.object-center{object-position:center}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-10{padding-block:calc(var(--spacing) * 10)}.text-center{text-align:center}.text-left{text-align:left}.align-top{vertical-align:top}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-7{--tw-leading:calc(var(--spacing) * 7);line-height:calc(var(--spacing) * 7)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.2em\]{--tw-tracking:.2em;letter-spacing:.2em}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.break-all{word-break:break-all}.text-cyan-100{color:var(--color-cyan-100)}.text-cyan-200{color:var(--color-cyan-200)}.text-rose-100{color:var(--color-rose-100)}.text-rose-100\/80{color:#ffe4e6cc}@supports (color:color-mix(in lab,red,red)){.text-rose-100\/80{color:color-mix(in oklab,var(--color-rose-100) 80%,transparent)}}.text-slate-100{color:var(--color-slate-100)}.text-slate-200{color:var(--color-slate-200)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-violet-100{color:var(--color-violet-100)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-slate-950\/20{--tw-shadow-color:#02061833}@supports (color:color-mix(in lab,red,red)){.shadow-slate-950\/20{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-slate-950) 20%, transparent) var(--tw-shadow-alpha), transparent)}}.shadow-slate-950\/40{--tw-shadow-color:#02061866}@supports (color:color-mix(in lab,red,red)){.shadow-slate-950\/40{--tw-shadow-color:color-mix(in oklab, color-mix(in oklab, var(--color-slate-950) 40%, transparent) var(--tw-shadow-alpha), transparent)}}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media(hover:hover){.hover\:border-cyan-300\/40:hover{border-color:#53eafd66}@supports (color:color-mix(in lab,red,red)){.hover\:border-cyan-300\/40:hover{border-color:color-mix(in oklab,var(--color-cyan-300) 40%,transparent)}}.hover\:border-violet-300\/40:hover{border-color:#c4b4ff66}@supports (color:color-mix(in lab,red,red)){.hover\:border-violet-300\/40:hover{border-color:color-mix(in oklab,var(--color-violet-300) 40%,transparent)}}.hover\:bg-cyan-400\/20:hover{background-color:#00d2ef33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-cyan-400\/20:hover{background-color:color-mix(in oklab,var(--color-cyan-400) 20%,transparent)}}.hover\:bg-violet-400\/20:hover{background-color:#a685ff33}@supports (color:color-mix(in lab,red,red)){.hover\:bg-violet-400\/20:hover{background-color:color-mix(in oklab,var(--color-violet-400) 20%,transparent)}}.hover\:bg-white\/10:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/10:hover{background-color:color-mix(in oklab,var(--color-white) 10%,transparent)}}.hover\:bg-white\/\[0\.03\]:hover{background-color:#ffffff08}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/\[0\.03\]:hover{background-color:color-mix(in oklab,var(--color-white) 3%,transparent)}}}@media(min-width:40rem){.sm\:h-80{height:calc(var(--spacing) * 80)}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-end{align-items:flex-end}.sm\:justify-between{justify-content:space-between}.sm\:p-8{padding:calc(var(--spacing) * 8)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.sm\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}}@media(min-width:64rem){.lg\:grid-cols-\[1\.6fr_1fr\]{grid-template-columns:1.6fr 1fr}.lg\:p-10{padding:calc(var(--spacing) * 10)}.lg\:px-8{padding-inline:calc(var(--spacing) * 8)}}}:root{color-scheme:dark;font-family:Inter,system-ui,sans-serif}html,body,#app{min-height:100%}body{margin:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000} diff --git a/internal/app/ui/dist/assets/index-CIozj4p7.js b/internal/app/ui/dist/assets/index-CIozj4p7.js new file mode 100644 index 0000000..109f60e --- /dev/null +++ b/internal/app/ui/dist/assets/index-CIozj4p7.js @@ -0,0 +1 @@ +var Br=Object.defineProperty;var bn=e=>{throw TypeError(e)};var Ur=(e,t,n)=>t in e?Br(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var be=(e,t,n)=>Ur(e,typeof t!="symbol"?t+"":t,n),Bt=(e,t,n)=>t.has(e)||bn("Cannot "+n);var c=(e,t,n)=>(Bt(e,t,"read from private field"),n?n.call(e):t.get(e)),M=(e,t,n)=>t.has(e)?bn("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,n),De=(e,t,n,r)=>(Bt(e,t,"write to private field"),r?r.call(e,n):t.set(e,n),n),U=(e,t,n)=>(Bt(e,t,"access private method"),n);(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))r(s);new MutationObserver(s=>{for(const i of s)if(i.type==="childList")for(const a of i.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&r(a)}).observe(document,{childList:!0,subtree:!0});function n(s){const i={};return s.integrity&&(i.integrity=s.integrity),s.referrerPolicy&&(i.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?i.credentials="include":s.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function r(s){if(s.ep)return;s.ep=!0;const i=n(s);fetch(s.href,i)}})();const Vr="5";var In;typeof window<"u"&&((In=window.__svelte??(window.__svelte={})).v??(In.v=new Set)).add(Vr);let pt=!1,Yr=!1;function Kr(){pt=!0}Kr();const Gr=1,Wr=2,Ln=4,$r=8,Xr=16,Zr=2,F=Symbol(),Pn="http://www.w3.org/1999/xhtml",Jr=!1;var jn=Array.isArray,Qr=Array.prototype.indexOf,$e=Array.prototype.includes,rn=Array.from,es=Object.defineProperty,Ut=Object.getOwnPropertyDescriptor,qn=Object.getOwnPropertyDescriptors,ts=Object.prototype,ns=Array.prototype,sn=Object.getPrototypeOf;const rs=()=>{};function ss(e){return e()}function Gt(e){for(var t=0;t{e=r,t=s});return{promise:n,resolve:e,reject:t}}const I=2,Xe=4,qt=8,Hn=1<<24,we=16,se=32,Ze=64,is=128,X=512,N=1024,P=2048,ue=4096,B=8192,Z=16384,ze=32768,yn=1<<25,it=65536,Wt=1<<17,Bn=1<<18,_t=1<<19,Un=1<<20,fe=1<<25,je=65536,$t=1<<21,zt=1<<22,Te=1<<23,st=Symbol("$state"),pe=new class extends Error{constructor(){super(...arguments);be(this,"name","StaleReactionError");be(this,"message","The reaction that called `getAbortSignal()` was re-run or destroyed")}};function ls(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function as(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function os(e,t,n){throw new Error("https://svelte.dev/e/each_key_duplicate")}function fs(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function us(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function cs(e){throw new Error("https://svelte.dev/e/effect_orphan")}function ds(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function vs(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function hs(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function ps(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function Vn(e){return e===this.v}function _s(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e=="object"||typeof e=="function"}function Yn(e){return!_s(e,this.v)}let D=null;function Dt(e){D=e}function gs(e,t=!1,n){D={p:D,i:!1,c:null,e:null,s:e,x:null,r:E,l:pt&&!t?{s:null,u:null,$:[]}:null}}function ms(e){var t=D,n=t.e;if(n!==null){t.e=null;for(var r of n)fr(r)}return t.i=!0,D=t.p,{}}function gt(){return!pt||D!==null&&D.l===null}let Ue=[];function ws(){var e=Ue;Ue=[],Gt(e)}function It(e){if(Ue.length===0){var t=Ue;queueMicrotask(()=>{t===Ue&&ws()})}Ue.push(e)}function xs(e){var t=E;if(t===null)return m.f|=Te,e;if((t.f&ze)===0&&(t.f&Xe)===0)throw e;Ft(e,t)}function Ft(e,t){for(;t!==null;){if((t.f&is)!==0){if((t.f&ze)===0)throw e;try{t.b.error(e);return}catch(n){e=n}}t=t.parent}throw e}const bs=-7169;function C(e,t){e.f=e.f&bs|t}function ln(e){(e.f&X)!==0||e.deps===null?C(e,N):C(e,ue)}function Kn(e){if(e!==null)for(const t of e)(t.f&I)===0||(t.f&je)===0||(t.f^=je,Kn(t.deps))}function ys(e,t,n){(e.f&P)!==0?t.add(e):(e.f&ue)!==0&&n.add(e),Kn(e.deps),C(e,N)}const ye=new Set;let w=null,L=null,Xt=null,Vt=!1,Ve=null,Mt=null;var En=0;let Es=1;var Ke,Ge,_e,le,ct,K,dt,Se,ge,ae,We,Fe,O,Ct,Gn,Rt,Zt,Jt,Wn;const Pt=class Pt{constructor(){M(this,O);be(this,"id",Es++);be(this,"current",new Map);be(this,"previous",new Map);M(this,Ke,new Set);M(this,Ge,new Set);M(this,_e,new Map);M(this,le,new Map);M(this,ct,null);M(this,K,[]);M(this,dt,[]);M(this,Se,new Set);M(this,ge,new Set);M(this,ae,new Map);be(this,"is_fork",!1);M(this,We,!1);M(this,Fe,new Set)}skip_effect(t){c(this,ae).has(t)||c(this,ae).set(t,{d:[],m:[]})}unskip_effect(t){var n=c(this,ae).get(t);if(n){c(this,ae).delete(t);for(var r of n.d)C(r,P),this.schedule(r);for(r of n.m)C(r,ue),this.schedule(r)}}capture(t,n,r=!1){n!==F&&!this.previous.has(t)&&this.previous.set(t,n),(t.f&Te)===0&&(this.current.set(t,[t.v,r]),L==null||L.set(t,t.v))}activate(){w=this}deactivate(){w=null,L=null}flush(){try{Vt=!0,w=this,U(this,O,Rt).call(this)}finally{En=0,Xt=null,Ve=null,Mt=null,Vt=!1,w=null,L=null,Me.clear()}}discard(){for(const t of c(this,Ge))t(this);c(this,Ge).clear(),ye.delete(this)}register_created_effect(t){c(this,dt).push(t)}increment(t,n){let r=c(this,_e).get(n)??0;if(c(this,_e).set(n,r+1),t){let s=c(this,le).get(n)??0;c(this,le).set(n,s+1)}}decrement(t,n,r){let s=c(this,_e).get(n)??0;if(s===1?c(this,_e).delete(n):c(this,_e).set(n,s-1),t){let i=c(this,le).get(n)??0;i===1?c(this,le).delete(n):c(this,le).set(n,i-1)}c(this,We)||r||(De(this,We,!0),It(()=>{De(this,We,!1),this.flush()}))}transfer_effects(t,n){for(const r of t)c(this,Se).add(r);for(const r of n)c(this,ge).add(r);t.clear(),n.clear()}oncommit(t){c(this,Ke).add(t)}ondiscard(t){c(this,Ge).add(t)}settled(){return(c(this,ct)??De(this,ct,zn())).promise}static ensure(){if(w===null){const t=w=new Pt;Vt||(ye.add(w),It(()=>{w===t&&t.flush()}))}return w}apply(){{L=null;return}}schedule(t){var s;if(Xt=t,(s=t.b)!=null&&s.is_pending&&(t.f&(Xe|qt|Hn))!==0&&(t.f&ze)===0){t.b.defer_effect(t);return}for(var n=t;n.parent!==null;){n=n.parent;var r=n.f;if(Ve!==null&&n===E&&(m===null||(m.f&I)===0))return;if((r&(Ze|se))!==0){if((r&N)===0)return;n.f^=N}}c(this,K).push(n)}};Ke=new WeakMap,Ge=new WeakMap,_e=new WeakMap,le=new WeakMap,ct=new WeakMap,K=new WeakMap,dt=new WeakMap,Se=new WeakMap,ge=new WeakMap,ae=new WeakMap,We=new WeakMap,Fe=new WeakMap,O=new WeakSet,Ct=function(){return this.is_fork||c(this,le).size>0},Gn=function(){for(const r of c(this,Fe))for(const s of c(r,le).keys()){for(var t=!1,n=s;n.parent!==null;){if(c(this,ae).has(n)){t=!0;break}n=n.parent}if(!t)return!0}return!1},Rt=function(){var f,l;if(En++>1e3&&(ye.delete(this),ks()),!U(this,O,Ct).call(this)){for(const o of c(this,Se))c(this,ge).delete(o),C(o,P),this.schedule(o);for(const o of c(this,ge))C(o,ue),this.schedule(o)}const t=c(this,K);De(this,K,[]),this.apply();var n=Ve=[],r=[],s=Mt=[];for(const o of t)try{U(this,O,Zt).call(this,o,n,r)}catch(u){throw Zn(o),u}if(w=null,s.length>0){var i=Pt.ensure();for(const o of s)i.schedule(o)}if(Ve=null,Mt=null,U(this,O,Ct).call(this)||U(this,O,Gn).call(this)){U(this,O,Jt).call(this,r),U(this,O,Jt).call(this,n);for(const[o,u]of c(this,ae))Xn(o,u)}else{c(this,_e).size===0&&ye.delete(this),c(this,Se).clear(),c(this,ge).clear();for(const o of c(this,Ke))o(this);c(this,Ke).clear(),kn(r),kn(n),(f=c(this,ct))==null||f.resolve()}var a=w;if(c(this,K).length>0){const o=a??(a=this);c(o,K).push(...c(this,K).filter(u=>!c(o,K).includes(u)))}a!==null&&(ye.add(a),U(l=a,O,Rt).call(l)),ye.has(this)||U(this,O,Wn).call(this)},Zt=function(t,n,r){t.f^=N;for(var s=t.first;s!==null;){var i=s.f,a=(i&(se|Ze))!==0,f=a&&(i&N)!==0,l=f||(i&B)!==0||c(this,ae).has(s);if(!l&&s.fn!==null){a?s.f^=N:(i&Xe)!==0?n.push(s):mt(s)&&((i&we)!==0&&c(this,ge).add(s),Je(s));var o=s.first;if(o!==null){s=o;continue}}for(;s!==null;){var u=s.next;if(u!==null){s=u;break}s=s.parent}}},Jt=function(t){for(var n=0;n!this.current.has(h));if(s.length===0)t&&p.discard();else if(n.length>0){p.activate();var i=new Set,a=new Map;for(var f of n)$n(f,s,i,a);a=new Map;var l=[...p.current.keys()].filter(h=>this.current.has(h)?this.current.get(h)[0]!==h:!0);for(const h of c(this,dt))(h.f&(Z|B|Wt))===0&&an(h,l,a)&&((h.f&(zt|we))!==0?(C(h,P),p.schedule(h)):c(p,Se).add(h));if(c(p,K).length>0){p.apply();for(var o of c(p,K))U(u=p,O,Zt).call(u,o,[],[]);De(p,K,[])}p.deactivate()}}for(const p of ye)c(p,Fe).has(this)&&(c(p,Fe).delete(this),c(p,Fe).size===0&&!U(_=p,O,Ct).call(_)&&(p.activate(),U(d=p,O,Rt).call(d)))};let lt=Pt;function ks(){try{ds()}catch(e){Ft(e,Xt)}}let te=null;function kn(e){var t=e.length;if(t!==0){for(var n=0;n0)){Me.clear();for(const s of te){if((s.f&(Z|B))!==0)continue;const i=[s];let a=s.parent;for(;a!==null;)te.has(a)&&(te.delete(a),i.push(a)),a=a.parent;for(let f=i.length-1;f>=0;f--){const l=i[f];(l.f&(Z|B))===0&&Je(l)}}te.clear()}}te=null}}function $n(e,t,n,r){if(!n.has(e)&&(n.add(e),e.reactions!==null))for(const s of e.reactions){const i=s.f;(i&I)!==0?$n(s,t,n,r):(i&(zt|we))!==0&&(i&P)===0&&an(s,t,r)&&(C(s,P),on(s))}}function an(e,t,n){const r=n.get(e);if(r!==void 0)return r;if(e.deps!==null)for(const s of e.deps){if($e.call(t,s))return!0;if((s.f&I)!==0&&an(s,t,n))return n.set(s,!0),!0}return n.set(e,!1),!1}function on(e){w.schedule(e)}function Xn(e,t){if(!((e.f&se)!==0&&(e.f&N)!==0)){(e.f&P)!==0?t.d.push(e):(e.f&ue)!==0&&t.m.push(e),C(e,N);for(var n=e.first;n!==null;)Xn(n,t),n=n.next}}function Zn(e){C(e,N);for(var t=e.first;t!==null;)Zn(t),t=t.next}function As(e,t,n,r){const s=gt()?fn:Qn;var i=e.filter(d=>!d.settled);if(n.length===0&&i.length===0){r(t.map(s));return}var a=E,f=Ss(),l=i.length===1?i[0].promise:i.length>1?Promise.all(i.map(d=>d.promise)):null;function o(d){f();try{r(d)}catch(p){(a.f&Z)===0&&Ft(p,a)}Lt()}if(n.length===0){l.then(()=>o(t.map(s)));return}var u=Jn();function _(){Promise.all(n.map(d=>Ts(d))).then(d=>o([...t.map(s),...d])).catch(d=>Ft(d,a)).finally(()=>u())}l?l.then(()=>{f(),_(),Lt()}):_()}function Ss(){var e=E,t=m,n=D,r=w;return function(i=!0){Ce(e),ce(t),Dt(n),i&&(e.f&Z)===0&&(r==null||r.activate(),r==null||r.apply())}}function Lt(e=!0){Ce(null),ce(null),Dt(null),e&&(w==null||w.deactivate())}function Jn(){var e=E,t=e.b,n=w,r=t.is_rendered();return t.update_pending_count(1,n),n.increment(r,e),(s=!1)=>{t.update_pending_count(-1,n),n.decrement(r,e,s)}}function fn(e){var t=I|P,n=m!==null&&(m.f&I)!==0?m:null;return E!==null&&(E.f|=_t),{ctx:D,deps:null,effects:null,equals:Vn,f:t,fn:e,reactions:null,rv:0,v:F,wv:0,parent:n??E,ac:null}}function Ts(e,t,n){let r=E;r===null&&as();var s=void 0,i=at(F),a=!m,f=new Map;return Hs(()=>{var p;var l=E,o=zn();s=o.promise;try{Promise.resolve(e()).then(o.resolve,o.reject).finally(Lt)}catch(h){o.reject(h),Lt()}var u=w;if(a){if((l.f&ze)!==0)var _=Jn();if(r.b.is_rendered())(p=f.get(u))==null||p.reject(pe),f.delete(u);else{for(const h of f.values())h.reject(pe);f.clear()}f.set(u,o)}const d=(h,k=void 0)=>{if(_){var v=k===pe;_(v)}if(!(k===pe||(l.f&Z)!==0)){if(u.activate(),k)i.f|=Te,ot(i,k);else{(i.f&Te)!==0&&(i.f^=Te),ot(i,h);for(const[x,S]of f){if(f.delete(x),x===u)break;S.reject(pe)}}u.deactivate()}};o.promise.then(d,h=>d(null,h||"unknown"))}),or(()=>{for(const l of f.values())l.reject(pe)}),new Promise(l=>{function o(u){function _(){u===s?l(i):o(s)}u.then(_,_)}o(s)})}function Qn(e){const t=fn(e);return t.equals=Yn,t}function Ms(e){var t=e.effects;if(t!==null){e.effects=null;for(var n=0;n0&&!nr&&Os()}return t}function Os(){nr=!1;for(const e of Qt)(e.f&N)!==0&&C(e,ue),mt(e)&&Je(e);Qt.clear()}function Yt(e){$(e,e.v+1)}function rr(e,t,n){var r=e.reactions;if(r!==null)for(var s=gt(),i=r.length,a=0;a{if(Pe===i)return f();var l=m,o=Pe;ce(null),Sn(i);var u=f();return ce(l),Sn(o),u};return r&&n.set("length",Ee(e.length)),new Proxy(e,{defineProperty(f,l,o){(!("value"in o)||o.configurable===!1||o.enumerable===!1||o.writable===!1)&&vs();var u=n.get(l);return u===void 0?a(()=>{var _=Ee(o.value);return n.set(l,_),_}):$(u,o.value,!0),!0},deleteProperty(f,l){var o=n.get(l);if(o===void 0){if(l in f){const u=a(()=>Ee(F));n.set(l,u),Yt(s)}}else $(o,F),Yt(s);return!0},get(f,l,o){var p;if(l===st)return e;var u=n.get(l),_=l in f;if(u===void 0&&(!_||(p=Ut(f,l))!=null&&p.writable)&&(u=a(()=>{var h=nt(_?f[l]:F),k=Ee(h);return k}),n.set(l,u)),u!==void 0){var d=y(u);return d===F?void 0:d}return Reflect.get(f,l,o)},getOwnPropertyDescriptor(f,l){var o=Reflect.getOwnPropertyDescriptor(f,l);if(o&&"value"in o){var u=n.get(l);u&&(o.value=y(u))}else if(o===void 0){var _=n.get(l),d=_==null?void 0:_.v;if(_!==void 0&&d!==F)return{enumerable:!0,configurable:!0,value:d,writable:!0}}return o},has(f,l){var d;if(l===st)return!0;var o=n.get(l),u=o!==void 0&&o.v!==F||Reflect.has(f,l);if(o!==void 0||E!==null&&(!u||(d=Ut(f,l))!=null&&d.writable)){o===void 0&&(o=a(()=>{var p=u?nt(f[l]):F,h=Ee(p);return h}),n.set(l,o));var _=y(o);if(_===F)return!1}return u},set(f,l,o,u){var T;var _=n.get(l),d=l in f;if(r&&l==="length")for(var p=o;p<_.v;p+=1){var h=n.get(p+"");h!==void 0?$(h,F):p in f&&(h=a(()=>Ee(F)),n.set(p+"",h))}if(_===void 0)(!d||(T=Ut(f,l))!=null&&T.writable)&&(_=a(()=>Ee(void 0)),$(_,nt(o)),n.set(l,_));else{d=_.v!==F;var k=a(()=>nt(o));$(_,k)}var v=Reflect.getOwnPropertyDescriptor(f,l);if(v!=null&&v.set&&v.set.call(u,o),!d){if(r&&typeof l=="string"){var x=n.get("length"),S=Number(l);Number.isInteger(S)&&S>=x.v&&$(x,S+1)}Yt(s)}return!0},ownKeys(f){y(s);var l=Reflect.ownKeys(f).filter(_=>{var d=n.get(_);return d===void 0||d.v!==F});for(var[o,u]of n)u.v!==F&&!(o in f)&&l.push(o);return l},setPrototypeOf(){hs()}})}var Ns,Ds,Is,Fs;function Ye(e=""){return document.createTextNode(e)}function sr(e){return Is.call(e)}function Ht(e){return Fs.call(e)}function g(e,t){return sr(e)}function A(e,t=1,n=!1){let r=e;for(;t--;)r=Ht(r);return r}function Ls(e){e.textContent=""}function ir(){return!1}function Ps(e,t,n){return document.createElementNS(Pn,e,void 0)}function cn(e){var t=m,n=E;ce(null),Ce(null);try{return e()}finally{ce(t),Ce(n)}}function lr(e){E===null&&(m===null&&cs(),us()),qe&&fs()}function js(e,t){var n=t.last;n===null?t.last=t.first=e:(n.next=e,e.prev=n,t.last=e)}function Re(e,t){var n=E;n!==null&&(n.f&B)!==0&&(e|=B);var r={ctx:D,deps:null,nodes:null,f:e|P|X,first:null,fn:t,last:null,next:null,parent:n,b:n&&n.b,prev:null,teardown:null,wv:0,ac:null};w==null||w.register_created_effect(r);var s=r;if((e&Xe)!==0)Ve!==null?Ve.push(r):lt.ensure().schedule(r);else if(t!==null){try{Je(r)}catch(a){throw me(r),a}s.deps===null&&s.teardown===null&&s.nodes===null&&s.first===s.last&&(s.f&_t)===0&&(s=s.first,(e&we)!==0&&(e&it)!==0&&s!==null&&(s.f|=it))}if(s!==null&&(s.parent=n,n!==null&&js(s,n),m!==null&&(m.f&I)!==0&&(e&Ze)===0)){var i=m;(i.effects??(i.effects=[])).push(s)}return r}function ar(){return m!==null&&!re}function or(e){const t=Re(qt,null);return C(t,N),t.teardown=e,t}function en(e){lr();var t=E.f,n=!m&&(t&se)!==0&&(t&ze)===0;if(n){var r=D;(r.e??(r.e=[])).push(e)}else return fr(e)}function fr(e){return Re(Xe|Un,e)}function qs(e){return lr(),Re(qt|Un,e)}function zs(e){return Re(Xe,e)}function Hs(e){return Re(zt|_t,e)}function St(e,t=[],n=[],r=[]){As(r,t,n,s=>{Re(qt,()=>e(...s.map(y)))})}function dn(e,t=0){var n=Re(we|t,e);return n}function ft(e){return Re(se|_t,e)}function ur(e){var t=e.teardown;if(t!==null){const n=qe,r=m;An(!0),ce(null);try{t.call(null)}finally{An(n),ce(r)}}}function vn(e,t=!1){var n=e.first;for(e.first=e.last=null;n!==null;){const s=n.ac;s!==null&&cn(()=>{s.abort(pe)});var r=n.next;(n.f&Ze)!==0?n.parent=null:me(n,t),n=r}}function Bs(e){for(var t=e.first;t!==null;){var n=t.next;(t.f&se)===0&&me(t),t=n}}function me(e,t=!0){var n=!1;(t||(e.f&Bn)!==0)&&e.nodes!==null&&e.nodes.end!==null&&(Us(e.nodes.start,e.nodes.end),n=!0),C(e,yn),vn(e,t&&!n),ut(e,0);var r=e.nodes&&e.nodes.t;if(r!==null)for(const i of r)i.stop();ur(e),e.f^=yn,e.f|=Z;var s=e.parent;s!==null&&s.first!==null&&cr(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=e.b=null}function Us(e,t){for(;e!==null;){var n=e===t?null:Ht(e);e.remove(),e=n}}function cr(e){var t=e.parent,n=e.prev,r=e.next;n!==null&&(n.next=r),r!==null&&(r.prev=n),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=n))}function hn(e,t,n=!0){var r=[];dr(e,r,!0);var s=()=>{n&&me(e),t&&t()},i=r.length;if(i>0){var a=()=>--i||s();for(var f of r)f.out(a)}else s()}function dr(e,t,n){if((e.f&B)===0){e.f^=B;var r=e.nodes&&e.nodes.t;if(r!==null)for(const f of r)(f.is_global||n)&&t.push(f);for(var s=e.first;s!==null;){var i=s.next,a=(s.f&it)!==0||(s.f&se)!==0&&(e.f&we)!==0;dr(s,t,a?n:!1),s=i}}}function pn(e){vr(e,!0)}function vr(e,t){if((e.f&B)!==0){e.f^=B,(e.f&N)===0&&(C(e,P),lt.ensure().schedule(e));for(var n=e.first;n!==null;){var r=n.next,s=(n.f&it)!==0||(n.f&se)!==0;vr(n,s?t:!1),n=r}var i=e.nodes&&e.nodes.t;if(i!==null)for(const a of i)(a.is_global||t)&&a.in()}}function hr(e,t){if(e.nodes)for(var n=e.nodes.start,r=e.nodes.end;n!==null;){var s=n===r?null:Ht(n);t.append(n),n=s}}let Nt=!1,qe=!1;function An(e){qe=e}let m=null,re=!1;function ce(e){m=e}let E=null;function Ce(e){E=e}let J=null;function Vs(e){m!==null&&(J===null?J=[e]:J.push(e))}let H=null,Y=0,W=null;function Ys(e){W=e}let pr=1,Ie=0,Pe=Ie;function Sn(e){Pe=e}function _r(){return++pr}function mt(e){var t=e.f;if((t&P)!==0)return!0;if(t&I&&(e.f&=~je),(t&ue)!==0){for(var n=e.deps,r=n.length,s=0;se.wv)return!0}(t&X)!==0&&L===null&&C(e,N)}return!1}function gr(e,t,n=!0){var r=e.reactions;if(r!==null&&!(J!==null&&$e.call(J,e)))for(var s=0;s{e.ac.abort(pe)}),e.ac=null);try{e.f|=$t;var u=e.fn,_=u();e.f|=ze;var d=e.deps,p=w==null?void 0:w.is_fork;if(H!==null){var h;if(p||ut(e,Y),d!==null&&Y>0)for(d.length=Y+H.length,h=0;hn==null?void 0:n.call(this,i))}return e.startsWith("pointer")||e.startsWith("touch")||e==="wheel"?It(()=>{t.addEventListener(e,s,r)}):t.addEventListener(e,s,r),s}function $s(e,t,n,r,s){var i={capture:r,passive:s},a=Ws(e,t,n,i);(t===document.body||t===window||t===document||t instanceof HTMLMediaElement)&&or(()=>{t.removeEventListener(e,a,i)})}let Tn=null;function Xs(e){var v,x;var t=this,n=t.ownerDocument,r=e.type,s=((v=e.composedPath)==null?void 0:v.call(e))||[],i=s[0]||e.target;Tn=e;var a=0,f=Tn===e&&e[Tt];if(f){var l=s.indexOf(f);if(l!==-1&&(t===document||t===window)){e[Tt]=t;return}var o=s.indexOf(t);if(o===-1)return;l<=o&&(a=l)}if(i=s[a]||e.target,i!==t){es(e,"currentTarget",{configurable:!0,get(){return i||n}});var u=m,_=E;ce(null),Ce(null);try{for(var d,p=[];i!==null;){var h=i.assignedSlot||i.parentNode||i.host||null;try{var k=(x=i[Tt])==null?void 0:x[r];k!=null&&(!i.disabled||e.target===i)&&k.call(i,e)}catch(S){d?p.push(S):d=S}if(e.cancelBubble||h===t||h===null)break;i=h}if(d){for(let S of p)queueMicrotask(()=>{throw S});throw d}}finally{e[Tt]=t,delete e.currentTarget,ce(u),Ce(_)}}}var Fn;const Kt=((Fn=globalThis==null?void 0:globalThis.window)==null?void 0:Fn.trustedTypes)&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:e=>e});function Zs(e){return(Kt==null?void 0:Kt.createHTML(e))??e}function Js(e){var t=Ps("template");return t.innerHTML=Zs(e.replaceAll("","")),t.content}function Qs(e,t){var n=E;n.nodes===null&&(n.nodes={start:e,end:t,a:null,t:null})}function Oe(e,t){var n=(t&Zr)!==0,r,s=!e.startsWith("");return()=>{r===void 0&&(r=Js(s?e:""+e),r=sr(r));var i=n||Ds?document.importNode(r,!0):r.cloneNode(!0);return Qs(i,i),i}}function ke(e,t){e!==null&&e.before(t)}function V(e,t){var n=t==null?"":typeof t=="object"?`${t}`:t;n!==(e.__t??(e.__t=e.nodeValue))&&(e.__t=n,e.nodeValue=`${n}`)}var ne,oe,G,Le,vt,ht,jt;class ei{constructor(t,n=!0){be(this,"anchor");M(this,ne,new Map);M(this,oe,new Map);M(this,G,new Map);M(this,Le,new Set);M(this,vt,!0);M(this,ht,t=>{if(c(this,ne).has(t)){var n=c(this,ne).get(t),r=c(this,oe).get(n);if(r)pn(r),c(this,Le).delete(n);else{var s=c(this,G).get(n);s&&(c(this,oe).set(n,s.effect),c(this,G).delete(n),s.fragment.lastChild.remove(),this.anchor.before(s.fragment),r=s.effect)}for(const[i,a]of c(this,ne)){if(c(this,ne).delete(i),i===t)break;const f=c(this,G).get(a);f&&(me(f.effect),c(this,G).delete(a))}for(const[i,a]of c(this,oe)){if(i===n||c(this,Le).has(i))continue;const f=()=>{if(Array.from(c(this,ne).values()).includes(i)){var o=document.createDocumentFragment();hr(a,o),o.append(Ye()),c(this,G).set(i,{effect:a,fragment:o})}else me(a);c(this,Le).delete(i),c(this,oe).delete(i)};c(this,vt)||!r?(c(this,Le).add(i),hn(a,f,!1)):f()}}});M(this,jt,t=>{c(this,ne).delete(t);const n=Array.from(c(this,ne).values());for(const[r,s]of c(this,G))n.includes(r)||(me(s.effect),c(this,G).delete(r))});this.anchor=t,De(this,vt,n)}ensure(t,n){var r=w,s=ir();if(n&&!c(this,oe).has(t)&&!c(this,G).has(t))if(s){var i=document.createDocumentFragment(),a=Ye();i.append(a),c(this,G).set(t,{effect:ft(()=>n(a)),fragment:i})}else c(this,oe).set(t,ft(()=>n(this.anchor)));if(c(this,ne).set(r,t),s){for(const[f,l]of c(this,oe))f===t?r.unskip_effect(l):r.skip_effect(l);for(const[f,l]of c(this,G))f===t?r.unskip_effect(l.effect):r.skip_effect(l.effect);r.oncommit(c(this,ht)),r.ondiscard(c(this,jt))}else c(this,ht).call(this,r)}}ne=new WeakMap,oe=new WeakMap,G=new WeakMap,Le=new WeakMap,vt=new WeakMap,ht=new WeakMap,jt=new WeakMap;function ti(e){D===null&&ls(),pt&&D.l!==null?ni(D).m.push(e):en(()=>{const t=br(e);if(typeof t=="function")return t})}function ni(e){var t=e.l;return t.u??(t.u={a:[],b:[],m:[]})}function Mn(e,t,n=!1){var r=new ei(e),s=n?it:0;function i(a,f){r.ensure(a,f)}dn(()=>{var a=!1;t((f,l=0)=>{a=!0,i(l,f)}),a||i(-1,null)},s)}function Cn(e,t){return t}function ri(e,t,n){for(var r=[],s=t.length,i,a=t.length,f=0;f{if(i){if(i.pending.delete(_),i.done.add(_),i.pending.size===0){var d=e.outrogroups;nn(e,rn(i.done)),d.delete(i),d.size===0&&(e.outrogroups=null)}}else a-=1},!1)}if(a===0){var l=r.length===0&&n!==null;if(l){var o=n,u=o.parentNode;Ls(u),u.append(o),e.items.clear()}nn(e,t,!l)}else i={pending:new Set(t),done:new Set},(e.outrogroups??(e.outrogroups=new Set)).add(i)}function nn(e,t,n=!0){var r;if(e.pending.size>0){r=new Set;for(const a of e.pending.values())for(const f of a)r.add(e.items.get(f).e)}for(var s=0;s{var T=n();return jn(T)?T:T==null?[]:rn(T)}),d,p=new Map,h=!0;function k(T){(S.effect.f&Z)===0&&(S.pending.delete(T),S.fallback=u,si(S,d,a,t,r),u!==null&&(d.length===0?(u.f&fe)===0?pn(u):(u.f^=fe,rt(u,null,a)):hn(u,()=>{u=null})))}function v(T){S.pending.delete(T)}var x=dn(()=>{d=y(_);for(var T=d.length,j=new Set,Q=w,de=ir(),q=0;qi(a)):(u=ft(()=>i(Rn??(Rn=Ye()))),u.f|=fe)),T>j.size&&os(),!h)if(p.set(Q,j),de){for(const[He,Be]of f)j.has(He)||Q.skip_effect(Be.e);Q.oncommit(k),Q.ondiscard(v)}else k(Q);y(_)}),S={effect:x,items:f,pending:p,outrogroups:null,fallback:u};h=!1}function tt(e){for(;e!==null&&(e.f&se)===0;)e=e.next;return e}function si(e,t,n,r,s){var z,He,Be,wt,xt,bt,yt,Qe,Et;var i=(r&$r)!==0,a=t.length,f=e.items,l=tt(e.effect.first),o,u=null,_,d=[],p=[],h,k,v,x;if(i)for(x=0;x0){var he=(r&Ln)!==0&&a===0?n:null;if(i){for(x=0;x{var ee,et;if(_!==void 0)for(v of _)(et=(ee=v.nodes)==null?void 0:ee.a)==null||et.apply()})}function ii(e,t,n,r,s,i,a,f){var l=(a&Gr)!==0?(a&Xr)===0?Ot(n,!1,!1):at(n):null,o=(a&Wr)!==0?at(s):null;return{v:l,i:o,e:ft(()=>(i(t,l??n,o??s,f),()=>{e.delete(r)}))}}function rt(e,t,n){if(e.nodes)for(var r=e.nodes.start,s=e.nodes.end,i=t&&(t.f&fe)===0?t.nodes.start:n;r!==null;){var a=Ht(r);if(i.before(r),r===s)return;r=a}}function Ae(e,t,n){t===null?e.effect.first=n:t.next=n,n===null?e.effect.last=t:n.prev=t}function li(e,t){var n;n=document.head.appendChild(Ye());try{dn(()=>t(n),Bn|_t)}finally{}}const ai=Symbol("is custom element"),oi=Symbol("is html");function fi(e,t,n,r){var s=ui(e);s[t]!==(s[t]=n)&&(n==null?e.removeAttribute(t):typeof n!="string"&&ci(e).includes(t)?e[t]=n:e.setAttribute(t,n))}function ui(e){return e.__attributes??(e.__attributes={[ai]:e.nodeName.includes("-"),[oi]:e.namespaceURI===Pn})}var Nn=new Map;function ci(e){var t=e.getAttribute("is")||e.nodeName,n=Nn.get(t);if(n)return n;Nn.set(t,n=[]);for(var r,s=e,i=Element.prototype;i!==s;){r=qn(s);for(var a in r)r[a].set&&n.push(a);s=sn(s)}return n}function di(e=!1){const t=D,n=t.l.u;if(!n)return;let r=()=>Gs(t.s);if(e){let s=0,i={};const a=fn(()=>{let f=!1;const l=t.s;for(const o in l)l[o]!==i[o]&&(i[o]=l[o],f=!0);return f&&s++,s});r=()=>y(a)}n.b.length&&qs(()=>{Dn(t,r),Gt(n.b)}),en(()=>{const s=br(()=>n.m.map(ss));return()=>{for(const i of s)typeof i=="function"&&i()}}),n.a.length&&en(()=>{Dn(t,r),Gt(n.a)})}function Dn(e,t){if(e.l.s)for(const n of e.l.s)y(n);t()}var vi=Oe(' '),hi=Oe('OAuth Authorization Server'),pi=Oe('
Loading status…
'),_i=Oe('

Couldn’t load the status snapshot.

'),gi=Oe('
No authenticated access recorded yet.
'),mi=Oe(' '),wi=Oe('
PrincipalLast accessedLast pathRequests
'),xi=Oe('
Avelon Memory Crystal
Avalon Memory Crystal Server

Avelon Memory Crystal Server (AMCS)

Connected users

Known principals

Version

Recent access

Authenticated principals AMCS has seen recently.

');function bi(e,t){gs(t,!1);let n=Ot(null),r=Ot(!0),s=Ot("");const i=[{href:"/llm",label:"LLM Instructions"},{href:"/healthz",label:"Health Check"},{href:"/readyz",label:"Readiness Check"}];async function a(){$(r,!0),$(s,"");try{const b=await fetch("/api/status");if(!b.ok)throw new Error(`Status request failed with ${b.status}`);$(n,await b.json())}catch(b){$(s,b instanceof Error?b.message:"Failed to load status")}finally{$(r,!1)}}function f(b){return new Date(b).toLocaleString()}ti(a),di();var l=xi();li("1n46o8q",b=>{zs(()=>{Ns.title="AMCS"})});var o=g(l),u=g(o),_=A(g(u),2),d=g(_),p=g(d),h=A(g(p),2),k=A(g(h),2),v=g(k),x=A(p,2),S=g(x);On(S,1,()=>i,Cn,(b,R)=>{var ie=vi(),xe=g(ie);St(()=>{fi(ie,"href",y(R).href),V(xe,y(R).label)}),ke(b,ie)});var T=A(S,2);{var j=b=>{var R=hi();ke(b,R)};Mn(T,b=>{var R;(R=y(n))!=null&&R.oauth_enabled&&b(j)})}var Q=A(x,2),de=g(Q),q=A(g(de),2),ve=g(q),he=A(de,2),z=A(g(he),2),He=g(z),Be=A(he,2),wt=A(g(Be),2),xt=g(wt),bt=A(d,2),yt=A(g(bt),2),Qe=g(yt),Et=A(g(Qe),2),ee=g(Et),et=A(Qe,2),yr=A(g(et),2),Er=g(yr),kr=A(et,2),Ar=A(g(kr),2),Sr=g(Ar),Tr=A(u,2),_n=g(Tr),Mr=A(g(_n),2),Cr=A(_n,2);{var Rr=b=>{var R=pi();ke(b,R)},Or=b=>{var R=_i(),ie=A(g(R),2),xe=g(ie);St(()=>V(xe,y(s))),ke(b,R)},Nr=b=>{var R=gi();ke(b,R)},Dr=b=>{var R=wi(),ie=g(R),xe=g(ie),kt=A(g(xe));On(kt,5,()=>y(n).entries,Cn,(At,Ne)=>{var gn=mi(),mn=g(gn),Ir=g(mn),Fr=g(Ir),wn=A(mn),Lr=g(wn),xn=A(wn),Pr=g(xn),jr=g(Pr),qr=A(xn),zr=g(qr);St(Hr=>{V(Fr,y(Ne).key_id),V(Lr,Hr),V(jr,y(Ne).last_path),V(zr,y(Ne).request_count)},[()=>f(y(Ne).last_accessed_at)]),ke(At,gn)}),ke(b,R)};Mn(Cr,b=>{y(r)?b(Rr):y(s)?b(Or,1):y(n)&&y(n).entries.length===0?b(Nr,2):y(n)&&b(Dr,3)})}St(()=>{var b,R,ie,xe,kt,At,Ne;V(v,((b=y(n))==null?void 0:b.description)??"AMCS is a memory server that captures, links, and retrieves structured project thoughts for AI assistants using semantic search, summaries, and MCP tools."),V(ve,((R=y(n))==null?void 0:R.connected_count)??"—"),V(He,((ie=y(n))==null?void 0:ie.total_known)??"—"),V(xt,((xe=y(n))==null?void 0:xe.version)??"—"),V(ee,((kt=y(n))==null?void 0:kt.build_date)??"unknown"),V(Er,((At=y(n))==null?void 0:At.commit)??"unknown"),V(Sr,((Ne=y(n))==null?void 0:Ne.connected_window)??"last 10 minutes")}),$s("click",Mr,a),ke(e,l),ms()}new bi({target:document.getElementById("app")}); diff --git a/internal/app/ui/dist/index.html b/internal/app/ui/dist/index.html new file mode 100644 index 0000000..0ddba98 --- /dev/null +++ b/internal/app/ui/dist/index.html @@ -0,0 +1,17 @@ + + + + + + AMCS + + + + + +
+ + diff --git a/internal/app/ui_assets.go b/internal/app/ui_assets.go new file mode 100644 index 0000000..430c073 --- /dev/null +++ b/internal/app/ui_assets.go @@ -0,0 +1,22 @@ +package app + +import ( + "embed" + "io/fs" +) + +var ( + //go:embed ui/dist + uiFiles embed.FS + uiDistFS fs.FS + indexHTML []byte +) + +func init() { + dist, err := fs.Sub(uiFiles, "ui/dist") + if err != nil { + return + } + uiDistFS = dist + indexHTML, _ = fs.ReadFile(uiDistFS, "index.html") +} diff --git a/scripts/run-local.sh b/scripts/run-local.sh index 449ed46..074c617 100755 --- a/scripts/run-local.sh +++ b/scripts/run-local.sh @@ -2,4 +2,11 @@ set -euo pipefail -go run ./cmd/amcs-server --config "${1:-configs/dev.yaml}" +CONFIG_PATH="${1:-configs/dev.yaml}" + +if [[ ! -f internal/app/ui/dist/index.html ]]; then + echo "UI build not found; building frontend first..." + make ui-build +fi + +go run ./cmd/amcs-server --config "$CONFIG_PATH" diff --git a/ui/index.html b/ui/index.html new file mode 100644 index 0000000..d3e87c8 --- /dev/null +++ b/ui/index.html @@ -0,0 +1,16 @@ + + + + + + AMCS + + + +
+ + + diff --git a/ui/package-lock.json b/ui/package-lock.json new file mode 100644 index 0000000..fd174bd --- /dev/null +++ b/ui/package-lock.json @@ -0,0 +1,2193 @@ +{ + "name": "amcs-ui", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "amcs-ui", + "version": "0.0.0", + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^5.0.3", + "@tailwindcss/vite": "^4.1.4", + "@types/node": "^24.5.2", + "svelte": "^5.28.2", + "svelte-check": "^4.1.6", + "tailwindcss": "^4.1.4", + "typescript": "^5.8.3", + "vite": "^6.3.2" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz", + "integrity": "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz", + "integrity": "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz", + "integrity": "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz", + "integrity": "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz", + "integrity": "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz", + "integrity": "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz", + "integrity": "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz", + "integrity": "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz", + "integrity": "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz", + "integrity": "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz", + "integrity": "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz", + "integrity": "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz", + "integrity": "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz", + "integrity": "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz", + "integrity": "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz", + "integrity": "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz", + "integrity": "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz", + "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz", + "integrity": "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz", + "integrity": "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz", + "integrity": "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz", + "integrity": "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz", + "integrity": "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz", + "integrity": "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz", + "integrity": "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sveltejs/acorn-typescript": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.9.tgz", + "integrity": "sha512-lVJX6qEgs/4DOcRTpo56tmKzVPtoWAaVbL4hfO7t7NVwl9AAXzQR6cihesW1BmNMPl+bK6dreu2sOKBP2Q9CIA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8.9.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-5.1.1.tgz", + "integrity": "sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", + "debug": "^4.4.1", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.17", + "vitefu": "^1.0.6" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22" + }, + "peerDependencies": { + "svelte": "^5.0.0", + "vite": "^6.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-4.0.1.tgz", + "integrity": "sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.7" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^5.0.0", + "svelte": "^5.0.0", + "vite": "^6.0.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.2.tgz", + "integrity": "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.2" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.2.tgz", + "integrity": "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-x64": "4.2.2", + "@tailwindcss/oxide-freebsd-x64": "4.2.2", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.2", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-x64-musl": "4.2.2", + "@tailwindcss/oxide-wasm32-wasi": "4.2.2", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.2", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.2" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.2.tgz", + "integrity": "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.2.tgz", + "integrity": "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.2.tgz", + "integrity": "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.2.tgz", + "integrity": "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.2.tgz", + "integrity": "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.2.tgz", + "integrity": "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.2.tgz", + "integrity": "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.2.tgz", + "integrity": "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.2.tgz", + "integrity": "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.2.tgz", + "integrity": "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.2.tgz", + "integrity": "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz", + "integrity": "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.2.2.tgz", + "integrity": "sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.2.2", + "@tailwindcss/oxide": "4.2.2", + "tailwindcss": "4.2.2" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7 || ^8" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.12.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz", + "integrity": "sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/types": { + "version": "8.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.58.0.tgz", + "integrity": "sha512-O9CjxypDT89fbHxRfETNoAnHj/i6IpRK0CvbVN3qibxlLdo5p5hcLmUuCCrHMpxiWSwKyI8mCP7qRNYuOJ0Uww==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aria-query": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.1.tgz", + "integrity": "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devalue": { + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.4.tgz", + "integrity": "sha512-Gp6rDldRsFh/7XuouDbxMH3Mx8GMCcgzIb1pDTvNyn8pZGQ22u+Wa+lGV9dQCltFQ7uVw0MhRyb8XDskNFOReA==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", + "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/esm-env": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz", + "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/esrap": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.2.4.tgz", + "integrity": "sha512-suICpxAmZ9A8bzJjEl/+rLJiDKC0X4gYWUxT6URAWBLvlXmtbZd5ySMu/N2ZGEtMCAmflUDPSehrP9BQcsGcSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15", + "@typescript-eslint/types": "^8.2.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-reference": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.6" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "dev": true, + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/rollup": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.1.tgz", + "integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.1", + "@rollup/rollup-android-arm64": "4.60.1", + "@rollup/rollup-darwin-arm64": "4.60.1", + "@rollup/rollup-darwin-x64": "4.60.1", + "@rollup/rollup-freebsd-arm64": "4.60.1", + "@rollup/rollup-freebsd-x64": "4.60.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", + "@rollup/rollup-linux-arm-musleabihf": "4.60.1", + "@rollup/rollup-linux-arm64-gnu": "4.60.1", + "@rollup/rollup-linux-arm64-musl": "4.60.1", + "@rollup/rollup-linux-loong64-gnu": "4.60.1", + "@rollup/rollup-linux-loong64-musl": "4.60.1", + "@rollup/rollup-linux-ppc64-gnu": "4.60.1", + "@rollup/rollup-linux-ppc64-musl": "4.60.1", + "@rollup/rollup-linux-riscv64-gnu": "4.60.1", + "@rollup/rollup-linux-riscv64-musl": "4.60.1", + "@rollup/rollup-linux-s390x-gnu": "4.60.1", + "@rollup/rollup-linux-x64-gnu": "4.60.1", + "@rollup/rollup-linux-x64-musl": "4.60.1", + "@rollup/rollup-openbsd-x64": "4.60.1", + "@rollup/rollup-openharmony-arm64": "4.60.1", + "@rollup/rollup-win32-arm64-msvc": "4.60.1", + "@rollup/rollup-win32-ia32-msvc": "4.60.1", + "@rollup/rollup-win32-x64-gnu": "4.60.1", + "@rollup/rollup-win32-x64-msvc": "4.60.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svelte": { + "version": "5.55.1", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.55.1.tgz", + "integrity": "sha512-QjvU7EFemf6mRzdMGlAFttMWtAAVXrax61SZYHdkD6yoVGQ89VeyKfZD4H1JrV1WLmJBxWhFch9H6ig/87VGjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@sveltejs/acorn-typescript": "^1.0.5", + "@types/estree": "^1.0.5", + "@types/trusted-types": "^2.0.7", + "acorn": "^8.12.1", + "aria-query": "5.3.1", + "axobject-query": "^4.1.0", + "clsx": "^2.1.1", + "devalue": "^5.6.4", + "esm-env": "^1.2.1", + "esrap": "^2.2.4", + "is-reference": "^3.0.3", + "locate-character": "^3.0.0", + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/svelte-check": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.4.6.tgz", + "integrity": "sha512-kP1zG81EWaFe9ZyTv4ZXv44Csi6Pkdpb7S3oj6m+K2ec/IcDg/a8LsFsnVLqm2nxtkSwsd5xPj/qFkTBgXHXjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "chokidar": "^4.0.1", + "fdir": "^6.2.0", + "picocolors": "^1.0.0", + "sade": "^1.7.4" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "engines": { + "node": ">= 18.0.0" + }, + "peerDependencies": { + "svelte": "^4.0.0 || ^5.0.0-next.0", + "typescript": ">=5.0.0" + } + }, + "node_modules/tailwindcss": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz", + "integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.2.tgz", + "integrity": "sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", + "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz", + "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==", + "dev": true, + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*", + "tests/projects/workspace/packages/*" + ], + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/zimmerframe": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz", + "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/ui/package.json b/ui/package.json new file mode 100644 index 0000000..6fa5dd4 --- /dev/null +++ b/ui/package.json @@ -0,0 +1,22 @@ +{ + "name": "amcs-ui", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "check": "svelte-check --tsconfig ./tsconfig.json", + "preview": "vite preview" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^5.0.3", + "@tailwindcss/vite": "^4.1.4", + "@types/node": "^24.5.2", + "svelte": "^5.28.2", + "svelte-check": "^4.1.6", + "tailwindcss": "^4.1.4", + "typescript": "^5.8.3", + "vite": "^6.3.2" + } +} \ No newline at end of file diff --git a/ui/src/App.svelte b/ui/src/App.svelte new file mode 100644 index 0000000..ba44f7b --- /dev/null +++ b/ui/src/App.svelte @@ -0,0 +1,178 @@ + + + + AMCS + + +
+
+
+ Avelon Memory Crystal + +
+
+
+
+ + Avalon Memory Crystal Server +
+
+

Avelon Memory Crystal Server (AMCS)

+

+ {data?.description ?? 'AMCS is a memory server that captures, links, and retrieves structured project thoughts for AI assistants using semantic search, summaries, and MCP tools.'} +

+
+
+ +
+ {#each quickLinks as link} + {link.label} + {/each} + {#if data?.oauth_enabled} + OAuth Authorization Server + {/if} +
+ +
+
+

Connected users

+

{data?.connected_count ?? '—'}

+
+
+

Known principals

+

{data?.total_known ?? '—'}

+
+
+

Version

+

{data?.version ?? '—'}

+
+
+
+ + +
+
+ +
+
+
+

Recent access

+

Authenticated principals AMCS has seen recently.

+
+ +
+ + {#if loading} +
Loading status…
+ {:else if error} +
+

Couldn’t load the status snapshot.

+

{error}

+
+ {:else if data && data.entries.length === 0} +
No authenticated access recorded yet.
+ {:else if data} +
+
+ + + + + + + + + + + {#each data.entries as entry} + + + + + + + {/each} + +
PrincipalLast accessedLast pathRequests
{entry.key_id}{formatDate(entry.last_accessed_at)}{entry.last_path}{entry.request_count}
+
+
+ {/if} +
+
+
diff --git a/ui/src/app.css b/ui/src/app.css new file mode 100644 index 0000000..c2af853 --- /dev/null +++ b/ui/src/app.css @@ -0,0 +1,16 @@ +@import 'tailwindcss'; + +:root { + color-scheme: dark; + font-family: Inter, system-ui, sans-serif; +} + +html, +body, +#app { + min-height: 100%; +} + +body { + margin: 0; +} diff --git a/ui/src/main.ts b/ui/src/main.ts new file mode 100644 index 0000000..73d7971 --- /dev/null +++ b/ui/src/main.ts @@ -0,0 +1,8 @@ +import './app.css'; +import App from './App.svelte'; + +const app = new App({ + target: document.getElementById('app')! +}); + +export default app; diff --git a/ui/svelte.config.js b/ui/svelte.config.js new file mode 100644 index 0000000..984222e --- /dev/null +++ b/ui/svelte.config.js @@ -0,0 +1,5 @@ +export default { + compilerOptions: { + dev: process.env.NODE_ENV !== 'production' + } +}; diff --git a/ui/tsconfig.json b/ui/tsconfig.json new file mode 100644 index 0000000..0d9a04a --- /dev/null +++ b/ui/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "./tsconfig.node.json", + "compilerOptions": { + "module": "ESNext", + "moduleResolution": "Bundler", + "target": "ES2022", + "lib": ["ESNext", "DOM"], + "verbatimModuleSyntax": true, + "strict": true, + "allowJs": true, + "checkJs": false, + "types": ["svelte", "node"] + }, + "include": ["src/**/*.ts", "src/**/*.js", "src/**/*.svelte", "vite.config.ts"] +} diff --git a/ui/tsconfig.node.json b/ui/tsconfig.node.json new file mode 100644 index 0000000..146025d --- /dev/null +++ b/ui/tsconfig.node.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Bundler", + "allowSyntheticDefaultImports": true + } +} diff --git a/ui/vite.config.ts b/ui/vite.config.ts new file mode 100644 index 0000000..ac21268 --- /dev/null +++ b/ui/vite.config.ts @@ -0,0 +1,31 @@ +import { defineConfig } from 'vite'; +import { svelte } from '@sveltejs/vite-plugin-svelte'; +import tailwindcss from '@tailwindcss/vite'; + +const backendTarget = process.env.AMCS_UI_BACKEND ?? 'http://127.0.0.1:8080'; + +export default defineConfig({ + plugins: [svelte(), tailwindcss()], + server: { + host: '0.0.0.0', + port: 5173, + proxy: { + '/api': backendTarget, + '/healthz': backendTarget, + '/readyz': backendTarget, + '/llm': backendTarget, + '/images': backendTarget, + '/favicon.ico': backendTarget, + '/mcp': backendTarget, + '/files': backendTarget, + '/oauth-authorization-server': backendTarget, + '/authorize': backendTarget, + '/oauth': backendTarget, + '/.well-known': backendTarget + } + }, + build: { + outDir: '../internal/app/ui/dist', + emptyOutDir: true + } +});