>".
- """
- parts: list[str] = []
- in_span = False
- for tok, active in tokens:
- if active and not in_span:
- stripped = tok.lstrip()
- parts.append(tok[: len(tok) - len(stripped)])
- parts.append("<<")
- parts.append(stripped)
- in_span = True
- elif active:
- parts.append(tok)
- elif in_span:
- parts.append(">>")
- parts.append(tok)
- in_span = False
- else:
- parts.append(tok)
- if in_span:
- parts.append(">>")
- return "".join(parts)
diff --git a/param_decomp_lab/app/frontend/.gitignore b/param_decomp_lab/app/frontend/.gitignore
deleted file mode 100644
index 3b462cb0c..000000000
--- a/param_decomp_lab/app/frontend/.gitignore
+++ /dev/null
@@ -1,23 +0,0 @@
-node_modules
-
-# Output
-.output
-.vercel
-.netlify
-.wrangler
-/.svelte-kit
-/build
-
-# OS
-.DS_Store
-Thumbs.db
-
-# Env
-.env
-.env.*
-!.env.example
-!.env.test
-
-# Vite
-vite.config.js.timestamp-*
-vite.config.ts.timestamp-*
diff --git a/param_decomp_lab/app/frontend/.prettierrc b/param_decomp_lab/app/frontend/.prettierrc
deleted file mode 100644
index ea0ee7af5..000000000
--- a/param_decomp_lab/app/frontend/.prettierrc
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "plugins": ["prettier-plugin-svelte"],
- "tabWidth": 4,
- "printWidth": 120,
- "overrides": [
- {
- "files": "*.svelte",
- "options": {
- "parser": "svelte"
- }
- }
- ]
-}
diff --git a/param_decomp_lab/app/frontend/eslint.config.js b/param_decomp_lab/app/frontend/eslint.config.js
deleted file mode 100644
index 9c53f9c37..000000000
--- a/param_decomp_lab/app/frontend/eslint.config.js
+++ /dev/null
@@ -1,43 +0,0 @@
-import js from "@eslint/js";
-import svelte from "eslint-plugin-svelte";
-import tseslint from "typescript-eslint";
-import prettier from "eslint-config-prettier";
-import globals from "globals";
-
-export default [
- js.configs.recommended,
- ...tseslint.configs.recommended,
- ...svelte.configs["flat/recommended"],
- prettier,
- {
- languageOptions: {
- globals: {
- ...globals.browser,
- ...globals.node,
- },
- },
- },
- {
- files: ["**/*.svelte"],
- languageOptions: {
- parserOptions: {
- parser: tseslint.parser,
- },
- },
- },
- {
- files: ["**/*.svelte.ts"],
- languageOptions: {
- parser: tseslint.parser,
- },
- },
- {
- rules: {
- "@typescript-eslint/no-unused-vars": ["error", { argsIgnorePattern: "^_" }],
- "@typescript-eslint/no-explicit-any": "warn",
- },
- },
- {
- ignores: ["dist/", "build/", ".svelte-kit/", "node_modules/"],
- },
-];
diff --git a/param_decomp_lab/app/frontend/frontend/.gitignore b/param_decomp_lab/app/frontend/frontend/.gitignore
deleted file mode 100644
index 3b462cb0c..000000000
--- a/param_decomp_lab/app/frontend/frontend/.gitignore
+++ /dev/null
@@ -1,23 +0,0 @@
-node_modules
-
-# Output
-.output
-.vercel
-.netlify
-.wrangler
-/.svelte-kit
-/build
-
-# OS
-.DS_Store
-Thumbs.db
-
-# Env
-.env
-.env.*
-!.env.example
-!.env.test
-
-# Vite
-vite.config.js.timestamp-*
-vite.config.ts.timestamp-*
diff --git a/param_decomp_lab/app/frontend/frontend/.prettierrc b/param_decomp_lab/app/frontend/frontend/.prettierrc
deleted file mode 100644
index ea0ee7af5..000000000
--- a/param_decomp_lab/app/frontend/frontend/.prettierrc
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "plugins": ["prettier-plugin-svelte"],
- "tabWidth": 4,
- "printWidth": 120,
- "overrides": [
- {
- "files": "*.svelte",
- "options": {
- "parser": "svelte"
- }
- }
- ]
-}
diff --git a/param_decomp_lab/app/frontend/frontend/eslint.config.js b/param_decomp_lab/app/frontend/frontend/eslint.config.js
deleted file mode 100644
index 9c53f9c37..000000000
--- a/param_decomp_lab/app/frontend/frontend/eslint.config.js
+++ /dev/null
@@ -1,43 +0,0 @@
-import js from "@eslint/js";
-import svelte from "eslint-plugin-svelte";
-import tseslint from "typescript-eslint";
-import prettier from "eslint-config-prettier";
-import globals from "globals";
-
-export default [
- js.configs.recommended,
- ...tseslint.configs.recommended,
- ...svelte.configs["flat/recommended"],
- prettier,
- {
- languageOptions: {
- globals: {
- ...globals.browser,
- ...globals.node,
- },
- },
- },
- {
- files: ["**/*.svelte"],
- languageOptions: {
- parserOptions: {
- parser: tseslint.parser,
- },
- },
- },
- {
- files: ["**/*.svelte.ts"],
- languageOptions: {
- parser: tseslint.parser,
- },
- },
- {
- rules: {
- "@typescript-eslint/no-unused-vars": ["error", { argsIgnorePattern: "^_" }],
- "@typescript-eslint/no-explicit-any": "warn",
- },
- },
- {
- ignores: ["dist/", "build/", ".svelte-kit/", "node_modules/"],
- },
-];
diff --git a/param_decomp_lab/app/frontend/frontend/index.html b/param_decomp_lab/app/frontend/frontend/index.html
deleted file mode 100644
index 58518ec36..000000000
--- a/param_decomp_lab/app/frontend/frontend/index.html
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
- PD Scope
-
-
-
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/package-lock.json b/param_decomp_lab/app/frontend/frontend/package-lock.json
deleted file mode 100644
index 32da0218c..000000000
--- a/param_decomp_lab/app/frontend/frontend/package-lock.json
+++ /dev/null
@@ -1,3302 +0,0 @@
-{
- "name": "frontend",
- "version": "0.0.0",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "frontend",
- "version": "0.0.0",
- "dependencies": {
- "marked": "^17.0.1"
- },
- "devDependencies": {
- "@eslint/js": "^9.38.0",
- "@sveltejs/vite-plugin-svelte": "^6.2.1",
- "@tsconfig/svelte": "^5.0.5",
- "@types/node": "^24.6.0",
- "eslint": "^9.38.0",
- "eslint-config-prettier": "^10.1.8",
- "eslint-plugin-svelte": "^3.12.5",
- "globals": "^16.4.0",
- "prettier": "^3.6.2",
- "prettier-plugin-svelte": "^3.4.0",
- "svelte": "^5.39.6",
- "svelte-check": "^4.3.2",
- "svelte-render-scan": "^1.1.0",
- "typescript": "~5.9.3",
- "typescript-eslint": "^8.46.2",
- "vite": "^7.1.7"
- }
- },
- "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/@eslint-community/eslint-utils": {
- "version": "4.9.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz",
- "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "eslint-visitor-keys": "^3.4.3"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- },
- "peerDependencies": {
- "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
- }
- },
- "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/@eslint-community/regexpp": {
- "version": "4.12.2",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
- "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
- }
- },
- "node_modules/@eslint/config-array": {
- "version": "0.21.1",
- "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz",
- "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@eslint/object-schema": "^2.1.7",
- "debug": "^4.3.1",
- "minimatch": "^3.1.2"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@eslint/config-helpers": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz",
- "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@eslint/core": "^0.17.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@eslint/core": {
- "version": "0.17.0",
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz",
- "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@types/json-schema": "^7.0.15"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@eslint/eslintrc": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
- "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ajv": "^6.12.4",
- "debug": "^4.3.2",
- "espree": "^10.0.1",
- "globals": "^14.0.0",
- "ignore": "^5.2.0",
- "import-fresh": "^3.2.1",
- "js-yaml": "^4.1.0",
- "minimatch": "^3.1.2",
- "strip-json-comments": "^3.1.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/@eslint/eslintrc/node_modules/globals": {
- "version": "14.0.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
- "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@eslint/js": {
- "version": "9.39.1",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz",
- "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://eslint.org/donate"
- }
- },
- "node_modules/@eslint/object-schema": {
- "version": "2.1.7",
- "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz",
- "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@eslint/plugin-kit": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz",
- "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@eslint/core": "^0.17.0",
- "levn": "^0.4.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- }
- },
- "node_modules/@humanfs/core": {
- "version": "0.19.1",
- "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
- "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=18.18.0"
- }
- },
- "node_modules/@humanfs/node": {
- "version": "0.16.7",
- "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
- "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@humanfs/core": "^0.19.1",
- "@humanwhocodes/retry": "^0.4.0"
- },
- "engines": {
- "node": ">=18.18.0"
- }
- },
- "node_modules/@humanwhocodes/module-importer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
- "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=12.22"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
- "node_modules/@humanwhocodes/retry": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
- "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=18.18"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
- }
- },
- "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/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.52.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.5.tgz",
- "integrity": "sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-android-arm64": {
- "version": "4.52.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.5.tgz",
- "integrity": "sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.52.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.5.tgz",
- "integrity": "sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.52.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.5.tgz",
- "integrity": "sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-freebsd-arm64": {
- "version": "4.52.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.5.tgz",
- "integrity": "sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ]
- },
- "node_modules/@rollup/rollup-freebsd-x64": {
- "version": "4.52.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.5.tgz",
- "integrity": "sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.52.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.5.tgz",
- "integrity": "sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.52.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.5.tgz",
- "integrity": "sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.52.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.5.tgz",
- "integrity": "sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.52.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.5.tgz",
- "integrity": "sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-loong64-gnu": {
- "version": "4.52.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.5.tgz",
- "integrity": "sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==",
- "cpu": [
- "loong64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-ppc64-gnu": {
- "version": "4.52.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.5.tgz",
- "integrity": "sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.52.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.5.tgz",
- "integrity": "sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-musl": {
- "version": "4.52.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.5.tgz",
- "integrity": "sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.52.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.5.tgz",
- "integrity": "sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.52.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.5.tgz",
- "integrity": "sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.52.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.5.tgz",
- "integrity": "sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-openharmony-arm64": {
- "version": "4.52.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.5.tgz",
- "integrity": "sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openharmony"
- ]
- },
- "node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.52.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.5.tgz",
- "integrity": "sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.52.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.5.tgz",
- "integrity": "sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-x64-gnu": {
- "version": "4.52.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.5.tgz",
- "integrity": "sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.52.5",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.5.tgz",
- "integrity": "sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@sveltejs/acorn-typescript": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.6.tgz",
- "integrity": "sha512-4awhxtMh4cx9blePWl10HRHj8Iivtqj+2QdDCSMDzxG+XKa9+VCNupQuCuvzEhYPzZSrX+0gC+0lHA/0fFKKQQ==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "acorn": "^8.9.0"
- }
- },
- "node_modules/@sveltejs/vite-plugin-svelte": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.2.1.tgz",
- "integrity": "sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0",
- "debug": "^4.4.1",
- "deepmerge": "^4.3.1",
- "magic-string": "^0.30.17",
- "vitefu": "^1.1.1"
- },
- "engines": {
- "node": "^20.19 || ^22.12 || >=24"
- },
- "peerDependencies": {
- "svelte": "^5.0.0",
- "vite": "^6.3.0 || ^7.0.0"
- }
- },
- "node_modules/@sveltejs/vite-plugin-svelte-inspector": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-5.0.1.tgz",
- "integrity": "sha512-ubWshlMk4bc8mkwWbg6vNvCeT7lGQojE3ijDh3QTR6Zr/R+GXxsGbyH4PExEPpiFmqPhYiVSVmHBjUcVc1JIrA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "debug": "^4.4.1"
- },
- "engines": {
- "node": "^20.19 || ^22.12 || >=24"
- },
- "peerDependencies": {
- "@sveltejs/vite-plugin-svelte": "^6.0.0-next.0",
- "svelte": "^5.0.0",
- "vite": "^6.3.0 || ^7.0.0"
- }
- },
- "node_modules/@tsconfig/svelte": {
- "version": "5.0.5",
- "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-5.0.5.tgz",
- "integrity": "sha512-48fAnUjKye38FvMiNOj0J9I/4XlQQiZlpe9xaNPfe8vy2Y1hFBt8g1yqf2EGjVvHavo4jf2lC+TQyENCr4BJBQ==",
- "dev": true,
- "license": "MIT"
- },
- "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/json-schema": {
- "version": "7.0.15",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
- "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/node": {
- "version": "24.10.0",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.0.tgz",
- "integrity": "sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "undici-types": "~7.16.0"
- }
- },
- "node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.46.3",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.3.tgz",
- "integrity": "sha512-sbaQ27XBUopBkRiuY/P9sWGOWUW4rl8fDoHIUmLpZd8uldsTyB4/Zg6bWTegPoTLnKj9Hqgn3QD6cjPNB32Odw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "8.46.3",
- "@typescript-eslint/type-utils": "8.46.3",
- "@typescript-eslint/utils": "8.46.3",
- "@typescript-eslint/visitor-keys": "8.46.3",
- "graphemer": "^1.4.0",
- "ignore": "^7.0.0",
- "natural-compare": "^1.4.0",
- "ts-api-utils": "^2.1.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "@typescript-eslint/parser": "^8.46.3",
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <6.0.0"
- }
- },
- "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
- "version": "7.0.5",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
- "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/@typescript-eslint/parser": {
- "version": "8.46.3",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.3.tgz",
- "integrity": "sha512-6m1I5RmHBGTnUGS113G04DMu3CpSdxCAU/UvtjNWL4Nuf3MW9tQhiJqRlHzChIkhy6kZSAQmc+I1bcGjE3yNKg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/scope-manager": "8.46.3",
- "@typescript-eslint/types": "8.46.3",
- "@typescript-eslint/typescript-estree": "8.46.3",
- "@typescript-eslint/visitor-keys": "8.46.3",
- "debug": "^4.3.4"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <6.0.0"
- }
- },
- "node_modules/@typescript-eslint/project-service": {
- "version": "8.46.3",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.3.tgz",
- "integrity": "sha512-Fz8yFXsp2wDFeUElO88S9n4w1I4CWDTXDqDr9gYvZgUpwXQqmZBr9+NTTql5R3J7+hrJZPdpiWaB9VNhAKYLuQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/tsconfig-utils": "^8.46.3",
- "@typescript-eslint/types": "^8.46.3",
- "debug": "^4.3.4"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <6.0.0"
- }
- },
- "node_modules/@typescript-eslint/scope-manager": {
- "version": "8.46.3",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.3.tgz",
- "integrity": "sha512-FCi7Y1zgrmxp3DfWfr+3m9ansUUFoy8dkEdeQSgA9gbm8DaHYvZCdkFRQrtKiedFf3Ha6VmoqoAaP68+i+22kg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.46.3",
- "@typescript-eslint/visitor-keys": "8.46.3"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/tsconfig-utils": {
- "version": "8.46.3",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.3.tgz",
- "integrity": "sha512-GLupljMniHNIROP0zE7nCcybptolcH8QZfXOpCfhQDAdwJ/ZTlcaBOYebSOZotpti/3HrHSw7D3PZm75gYFsOA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <6.0.0"
- }
- },
- "node_modules/@typescript-eslint/type-utils": {
- "version": "8.46.3",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.3.tgz",
- "integrity": "sha512-ZPCADbr+qfz3aiTTYNNkCbUt+cjNwI/5McyANNrFBpVxPt7GqpEYz5ZfdwuFyGUnJ9FdDXbGODUu6iRCI6XRXw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.46.3",
- "@typescript-eslint/typescript-estree": "8.46.3",
- "@typescript-eslint/utils": "8.46.3",
- "debug": "^4.3.4",
- "ts-api-utils": "^2.1.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <6.0.0"
- }
- },
- "node_modules/@typescript-eslint/types": {
- "version": "8.46.3",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.3.tgz",
- "integrity": "sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA==",
- "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/@typescript-eslint/typescript-estree": {
- "version": "8.46.3",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.3.tgz",
- "integrity": "sha512-f/NvtRjOm80BtNM5OQtlaBdM5BRFUv7gf381j9wygDNL+qOYSNOgtQ/DCndiYi80iIOv76QqaTmp4fa9hwI0OA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/project-service": "8.46.3",
- "@typescript-eslint/tsconfig-utils": "8.46.3",
- "@typescript-eslint/types": "8.46.3",
- "@typescript-eslint/visitor-keys": "8.46.3",
- "debug": "^4.3.4",
- "fast-glob": "^3.3.2",
- "is-glob": "^4.0.3",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^2.1.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4 <6.0.0"
- }
- },
- "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
- "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
- "version": "9.0.5",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
- "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/@typescript-eslint/utils": {
- "version": "8.46.3",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.3.tgz",
- "integrity": "sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.7.0",
- "@typescript-eslint/scope-manager": "8.46.3",
- "@typescript-eslint/types": "8.46.3",
- "@typescript-eslint/typescript-estree": "8.46.3"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <6.0.0"
- }
- },
- "node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.46.3",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.3.tgz",
- "integrity": "sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "8.46.3",
- "eslint-visitor-keys": "^4.2.1"
- },
- "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.15.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
- "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/acorn-jsx": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
- "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
- }
- },
- "node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true,
- "license": "Python-2.0"
- },
- "node_modules/aria-query": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
- "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
- "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/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/brace-expansion": {
- "version": "1.1.12",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
- "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/braces": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
- "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fill-range": "^7.1.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "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/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/cross-spawn": {
- "version": "7.0.6",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
- "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/cssesc": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
- "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "cssesc": "bin/cssesc"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "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/deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "dev": true,
- "license": "MIT"
- },
- "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/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/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint": {
- "version": "9.39.1",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz",
- "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.8.0",
- "@eslint-community/regexpp": "^4.12.1",
- "@eslint/config-array": "^0.21.1",
- "@eslint/config-helpers": "^0.4.2",
- "@eslint/core": "^0.17.0",
- "@eslint/eslintrc": "^3.3.1",
- "@eslint/js": "9.39.1",
- "@eslint/plugin-kit": "^0.4.1",
- "@humanfs/node": "^0.16.6",
- "@humanwhocodes/module-importer": "^1.0.1",
- "@humanwhocodes/retry": "^0.4.2",
- "@types/estree": "^1.0.6",
- "ajv": "^6.12.4",
- "chalk": "^4.0.0",
- "cross-spawn": "^7.0.6",
- "debug": "^4.3.2",
- "escape-string-regexp": "^4.0.0",
- "eslint-scope": "^8.4.0",
- "eslint-visitor-keys": "^4.2.1",
- "espree": "^10.4.0",
- "esquery": "^1.5.0",
- "esutils": "^2.0.2",
- "fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^8.0.0",
- "find-up": "^5.0.0",
- "glob-parent": "^6.0.2",
- "ignore": "^5.2.0",
- "imurmurhash": "^0.1.4",
- "is-glob": "^4.0.0",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "lodash.merge": "^4.6.2",
- "minimatch": "^3.1.2",
- "natural-compare": "^1.4.0",
- "optionator": "^0.9.3"
- },
- "bin": {
- "eslint": "bin/eslint.js"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://eslint.org/donate"
- },
- "peerDependencies": {
- "jiti": "*"
- },
- "peerDependenciesMeta": {
- "jiti": {
- "optional": true
- }
- }
- },
- "node_modules/eslint-config-prettier": {
- "version": "10.1.8",
- "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz",
- "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "eslint-config-prettier": "bin/cli.js"
- },
- "funding": {
- "url": "https://opencollective.com/eslint-config-prettier"
- },
- "peerDependencies": {
- "eslint": ">=7.0.0"
- }
- },
- "node_modules/eslint-plugin-svelte": {
- "version": "3.13.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-3.13.0.tgz",
- "integrity": "sha512-2ohCCQJJTNbIpQCSDSTWj+FN0OVfPmSO03lmSNT7ytqMaWF6kpT86LdzDqtm4sh7TVPl/OEWJ/d7R87bXP2Vjg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.6.1",
- "@jridgewell/sourcemap-codec": "^1.5.0",
- "esutils": "^2.0.3",
- "globals": "^16.0.0",
- "known-css-properties": "^0.37.0",
- "postcss": "^8.4.49",
- "postcss-load-config": "^3.1.4",
- "postcss-safe-parser": "^7.0.0",
- "semver": "^7.6.3",
- "svelte-eslint-parser": "^1.4.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ota-meshi"
- },
- "peerDependencies": {
- "eslint": "^8.57.1 || ^9.0.0",
- "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0"
- },
- "peerDependenciesMeta": {
- "svelte": {
- "optional": true
- }
- }
- },
- "node_modules/eslint-scope": {
- "version": "8.4.0",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
- "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint-visitor-keys": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
- "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "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/espree": {
- "version": "10.4.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
- "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "acorn": "^8.15.0",
- "acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^4.2.1"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/esquery": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
- "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "estraverse": "^5.1.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/esrap": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.1.2.tgz",
- "integrity": "sha512-DgvlIQeowRNyvLPWW4PT7Gu13WznY288Du086E751mwwbsgr29ytBiYeLzAGIo0qk3Ujob0SDk8TiSaM5WQzNg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.4.15"
- }
- },
- "node_modules/esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fast-glob": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
- "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.8"
- },
- "engines": {
- "node": ">=8.6.0"
- }
- },
- "node_modules/fast-glob/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fastq": {
- "version": "1.19.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
- "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "reusify": "^1.0.4"
- }
- },
- "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/file-entry-cache": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
- "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "flat-cache": "^4.0.0"
- },
- "engines": {
- "node": ">=16.0.0"
- }
- },
- "node_modules/fill-range": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
- "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/flat-cache": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
- "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "flatted": "^3.2.9",
- "keyv": "^4.5.4"
- },
- "engines": {
- "node": ">=16"
- }
- },
- "node_modules/flatted": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
- "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
- "dev": true,
- "license": "ISC"
- },
- "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/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/globals": {
- "version": "16.5.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz",
- "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/graphemer": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
- "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ignore": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
- "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/import-fresh": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
- "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8.19"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "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/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "argparse": "^2.0.1"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/json-buffer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
- "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/keyv": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
- "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "json-buffer": "3.0.1"
- }
- },
- "node_modules/known-css-properties": {
- "version": "0.37.0",
- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz",
- "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/levn": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
- "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "prelude-ls": "^1.2.1",
- "type-check": "~0.4.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/lilconfig": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
- "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- }
- },
- "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/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-locate": "^5.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/lodash.merge": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
- "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
- "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/marked": {
- "version": "17.0.1",
- "resolved": "https://registry.npmjs.org/marked/-/marked-17.0.1.tgz",
- "integrity": "sha512-boeBdiS0ghpWcSwoNm/jJBwdpFaMnZWRzjA6SkUMYb40SVaN1x7mmfGKp0jvexGcx+7y2La5zRZsYFZI6Qpypg==",
- "license": "MIT",
- "bin": {
- "marked": "bin/marked.js"
- },
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/micromatch": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
- "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "braces": "^3.0.3",
- "picomatch": "^2.3.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/micromatch/node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "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/natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/optionator": {
- "version": "0.9.4",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
- "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "deep-is": "^0.1.3",
- "fast-levenshtein": "^2.0.6",
- "levn": "^0.4.1",
- "prelude-ls": "^1.2.1",
- "type-check": "^0.4.0",
- "word-wrap": "^1.2.5"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "yocto-queue": "^0.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-limit": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "callsites": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "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.3",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
- "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/postcss": {
- "version": "8.5.6",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
- "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
- "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/postcss-load-config": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
- "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "lilconfig": "^2.0.5",
- "yaml": "^1.10.2"
- },
- "engines": {
- "node": ">= 10"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- "peerDependencies": {
- "postcss": ">=8.0.9",
- "ts-node": ">=9.0.0"
- },
- "peerDependenciesMeta": {
- "postcss": {
- "optional": true
- },
- "ts-node": {
- "optional": true
- }
- }
- },
- "node_modules/postcss-load-config/node_modules/yaml": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
- "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/postcss-safe-parser": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz",
- "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-scss": {
- "version": "4.0.9",
- "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz",
- "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss-scss"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=12.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.29"
- }
- },
- "node_modules/postcss-selector-parser": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
- "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/prelude-ls": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
- "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/prettier": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz",
- "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "prettier": "bin/prettier.cjs"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/prettier/prettier?sponsor=1"
- }
- },
- "node_modules/prettier-plugin-svelte": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.4.0.tgz",
- "integrity": "sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "prettier": "^3.0.0",
- "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0"
- }
- },
- "node_modules/punycode": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
- "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT"
- },
- "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/resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/reusify": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
- "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
- }
- },
- "node_modules/rollup": {
- "version": "4.52.5",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.5.tgz",
- "integrity": "sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==",
- "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.52.5",
- "@rollup/rollup-android-arm64": "4.52.5",
- "@rollup/rollup-darwin-arm64": "4.52.5",
- "@rollup/rollup-darwin-x64": "4.52.5",
- "@rollup/rollup-freebsd-arm64": "4.52.5",
- "@rollup/rollup-freebsd-x64": "4.52.5",
- "@rollup/rollup-linux-arm-gnueabihf": "4.52.5",
- "@rollup/rollup-linux-arm-musleabihf": "4.52.5",
- "@rollup/rollup-linux-arm64-gnu": "4.52.5",
- "@rollup/rollup-linux-arm64-musl": "4.52.5",
- "@rollup/rollup-linux-loong64-gnu": "4.52.5",
- "@rollup/rollup-linux-ppc64-gnu": "4.52.5",
- "@rollup/rollup-linux-riscv64-gnu": "4.52.5",
- "@rollup/rollup-linux-riscv64-musl": "4.52.5",
- "@rollup/rollup-linux-s390x-gnu": "4.52.5",
- "@rollup/rollup-linux-x64-gnu": "4.52.5",
- "@rollup/rollup-linux-x64-musl": "4.52.5",
- "@rollup/rollup-openharmony-arm64": "4.52.5",
- "@rollup/rollup-win32-arm64-msvc": "4.52.5",
- "@rollup/rollup-win32-ia32-msvc": "4.52.5",
- "@rollup/rollup-win32-x64-gnu": "4.52.5",
- "@rollup/rollup-win32-x64-msvc": "4.52.5",
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "queue-microtask": "^1.2.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/semver": {
- "version": "7.7.3",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
- "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "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/strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/svelte": {
- "version": "5.43.4",
- "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.43.4.tgz",
- "integrity": "sha512-tPNp21nDWB0PSHE+VrTvEy9cFtDp2Q+ATxQoFomISEVdikZ1QZ69UqBPz/LlT+Oc8/LYS/COYwDQZrmZEUr+JQ==",
- "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",
- "acorn": "^8.12.1",
- "aria-query": "^5.3.1",
- "axobject-query": "^4.1.0",
- "clsx": "^2.1.1",
- "esm-env": "^1.2.1",
- "esrap": "^2.1.0",
- "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.3.3",
- "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.3.3.tgz",
- "integrity": "sha512-RYP0bEwenDXzfv0P1sKAwjZSlaRyqBn0Fz1TVni58lqyEiqgwztTpmodJrGzP6ZT2aHl4MbTvWP6gbmQ3FOnBg==",
- "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/svelte-eslint-parser": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-1.4.0.tgz",
- "integrity": "sha512-fjPzOfipR5S7gQ/JvI9r2H8y9gMGXO3JtmrylHLLyahEMquXI0lrebcjT+9/hNgDej0H7abTyox5HpHmW1PSWA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "eslint-scope": "^8.2.0",
- "eslint-visitor-keys": "^4.0.0",
- "espree": "^10.0.0",
- "postcss": "^8.4.49",
- "postcss-scss": "^4.0.9",
- "postcss-selector-parser": "^7.0.0"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0",
- "pnpm": "10.18.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ota-meshi"
- },
- "peerDependencies": {
- "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0"
- },
- "peerDependenciesMeta": {
- "svelte": {
- "optional": true
- }
- }
- },
- "node_modules/svelte-render-scan": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/svelte-render-scan/-/svelte-render-scan-1.1.0.tgz",
- "integrity": "sha512-9S73wEtcnn9Hn0HsOSufm+AC+3Es2rMXoWMEWk6Fa3w3yORBg6khOSsZ8+kj/rY4BJRZTyjuFQBytFPGC8YHGQ==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "svelte": "^5.0.0"
- }
- },
- "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/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/ts-api-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
- "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18.12"
- },
- "peerDependencies": {
- "typescript": ">=4.8.4"
- }
- },
- "node_modules/type-check": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
- "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "prelude-ls": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "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/typescript-eslint": {
- "version": "8.46.3",
- "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.3.tgz",
- "integrity": "sha512-bAfgMavTuGo+8n6/QQDVQz4tZ4f7Soqg53RbrlZQEoAltYop/XR4RAts/I0BrO3TTClTSTFJ0wYbla+P8cEWJA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/eslint-plugin": "8.46.3",
- "@typescript-eslint/parser": "8.46.3",
- "@typescript-eslint/typescript-estree": "8.46.3",
- "@typescript-eslint/utils": "8.46.3"
- },
- "engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0",
- "typescript": ">=4.8.4 <6.0.0"
- }
- },
- "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/uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "punycode": "^2.1.0"
- }
- },
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/vite": {
- "version": "7.2.2",
- "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.2.tgz",
- "integrity": "sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "esbuild": "^0.25.0",
- "fdir": "^6.5.0",
- "picomatch": "^4.0.3",
- "postcss": "^8.5.6",
- "rollup": "^4.43.0",
- "tinyglobby": "^0.2.15"
- },
- "bin": {
- "vite": "bin/vite.js"
- },
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- },
- "funding": {
- "url": "https://github.com/vitejs/vite?sponsor=1"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.3"
- },
- "peerDependencies": {
- "@types/node": "^20.19.0 || >=22.12.0",
- "jiti": ">=1.21.0",
- "less": "^4.0.0",
- "lightningcss": "^1.21.0",
- "sass": "^1.70.0",
- "sass-embedded": "^1.70.0",
- "stylus": ">=0.54.8",
- "sugarss": "^5.0.0",
- "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.1",
- "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.1.tgz",
- "integrity": "sha512-B/Fegf3i8zh0yFbpzZ21amWzHmuNlLlmJT6n7bu5e+pCHUKQIfXSYokrqOBGEMMe9UG2sostKQF9mml/vYaWJQ==",
- "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-beta.0"
- },
- "peerDependenciesMeta": {
- "vite": {
- "optional": true
- }
- }
- },
- "node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/word-wrap": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
- "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "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/param_decomp_lab/app/frontend/frontend/package.json b/param_decomp_lab/app/frontend/frontend/package.json
deleted file mode 100644
index f298885ce..000000000
--- a/param_decomp_lab/app/frontend/frontend/package.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "name": "frontend",
- "private": true,
- "version": "0.0.0",
- "type": "module",
- "scripts": {
- "dev": "vite",
- "build": "vite build",
- "check": "svelte-check --tsconfig ./tsconfig.json",
- "lint": "eslint .",
- "format": "prettier --write ."
- },
- "devDependencies": {
- "@eslint/js": "^9.38.0",
- "@sveltejs/vite-plugin-svelte": "^6.2.1",
- "@tsconfig/svelte": "^5.0.5",
- "@types/node": "^24.6.0",
- "eslint": "^9.38.0",
- "eslint-config-prettier": "^10.1.8",
- "eslint-plugin-svelte": "^3.12.5",
- "globals": "^16.4.0",
- "prettier": "^3.6.2",
- "prettier-plugin-svelte": "^3.4.0",
- "svelte": "^5.39.6",
- "svelte-check": "^4.3.2",
- "svelte-render-scan": "^1.1.0",
- "typescript": "~5.9.3",
- "typescript-eslint": "^8.46.2",
- "vite": "^7.1.7"
- },
- "dependencies": {
- "marked": "^17.0.1"
- }
-}
diff --git a/param_decomp_lab/app/frontend/frontend/public/favicon.png b/param_decomp_lab/app/frontend/frontend/public/favicon.png
deleted file mode 100644
index 0c616ff0b..000000000
Binary files a/param_decomp_lab/app/frontend/frontend/public/favicon.png and /dev/null differ
diff --git a/param_decomp_lab/app/frontend/frontend/src/App.svelte b/param_decomp_lab/app/frontend/frontend/src/App.svelte
deleted file mode 100644
index c7a073625..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/App.svelte
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-{#if showWhichView === "run-selector"}
-
-{:else}
-
-{/if}
diff --git a/param_decomp_lab/app/frontend/frontend/src/app.css b/param_decomp_lab/app/frontend/frontend/src/app.css
deleted file mode 100644
index bf6649aee..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/app.css
+++ /dev/null
@@ -1,140 +0,0 @@
-:root {
- /* Goodfire-inspired - warm whites, navy text, vibrant blue accent */
- --bg-base: #ffffff;
- --bg-surface: #ffffff;
- --bg-elevated: #ffffff;
- --bg-inset: #f7f6f2;
- --bg-hover: #f0efeb;
-
- --border-subtle: #e5e3dc;
- --border-default: #c8c5bc;
- --border-strong: #8a8780;
-
- --text-primary: #1d272a;
- --text-secondary: #646464;
- --text-muted: #b4b4b4;
-
- --accent-primary: #7c4d33;
- --accent-primary-bright: #96613f;
- --accent-primary-dim: #5e3a27;
-
- --status-positive: #16a34a;
- --status-positive-bright: #22c55e;
- --status-negative: #dc2626;
- --status-negative-bright: #ef4444;
- --status-warning: #eab308;
- --status-warning-bright: #facc15;
- --status-info: #4d65ff;
- --status-info-bright: #6b7fff;
-
- --focus-ring: #4d65ff;
-
- /* Typography - Clean system fonts with mono for code */
- --font-mono: "SF Mono", "Menlo", "Monaco", "Consolas", monospace;
- --font-sans: -apple-system, BlinkMacSystemFont, "SF Pro Text", "Helvetica Neue", sans-serif;
-
- --text-xs: 0.75rem;
- --text-sm: 0.8125rem;
- --text-base: 0.875rem;
- --text-lg: 1rem;
-
- /* Spacing */
- --space-1: 0.25rem;
- --space-2: 0.5rem;
- --space-3: 0.75rem;
- --space-4: 1rem;
- --space-6: 1.5rem;
-
- /* Radius */
- --radius-sm: 4px;
- --radius-md: 6px;
- --radius-lg: 8px;
-
- /* Shadows - standardized opacity levels */
- --shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.08);
- --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.12);
- --shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.16);
-
- /* Transitions - standardized timing */
- --transition-fast: 0.1s ease;
- --transition-normal: 0.15s ease;
- --transition-slow: 0.2s ease;
-}
-
-* {
- box-sizing: border-box;
-}
-
-body {
- margin: 0;
- font-family: var(--font-sans);
- background: var(--bg-base);
- color: var(--text-primary);
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-}
-
-#app {
- width: 100%;
- min-height: 100vh;
- background: var(--bg-base);
-}
-
-/* Base button reset and styles */
-button {
- font-family: var(--font-sans);
- font-size: var(--text-sm);
- border-radius: var(--radius-sm);
- cursor: pointer;
- transition:
- background-color var(--transition-fast),
- border-color var(--transition-fast),
- color var(--transition-fast);
-}
-
-button:disabled {
- cursor: not-allowed;
- opacity: 0.6;
-}
-
-/* Reusable tooltip pattern */
-.info-icon {
- position: relative;
- cursor: help;
- color: var(--text-muted);
- font-size: var(--text-xs);
- width: 14px;
- height: 14px;
- line-height: 14px;
- text-align: center;
- border: 1px solid var(--border-default);
- border-radius: 50%;
- display: inline-block;
-}
-
-.info-icon::after {
- content: attr(data-tooltip);
- position: absolute;
- top: 100%;
- left: 0;
- margin-top: 4px;
- padding: var(--space-2) var(--space-2);
- background: var(--bg-elevated);
- border: 1px solid var(--border-default);
- border-radius: var(--radius-sm);
- color: var(--text-secondary);
- font-size: var(--text-xs);
- font-family: var(--font-sans);
- line-height: 1.4;
- width: 200px;
- white-space: normal;
- opacity: 0;
- pointer-events: none;
- z-index: 1000;
- box-shadow: var(--shadow-md);
- transition: opacity var(--transition-slow);
-}
-
-.info-icon:hover::after {
- opacity: 1;
-}
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/ActivationContextsPagedTable.svelte b/param_decomp_lab/app/frontend/frontend/src/components/ActivationContextsPagedTable.svelte
deleted file mode 100644
index c9c304950..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/ActivationContextsPagedTable.svelte
+++ /dev/null
@@ -1,386 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
- {#if loading}
-
-
- {#each Array(pageSize) as _, i (i)}
-
- {/each}
-
-
- {:else}
- {@const d = loaded!}
-
- {#if displaySettings.centerOnPeak}
-
- {#each paginatedIndices as idx (idx)}
- {@const fp = firingPositions[idx]}
-
- {/each}
-
- {:else}
-
- {#each paginatedIndices as idx (idx)}
-
-
-
- {/each}
-
- {/if}
-
- {/if}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/ActivationContextsTab.svelte b/param_decomp_lab/app/frontend/frontend/src/components/ActivationContextsTab.svelte
deleted file mode 100644
index ca025ad97..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/ActivationContextsTab.svelte
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
-
- {#if summary.status === "uninitialized" || summary.status === "loading"}
-
Loading activation contexts summary...
- {:else if summary.status === "error"}
-
Error loading summary: {String(summary.error)}
- {:else if summary.data === null}
-
No harvest data available. Run postprocessing first.
- {:else}
-
- {/if}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/ActivationContextsViewer.svelte b/param_decomp_lab/app/frontend/frontend/src/components/ActivationContextsViewer.svelte
deleted file mode 100644
index 209bd66d8..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/ActivationContextsViewer.svelte
+++ /dev/null
@@ -1,541 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {#if searchError}
- {searchError}
- {/if}
-
-
-
-
-
-
-
- Mean CI: {formatMeanCi(currentMetadata.mean_ci)}
- {#if currentIntruderScore !== null}
- Intruder: {Math.round(currentIntruderScore * 100)}%
- {/if}
-
-
-
-
- {#if currentGraphInterpLabel && componentData.graphInterpDetail.status === "loaded" && componentData.graphInterpDetail.data}
-
- {/if}
-
-
-
- {#if activationExamples.status === "error"}
-
Error loading component data: {String(activationExamples.error)}
- {:else}
-
- {/if}
-
-
-
-
- {#if componentData.datasetAttributions?.status === "loaded" && componentData.datasetAttributions.data}
-
- {:else if componentData.datasetAttributions?.status === "loading"}
-
-
- Loading...
-
- {:else if componentData.datasetAttributions?.status === "error"}
-
-
- Error: {String(componentData.datasetAttributions.error)}
-
- {/if}
-
-
- {#if componentData.tokenStats.status === "uninitialized" || componentData.tokenStats.status === "loading"}
- Loading token stats...
- {:else if componentData.tokenStats.status === "error"}
- Error: {String(componentData.tokenStats.error)}
- {:else}
-
-
-
- {/if}
-
-
-
- {#if anyCorrelationStatsEnabled()}
-
-
- {#if componentData.correlations.status === "uninitialized" || componentData.correlations.status === "loading"}
- Loading...
- {:else if componentData.correlations.status === "error"}
- Error loading correlations: {String(componentData.correlations.error)}
- {:else if componentData.correlations.data === null}
- No correlations data. Run harvest pipeline first.
- {:else}
-
- {/if}
-
- {/if}
-
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/AutointerpCompareTab.svelte b/param_decomp_lab/app/frontend/frontend/src/components/AutointerpCompareTab.svelte
deleted file mode 100644
index 9af35a172..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/AutointerpCompareTab.svelte
+++ /dev/null
@@ -1,114 +0,0 @@
-
-
-
- {#if subrunsState.status === "uninitialized" || subrunsState.status === "loading"}
-
Loading subruns...
- {:else if subrunsState.status === "error"}
-
Error loading subruns: {String(subrunsState.error)}
- {:else if subrunsState.data.length === 0}
-
No completed autointerp subruns found.
- {:else}
-
-
- {#if selectedSubruns.length > 0}
- {#if summary.status === "loaded" && summary.data !== null}
-
- {:else if summary.status === "loading" || summary.status === "uninitialized"}
-
Loading component data...
- {:else if summary.status === "error"}
-
Error loading component data: {String(summary.error)}
- {:else}
-
No harvest data available. Run postprocessing first.
- {/if}
- {:else}
-
Select one or more subruns to compare interpretations.
- {/if}
- {/if}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/AutointerpComparer.svelte b/param_decomp_lab/app/frontend/frontend/src/components/AutointerpComparer.svelte
deleted file mode 100644
index 825f9cdeb..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/AutointerpComparer.svelte
+++ /dev/null
@@ -1,581 +0,0 @@
-
-
-{#if currentMetadata}
-
-
-
-
-
-
-
-
-
-
-
-
- {#if searchError}
- {searchError}
- {/if}
-
-
-
-
-
-
-
-
- Mean CI: {formatMeanCi(currentMetadata.mean_ci)}
-
-
-
- {#each selectedSubruns as subrun (subrun.subrun_id)}
-
- {/each}
-
-
-
-
- {#if activationExamples.status === "error"}
-
Error loading component data: {String(activationExamples.error)}
- {:else}
-
- {/if}
-
-
-
- {#if componentData.datasetAttributions?.status === "loaded" && componentData.datasetAttributions.data}
-
- {:else if componentData.datasetAttributions?.status === "loading"}
-
-
- Loading...
-
- {/if}
-
-
- {#if componentData.tokenStats.status === "uninitialized" || componentData.tokenStats.status === "loading"}
- Loading token stats...
- {:else if componentData.tokenStats.status === "error"}
- Error: {String(componentData.tokenStats.error)}
- {:else}
-
-
- {/if}
-
-
- {#if anyCorrelationStatsEnabled()}
-
-
- {#if componentData.correlations.status === "uninitialized" || componentData.correlations.status === "loading"}
- Loading...
- {:else if componentData.correlations.status === "error"}
- Error loading correlations
- {:else if componentData.correlations.data === null}
- No correlations data.
- {:else}
-
- {/if}
-
- {/if}
-
-
-
-{:else}
- No components above CI cutoff
-{/if}
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/ClusterComponentCard.svelte b/param_decomp_lab/app/frontend/frontend/src/components/ClusterComponentCard.svelte
deleted file mode 100644
index e5c6769b5..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/ClusterComponentCard.svelte
+++ /dev/null
@@ -1,254 +0,0 @@
-
-
-
-
-
-
-
-
-
- {#if activationExamples.status === "error"}
-
Error loading details: {String(activationExamples.error)}
- {:else if activationExamples.status === "loaded" && activationExamples.data.tokens.length === 0}
-
- {:else}
-
- {/if}
-
-
-
-
- {#if componentData.datasetAttributions.status === "uninitialized"}
-
uninitialized
- {:else if componentData.datasetAttributions.status === "loaded"}
- {#if componentData.datasetAttributions.data !== null}
-
- {:else}
-
No dataset attributions available.
- {/if}
- {:else if componentData.datasetAttributions.status === "loading"}
-
-
- Loading...
-
- {:else if componentData.datasetAttributions.status === "error"}
-
-
- Error: {String(componentData.datasetAttributions.error)}
-
- {/if}
-
-
-
-
- {#if componentData.tokenStats.status === "loading" || componentData.tokenStats.status === "uninitialized"}
- Loading token stats...
- {:else if componentData.tokenStats.status === "error"}
- Error: {String(componentData.tokenStats.error)}
- {:else}
-
-
-
- {/if}
-
-
-
- {#if anyCorrelationStatsEnabled()}
-
-
- {#if componentData.correlations.status === "loading"}
- Loading...
- {:else if componentData.correlations.status === "loaded" && componentData.correlations.data}
-
- {:else if componentData.correlations.status === "error"}
- Error loading correlations: {String(componentData.correlations.error)}
- {:else}
- No correlations available.
- {/if}
-
- {/if}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/ClusterPathInput.svelte b/param_decomp_lab/app/frontend/frontend/src/components/ClusterPathInput.svelte
deleted file mode 100644
index 6adcfb2b3..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/ClusterPathInput.svelte
+++ /dev/null
@@ -1,364 +0,0 @@
-
-
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/ClustersTab.svelte b/param_decomp_lab/app/frontend/frontend/src/components/ClustersTab.svelte
deleted file mode 100644
index 4ecf586c3..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/ClustersTab.svelte
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
- {#if clusterMapping}
-
- {:else}
- No clusters loaded. Use the cluster path input in the header bar to load a cluster mapping.
- {/if}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/ClustersViewer.svelte b/param_decomp_lab/app/frontend/frontend/src/components/ClustersViewer.svelte
deleted file mode 100644
index 6ff194c82..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/ClustersViewer.svelte
+++ /dev/null
@@ -1,249 +0,0 @@
-
-
-
- {#if selectedClusterId === null}
-
-
- {#each clusterGroups.sorted as [clusterId, members] (clusterId)}
- {@const previewLabels = getPreviewLabels(members)}
-
- {/each}
- {#if clusterGroups.singletons.length > 0}
-
- {/if}
-
- {:else}
-
-
-
- {#each selectedMembers as member (`${member.layer}:${member.cIdx}`)}
-
-
-
- {/each}
-
-
- {/if}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/ComponentProbeInput.svelte b/param_decomp_lab/app/frontend/frontend/src/components/ComponentProbeInput.svelte
deleted file mode 100644
index bf537c38e..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/ComponentProbeInput.svelte
+++ /dev/null
@@ -1,128 +0,0 @@
-
-
-
-
Custom Text
-
- {#if probeResult.status === "loading"}
-
Loading...
- {:else if probeResult.status === "error"}
-
{probeResult.error}
- {:else if probeResult.status === "loaded" && probeResult.data.tokens.length > 0}
-
-
-
- {/if}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/DataSourcesTab.svelte b/param_decomp_lab/app/frontend/frontend/src/components/DataSourcesTab.svelte
deleted file mode 100644
index c54a1fa0a..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/DataSourcesTab.svelte
+++ /dev/null
@@ -1,350 +0,0 @@
-
-
-
-
-
- {#if runState.run.status === "loaded" && runState.run.data.config_yaml}
-
- Run Config
- {runState.run.data.config_yaml}
-
- {/if}
-
-
- Target Model
- {#if pretrainData.status === "loading"}
- Loading...
- {:else if pretrainData.status === "loaded"}
- {@const pt = pretrainData.data}
-
- Architecture
- {pt.summary}
- {#if pt.pretrain_wandb_path}
- Pretrain run
- {pt.pretrain_wandb_path}
- {/if}
-
- {#if pt.topology}
-
-
-
- {/if}
- {#if pt.pretrain_config}
-
- Pretraining config
- {formatPretrainConfigYaml(pt.pretrain_config)}
-
- {/if}
- {:else if pretrainData.status === "error"}
- Failed to load target model info
- {/if}
-
-
-
-
-
-
-
-
- {#if data.status === "loading"}
- Loading...
- {:else if data.status === "loaded" && data.data.harvest}
- {@const harvest = data.data.harvest}
-
- Subrun
- {harvest.subrun_id}
- Components
- {harvest.n_components.toLocaleString()}
- Intruder eval
- {harvest.has_intruder_scores ? "yes" : "no"}
- {#each Object.entries(harvest.config) as [key, value] (key)}
- {key}
- {formatConfigValue(value)}
- {/each}
-
- {:else if data.status === "loaded"}
- Not available
- {/if}
-
-
-
-
-
- {#if data.status === "loading"}
- Loading...
- {:else if data.status === "loaded" && data.data.autointerp}
- {@const autointerp = data.data.autointerp}
-
- Subrun
- {autointerp.subrun_id}
- Interpretations
- {autointerp.n_interpretations.toLocaleString()}
- Eval scores
-
- {#if autointerp.eval_scores.length > 0}
- {autointerp.eval_scores.join(", ")}
- {:else}
- none
- {/if}
-
- {#each Object.entries(autointerp.config) as [key, value] (key)}
- {key}
- {formatConfigValue(value)}
- {/each}
-
- {:else if data.status === "loaded"}
- Not available
- {/if}
-
-
-
-
-
- {#if data.status === "loading"}
- Loading...
- {:else if data.status === "loaded" && data.data.attributions}
- {@const attributions = data.data.attributions}
-
- Subrun
- {attributions.subrun_id}
- Tokens
- {attributions.n_tokens_processed.toLocaleString()}
- CI threshold
- {attributions.ci_threshold}
-
- {:else if data.status === "loaded"}
- Not available
- {/if}
-
-
-
-
-
- {#if data.status === "loading"}
- Loading...
- {:else if data.status === "loaded" && data.data.graph_interp}
- {@const graph_interp = data.data.graph_interp}
-
- Subrun
- {graph_interp.subrun_id}
- {#each Object.entries(graph_interp.label_counts) as [key, value] (key)}
- {key} labels
- {value.toLocaleString()}
- {/each}
- {#if graph_interp.config}
- {#each Object.entries(graph_interp.config) as [key, value] (key)}
- {key}
- {formatConfigValue(value)}
- {/each}
- {/if}
-
- {:else if data.status === "loaded"}
- Not available
- {/if}
-
-
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/DatasetExplorerTab.svelte b/param_decomp_lab/app/frontend/frontend/src/components/DatasetExplorerTab.svelte
deleted file mode 100644
index 4befbc7b2..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/DatasetExplorerTab.svelte
+++ /dev/null
@@ -1,97 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/DatasetRandomPanel.svelte b/param_decomp_lab/app/frontend/frontend/src/components/DatasetRandomPanel.svelte
deleted file mode 100644
index cda9ef0d7..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/DatasetRandomPanel.svelte
+++ /dev/null
@@ -1,357 +0,0 @@
-
-
-
-
-
-
- {#if randomSamples.status === "loaded"}
-
- Showing {randomSamples.data.results.length} random samples (seed: {randomSamples.data.seed})
-
- {/if}
-
-
-
- {#if randomPageResults}
-
-
- P(token):
- Low
- →
- High
-
-
- {#each randomPageResults.results as sample, idx (idx)}
-
- {/each}
-
- {#if randomPageResults.total_pages > 1}
-
- {/if}
-
- {:else if randomSamples.status === "loading"}
-
Loading random samples...
- {:else if randomSamples.status === "error"}
-
Error: {randomSamples.error}
- {:else}
-
-
Click "Load Samples" to fetch random stories
-
- {/if}
-
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/DatasetSearchPanel.svelte b/param_decomp_lab/app/frontend/frontend/src/components/DatasetSearchPanel.svelte
deleted file mode 100644
index cdb073509..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/DatasetSearchPanel.svelte
+++ /dev/null
@@ -1,234 +0,0 @@
-
-
-
-
-
-
- {#if searchMetadata}
-
- Found {searchMetadata.total_results} results in {searchMetadata.search_time_seconds.toFixed(2)}s
-
- {/if}
-
-
-
- {#if searchResults.status === "loaded"}
-
- {:else if searchResults.status === "loading"}
-
Searching dataset...
- {:else if searchResults.status === "error"}
-
Error: {searchResults.error}
- {:else}
-
-
No search performed yet
-
Enter a query above to search the dataset
-
- {/if}
-
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/DatasetSearchResults.svelte b/param_decomp_lab/app/frontend/frontend/src/components/DatasetSearchResults.svelte
deleted file mode 100644
index 799f7e38c..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/DatasetSearchResults.svelte
+++ /dev/null
@@ -1,92 +0,0 @@
-
-
-
-
- {#each results as result, idx (idx)}
-
- {/each}
-
-
- {#if totalPages > 1}
-
- {/if}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/InvestigationsTab.svelte b/param_decomp_lab/app/frontend/frontend/src/components/InvestigationsTab.svelte
deleted file mode 100644
index eae07f298..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/InvestigationsTab.svelte
+++ /dev/null
@@ -1,642 +0,0 @@
-
-
-
- {#if selected?.status === "loaded"}
-
-
-
- {#if selected.data.summary}
-
{selected.data.summary}
- {/if}
-
-
-
- {formatId(selected.data.id)} · Started {formatDate(selected.data.created_at)}
- {#if selected.data.wandb_path}
- · {selected.data.wandb_path}
- {/if}
-
-
-
-
-
-
-
-
- {#if activeTab === "research"}
- {#if selected.data.research_log}
-
- {:else}
-
No research log available
- {/if}
- {:else}
-
- {#each selected.data.events as event, i (i)}
-
-
- {event.event_type}
-
-
{formatDate(event.timestamp)}
-
{event.message}
- {#if event.details && Object.keys(event.details).length > 0}
-
- Details
- {JSON.stringify(event.details, null, 2)}
-
- {/if}
-
- {:else}
-
No events recorded
- {/each}
-
- {/if}
-
- {:else if selected?.status === "loading"}
-
Loading investigation...
- {:else}
-
-
-
-
- {#if launchState.status === "error"}
-
{launchState.error}
- {/if}
-
- {#if investigations.status === "loading"}
-
Loading investigations...
- {:else if investigations.status === "error"}
-
{investigations.error}
- {:else if investigations.status === "loaded"}
-
- {#each investigations.data as inv (inv.id)}
-
- {:else}
-
- No investigations found. Run pd-investigate to create one.
-
- {/each}
-
- {/if}
- {/if}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/ModelGraph.svelte b/param_decomp_lab/app/frontend/frontend/src/components/ModelGraph.svelte
deleted file mode 100644
index e097adac5..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/ModelGraph.svelte
+++ /dev/null
@@ -1,470 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {filteredNodes.length} nodes, {visibleEdges.length} edges
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {#if tooltipNode}
-
- {/if}
-
-
- {#if selectedNodeKey}
- {@const selectedNode = layout.nodes.get(selectedNodeKey)}
- {#if selectedNode}
-
-
-
{selectedNode.key}
-
- {#if selectedNodeEdges.length > 0}
-
- {#each selectedNodeEdges as e, i (i)}
- {@const other = e.source === selectedNodeKey ? e.target : e.source}
- {@const otherNode = layout.nodes.get(other)}
-
- {e.source === selectedNodeKey ? "to" : "from"}
- {otherNode?.label ?? other}
- {e.attribution.toFixed(3)}
-
- {/each}
-
- {:else}
-
No edges
- {/if}
-
-
- {/if}
- {/if}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/ProbColoredTokens.svelte b/param_decomp_lab/app/frontend/frontend/src/components/ProbColoredTokens.svelte
deleted file mode 100644
index 7b30870c3..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/ProbColoredTokens.svelte
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-{#each tokens as tok, i (i)}{@const prob = getProbAtPosition(nextTokenProbs, i)}{/each}
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/PromptAttributionsGraph.svelte b/param_decomp_lab/app/frontend/frontend/src/components/PromptAttributionsGraph.svelte
deleted file mode 100644
index c5e182917..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/PromptAttributionsGraph.svelte
+++ /dev/null
@@ -1,1058 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {#if hoveredEdge}
-
- {/if}
-
-
- {#if hoveredNode}
-
(isHoveringTooltip = true)}
- onMouseLeave={() => {
- isHoveringTooltip = false;
- handleNodeMouseLeave();
- }}
- onPinComponent={toggleComponentPinned}
- />
- {/if}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/PromptAttributionsTab.svelte b/param_decomp_lab/app/frontend/frontend/src/components/PromptAttributionsTab.svelte
deleted file mode 100644
index 32c91f4eb..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/PromptAttributionsTab.svelte
+++ /dev/null
@@ -1,1714 +0,0 @@
-
-
-
-
-
-
-
-
-
- {#if tabView.view === "draft"}
- {@const draft = tabView.draft}
-
-
-
-
-
- {#if prompts.length > 0}
-
-
-
- {#each prompts as prompt (prompt.id)}
- {#if confirmingDeleteId === prompt.id}
-
- Delete prompt #{prompt.id}?
-
-
-
- {:else}
-
-
-
-
- {/if}
- {/each}
-
-
- {/if}
-
-
- {:else if activeCard}
-
-
-
-
-
-
- {#if activeGraph}
-
- {#if activeGraph.data.optimization}
-
- {/if}
-
-
-
-
-
- {#if activeCard.activeView === "graph"}
-
-
(hideUnpinnedEdges = v)}
- onHideNodeCardChange={(v) => (hideNodeCard = v)}
- />
-
- L0:
- {activeGraph.data.l0_total.toFixed(0)} active at ci threshold {activeGraph
- .viewSettings.ciThreshold}
- {#if pinnedNodes.length > 0}
- {pinnedNodes.length} pinned
- {/if}
-
- {#key activeGraph.id}
- (filteredEdgeCount = count)}
- onHoveredNodeChange={(node) => (hoveredNode = node)}
- />
- {/key}
-
-
- {:else if activeInterventionState}
-
(hideUnpinnedEdges = v)}
- onHideNodeCardChange={(v) => (hideNodeCard = v)}
- {runningIntervention}
- {generatingSubgraph}
- onSelectionChange={handleDraftSelectionChange}
- onForwardDraft={handleForwardDraft}
- onCloneRun={handleCloneRun}
- onSelectVersion={handleSelectVersion}
- onDeleteRun={handleDeleteRun}
- onGenerateGraphFromSelection={handleGenerateGraphFromSelection}
- onHoveredNodeChange={(node) => (hoveredNode = node)}
- />
- {/if}
-
- {:else}
-
- {#if graphCompute.status === "error"}
-
- {graphCompute.error}
-
-
-
- {/if}
-
-
- {#if graphCompute.status === "computing" && graphCompute.cardId === activeCard.id}
-
- {:else}
-
-
- {#if !hasStandardGraph}
-
- {/if}
- {#if hasStandardGraph || activeCard.useOptimized}
-
- {/if}
-
-
- {#if hasStandardGraph || activeCard.useOptimized}
-
- {/if}
-
-
-
- {/if}
-
- {/if}
- {:else if tabView.view === "loading"}
-
- {:else if tabView.view === "error"}
-
-
Error loading prompt: {tabView.error}
-
-
- {/if}
-
-
- {#if !hideNodeCard && stickyComponentNode && activeGraph}
-
-
-
- {#key `${stickyComponentNode.layer}:${stickyComponentNode.cIdx}`}
- {
- handlePinnedNodesChange([
- ...pinnedNodes.filter(
- (p) => !(p.layer === layer && p.seqIdx === seqIdx && p.cIdx === cIdx),
- ),
- { layer, seqIdx, cIdx },
- ]);
- }}
- />
- {/key}
-
- {/if}
-
-
-
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/RunSelector.svelte b/param_decomp_lab/app/frontend/frontend/src/components/RunSelector.svelte
deleted file mode 100644
index 9db6d6269..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/RunSelector.svelte
+++ /dev/null
@@ -1,451 +0,0 @@
-
-
-
- {#if isLoading}
-
- {/if}
-
-
- {#if username}
- Hello, {username}
- {:else}
- PD Explorer
- {/if}
-
-
-
-
-
-
- | Run |
- Architecture |
- Notes |
- {#each AVAILABILITY_COLUMNS as col (col.key)}
- {col.abbrev}{col.tooltip} |
- {/each}
-
-
-
- {#each CANONICAL_RUNS as entry (entry.wandbRunId)}
- {@const info = backendData[entry.wandbRunId]}
- handleRowClick(entry.wandbRunId)}
- role="button"
- tabindex="0"
- onkeydown={(e) => {
- if (e.key === "Enter") handleRowClick(entry.wandbRunId);
- }}
- >
- |
- {#if entry.name}
- {entry.name}
- {/if}
- {formatRunIdForDisplay(entry.wandbRunId)}
- |
-
- {#if info?.architecture}
- {info.architecture}
- {:else if !backendLoaded}
-
- {:else}
- -
- {/if}
- |
-
- {#if entry.notes}
- {entry.notes}
- {/if}
- |
- {#each AVAILABILITY_COLUMNS as col (col.key)}
-
- {#if info}
-
- {:else if !backendLoaded}
-
- {:else}
-
- {/if}
- |
- {/each}
-
- {/each}
-
-
-
-
-
- or enter a custom path
-
-
-
-
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/RunView.svelte b/param_decomp_lab/app/frontend/frontend/src/components/RunView.svelte
deleted file mode 100644
index 99121a8da..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/RunView.svelte
+++ /dev/null
@@ -1,325 +0,0 @@
-
-
-
-
- {#if runState.run.status === "loaded"}
- {@const wandbParts = runState.run.data.wandb_path.split("/")}
-
- {runState.run.data.wandb_path}
- (wandb)
-
- {/if}
-
-
-
-
- {#if runState.run.status === "loaded"}
-
-
-
- {/if}
-
-
-
-
- {#if runState.run.status === "error"}
-
- {runState.run.error}
-
- {/if}
-
-
-
-
- {#if runState.prompts.status === "loaded"}
-
-
-
-
- {#if datasetSearchEnabled}
-
-
-
- {/if}
-
-
-
- {#if runState.clusterMapping}
-
-
-
- {/if}
- {:else if runState.run.status === "loading" || runState.prompts.status === "loading"}
-
- {:else}
-
-
Enter a W&B Path above to get started
-
- {/if}
-
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/SubrunSelector.svelte b/param_decomp_lab/app/frontend/frontend/src/components/SubrunSelector.svelte
deleted file mode 100644
index f4cc25118..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/SubrunSelector.svelte
+++ /dev/null
@@ -1,243 +0,0 @@
-
-
-
-
-
- {#if !collapsed}
-
-
-
- |
- Note |
- Strategy |
- Model |
- Interps |
- Det |
- Fuz |
- Harvest |
- Time |
-
-
-
- {#each subruns as subrun (subrun.subrun_id)}
- toggle(subrun.subrun_id)}
- >
- |
-
- |
-
- {#if subrun.note}
- {subrun.note}
- {:else}
- -
- {/if}
- |
- {subrun.strategy} |
- {shortModel(subrun.llm_model)} |
- {subrun.n_completed} |
- {formatScore(subrun.mean_detection_score)} |
- {formatScore(subrun.mean_fuzzing_score)} |
-
- {#if subrun.harvest_mismatch}
-
- ⚠ {subrun.harvest_subrun_id}
-
- {:else if subrun.harvest_subrun_id}
- {subrun.harvest_subrun_id}
- {:else}
- ?
- {/if}
- |
- {subrun.timestamp} |
-
- {/each}
-
-
- {/if}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/TokenHighlights.svelte b/param_decomp_lab/app/frontend/frontend/src/components/TokenHighlights.svelte
deleted file mode 100644
index 456cdbc72..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/TokenHighlights.svelte
+++ /dev/null
@@ -1,96 +0,0 @@
-
-
-{#each tokenStrings as tok, i (i)}{sanitizeToken(tok)}{/each}
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/TokenizedSampleCard.svelte b/param_decomp_lab/app/frontend/frontend/src/components/TokenizedSampleCard.svelte
deleted file mode 100644
index 335f81556..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/TokenizedSampleCard.svelte
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/TokenizedSearchResultCard.svelte b/param_decomp_lab/app/frontend/frontend/src/components/TokenizedSearchResultCard.svelte
deleted file mode 100644
index c49e2454f..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/TokenizedSearchResultCard.svelte
+++ /dev/null
@@ -1,142 +0,0 @@
-
-
-
-
-
- {#each result.tokens as tok, i (i)}{@const prob = getProbAtPosition(result.next_token_probs, i)}{/each}
-
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/TopologyDiagram.svelte b/param_decomp_lab/app/frontend/frontend/src/components/TopologyDiagram.svelte
deleted file mode 100644
index abdd55cdc..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/TopologyDiagram.svelte
+++ /dev/null
@@ -1,112 +0,0 @@
-
-
-
-
embed
- {#each topology.block_structure as block (block.index)}
-
-
{block.index}
-
-
-
{block.attn_type === "fused" ? "attn_fused" : "attn"}
-
- {#each block.attn_projections as proj (proj)}
- {proj}
- {/each}
-
-
-
-
{block.ffn_type}
-
- {#each block.ffn_projections as proj (proj)}
- {proj}
- {/each}
-
-
-
-
- {/each}
-
output
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/investigations/ArtifactGraph.svelte b/param_decomp_lab/app/frontend/frontend/src/components/investigations/ArtifactGraph.svelte
deleted file mode 100644
index 567d373dd..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/investigations/ArtifactGraph.svelte
+++ /dev/null
@@ -1,434 +0,0 @@
-
-
-
- {#if caption}
-
{caption}
- {/if}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- L0: {data.l0_total} · Edges: {filteredEdges.length}
-
-
-
- {#if hoveredNode && runState}
-
(isHoveringTooltip = true)}
- onMouseLeave={() => {
- isHoveringTooltip = false;
- hoveredNode = null;
- }}
- />
- {/if}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/investigations/ResearchLogViewer.svelte b/param_decomp_lab/app/frontend/frontend/src/components/investigations/ResearchLogViewer.svelte
deleted file mode 100644
index a817e2bbc..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/investigations/ResearchLogViewer.svelte
+++ /dev/null
@@ -1,224 +0,0 @@
-
-
-
- {#each contentBlocks as block, i (i)}
- {#if block.type === "html"}
-
-
{@html block.content}
- {:else if block.type === "graph"}
- {@const artifact = artifacts[block.artifactId]}
- {#if artifact}
-
- {:else if artifactsLoading}
-
- Loading graph: {block.artifactId}...
-
- {:else}
-
- Graph artifact not found: {block.artifactId}
-
- {/if}
- {/if}
- {/each}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/ComponentCorrelationPills.svelte b/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/ComponentCorrelationPills.svelte
deleted file mode 100644
index 47b5e3831..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/ComponentCorrelationPills.svelte
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-{#if items.length > 0}
-
-
- {title}
- {#if mathNotation}
- {@render mathNotation()}
- {/if}
-
-
-
-{/if}
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/ComponentNodeCard.svelte b/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/ComponentNodeCard.svelte
deleted file mode 100644
index 8d6ef9263..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/ComponentNodeCard.svelte
+++ /dev/null
@@ -1,433 +0,0 @@
-
-
-
-
-
-
-
- {#if graphInterpLabel && componentData.graphInterpDetail.status === "loaded" && componentData.graphInterpDetail.data}
-
- {/if}
-
-
-
-
-
- {#if activationExamples.status === "error"}
-
Error loading details: {String(activationExamples.error)}
- {:else if activationExamples.status === "loaded" && activationExamples.data.tokens.length === 0}
-
- {:else}
-
- {/if}
-
-
-
-
-
- {#if displaySettings.showEdgeAttributions && hasAnyEdges}
-
- {/if}
-
-
- {#if componentData.datasetAttributions.status === "loading" || componentData.datasetAttributions.status === "uninitialized"}
-
- {:else if componentData.datasetAttributions.status === "loaded"}
- {#if componentData.datasetAttributions.data !== null}
-
- {/if}
- {:else if componentData.datasetAttributions.status === "error"}
-
-
- Error: {String(componentData.datasetAttributions.error)}
-
- {/if}
-
-
-
-
- {#if componentData.tokenStats === null || componentData.tokenStats.status === "loading"}
-
- {:else if componentData.tokenStats.status === "error"}
-
Error: {String(componentData.tokenStats.error)}
- {:else}
-
-
-
- {/if}
-
-
-
-
- {#if anyCorrelationStatsEnabled()}
-
-
- {#if componentData.correlations.status === "loading"}
-
- {:else if componentData.correlations.status === "loaded" && componentData.correlations.data}
-
- {:else if componentData.correlations.status === "error"}
-
Error loading correlations: {String(componentData.correlations.error)}
- {:else}
-
No correlations available.
- {/if}
-
- {/if}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/ComputeProgressOverlay.svelte b/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/ComputeProgressOverlay.svelte
deleted file mode 100644
index 23619c281..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/ComputeProgressOverlay.svelte
+++ /dev/null
@@ -1,173 +0,0 @@
-
-
-
-
- {#if ciSnapshot}
-
- {/if}
-
- {#each state.stages as stage, i (i)}
- {@const isCurrent = i === state.currentStage}
- {@const isComplete = i < state.currentStage}
-
-
- {#if isCurrent}
-
- {#if stage.progress !== null}
-
- {:else}
-
- {/if}
-
- {:else if isComplete}
-
- {:else}
-
- {/if}
-
- {/each}
-
-
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/GraphTabs.svelte b/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/GraphTabs.svelte
deleted file mode 100644
index 2d403a8b3..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/GraphTabs.svelte
+++ /dev/null
@@ -1,131 +0,0 @@
-
-
-
- {#each graphs as graph (graph.id)}
-
-
-
-
- {/each}
- {#if isNewGraphMode}
-
- New Graph
-
- {/if}
- {#if graphs.length > 0 && !isNewGraphMode}
-
- {/if}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/InterventionsView.svelte b/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/InterventionsView.svelte
deleted file mode 100644
index 84d0fdc25..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/InterventionsView.svelte
+++ /dev/null
@@ -1,1595 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {#if predRows && PRED_AREA_HEIGHT > 0}
-
-
-
- {/if}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {#each interventionState.runs as run, index (runIdentityKey(run, index))}
- {@const isActive = index === interventionState.activeIndex}
-
onSelectVersion(index)}
- onkeydown={(e) => e.key === "Enter" && onSelectVersion(index)}
- >
- {#if run.kind === "draft"}
-
- {:else}
-
- {#if isActive}
- {@const opt = graph.data.optimization}
- {@const lossLabel = opt
- ? opt.loss.type === "ce"
- ? `CE "${opt.loss.label_str}" @ ${opt.loss.position}`
- : `KL @ ${opt.loss.position}`
- : "mean KL"}
-
-
- CI
- {run.result.ci_loss.toFixed(3)}
-
-
- stoch
- {run.result.stochastic_loss.toFixed(3)}
-
-
- adv
- {run.result.adversarial_loss.toFixed(3)}
-
- {#if run.result.ablated_loss != null}
-
- T\S
- {run.result.ablated_loss.toFixed(3)}
-
- {/if}
-
- metric
- {lossLabel}
-
- {#if opt}
-
- L0
- {opt.metrics.l0_total.toFixed(1)}
-
- {/if}
-
- {/if}
- {/if}
-
- {/each}
-
-
-
-
-
-
-
-
- {#if hoveredNode}
-
(isHoveringTooltip = true)}
- onMouseLeave={() => {
- isHoveringTooltip = false;
- handleNodeMouseLeave();
- }}
- />
- {/if}
-
-
- {#if hoveredPred}
- {@const p = hoveredPred.pred}
- {@const pos = predTooltipPos}
-
- {/if}
-
-
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/NodeTooltip.svelte b/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/NodeTooltip.svelte
deleted file mode 100644
index 32af775bc..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/NodeTooltip.svelte
+++ /dev/null
@@ -1,181 +0,0 @@
-
-
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/OptimizationGrid.svelte b/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/OptimizationGrid.svelte
deleted file mode 100644
index 3fa6a0213..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/OptimizationGrid.svelte
+++ /dev/null
@@ -1,134 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/OptimizationParams.svelte b/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/OptimizationParams.svelte
deleted file mode 100644
index 83d9f0594..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/OptimizationParams.svelte
+++ /dev/null
@@ -1,150 +0,0 @@
-
-
-
- steps{optimization.steps}
- imp_min{optimization.imp_min_coeff}
- pnorm{optimization.pnorm}
- beta{optimization.beta}
- mask{optimization.mask_type}
-
- {optimization.loss.type}{optimization.loss.coeff}
-
-
- pos
- {optimization.loss.position}
- {#if tokenAtPos !== null}
- ({tokenAtPos})
- {/if}
-
- {#if optimization.loss.type === "ce" || optimization.loss.type === "logit"}
-
- label({optimization.loss.label_str})
-
- {/if}
- {#if optimization.pgd}
-
- pgd_steps{optimization.pgd.n_steps}
-
-
- pgd_lr{optimization.pgd.step_size}
-
- {/if}
-
-
- L0{optimization.metrics.l0_total.toFixed(1)}
-
- {#if optimization.loss.type === "ce" || optimization.loss.type === "logit"}
-
- CI prob{formatProb(optimization.metrics.ci_masked_label_prob)}
-
-
- stoch prob{formatProb(optimization.metrics.stoch_masked_label_prob)}
-
-
- adv prob{formatProb(optimization.metrics.adv_pgd_label_prob)}
-
- {/if}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/OptimizationSettings.svelte b/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/OptimizationSettings.svelte
deleted file mode 100644
index 3c15034b4..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/OptimizationSettings.svelte
+++ /dev/null
@@ -1,537 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
Position
-
- {#each tokens as tok, i (i)}
- {@const prob = getProbAtPosition(nextTokenProbs, i)}
-
- {/each}
-
-
- pos {config.loss.position}
- {#if config.loss.type === "ce" || config.loss.type === "logit"}
- {config.loss.type === "logit" ? "maximize" : "predict"}
- {
- if (config.loss.type !== "ce" && config.loss.type !== "logit")
- throw new Error("inconsistent state: Token dropdown rendered but loss type has no label");
-
- if (tokenId !== null) {
- onChange({
- ...config,
- loss: { ...config.loss, labelTokenId: tokenId, labelTokenText: tokenString },
- });
- }
- }}
- placeholder="token..."
- />
- {/if}
-
-
-
-
-
-
-
handleSliderChange(parseInt(e.currentTarget.value))}
- />
-
- 1e-5
- 10
-
-
-
-
-
-
- {#if showAdvanced}
-
- {/if}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/OutputNodeCard.svelte b/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/OutputNodeCard.svelte
deleted file mode 100644
index 9dcab7f0e..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/OutputNodeCard.svelte
+++ /dev/null
@@ -1,183 +0,0 @@
-
-
-
- {#if singlePosEntry}
-
-
- Position:
- {seqIdx}
-
- {:else if allPositions}
-
"{allPositions[0].token}"
-
-
-
- | Pos |
- CI-masked |
- Logit |
- Target |
- Logit |
-
-
-
- {#each allPositions as pos (pos.seqIdx)}
-
- | {pos.seqIdx} |
- {(pos.prob * 100).toFixed(2)}% |
- {pos.logit.toFixed(2)} |
- {(pos.target_prob * 100).toFixed(2)}% |
- {pos.target_logit.toFixed(2)} |
-
- {/each}
-
-
- {/if}
- {#if displaySettings.showEdgeAttributions && outputIncoming.length > 0}
-
{}}
- />
- {/if}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/PromptPicker.svelte b/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/PromptPicker.svelte
deleted file mode 100644
index 0932a9b87..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/PromptPicker.svelte
+++ /dev/null
@@ -1,382 +0,0 @@
-
-
-{#if show}
- e.key === "Escape" && onClose()}>
-
-
-
-
-
- {#if filterLoading}
- ...
- {/if}
-
-
-
- {#each displayedPrompts as p (p.id)}
-
- {/each}
- {#if displayedPrompts.length === 0}
-
- {filterByStaged ? "No matching prompts" : "No prompts yet"}
-
- {/if}
-
-
-
-
-{/if}
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/PromptTabs.svelte b/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/PromptTabs.svelte
deleted file mode 100644
index de4387d8a..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/PromptTabs.svelte
+++ /dev/null
@@ -1,151 +0,0 @@
-
-
-
- {#each cards as card (card.id)}
-
-
-
-
- {/each}
- {#if tabView.view === "loading"}
-
- Loading...
-
- {:else if tabView.view === "error"}
-
- Error
-
- {:else if tabView.view === "draft"}
-
-
-
- {/if}
-
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/StagedNodesPanel.svelte b/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/StagedNodesPanel.svelte
deleted file mode 100644
index 957edf2cb..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/StagedNodesPanel.svelte
+++ /dev/null
@@ -1,191 +0,0 @@
-
-
-{#if stagedNodes.length > 0}
-
-
-
-
-
- {#each stagedNodes as node, idx (`${node.layer}:${node.seqIdx}:${node.cIdx}-${idx}`)}
- {@const token = getTokenAtPosition(node.seqIdx)}
- {@const isOutput = node.layer === "output"}
- {@const isWte = node.layer === "embed"}
- {@const isComponent = !isWte && !isOutput}
- {@const nodeKey = `${node.layer}:${node.seqIdx}:${node.cIdx}`}
- {@const ciVal = isComponent ? (nodeCiVals[nodeKey] ?? null) : null}
- {@const subcompAct = isComponent ? (nodeSubcompActs[nodeKey] ?? null) : null}
- {@const clusterId = isComponent ? runState.getClusterId(node.layer, node.cIdx) : undefined}
-
-
-
- {#if isWte}
-
"{token}"
-
Input embedding at position {node.seqIdx}
- {:else if isOutput}
-
- {:else}
-
- {/if}
-
- {/each}
-
-
-{/if}
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/TokenDropdown.svelte b/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/TokenDropdown.svelte
deleted file mode 100644
index 74f04ccec..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/TokenDropdown.svelte
+++ /dev/null
@@ -1,250 +0,0 @@
-
-
-
-
-
- {#if isOpen && searchResults.length > 0}
-
- {#each searchResults as token, i (token.id)}
- -
-
-
- {/each}
-
- {:else if isOpen && inputValue.trim() && searchResults.length === 0}
-
- No matching tokens
-
- {/if}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/ViewControls.svelte b/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/ViewControls.svelte
deleted file mode 100644
index 26c57b1b0..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/ViewControls.svelte
+++ /dev/null
@@ -1,233 +0,0 @@
-
-
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/ViewTabs.svelte b/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/ViewTabs.svelte
deleted file mode 100644
index 342f7c6a2..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/ViewTabs.svelte
+++ /dev/null
@@ -1,74 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/graphUtils.ts b/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/graphUtils.ts
deleted file mode 100644
index 0191768a8..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/graphUtils.ts
+++ /dev/null
@@ -1,239 +0,0 @@
-/**
- * Utility functions for the PromptAttributionsGraph component.
- */
-
-/** Linear interpolation between min and max. */
-export function lerp(min: number, max: number, t: number): number {
- return min + (max - min) * t;
-}
-
-export type TooltipPos = {
- left?: number;
- right?: number;
- top?: number;
- bottom?: number;
- maxHeight?: number;
-};
-
-/** Calculate tooltip position that stays within viewport bounds. */
-export function calcTooltipPos(mouseX: number, mouseY: number, size: "small" | "large"): TooltipPos {
- const padding = 15;
- const tooltipMaxWidth = 800;
- const tooltipMaxHeight = typeof window !== "undefined" ? window.innerHeight * 0.8 : 400;
-
- const pos: TooltipPos = {};
-
- if (typeof window !== "undefined") {
- // Horizontal: position right of cursor, or left if would overflow
- if (mouseX + padding + tooltipMaxWidth > window.innerWidth) {
- pos.right = Math.max(padding, window.innerWidth - mouseX + padding);
- } else {
- pos.left = mouseX + padding;
- }
-
- // Vertical: strategy depends on tooltip size
- const wouldOverflowBottom = mouseY + padding + tooltipMaxHeight > window.innerHeight;
-
- if (size === "small" && wouldOverflowBottom) {
- // Small tooltips: anchor bottom edge near cursor
- pos.bottom = Math.max(padding, window.innerHeight - mouseY + padding);
- pos.maxHeight = mouseY - padding * 2;
- } else {
- // Large tooltips (or small with space below): use top with clamping
- pos.top = mouseY + padding;
- if (wouldOverflowBottom) {
- pos.top = 5; // Pin near top to maximize vertical space
- }
- }
-
- return pos;
- }
-
- // SSR fallback
- return { left: mouseX + padding, top: mouseY + padding };
-}
-
-/**
- * Sort component indices by importance (CI for internal nodes, probability for output nodes).
- * Returns a new sorted array (highest importance first).
- */
-export function sortComponentsByImportance(
- components: number[],
- layer: string,
- seqIdx: number,
- nodeCiVals: Record,
- outputProbs: Record,
-): number[] {
- const isOutput = layer === "output";
- return [...components].sort((a, b) => {
- if (isOutput) {
- const keyA = `${seqIdx}:${a}`;
- const keyB = `${seqIdx}:${b}`;
- return (outputProbs[keyB]?.prob ?? 0) - (outputProbs[keyA]?.prob ?? 0);
- }
- const keyA = `${layer}:${seqIdx}:${a}`;
- const keyB = `${layer}:${seqIdx}:${b}`;
- return (nodeCiVals[keyB] ?? 0) - (nodeCiVals[keyA] ?? 0);
- });
-}
-
-/**
- * Sort component indices by cluster, then by CI within each cluster.
- * Clusters are sorted by size (biggest first), with singletons (null cluster) at the end.
- * Returns a new sorted array.
- */
-export function sortComponentsByCluster(
- components: number[],
- layer: string,
- seqIdx: number,
- nodeCiVals: Record,
- getClusterId: (layer: string, componentIdx: number) => number | null | undefined,
-): number[] {
- // Group components by cluster ID
- const clusterGroups = new Map();
- const singletons: number[] = [];
-
- for (const cIdx of components) {
- const clusterId = getClusterId(layer, cIdx);
- if (clusterId === undefined || clusterId === null) {
- singletons.push(cIdx);
- } else {
- const group = clusterGroups.get(clusterId);
- if (group) {
- group.push(cIdx);
- } else {
- clusterGroups.set(clusterId, [cIdx]);
- }
- }
- }
-
- // Sort each cluster group by CI (descending)
- const sortByCI = (a: number, b: number) => {
- const keyA = `${layer}:${seqIdx}:${a}`;
- const keyB = `${layer}:${seqIdx}:${b}`;
- if (!(keyA in nodeCiVals) || !(keyB in nodeCiVals))
- throw new Error(`Node CI value not found for key: ${keyA} or ${keyB}`);
- return nodeCiVals[keyB] - nodeCiVals[keyA];
- };
-
- for (const group of clusterGroups.values()) {
- group.sort(sortByCI);
- }
- singletons.sort(sortByCI);
-
- // Sort clusters by size (descending), then concatenate
- const sortedClusters = [...clusterGroups.entries()].sort((a, b) => b[1].length - a[1].length);
-
- const result: number[] = [];
- for (const [, group] of sortedClusters) {
- result.push(...group);
- }
- result.push(...singletons);
-
- return result;
-}
-
-/**
- * Compute X offsets for components given their display order.
- * Returns a map from component index to its X offset in pixels.
- */
-export function computeComponentOffsets(
- sortedComponents: number[],
- componentSize: number,
- componentGap: number,
-): Record {
- const offsets: Record = {};
- for (let i = 0; i < sortedComponents.length; i++) {
- offsets[sortedComponents[i]] = i * (componentSize + componentGap);
- }
- return offsets;
-}
-
-export type ClusterSpan = {
- clusterId: number;
- layer: string;
- seqIdx: number;
- xStart: number;
- xEnd: number;
- y: number;
-};
-
-/**
- * Compute horizontal spans for cluster bars.
- * For each (layer, seqIdx), finds contiguous runs of components in the same cluster
- * and returns their bounding box positions.
- */
-export function computeClusterSpans(
- sortedComponents: number[],
- layer: string,
- seqIdx: number,
- baseX: number,
- baseY: number,
- componentSize: number,
- offsets: Record,
- getClusterId: (layer: string, componentIdx: number) => number | null | undefined,
-): ClusterSpan[] {
- const spans: ClusterSpan[] = [];
- if (sortedComponents.length === 0) return spans;
-
- let currentCluster: number | null = null;
- let spanStartX: number | null = null;
- let spanEndX: number | null = null;
-
- for (const cIdx of sortedComponents) {
- const clusterId = getClusterId(layer, cIdx);
- const x = baseX + offsets[cIdx];
-
- if (typeof clusterId === "number") {
- if (clusterId === currentCluster) {
- // Extend current span
- spanEndX = x + componentSize;
- } else {
- // Close previous span if exists
- if (currentCluster !== null && spanStartX !== null && spanEndX !== null) {
- spans.push({
- clusterId: currentCluster,
- layer,
- seqIdx,
- xStart: spanStartX,
- xEnd: spanEndX,
- y: baseY + componentSize,
- });
- }
- // Start new span
- currentCluster = clusterId;
- spanStartX = x;
- spanEndX = x + componentSize;
- }
- } else {
- // Close previous span if exists (singleton encountered)
- if (currentCluster !== null && spanStartX !== null && spanEndX !== null) {
- spans.push({
- clusterId: currentCluster,
- layer,
- seqIdx,
- xStart: spanStartX,
- xEnd: spanEndX,
- y: baseY + componentSize,
- });
- }
- currentCluster = null;
- spanStartX = null;
- spanEndX = null;
- }
- }
-
- // Close final span if exists
- if (currentCluster !== null && spanStartX !== null && spanEndX !== null) {
- spans.push({
- clusterId: currentCluster,
- layer,
- seqIdx,
- xStart: spanStartX,
- xEnd: spanEndX,
- y: baseY + componentSize,
- });
- }
-
- return spans;
-}
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/types.ts b/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/types.ts
deleted file mode 100644
index 1beb71426..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/prompt-attr/types.ts
+++ /dev/null
@@ -1,195 +0,0 @@
-import type { Loadable } from "../../lib";
-import type { GraphData, CISnapshot } from "../../lib/promptAttributionsTypes";
-import type { InterventionRunSummary } from "../../lib/interventionTypes";
-import type { NormalizeType } from "../../lib/api";
-
-export type MaskType = "stochastic" | "ci";
-export type LossType = "ce" | "kl" | "logit";
-
-export type ViewSettings = {
- topK: number;
- componentGap: number;
- layerGap: number;
- normalizeEdges: NormalizeType;
- ciThreshold: number;
-};
-
-/** Persisted graph data from the database */
-export type StoredGraph = {
- id: number; // database ID
- label: string;
- data: GraphData;
- viewSettings: ViewSettings;
- interventionRuns: InterventionRunSummary[];
-};
-
-export type PromptCard = {
- id: number; // database prompt ID
- tokens: string[];
- tokenIds: number[];
- nextTokenProbs: (number | null)[]; // probability of each token given previous
- isCustom: boolean;
- graphs: StoredGraph[];
- activeGraphId: number | null; // null means "new graph" mode when graphs exist, or initial state
- activeView: "graph" | "interventions";
- // Config for creating new graphs (per-card, not shared globally)
- newGraphConfig: OptimizeConfigDraft;
- useOptimized: boolean; // whether to compute optimized graph
-};
-
-// Draft types for UI state (may be incomplete)
-export type CELossConfigDraft = {
- type: "ce";
- coeff: number;
- position: number;
- labelTokenId: number | null; // null = not set yet
- labelTokenText: string; // user input text (may not match a token yet)
-};
-
-export type KLLossConfig = {
- type: "kl";
- coeff: number;
- position: number;
-};
-
-export type LogitLossConfigDraft = {
- type: "logit";
- coeff: number;
- position: number;
- labelTokenId: number | null;
- labelTokenText: string;
-};
-
-export type LossConfigDraft = CELossConfigDraft | KLLossConfig | LogitLossConfigDraft;
-
-export type OptimizeConfigDraft = {
- loss: LossConfigDraft;
- impMinCoeff: number;
- steps: number;
- pnorm: number;
- beta: number;
- maskType: MaskType;
- advPgdNSteps: number | null;
- advPgdStepSize: number | null;
-};
-
-// Validated types for API calls (all required fields present)
-export type CELossConfigValid = {
- type: "ce";
- coeff: number;
- position: number;
- labelTokenId: number;
- labelTokenText: string;
-};
-
-export type LogitLossConfigValid = {
- type: "logit";
- coeff: number;
- position: number;
- labelTokenId: number;
- labelTokenText: string;
-};
-
-export type LossConfigValid = CELossConfigValid | KLLossConfig | LogitLossConfigValid;
-
-export type OptimizeConfigValid = {
- loss: LossConfigValid;
- impMinCoeff: number;
- steps: number;
- pnorm: number;
- beta: number;
- maskType: MaskType;
- advPgdNSteps: number | null;
- advPgdStepSize: number | null;
-};
-
-/** Validate draft config, returning valid config or null if incomplete */
-export function validateOptimizeConfig(draft: OptimizeConfigDraft): OptimizeConfigValid | null {
- if ((draft.loss.type === "ce" || draft.loss.type === "logit") && draft.loss.labelTokenId === null) {
- return null;
- }
- return draft as OptimizeConfigValid;
-}
-
-/** Check if config is ready for submission */
-export function isOptimizeConfigValid(draft: OptimizeConfigDraft): draft is OptimizeConfigValid {
- return validateOptimizeConfig(draft) !== null;
-}
-
-export type ComputeOptions = {
- ciThreshold: number;
- useOptimized: boolean;
- optimizeConfig: OptimizeConfigValid;
-};
-
-export type LoadingStage = {
- name: string;
- progress: number | null; // 0-1, or null for indeterminate
-};
-
-export type LoadingState = {
- stages: LoadingStage[];
- currentStage: number; // 0-indexed
-};
-
-/** Generic state for async actions without a meaningful result */
-export type ActionState = { status: "idle" } | { status: "loading" } | { status: "error"; error: string };
-
-/** Result from tokenize endpoint */
-export type TokenizeResult = {
- tokens: string[];
- next_token_probs: (number | null)[];
-};
-
-/** State for the draft prompt input */
-export type DraftState = {
- text: string;
- tokenPreview: Loadable;
- isAdding: boolean;
-};
-
-export function defaultDraftState(): DraftState {
- return {
- text: "",
- tokenPreview: { status: "uninitialized" },
- isAdding: false,
- };
-}
-
-/** Discriminated union for the tab view - makes invalid states unrepresentable */
-export type TabViewState =
- | { view: "draft"; draft: DraftState }
- | { view: "loading" }
- | { view: "card"; cardId: number }
- | { view: "error"; error: string };
-
-/** State for graph computation - tracks which card is computing, progress, and errors */
-export type GraphComputeState =
- | { status: "idle" }
- | { status: "computing"; cardId: number; progress: LoadingState; ciSnapshot: CISnapshot | null }
- | { status: "error"; error: string };
-
-/** State for prompt generation - tracks progress and count */
-export type PromptGenerateState =
- | { status: "idle" }
- | { status: "generating"; progress: number; count: number }
- | { status: "error"; error: string };
-
-export function defaultOptimizeConfig(numTokens: number): OptimizeConfigDraft {
- return {
- loss: {
- type: "ce",
- coeff: 1,
- position: numTokens - 1,
- labelTokenId: null,
- labelTokenText: "",
- },
- impMinCoeff: 0.001,
- steps: 2000,
- pnorm: 0.3,
- beta: 0,
- maskType: "stochastic",
- advPgdNSteps: null,
- advPgdStepSize: null,
- };
-}
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/ui/ComponentCorrelationMetrics.svelte b/param_decomp_lab/app/frontend/frontend/src/components/ui/ComponentCorrelationMetrics.svelte
deleted file mode 100644
index 86fa7e2c0..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/ui/ComponentCorrelationMetrics.svelte
+++ /dev/null
@@ -1,59 +0,0 @@
-
-
-
- {#if displaySettings.showPmi}
-
- {#snippet mathNotation()}
- log(P(this, that) / P(this)P(that))
- {/snippet}
-
- {/if}
- {#if displaySettings.showPrecision}
-
- {#snippet mathNotation()}
- P(this |
- that)
- {/snippet}
-
- {/if}
- {#if displaySettings.showRecall}
-
- {#snippet mathNotation()}
- P(that |
- this)
- {/snippet}
-
- {/if}
- {#if displaySettings.showJaccard}
-
- {#snippet mathNotation()}
- this ∩ that / (this
- ∪ that)
- {/snippet}
-
- {/if}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/ui/ComponentFrequencyCurve.svelte b/param_decomp_lab/app/frontend/frontend/src/components/ui/ComponentFrequencyCurve.svelte
deleted file mode 100644
index eff4c9df5..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/ui/ComponentFrequencyCurve.svelte
+++ /dev/null
@@ -1,200 +0,0 @@
-
-
-
-
- {#if plotData}
-
- {/if}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/ui/CorrelatedSubcomponentsList.svelte b/param_decomp_lab/app/frontend/frontend/src/components/ui/CorrelatedSubcomponentsList.svelte
deleted file mode 100644
index d625c00d2..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/ui/CorrelatedSubcomponentsList.svelte
+++ /dev/null
@@ -1,160 +0,0 @@
-
-
-
- {#if totalPages > 1}
-
- {/if}
-
- {#each paginatedItems as { component_key, score, count_i, count_j, count_ij, n_tokens } (component_key)}
- {@const borderColor = getBorderColor(score)}
- {@const label = getInterpretationLabel(component_key)}
-
- {/each}
-
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/ui/DatasetAttributionsSection.svelte b/param_decomp_lab/app/frontend/frontend/src/components/ui/DatasetAttributionsSection.svelte
deleted file mode 100644
index 13432b5a5..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/ui/DatasetAttributionsSection.svelte
+++ /dev/null
@@ -1,202 +0,0 @@
-
-
-
-
-
-
-
-
- {#if hasAnyIncoming}
-
-
-
- {#if incomingPositive.length > 0}
-
-
-
- {/if}
- {#if incomingNegative.length > 0}
-
-
-
- {/if}
-
-
- {/if}
-
- {#if hasAnyOutgoing}
-
-
-
- {#if outgoingPositive.length > 0}
-
-
-
- {/if}
- {#if outgoingNegative.length > 0}
-
-
-
- {/if}
-
-
- {/if}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/ui/DisplaySettingsDropdown.svelte b/param_decomp_lab/app/frontend/frontend/src/components/ui/DisplaySettingsDropdown.svelte
deleted file mode 100644
index 63a1062d0..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/ui/DisplaySettingsDropdown.svelte
+++ /dev/null
@@ -1,337 +0,0 @@
-
-
- (showDropdown = true)}
- onmouseleave={() => (showDropdown = false)}
->
-
- {#if showDropdown}
-
-
-
-
-
Node Color
-
Color intensity based on
-
- {#each colorModes as mode (mode)}
-
- {/each}
-
-
-
-
Edge Variant
-
Attribution target: value or |value|
-
- {#each edgeVariants as variant (variant)}
-
- {/each}
-
-
-
-
Component Filtering
-
Filter components in Components tab by mean CI
-
-
- {
- const val = parseFloat((e.target as HTMLInputElement).value);
- if (!isNaN(val) && val >= 0) {
- displaySettings.meanCiCutoff = val;
- }
- }}
- />
-
-
-
- {/if}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/ui/EdgeAttributionGrid.svelte b/param_decomp_lab/app/frontend/frontend/src/components/ui/EdgeAttributionGrid.svelte
deleted file mode 100644
index ad3f821f5..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/ui/EdgeAttributionGrid.svelte
+++ /dev/null
@@ -1,39 +0,0 @@
-
-
-{#if incoming.length > 0}
-
-
-
-
-{/if}
-
-{#if outgoing.length > 0}
-
-
-
-
-{/if}
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/ui/EdgeAttributionList.svelte b/param_decomp_lab/app/frontend/frontend/src/components/ui/EdgeAttributionList.svelte
deleted file mode 100644
index 4c16157b9..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/ui/EdgeAttributionList.svelte
+++ /dev/null
@@ -1,343 +0,0 @@
-
-
-
-
-
- {#each paginatedItems as { key, value, normalizedMagnitude, tokenStr } (key)}
- {@const bgColor = getBgColor(normalizedMagnitude)}
- {@const textColor = normalizedMagnitude > 0.8 ? "white" : "var(--text-primary)"}
- {@const formattedKey = key}
- {@const isToken = isTokenNode(key)}
- {@const interp = isToken ? undefined : getInterpretation(key)}
- {@const hasInterpretation = interp?.status === "generated"}
- {@const polarity = value >= 0 ? "+" : "\u2212"}
-
handleMouseEnter(key, e)} onmouseleave={handleMouseLeave}>
-
- {#if hoveredKey === key && tooltipPosition}
-
-
- {/if}
-
- {/each}
-
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/ui/GraphInterpBadge.svelte b/param_decomp_lab/app/frontend/frontend/src/components/ui/GraphInterpBadge.svelte
deleted file mode 100644
index 8cd8edb67..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/ui/GraphInterpBadge.svelte
+++ /dev/null
@@ -1,240 +0,0 @@
-
-
-
-
-
- {#if expanded && detail}
-
-
-
-
Input
- {#if detail.input?.reasoning}
-
{detail.input.reasoning}
- {/if}
- {#each incomingEdges as edge (edge.related_key)}
-
- {formatComponentKey(edge.related_key, edge.token_str)}
- 0}
- class:negative={edge.attribution < 0}
- >
- {edge.attribution > 0 ? "+" : ""}{edge.attribution.toFixed(3)}
-
- {#if edge.related_label}
- {edge.related_label}
- {/if}
-
- {/each}
-
-
-
Output
- {#if detail.output?.reasoning}
-
{detail.output.reasoning}
- {/if}
- {#each outgoingEdges as edge (edge.related_key)}
-
- {formatComponentKey(edge.related_key, edge.token_str)}
- 0}
- class:negative={edge.attribution < 0}
- >
- {edge.attribution > 0 ? "+" : ""}{edge.attribution.toFixed(3)}
-
- {#if edge.related_label}
- {edge.related_label}
- {/if}
-
- {/each}
-
-
-
- {/if}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/ui/InterpretationBadge.svelte b/param_decomp_lab/app/frontend/frontend/src/components/ui/InterpretationBadge.svelte
deleted file mode 100644
index 0964a1515..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/ui/InterpretationBadge.svelte
+++ /dev/null
@@ -1,240 +0,0 @@
-
-
-
-
- {#if interpretation.status === "loading"}
-
Loading interpretations...
- {:else if interpretation.status === "loaded"}
- {@const interpretationData = interpretation.data}
- {#if interpretationData.status === "none"}
-
- {:else if interpretationData.status === "generating"}
-
Generating interpretation...
- {:else if interpretationData.status === "generated"}
-
-
- {#if interpretationDetail.status === "loaded" && interpretationDetail.data?.reasoning}
- {interpretationDetail.data.reasoning}
- {:else if interpretationDetail.status === "loading"}
- Loading reasoning...
-
-
- {/if}
-
- {#if displaySettings.showAutoInterpPromptButton}
-
- {/if}
-
- {:else if interpretationData.status === "generation-error"}
-
{String(interpretationData.error)}
-
- {/if}
-
- {:else if interpretation.status === "error"}
-
{String(interpretation.error)}
- {/if}
-
-
- {#if displaySettings.showAutoInterpPromptButton && showPrompt}
-
- {#if interpretationDetail.status === "loading"}
-
Loading prompt...
- {:else if interpretationDetail.status === "error"}
-
Error loading prompt: {String(interpretationDetail.error)}
- {:else if interpretationDetail.status === "loaded" && interpretationDetail.data}
-
{interpretationDetail.data.prompt}
- {:else}
-
Loading prompt...
- {/if}
-
- {/if}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/ui/SectionHeader.svelte b/param_decomp_lab/app/frontend/frontend/src/components/ui/SectionHeader.svelte
deleted file mode 100644
index ede998c73..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/ui/SectionHeader.svelte
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-{#if level === "h4"}
-
- {title}
- {#if mathNotation}
- {mathNotation}
- {/if}
- {#if children}
- {@render children()}
- {/if}
-
-{:else}
-
- {title}
- {#if mathNotation}
- {mathNotation}
- {/if}
- {#if children}
- {@render children()}
- {/if}
-
-{/if}
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/ui/SetOverlapVis.svelte b/param_decomp_lab/app/frontend/frontend/src/components/ui/SetOverlapVis.svelte
deleted file mode 100644
index 73a61fe5a..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/ui/SetOverlapVis.svelte
+++ /dev/null
@@ -1,95 +0,0 @@
-
-
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/ui/StatusText.svelte b/param_decomp_lab/app/frontend/frontend/src/components/ui/StatusText.svelte
deleted file mode 100644
index 0728a6c01..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/ui/StatusText.svelte
+++ /dev/null
@@ -1,44 +0,0 @@
-
-
-
- {@render children()}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/ui/SubrunInterpCard.svelte b/param_decomp_lab/app/frontend/frontend/src/components/ui/SubrunInterpCard.svelte
deleted file mode 100644
index 2e3a74288..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/ui/SubrunInterpCard.svelte
+++ /dev/null
@@ -1,221 +0,0 @@
-
-
-
-
-
- {#if headline === null}
-
No interpretation for this component
- {:else}
-
-
- {headline.label}
- {#if headline.detection_score !== null}
- Det {Math.round(headline.detection_score * 100)}%
- {/if}
- {#if headline.fuzzing_score !== null}
- Fuz {Math.round(headline.fuzzing_score * 100)}%
- {/if}
-
-
- {#if detail.status === "loaded" && detail.data}
-
{detail.data.reasoning}
-
- {#if showPrompt}
-
- {/if}
- {:else if detail.status === "loading"}
-
Loading...
- {:else if detail.status === "error"}
-
Error loading detail
- {/if}
-
- {/if}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/ui/TokenPillList.svelte b/param_decomp_lab/app/frontend/frontend/src/components/ui/TokenPillList.svelte
deleted file mode 100644
index 17e4bcd70..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/ui/TokenPillList.svelte
+++ /dev/null
@@ -1,144 +0,0 @@
-
-
-
-
- {#each visibleItems as { token, value }, i (i)}
- {token}
- {/each}
-
- {#if hasPagination}
-
- {/if}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/ui/TokenSpan.svelte b/param_decomp_lab/app/frontend/frontend/src/components/ui/TokenSpan.svelte
deleted file mode 100644
index 4a5fa9b81..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/ui/TokenSpan.svelte
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-{sanitizeToken(token)}
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/ui/TokenStatsSection.svelte b/param_decomp_lab/app/frontend/frontend/src/components/ui/TokenStatsSection.svelte
deleted file mode 100644
index a6469843b..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/ui/TokenStatsSection.svelte
+++ /dev/null
@@ -1,97 +0,0 @@
-
-
-
-
- {sectionTitle}
- {#if sectionSubtitle}
- {sectionSubtitle}
- {/if}
-
- {#if hasData && lists !== null}
-
- {#each lists as list (list.title + (list.mathNotation ?? ""))}
- {#if list.items.length > 0}
-
-
- {list.title}
- {#if list.mathNotation}
- {list.mathNotation}
- {/if}
-
-
-
- {/if}
- {/each}
-
- {:else}
-
No data available.
- {/if}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/components/ui/icons/GearIcon.svelte b/param_decomp_lab/app/frontend/frontend/src/components/ui/icons/GearIcon.svelte
deleted file mode 100644
index 918f90f15..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/components/ui/icons/GearIcon.svelte
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/lib/ZoomControls.svelte b/param_decomp_lab/app/frontend/frontend/src/lib/ZoomControls.svelte
deleted file mode 100644
index d455829c6..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/lib/ZoomControls.svelte
+++ /dev/null
@@ -1,77 +0,0 @@
-
-
-
-
- {Math.round(scale * 100)}%
-
-
- {#if hint}
- {hint}
- {/if}
-
-
-
diff --git a/param_decomp_lab/app/frontend/frontend/src/lib/api/activationContexts.ts b/param_decomp_lab/app/frontend/frontend/src/lib/api/activationContexts.ts
deleted file mode 100644
index a126739a1..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/lib/api/activationContexts.ts
+++ /dev/null
@@ -1,44 +0,0 @@
-/**
- * API client for /api/activation_contexts endpoints.
- */
-
-import type {
- ActivationContextsSummary,
- SubcomponentProbeResult,
- SubcomponentActivationContexts,
-} from "../promptAttributionsTypes";
-import { ApiError, fetchJson } from "./index";
-
-export async function getActivationContextsSummary(): Promise {
- try {
- return await fetchJson("/api/activation_contexts/summary");
- } catch (e) {
- if (e instanceof ApiError && e.status === 404) return null;
- throw e;
- }
-}
-
-/** Default limit for initial load - 100 examples = 10 pages at 10 per page. */
-const ACTIVATION_EXAMPLES_INITIAL_LIMIT = 100;
-
-export async function getActivationContextDetail(
- layer: string,
- componentIdx: number,
- limit: number = ACTIVATION_EXAMPLES_INITIAL_LIMIT,
-): Promise {
- return fetchJson(
- `/api/activation_contexts/${encodeURIComponent(layer)}/${componentIdx}?limit=${limit}`,
- );
-}
-
-export async function probeComponent(
- text: string,
- layer: string,
- componentIdx: number,
-): Promise {
- return fetchJson("/api/activation_contexts/probe", {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify({ text, layer, component_idx: componentIdx }),
- });
-}
diff --git a/param_decomp_lab/app/frontend/frontend/src/lib/api/autointerpCompare.ts b/param_decomp_lab/app/frontend/frontend/src/lib/api/autointerpCompare.ts
deleted file mode 100644
index cf0414a09..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/lib/api/autointerpCompare.ts
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * API client for /api/autointerp_compare endpoints.
- */
-
-import { ApiError, fetchJson } from "./index";
-
-export type SubrunSummary = {
- subrun_id: string;
- strategy: string;
- llm_model: string;
- timestamp: string;
- n_completed: number;
- mean_detection_score: number | null;
- mean_fuzzing_score: number | null;
- note: string | null;
- harvest_subrun_id: string | null;
- harvest_mismatch: boolean;
-};
-
-export type CompareInterpretationHeadline = {
- label: string;
- detection_score: number | null;
- fuzzing_score: number | null;
-};
-
-export type CompareInterpretationDetail = {
- reasoning: string;
- prompt: string;
-};
-
-export async function getSubruns(): Promise {
- return fetchJson("/api/autointerp_compare/subruns");
-}
-
-export async function getSubrunInterpretations(
- subrunId: string,
-): Promise> {
- return fetchJson>(
- `/api/autointerp_compare/subruns/${encodeURIComponent(subrunId)}/interpretations`,
- );
-}
-
-export async function getSubrunInterpretationDetail(
- subrunId: string,
- layer: string,
- componentIdx: number,
-): Promise {
- try {
- return await fetchJson(
- `/api/autointerp_compare/subruns/${encodeURIComponent(subrunId)}/interpretations/${encodeURIComponent(layer)}/${componentIdx}`,
- );
- } catch (e) {
- if (e instanceof ApiError && e.status === 404) return null;
- throw e;
- }
-}
diff --git a/param_decomp_lab/app/frontend/frontend/src/lib/api/clusters.ts b/param_decomp_lab/app/frontend/frontend/src/lib/api/clusters.ts
deleted file mode 100644
index f1c4744a3..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/lib/api/clusters.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * API client for /api/clusters endpoints.
- */
-
-import { apiUrl } from "./index";
-
-export type ClusterMapping = {
- mapping: Record;
-};
-
-export async function loadClusterMapping(filePath: string): Promise {
- const url = apiUrl("/api/clusters/load");
- url.searchParams.set("file_path", filePath);
-
- const response = await fetch(url.toString(), { method: "POST" });
- if (!response.ok) {
- const error = await response.json();
- throw new Error(error.detail || "Failed to load cluster mapping");
- }
-
- return (await response.json()) as ClusterMapping;
-}
diff --git a/param_decomp_lab/app/frontend/frontend/src/lib/api/correlations.ts b/param_decomp_lab/app/frontend/frontend/src/lib/api/correlations.ts
deleted file mode 100644
index b1bcaef65..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/lib/api/correlations.ts
+++ /dev/null
@@ -1,71 +0,0 @@
-/**
- * API client for /api/correlations endpoints.
- */
-
-import type { SubcomponentCorrelationsResponse, TokenStatsResponse } from "../promptAttributionsTypes";
-import { ApiError, apiUrl, fetchJson } from "./index";
-
-export async function getComponentCorrelations(
- layer: string,
- componentIdx: number,
- topK: number,
-): Promise {
- const url = apiUrl(`/api/correlations/components/${encodeURIComponent(layer)}/${componentIdx}`);
- url.searchParams.set("top_k", String(topK));
- return fetchJson(url.toString());
-}
-
-export async function getComponentTokenStats(
- layer: string,
- componentIdx: number,
- topK: number,
-): Promise {
- const url = apiUrl(`/api/correlations/token_stats/${encodeURIComponent(layer)}/${componentIdx}`);
- url.searchParams.set("top_k", String(topK));
- return fetchJson(url.toString());
-}
-
-// Interpretation headline (bulk-fetched) - lightweight data for badges
-export type InterpretationHeadline = {
- label: string;
- detection_score: number | null;
- fuzzing_score: number | null;
-};
-
-// Interpretation detail (fetched on-demand) - reasoning and prompt
-export type InterpretationDetail = {
- reasoning: string;
- prompt: string;
-};
-
-export async function getAllInterpretations(): Promise> {
- return fetchJson>("/api/correlations/interpretations");
-}
-
-export async function getIntruderScores(): Promise> {
- return fetchJson>("/api/correlations/intruder_scores");
-}
-
-export async function getInterpretationDetail(
- layer: string,
- componentIdx: number,
-): Promise {
- try {
- return await fetchJson(
- `/api/correlations/interpretations/${encodeURIComponent(layer)}/${componentIdx}`,
- );
- } catch (e) {
- if (e instanceof ApiError && e.status === 404) return null;
- throw e;
- }
-}
-
-export async function requestComponentInterpretation(
- layer: string,
- componentIdx: number,
-): Promise {
- return fetchJson(
- `/api/correlations/interpretations/${encodeURIComponent(layer)}/${componentIdx}`,
- { method: "POST" },
- );
-}
diff --git a/param_decomp_lab/app/frontend/frontend/src/lib/api/dataSources.ts b/param_decomp_lab/app/frontend/frontend/src/lib/api/dataSources.ts
deleted file mode 100644
index ac20b7220..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/lib/api/dataSources.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * API client for /api/data_sources endpoint.
- */
-
-import { fetchJson } from "./index";
-
-export type HarvestInfo = {
- subrun_id: string;
- config: Record;
- n_components: number;
- has_intruder_scores: boolean;
-};
-
-export type AutointerpInfo = {
- subrun_id: string;
- config: Record;
- n_interpretations: number;
- eval_scores: string[];
-};
-
-export type AttributionsInfo = {
- subrun_id: string;
- n_tokens_processed: number;
- ci_threshold: number;
-};
-
-export type GraphInterpInfoDS = {
- subrun_id: string;
- config: Record | null;
- label_counts: Record;
-};
-
-export type DataSourcesResponse = {
- harvest: HarvestInfo | null;
- autointerp: AutointerpInfo | null;
- attributions: AttributionsInfo | null;
- graph_interp: GraphInterpInfoDS | null;
-};
-
-export async function fetchDataSources(): Promise {
- return fetchJson("/api/data_sources");
-}
diff --git a/param_decomp_lab/app/frontend/frontend/src/lib/api/dataset.ts b/param_decomp_lab/app/frontend/frontend/src/lib/api/dataset.ts
deleted file mode 100644
index 62c0f736c..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/lib/api/dataset.ts
+++ /dev/null
@@ -1,148 +0,0 @@
-/**
- * API client for /api/dataset endpoints.
- */
-
-import { apiUrl } from "./index";
-
-export type DatasetSearchResult = {
- text: string;
- occurrence_count: number;
- metadata: Record;
-};
-
-export type DatasetSearchMetadata = {
- query: string;
- split: string;
- dataset_name: string;
- total_results: number;
- search_time_seconds: number;
-};
-
-export type DatasetSearchPage = {
- results: DatasetSearchResult[];
- page: number;
- page_size: number;
- total_results: number;
- total_pages: number;
-};
-
-export async function searchDataset(query: string, split: string): Promise {
- const url = apiUrl("/api/dataset/search");
- url.searchParams.set("query", query);
- url.searchParams.set("split", split);
-
- const response = await fetch(url.toString(), { method: "POST" });
- if (!response.ok) {
- const error = await response.json();
- throw new Error(error.detail || "Failed to search dataset");
- }
-
- return (await response.json()) as DatasetSearchMetadata;
-}
-
-export async function getDatasetResults(page: number, pageSize: number): Promise {
- const url = apiUrl("/api/dataset/results");
- url.searchParams.set("page", String(page));
- url.searchParams.set("page_size", String(pageSize));
-
- const response = await fetch(url.toString(), { method: "GET" });
- if (!response.ok) {
- const error = await response.json();
- throw new Error(error.detail || "Failed to get search results");
- }
-
- return (await response.json()) as DatasetSearchPage;
-}
-
-export type TokenizedSearchResult = {
- tokens: string[];
- next_token_probs: (number | null)[];
- occurrence_count: number;
- metadata: Record;
-};
-
-export type TokenizedSearchPage = {
- results: TokenizedSearchResult[];
- query: string;
- page: number;
- page_size: number;
- total_results: number;
- total_pages: number;
-};
-
-export async function getTokenizedResults(
- page: number,
- pageSize: number = 10,
- maxTokens: number = 256,
-): Promise {
- const url = apiUrl("/api/dataset/results_tokenized");
- url.searchParams.set("page", String(page));
- url.searchParams.set("page_size", String(pageSize));
- url.searchParams.set("max_tokens", String(maxTokens));
-
- const response = await fetch(url.toString(), { method: "GET" });
- if (!response.ok) {
- const error = await response.json();
- throw new Error(error.detail || "Failed to get tokenized results");
- }
-
- return (await response.json()) as TokenizedSearchPage;
-}
-
-export type RandomSamplesResult = {
- results: DatasetSearchResult[];
- total_available: number;
- seed: number;
-};
-
-export async function getRandomSamples(
- nSamples: number = 100,
- seed: number = 42,
- split: "train" | "test" = "train",
-): Promise {
- const url = apiUrl("/api/dataset/random");
- url.searchParams.set("n_samples", String(nSamples));
- url.searchParams.set("seed", String(seed));
- url.searchParams.set("split", split);
-
- const response = await fetch(url.toString(), { method: "GET" });
- if (!response.ok) {
- const error = await response.json();
- throw new Error(error.detail || "Failed to get random samples");
- }
-
- return (await response.json()) as RandomSamplesResult;
-}
-
-export type TokenizedSample = {
- tokens: string[];
- next_token_probs: (number | null)[]; // Probability of next token; null for last position
- metadata: Record;
-};
-
-export type RandomSamplesWithLossResult = {
- results: TokenizedSample[];
- total_available: number;
- seed: number;
-};
-
-export async function getRandomSamplesWithLoss(
- nSamples: number = 20,
- seed: number = 42,
- split: "train" | "test" = "train",
- maxTokens: number = 256,
-): Promise {
- const url = apiUrl("/api/dataset/random_with_loss");
- url.searchParams.set("n_samples", String(nSamples));
- url.searchParams.set("seed", String(seed));
- url.searchParams.set("split", split);
- url.searchParams.set("max_tokens", String(maxTokens));
-
- const response = await fetch(url.toString(), { method: "GET" });
- if (!response.ok) {
- const error = await response.json();
- throw new Error(error.detail || "Failed to get random samples with loss");
- }
-
- return (await response.json()) as RandomSamplesWithLossResult;
-}
diff --git a/param_decomp_lab/app/frontend/frontend/src/lib/api/datasetAttributions.ts b/param_decomp_lab/app/frontend/frontend/src/lib/api/datasetAttributions.ts
deleted file mode 100644
index 030eae6c6..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/lib/api/datasetAttributions.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- * API client for /api/dataset_attributions endpoints.
- */
-
-import { apiUrl, fetchJson } from "./index";
-
-export type DatasetAttributionEntry = {
- component_key: string;
- layer: string;
- component_idx: number;
- value: number;
- token_str: string | null;
-};
-
-export type SignedAttributions = {
- positive_sources: DatasetAttributionEntry[];
- negative_sources: DatasetAttributionEntry[];
- positive_targets: DatasetAttributionEntry[];
- negative_targets: DatasetAttributionEntry[];
-};
-
-export type AttrMetric = "attr" | "attr_abs";
-
-export type AllMetricAttributions = {
- attr: SignedAttributions;
- attr_abs: SignedAttributions;
-};
-
-export type DatasetAttributionsMetadata = {
- available: boolean;
-};
-
-export async function getDatasetAttributionsMetadata(): Promise {
- return fetchJson(apiUrl("/api/dataset_attributions/metadata").toString());
-}
-
-export async function getComponentAttributions(
- layer: string,
- componentIdx: number,
- k: number = 10,
-): Promise {
- const url = apiUrl(`/api/dataset_attributions/${encodeURIComponent(layer)}/${componentIdx}`);
- url.searchParams.set("k", String(k));
- return fetchJson(url.toString());
-}
diff --git a/param_decomp_lab/app/frontend/frontend/src/lib/api/graphInterp.ts b/param_decomp_lab/app/frontend/frontend/src/lib/api/graphInterp.ts
deleted file mode 100644
index 32c81530c..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/lib/api/graphInterp.ts
+++ /dev/null
@@ -1,77 +0,0 @@
-/**
- * API client for /api/graph_interp endpoints.
- */
-
-import { fetchJson } from "./index";
-
-export type GraphInterpHeadline = {
- label: string;
- output_label: string | null;
- input_label: string | null;
-};
-
-export type LabelDetail = {
- label: string;
- reasoning: string;
- prompt: string;
-};
-
-export type GraphInterpDetail = {
- output: LabelDetail | null;
- input: LabelDetail | null;
- unified: LabelDetail | null;
-};
-
-export type PromptEdgeResponse = {
- related_key: string;
- pass_name: string;
- attribution: number;
- related_label: string | null;
- token_str: string | null;
-};
-
-export type GraphInterpComponentDetail = {
- output: LabelDetail | null;
- input: LabelDetail | null;
- unified: LabelDetail | null;
- edges: PromptEdgeResponse[];
-};
-
-export type GraphNode = {
- component_key: string;
- label: string;
-};
-
-export type GraphEdge = {
- source: string;
- target: string;
- attribution: number;
- pass_name: string;
-};
-
-export type ModelGraphResponse = {
- nodes: GraphNode[];
- edges: GraphEdge[];
-};
-
-export type GraphInterpInfo = {
- subrun_id: string;
- config: Record | null;
- label_counts: Record;
-};
-
-export async function getAllGraphInterpLabels(): Promise> {
- return fetchJson>("/api/graph_interp/labels");
-}
-
-export async function getGraphInterpDetail(layer: string, cIdx: number): Promise {
- return fetchJson(`/api/graph_interp/labels/${layer}/${cIdx}`);
-}
-
-export async function getGraphInterpComponentDetail(layer: string, cIdx: number): Promise {
- return fetchJson(`/api/graph_interp/detail/${layer}/${cIdx}`);
-}
-
-export async function getModelGraph(): Promise {
- return fetchJson("/api/graph_interp/graph");
-}
diff --git a/param_decomp_lab/app/frontend/frontend/src/lib/api/graphs.ts b/param_decomp_lab/app/frontend/frontend/src/lib/api/graphs.ts
deleted file mode 100644
index 5bce08da5..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/lib/api/graphs.ts
+++ /dev/null
@@ -1,268 +0,0 @@
-/**
- * API client for /api/graphs endpoints.
- */
-
-import type { GraphData, EdgeData, TokenizeResponse, TokenSearchResult, CISnapshot } from "../promptAttributionsTypes";
-import { buildEdgeIndexes } from "../promptAttributionsTypes";
-import { apiUrl, ApiError, fetchJson } from "./index";
-
-/** Hydrate a raw API graph response into a full GraphData with edge indexes. */
-function hydrateGraph(raw: Record): GraphData {
- const g = raw as Omit;
- const { edgesBySource, edgesByTarget } = buildEdgeIndexes(g.edges);
- const edgesAbs = (g.edgesAbs satisfies EdgeData[] | null) ?? null;
- let edgesAbsBySource: Map | null = null;
- let edgesAbsByTarget: Map | null = null;
- if (edgesAbs) {
- const absIndexes = buildEdgeIndexes(edgesAbs);
- edgesAbsBySource = absIndexes.edgesBySource;
- edgesAbsByTarget = absIndexes.edgesByTarget;
- }
- return { ...g, edgesBySource, edgesByTarget, edgesAbs, edgesAbsBySource, edgesAbsByTarget };
-}
-
-export type NormalizeType = "none" | "target" | "layer";
-
-export type GraphProgress = {
- current: number;
- total: number;
- stage: string;
-};
-
-export type ComputeGraphParams = {
- promptId: number;
- normalize: NormalizeType;
- ciThreshold: number;
- /** If provided, only include these nodes in the graph (creates manual graph) */
- includedNodes?: string[];
-};
-
-/** Generic SSE stream parser. Delegates result extraction to the caller via extractResult. */
-async function parseSSEStream(
- response: Response,
- extractResult: (data: Record) => T,
- onProgress?: (progress: GraphProgress) => void,
- onCISnapshot?: (snapshot: CISnapshot) => void,
-): Promise {
- const reader = response.body?.getReader();
- if (!reader) {
- throw new Error("Response body is not readable");
- }
-
- const decoder = new TextDecoder();
- let buffer = "";
- let result: T | null = null;
-
- while (true) {
- const { done, value } = await reader.read();
- if (done) break;
-
- buffer += decoder.decode(value, { stream: true });
-
- const lines = buffer.split("\n\n");
- buffer = lines.pop() || "";
-
- for (const line of lines) {
- if (!line.trim() || !line.startsWith("data: ")) continue;
-
- const data = JSON.parse(line.substring(6));
-
- if (data.type === "progress" && onProgress) {
- onProgress({ current: data.current, total: data.total, stage: data.stage });
- } else if (data.type === "ci_snapshot" && onCISnapshot) {
- onCISnapshot(data as CISnapshot);
- } else if (data.type === "error") {
- throw new ApiError(data.error, 500);
- } else if (data.type === "complete") {
- result = extractResult(data);
- await reader.cancel();
- break;
- }
- }
-
- if (result) break;
- }
-
- if (!result) {
- throw new Error("No result received from stream");
- }
-
- return result;
-}
-
-export async function computeGraphStream(
- params: ComputeGraphParams,
- onProgress?: (progress: GraphProgress) => void,
-): Promise {
- const url = apiUrl("/api/graphs");
- url.searchParams.set("prompt_id", String(params.promptId));
- url.searchParams.set("normalize", String(params.normalize));
- url.searchParams.set("ci_threshold", String(params.ciThreshold));
-
- const response = await fetch(url.toString(), {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify({ included_nodes: params.includedNodes ?? null }),
- });
- if (!response.ok) {
- const text = await response.text();
- let detail = text || `HTTP ${response.status}`;
- try {
- detail = (JSON.parse(text) as { detail?: string }).detail ?? detail;
- } catch {
- // Response body was not JSON (e.g. a bare 431 from the dev proxy) — keep raw text.
- }
- throw new ApiError(detail, response.status);
- }
-
- return parseSSEStream(response, (data) => hydrateGraph(data.data as Record), onProgress);
-}
-
-export type MaskType = "stochastic" | "ci";
-export type LossType = "ce" | "kl" | "logit";
-
-export type ComputeGraphOptimizedParams = {
- promptId: number;
- impMinCoeff: number;
- steps: number;
- pnorm: number;
- beta: number;
- normalize: NormalizeType;
- ciThreshold: number;
- maskType: MaskType;
- lossType: LossType;
- lossCoeff: number;
- lossPosition: number;
- labelToken?: number; // Required for CE loss
- advPgdNSteps?: number;
- advPgdStepSize?: number;
-};
-
-export async function computeGraphOptimizedStream(
- params: ComputeGraphOptimizedParams,
- onProgress?: (progress: GraphProgress) => void,
- onCISnapshot?: (snapshot: CISnapshot) => void,
-): Promise {
- const url = apiUrl("/api/graphs/optimized/stream");
- url.searchParams.set("prompt_id", String(params.promptId));
- url.searchParams.set("imp_min_coeff", String(params.impMinCoeff));
- url.searchParams.set("steps", String(params.steps));
- url.searchParams.set("pnorm", String(params.pnorm));
- url.searchParams.set("beta", String(params.beta));
- url.searchParams.set("normalize", String(params.normalize));
- url.searchParams.set("ci_threshold", String(params.ciThreshold));
- url.searchParams.set("mask_type", params.maskType);
- url.searchParams.set("loss_type", params.lossType);
- url.searchParams.set("loss_coeff", String(params.lossCoeff));
- url.searchParams.set("loss_position", String(params.lossPosition));
- if (params.labelToken !== undefined) {
- url.searchParams.set("label_token", String(params.labelToken));
- }
- if (params.advPgdNSteps !== undefined) {
- url.searchParams.set("adv_pgd_n_steps", String(params.advPgdNSteps));
- }
- if (params.advPgdStepSize !== undefined) {
- url.searchParams.set("adv_pgd_step_size", String(params.advPgdStepSize));
- }
-
- const response = await fetch(url.toString(), { method: "POST" });
- if (!response.ok) {
- const error = await response.json();
- throw new ApiError(error.detail || `HTTP ${response.status}`, response.status);
- }
-
- return parseSSEStream(
- response,
- (data) => hydrateGraph(data.data as Record),
- onProgress,
- onCISnapshot,
- );
-}
-
-export type ComputeGraphOptimizedBatchParams = {
- promptId: number;
- impMinCoeffs: number[];
- steps: number;
- pnorm: number;
- beta: number;
- normalize: NormalizeType;
- ciThreshold: number;
- maskType: MaskType;
- lossType: LossType;
- lossCoeff: number;
- lossPosition: number;
- labelToken?: number;
- advPgdNSteps?: number;
- advPgdStepSize?: number;
-};
-
-export async function computeGraphOptimizedBatchStream(
- params: ComputeGraphOptimizedBatchParams,
- onProgress?: (progress: GraphProgress) => void,
- onCISnapshot?: (snapshot: CISnapshot) => void,
-): Promise {
- const url = apiUrl("/api/graphs/optimized/batch/stream");
-
- const body: Record = {
- prompt_id: params.promptId,
- imp_min_coeffs: params.impMinCoeffs,
- steps: params.steps,
- pnorm: params.pnorm,
- beta: params.beta,
- normalize: params.normalize,
- ci_threshold: params.ciThreshold,
- mask_type: params.maskType,
- loss_type: params.lossType,
- loss_coeff: params.lossCoeff,
- loss_position: params.lossPosition,
- };
- if (params.labelToken !== undefined) body.label_token = params.labelToken;
- if (params.advPgdNSteps !== undefined) body.adv_pgd_n_steps = params.advPgdNSteps;
- if (params.advPgdStepSize !== undefined) body.adv_pgd_step_size = params.advPgdStepSize;
-
- const response = await fetch(url.toString(), {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify(body),
- });
- if (!response.ok) {
- const error = await response.json();
- throw new ApiError(error.detail || `HTTP ${response.status}`, response.status);
- }
-
- return parseSSEStream(
- response,
- (data) => (data.data as { graphs: Record[] }).graphs.map((g) => hydrateGraph(g)),
- onProgress,
- onCISnapshot,
- );
-}
-
-export async function getGraphs(promptId: number, normalize: NormalizeType, ciThreshold: number): Promise {
- const url = apiUrl(`/api/graphs/${promptId}`);
- url.searchParams.set("normalize", normalize);
- url.searchParams.set("ci_threshold", String(ciThreshold));
- const graphs = await fetchJson[]>(url.toString());
- return graphs.map((g) => hydrateGraph(g));
-}
-
-export async function tokenizeText(text: string): Promise {
- const url = apiUrl("/api/graphs/tokenize");
- url.searchParams.set("text", text);
- return fetchJson(url.toString(), { method: "POST" });
-}
-
-export async function searchTokens(
- query: string,
- promptId: number,
- position: number,
- limit: number = 20,
-): Promise {
- const url = apiUrl("/api/graphs/tokens/search");
- url.searchParams.set("q", query);
- url.searchParams.set("limit", String(limit));
- url.searchParams.set("prompt_id", String(promptId));
- url.searchParams.set("position", String(position));
- const response = await fetchJson<{ tokens: TokenSearchResult[] }>(url.toString());
- return response.tokens;
-}
diff --git a/param_decomp_lab/app/frontend/frontend/src/lib/api/index.ts b/param_decomp_lab/app/frontend/frontend/src/lib/api/index.ts
deleted file mode 100644
index c3613959e..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/lib/api/index.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * Shared API utilities and exports.
- *
- * In development, Vite proxies /api requests to the backend.
- * This allows the frontend to work regardless of which port the backend is on.
- */
-
-/**
- * Build a URL for an API endpoint.
- * Uses relative paths which Vite's proxy forwards to the backend.
- */
-export function apiUrl(path: string): URL {
- return new URL(path, window.location.origin);
-}
-
-export class ApiError extends Error {
- constructor(
- message: string,
- public status: number,
- ) {
- super(message);
- this.name = "ApiError";
- }
-}
-
-export async function fetchJson(url: string, options?: RequestInit): Promise {
- const response = await fetch(url, options);
- const text = await response.text();
-
- if (!response.ok) {
- let message = `HTTP ${response.status}`;
- try {
- const data = JSON.parse(text);
- message = data.detail || data.error || message;
- } catch {
- message = text.slice(0, 200) || message;
- }
- throw new ApiError(message, response.status);
- }
-
- return JSON.parse(text) as T;
-}
-
-// Re-export all API modules
-export * from "./autointerpCompare";
-export * from "./runs";
-export * from "./graphs";
-export * from "./prompts";
-export * from "./activationContexts";
-export * from "./correlations";
-export * from "./datasetAttributions";
-export * from "./intervention";
-export * from "./dataset";
-export * from "./clusters";
-export * from "./investigations";
-export * from "./dataSources";
-export * from "./graphInterp";
-export * from "./pretrainInfo";
-export * from "./runRegistry";
diff --git a/param_decomp_lab/app/frontend/frontend/src/lib/api/intervention.ts b/param_decomp_lab/app/frontend/frontend/src/lib/api/intervention.ts
deleted file mode 100644
index 154228181..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/lib/api/intervention.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * API client for /api/intervention endpoints.
- */
-
-import type { InterventionRunSummary, RunInterventionRequest } from "../interventionTypes";
-
-export async function runAndSaveIntervention(request: RunInterventionRequest): Promise {
- const response = await fetch("/api/intervention/run", {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify(request),
- });
- if (!response.ok) {
- const error = await response.json();
- throw new Error(error.detail || "Failed to run intervention");
- }
- return (await response.json()) as InterventionRunSummary;
-}
-
-export async function getInterventionRuns(graphId: number): Promise {
- const response = await fetch(`/api/intervention/runs/${graphId}`);
- if (!response.ok) {
- const error = await response.json();
- throw new Error(error.detail || "Failed to get intervention runs");
- }
- return (await response.json()) as InterventionRunSummary[];
-}
-
-export async function deleteInterventionRun(runId: number): Promise {
- const response = await fetch(`/api/intervention/runs/${runId}`, {
- method: "DELETE",
- });
- if (!response.ok) {
- const error = await response.json();
- throw new Error(error.detail || "Failed to delete intervention run");
- }
-}
diff --git a/param_decomp_lab/app/frontend/frontend/src/lib/api/investigations.ts b/param_decomp_lab/app/frontend/frontend/src/lib/api/investigations.ts
deleted file mode 100644
index 42f1fb1f3..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/lib/api/investigations.ts
+++ /dev/null
@@ -1,101 +0,0 @@
-/**
- * API client for investigation results.
- */
-
-export interface InvestigationSummary {
- id: string; // inv_id (e.g., "inv-abc12345")
- wandb_path: string | null;
- prompt: string | null;
- created_at: string;
- has_research_log: boolean;
- has_explanations: boolean;
- event_count: number;
- last_event_time: string | null;
- last_event_message: string | null;
- // Agent-provided summary
- title: string | null;
- summary: string | null;
- status: string | null; // in_progress, completed, inconclusive
-}
-
-export interface EventEntry {
- event_type: string;
- timestamp: string;
- message: string;
- details: Record | null;
-}
-
-export interface InvestigationDetail {
- id: string;
- wandb_path: string | null;
- prompt: string | null;
- created_at: string;
- research_log: string | null;
- events: EventEntry[];
- explanations: Record[];
- artifact_ids: string[]; // List of artifact IDs available for this investigation
- // Agent-provided summary
- title: string | null;
- summary: string | null;
- status: string | null;
-}
-
-import type { EdgeData, OutputProbability } from "../promptAttributionsTypes";
-
-/** Data for a graph artifact (subset of GraphData, self-contained for offline viewing) */
-export interface ArtifactGraphData {
- tokens: string[];
- edges: EdgeData[];
- outputProbs: Record;
- nodeCiVals: Record;
- nodeSubcompActs: Record;
- maxAbsAttr: number;
- l0_total: number;
-}
-
-export interface GraphArtifact {
- type: "graph";
- id: string;
- caption: string | null;
- graph_id: number;
- data: ArtifactGraphData;
-}
-
-export interface LaunchResponse {
- inv_id: string;
- job_id: string;
-}
-
-export async function launchInvestigation(prompt: string): Promise {
- const res = await fetch("/api/investigations/launch", {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify({ prompt }),
- });
- if (!res.ok) throw new Error(`Failed to launch investigation: ${res.statusText}`);
- return res.json();
-}
-
-export async function listInvestigations(): Promise {
- const res = await fetch("/api/investigations");
- if (!res.ok) throw new Error(`Failed to list investigations: ${res.statusText}`);
- return res.json();
-}
-
-export async function getInvestigation(invId: string): Promise {
- const res = await fetch(`/api/investigations/${invId}`);
- if (!res.ok) throw new Error(`Failed to get investigation: ${res.statusText}`);
- return res.json();
-}
-
-export async function listArtifacts(invId: string): Promise {
- const res = await fetch(`/api/investigations/${invId}/artifacts`);
- if (!res.ok) throw new Error(`Failed to list artifacts: ${res.statusText}`);
- return res.json();
-}
-
-export async function getArtifact(invId: string, artifactId: string): Promise {
- const res = await fetch(`/api/investigations/${invId}/artifacts/${artifactId}`);
- if (!res.ok) throw new Error(`Failed to get artifact: ${res.statusText}`);
- return res.json();
-}
diff --git a/param_decomp_lab/app/frontend/frontend/src/lib/api/pretrainInfo.ts b/param_decomp_lab/app/frontend/frontend/src/lib/api/pretrainInfo.ts
deleted file mode 100644
index 0cd66bd97..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/lib/api/pretrainInfo.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-/**
- * API client for /api/pretrain_info endpoint.
- */
-
-import { fetchJson } from "./index";
-
-export type BlockStructure = {
- index: number;
- attn_type: "separate" | "fused";
- attn_projections: string[];
- ffn_type: "glu" | "mlp";
- ffn_projections: string[];
-};
-
-export type TopologyInfo = {
- n_blocks: number;
- block_structure: BlockStructure[];
-};
-
-export type PretrainInfoResponse = {
- model_type: string;
- summary: string;
- dataset_short: string | null;
- target_model_config: Record | null;
- pretrain_config: Record | null;
- pretrain_wandb_path: string | null;
- topology: TopologyInfo | null;
-};
-
-export async function fetchPretrainInfo(wandbPath: string): Promise {
- const params = new URLSearchParams({ wandb_path: wandbPath });
- return fetchJson(`/api/pretrain_info?${params}`);
-}
-
-export async function fetchPretrainInfoForLoadedRun(): Promise {
- return fetchJson("/api/pretrain_info/loaded");
-}
diff --git a/param_decomp_lab/app/frontend/frontend/src/lib/api/prompts.ts b/param_decomp_lab/app/frontend/frontend/src/lib/api/prompts.ts
deleted file mode 100644
index 76d562ab7..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/lib/api/prompts.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * API client for /api/prompts endpoints.
- */
-
-import type { PromptPreview } from "../promptAttributionsTypes";
-import { apiUrl, fetchJson } from "./index";
-
-export async function listPrompts(): Promise {
- return fetchJson("/api/prompts");
-}
-
-export async function createCustomPrompt(text: string): Promise {
- const url = apiUrl("/api/prompts/custom");
- url.searchParams.set("text", text);
- return fetchJson(url.toString(), { method: "POST" });
-}
-
-export async function deletePrompt(promptId: number): Promise {
- await fetchJson(`/api/prompts/${promptId}`, { method: "DELETE" });
-}
diff --git a/param_decomp_lab/app/frontend/frontend/src/lib/api/runRegistry.ts b/param_decomp_lab/app/frontend/frontend/src/lib/api/runRegistry.ts
deleted file mode 100644
index c727f4dcc..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/lib/api/runRegistry.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * API client for /api/run_registry endpoint.
- */
-
-import { fetchJson } from "./index";
-
-export type DataAvailability = {
- harvest: boolean;
- autointerp: boolean;
- attributions: boolean;
- graph_interp: boolean;
-};
-
-export type RunInfoResponse = {
- wandb_run_id: string;
- architecture: string | null;
- availability: DataAvailability;
-};
-
-export async function fetchRunInfo(wandbRunIds: string[]): Promise {
- return fetchJson("/api/run_registry", {
- method: "POST",
- headers: { "Content-Type": "application/json" },
- body: JSON.stringify(wandbRunIds),
- });
-}
diff --git a/param_decomp_lab/app/frontend/frontend/src/lib/api/runs.ts b/param_decomp_lab/app/frontend/frontend/src/lib/api/runs.ts
deleted file mode 100644
index d898c8671..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/lib/api/runs.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- * API client for /api/runs endpoints.
- */
-
-import { apiUrl } from "./index";
-
-export type LoadedRun = {
- id: number;
- wandb_path: string;
- config_yaml: string;
- has_prompts: boolean;
- prompt_count: number;
- context_length: number;
- backend_user: string;
- dataset_attributions_available: boolean;
- dataset_search_enabled: boolean;
- graph_interp_available: boolean;
- autointerp_available: boolean;
-};
-
-export async function getStatus(): Promise {
- const response = await fetch("/api/status");
- const data = await response.json();
- return data;
-}
-
-export async function whoami(): Promise {
- const response = await fetch("/api/whoami");
- const data = await response.json();
- return data.user;
-}
-
-export async function loadRun(wandbRunPath: string, contextLength: number): Promise {
- const url = apiUrl("/api/runs/load");
- url.searchParams.set("wandb_path", wandbRunPath);
- url.searchParams.set("context_length", String(contextLength));
- const response = await fetch(url.toString(), { method: "POST" });
- if (!response.ok) {
- const error = await response.json();
- throw new Error(error.detail || "Failed to load run");
- }
-}
diff --git a/param_decomp_lab/app/frontend/frontend/src/lib/colors.ts b/param_decomp_lab/app/frontend/frontend/src/lib/colors.ts
deleted file mode 100644
index d15462693..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/lib/colors.ts
+++ /dev/null
@@ -1,110 +0,0 @@
-/**
- * Centralized color definitions for graph visualization.
- * These match the CSS variables in app.css but are available for inline styles in SVG elements.
- *
- * RGB values for dynamic opacity (rgba) are stored as {r, g, b} objects.
- * Hex values are used for direct color application.
- */
-
-export const colors = {
- // Text - warm navy contrast (matches --text-*)
- textPrimary: "#1d272a",
- textSecondary: "#646464",
- textMuted: "#b4b4b4",
-
- // Status colors for edges/data (matches --accent-primary, --status-negative)
- positive: "#4d65ff",
- negative: "#dc2626",
-
- // RGB components for dynamic opacity
- positiveRgb: { r: 77, g: 101, b: 255 }, // vibrant blue - matches --accent-primary
- negativeRgb: { r: 220, g: 38, b: 38 }, // red - matches --status-negative
-
- // Output node gradient (green) - matches --status-positive
- outputBase: { r: 22, g: 163, b: 74 },
-
- // Token highlight - matches --status-positive
- tokenHighlight: { r: 22, g: 163, b: 74 },
- tokenHighlightOpacity: 0.4,
-
- // Node default
- nodeDefault: "#8a8780",
-
- // Accent (for active states) - matches --accent-primary
- accent: "#7C4D33",
-
- // Set overlap visualization (A/B/intersection)
- setOverlap: {
- self: { r: 20, g: 184, b: 166 }, // teal - A-only
- both: { r: 100, g: 116, b: 139 }, // slate - intersection
- other: { r: 249, g: 115, b: 22 }, // orange - B-only
- },
-} as const;
-
-/** Get edge color based on value sign */
-export function getEdgeColor(val: number): string {
- return val > 0 ? colors.positive : colors.negative;
-}
-
-/** Get node color for subcomponent activation (blue=positive, red=negative) */
-export function getSubcompActColor(val: number): string {
- return val >= 0 ? colors.positive : colors.negative;
-}
-
-/** Get token highlight background for CI values (0-1, green) */
-export function getTokenHighlightBg(ci: number): string {
- const { r, g, b } = colors.tokenHighlight;
- return `rgba(${r},${g},${b},${ci * colors.tokenHighlightOpacity})`;
-}
-
-/** Get color for component activations (blue for positive, red for negative) */
-export function getComponentActivationColor(value: number, normalizedAbs: number): string {
- const { r, g, b } = value >= 0 ? colors.positiveRgb : colors.negativeRgb;
- return `rgba(${r}, ${g}, ${b}, ${normalizedAbs})`;
-}
-
-/** Compute the max absolute value across all component activations (for normalization) */
-export function computeMaxAbsComponentAct(exampleComponentActs: number[][]): number {
- let max = 0;
- for (const row of exampleComponentActs) {
- for (const val of row) {
- const abs = Math.abs(val);
- if (abs > max) max = abs;
- }
- }
- return max === 0 ? 1 : max;
-}
-
-/** Get output header gradient background based on probability */
-export function getOutputHeaderColor(prob: number): string {
- const { r, g, b } = colors.outputBase;
- const opacity = Math.min(0.8, prob + 0.05);
- return `rgba(${r}, ${g}, ${b}, ${opacity})`;
-}
-
-/** Background color with opacity for overlays */
-export const bgBaseRgb = { r: 255, g: 255, b: 255 };
-
-/** Convert RGB object to CSS rgb() string */
-export function rgbToCss(rgb: { r: number; g: number; b: number }): string {
- return `rgb(${rgb.r}, ${rgb.g}, ${rgb.b})`;
-}
-
-/** Convert RGB object to CSS rgba() string with opacity */
-export function rgbaToCss(rgb: { r: number; g: number; b: number }, opacity: number): string {
- return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${opacity})`;
-}
-
-/**
- * Get background color for next-token probability visualization.
- * High probability = green (expected), low probability = white.
- */
-export function getNextTokenProbBgColor(prob: number | null): string {
- if (prob === null) return "white";
- const { r: gR, g: gG, b: gB } = colors.outputBase; // green
- // Interpolate from white (255,255,255) to green based on probability
- const r = Math.round(255 + (gR - 255) * prob);
- const g = Math.round(255 + (gG - 255) * prob);
- const b = Math.round(255 + (gB - 255) * prob);
- return `rgb(${r}, ${g}, ${b})`;
-}
diff --git a/param_decomp_lab/app/frontend/frontend/src/lib/componentCardConstants.ts b/param_decomp_lab/app/frontend/frontend/src/lib/componentCardConstants.ts
deleted file mode 100644
index 97fb9c423..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/lib/componentCardConstants.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-/**
- * Shared constants for component card displays.
- * Centralizes magic numbers to ensure consistency across ComponentNodeCard and ActivationContextsViewer.
- */
-
-export const COMPONENT_CARD_CONSTANTS = {
- /** Number of correlations per page */
- CORRELATIONS_PAGE_SIZE: 10,
-
- /** Number of dataset attributions per page */
- DATASET_ATTRIBUTIONS_PAGE_SIZE: 4,
-
- /** Number of prompt attributions per page */
- PROMPT_ATTRIBUTIONS_PAGE_SIZE: 4,
-} as const;
diff --git a/param_decomp_lab/app/frontend/frontend/src/lib/componentKeys.ts b/param_decomp_lab/app/frontend/frontend/src/lib/componentKeys.ts
deleted file mode 100644
index ff83bda06..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/lib/componentKeys.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * Utilities for component key display (e.g. rendering embed/output keys with token strings).
- */
-
-export function isTokenNode(key: string): boolean {
- const layer = key.split(":")[0];
- return layer === "embed" || layer === "output";
-}
-
-export function formatComponentKey(key: string, tokenStr: string | null): string {
- if (tokenStr && isTokenNode(key)) {
- const layer = key.split(":")[0];
- const label = layer === "embed" ? "input" : "output";
- return `'${tokenStr}' (${label})`;
- }
- return key;
-}
diff --git a/param_decomp_lab/app/frontend/frontend/src/lib/displaySettings.svelte.ts b/param_decomp_lab/app/frontend/frontend/src/lib/displaySettings.svelte.ts
deleted file mode 100644
index 4254acb31..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/lib/displaySettings.svelte.ts
+++ /dev/null
@@ -1,86 +0,0 @@
-/**
- * Global display settings using Svelte 5 runes
- */
-
-// Available correlation stat types
-export type CorrelationStatType = "pmi" | "precision" | "recall" | "jaccard";
-
-// Node color mode for graph visualization
-export type NodeColorMode = "ci" | "subcomp_act";
-
-export const NODE_COLOR_MODE_LABELS: Record = {
- ci: "CI",
- subcomp_act: "Subcomp Act",
-};
-
-// Edge variant for attribution graphs
-export type EdgeVariant = "signed" | "abs_target";
-
-export const EDGE_VARIANT_LABELS: Record = {
- signed: "Signed",
- abs_target: "Abs Target",
-};
-
-// Example color mode for activation contexts viewer
-export type ExampleColorMode = "ci" | "component_act" | "both";
-
-export const EXAMPLE_COLOR_MODE_LABELS: Record = {
- ci: "CI",
- component_act: "Component Act",
- both: "Both",
-};
-
-export const CORRELATION_STAT_LABELS: Record = {
- pmi: "PMI",
- precision: "Precision",
- recall: "Recall",
- jaccard: "Jaccard",
-};
-
-export const CORRELATION_STAT_DESCRIPTIONS: Record = {
- pmi: "log(P(both) / P(A)P(B))",
- precision: "P(that | this)",
- recall: "P(this | that)",
- jaccard: "Intersection over union",
-};
-
-type DisplaySettings = {
- showPmi: boolean;
- showPrecision: boolean;
- showRecall: boolean;
- showJaccard: boolean;
- showSetOverlapVis: boolean;
- showEdgeAttributions: boolean;
- nodeColorMode: NodeColorMode;
- exampleColorMode: ExampleColorMode;
- meanCiCutoff: number;
- centerOnPeak: boolean;
- showAutoInterpPromptButton: boolean;
- curvedEdges: boolean;
- edgeVariant: EdgeVariant;
-};
-
-export const displaySettings = $state({
- showPmi: false,
- showPrecision: false,
- showRecall: false,
- showJaccard: false,
- showSetOverlapVis: true,
- showEdgeAttributions: true,
- nodeColorMode: "ci",
- exampleColorMode: "ci",
- meanCiCutoff: 1e-7,
- centerOnPeak: false,
- showAutoInterpPromptButton: false,
- curvedEdges: true,
- edgeVariant: "signed",
-});
-
-export function anyCorrelationStatsEnabled() {
- return (
- displaySettings.showPmi ||
- displaySettings.showPrecision ||
- displaySettings.showRecall ||
- displaySettings.showJaccard
- );
-}
diff --git a/param_decomp_lab/app/frontend/frontend/src/lib/graphLayout.ts b/param_decomp_lab/app/frontend/frontend/src/lib/graphLayout.ts
deleted file mode 100644
index cc3e6fa19..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/lib/graphLayout.ts
+++ /dev/null
@@ -1,136 +0,0 @@
-/**
- * Graph layout utilities for canonical transformer addresses.
- *
- * Canonical address format:
- * "embed" — embedding
- * "output" — unembed / logits
- * "{block}.{sublayer}.{projection}" — e.g. "0.attn.q", "2.mlp.down"
- *
- * Node key format:
- * "{layer}:{seqIdx}:{cIdx}" — e.g. "0.attn.q:3:5", "embed:0:0"
- */
-
-export type LayerInfo = {
- name: string;
- block: number; // -1 for embed, Infinity for output
- sublayer: string; // "attn" | "attn_fused" | "mlp" | "glu" | "embed" | "output"
- projection: string | null; // "q" | "k" | "v" | "o" | "qkv" | "up" | "down" | "gate" | null
-};
-
-const SUBLAYER_ORDER = ["attn", "attn_fused", "glu", "mlp"];
-
-// Projections that share a row and get grouped horizontally
-const GROUPED_PROJECTIONS: Record = {
- attn: ["q", "k", "v"],
- glu: ["gate", "up"],
-};
-
-// Full projection ordering within each sublayer (grouped inputs first, then outputs)
-const PROJECTION_ORDER: Record = {
- attn: ["q", "k", "v", "o"],
- attn_fused: ["qkv", "o"],
- glu: ["gate", "up", "down"],
- mlp: ["up", "down"],
-};
-
-export function parseLayer(name: string): LayerInfo {
- if (name === "embed") return { name, block: -1, sublayer: "embed", projection: null };
- if (name === "output") return { name, block: Infinity, sublayer: "output", projection: null };
-
- const parts = name.split(".");
- return {
- name,
- block: +parts[0],
- sublayer: parts[1],
- projection: parts[2],
- };
-}
-
-/**
- * Row key: layers that share the same visual row.
- * q/k/v share "0.attn.qkv", gate/up share "0.glu.gate_up".
- * Ungrouped projections (o, down) get their own row.
- */
-export function getRowKey(layer: string): string {
- const info = parseLayer(layer);
- if (info.sublayer === "embed" || info.sublayer === "output") return layer;
-
- const grouped = GROUPED_PROJECTIONS[info.sublayer];
- if (grouped && info.projection && grouped.includes(info.projection)) {
- return `${info.block}.${info.sublayer}.${grouped.join("_")}`;
- }
- return layer;
-}
-
-/**
- * Row label for display.
- */
-export function getRowLabel(rowKey: string): string {
- if (rowKey === "embed") return "embed";
- if (rowKey === "output") return "output";
-
- const parts = rowKey.split(".");
- const block = parts[0];
- const sublayer = parts[1];
- const projPart = parts[2];
-
- if (!projPart) return `${block}.${sublayer}`;
-
- // Grouped projections: show "0.attn.qkv" or "0.glu.gate/up"
- if (projPart.includes("_")) {
- return `${block}.${sublayer}.${projPart.replace(/_/g, "/")}`;
- }
- return rowKey;
-}
-
-/**
- * Sort row keys: embed at bottom, output at top, blocks in between.
- * Within a block: sublayers follow SUBLAYER_ORDER, grouped projections before ungrouped.
- */
-export function sortRows(rows: string[]): string[] {
- return [...rows].sort((a, b) => {
- const partsA = a.split(".");
- const partsB = b.split(".");
-
- const blockA = a === "embed" ? -1 : a === "output" ? Infinity : +partsA[0];
- const blockB = b === "embed" ? -1 : b === "output" ? Infinity : +partsB[0];
-
- if (blockA !== blockB) return blockA - blockB;
-
- const sublayerA = partsA[1] ?? "";
- const sublayerB = partsB[1] ?? "";
- const sublayerDiff = SUBLAYER_ORDER.indexOf(sublayerA) - SUBLAYER_ORDER.indexOf(sublayerB);
- if (sublayerDiff !== 0) return sublayerDiff;
-
- // Within same sublayer: order by first projection in the row key
- const projOrder = PROJECTION_ORDER[sublayerA] ?? [];
- const firstProjA = (partsA[2] ?? "").split("_")[0];
- const firstProjB = (partsB[2] ?? "").split("_")[0];
- const projIdxA = projOrder.indexOf(firstProjA);
- const projIdxB = projOrder.indexOf(firstProjB);
- return (projIdxA === -1 ? 999 : projIdxA) - (projIdxB === -1 ? 999 : projIdxB);
- });
-}
-
-/**
- * Get the grouped projections for a sublayer, if any.
- * Returns null if no grouping (each projection gets its own horizontal space).
- */
-export function getGroupProjections(sublayer: string): string[] | null {
- return GROUPED_PROJECTIONS[sublayer] ?? null;
-}
-
-/**
- * Check if a specific projection is part of its sublayer's group.
- */
-export function isGroupedProjection(sublayer: string, projection: string): boolean {
- const group = GROUPED_PROJECTIONS[sublayer];
- return group !== undefined && group.includes(projection);
-}
-
-/**
- * Build the full layer address from block + sublayer + projection.
- */
-export function buildLayerAddress(block: number, sublayer: string, projection: string): string {
- return `${block}.${sublayer}.${projection}`;
-}
diff --git a/param_decomp_lab/app/frontend/frontend/src/lib/index.ts b/param_decomp_lab/app/frontend/frontend/src/lib/index.ts
deleted file mode 100644
index 66de79698..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/lib/index.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * A type that represents a value that may be uninitialized, loading, loaded, or in an error state.
- * This is useful for handling asynchronous data in a type-safe way.
- */
-export type Loadable =
- | { status: "uninitialized" }
- | { status: "loading" }
- | { status: "loaded"; data: T }
- | { status: "error"; error: unknown };
-
-/** Map over the data inside a Loadable, preserving uninitialized/loading/error states */
-export function mapLoadable(loadable: Loadable, fn: (data: T) => U): Loadable {
- if (loadable.status === "uninitialized") return { status: "uninitialized" };
- if (loadable.status === "loading") return { status: "loading" };
- if (loadable.status === "error") return { status: "error", error: loadable.error };
- return { status: "loaded", data: fn(loadable.data) };
-}
diff --git a/param_decomp_lab/app/frontend/frontend/src/lib/interventionTypes.ts b/param_decomp_lab/app/frontend/frontend/src/lib/interventionTypes.ts
deleted file mode 100644
index db2794da5..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/lib/interventionTypes.ts
+++ /dev/null
@@ -1,105 +0,0 @@
-/** Types for the intervention forward pass feature */
-
-/** Default eval PGD settings (distinct from training PGD which is an optimization regularizer) */
-export const EVAL_PGD_N_STEPS = 4;
-export const EVAL_PGD_STEP_SIZE = 1.0;
-
-export type TokenPrediction = {
- token: string;
- token_id: number;
- prob: number;
- logit: number;
- target_prob: number;
- target_logit: number;
-};
-
-export type LabelPredictions = {
- position: number;
- ci: TokenPrediction;
- stochastic: TokenPrediction;
- adversarial: TokenPrediction;
- ablated: TokenPrediction | null;
-};
-
-export type InterventionResult = {
- input_tokens: string[];
- ci: TokenPrediction[][];
- stochastic: TokenPrediction[][];
- adversarial: TokenPrediction[][];
- ablated: TokenPrediction[][] | null;
- ci_loss: number;
- stochastic_loss: number;
- adversarial_loss: number;
- ablated_loss: number | null;
- label: LabelPredictions | null;
-};
-
-/** Persisted intervention run from the server */
-export type InterventionRunSummary = {
- id: number;
- selected_nodes: string[]; // node keys (layer:seq:cIdx)
- result: InterventionResult;
- created_at: string;
-};
-
-/** Request to run and save an intervention */
-export type RunInterventionRequest = {
- graph_id: number;
- selected_nodes: string[];
- nodes_to_ablate?: string[];
- top_k: number;
- adv_pgd: { n_steps: number; step_size: number };
-};
-
-// --- Frontend-only run lifecycle types ---
-
-import { SvelteSet } from "svelte/reactivity";
-import { isInterventableNode } from "./promptAttributionsTypes";
-
-/** Draft run: cloned from a parent, editable node selection. No forwarded results yet. */
-export type DraftRun = {
- kind: "draft";
- parentId: number;
- selectedNodes: SvelteSet;
-};
-
-/** Baked run: forwarded and immutable. Wraps a persisted InterventionRunSummary. */
-export type BakedRun = {
- kind: "baked";
- id: number;
- selectedNodes: Set;
- result: InterventionResult;
- createdAt: string;
-};
-
-export type InterventionRun = DraftRun | BakedRun;
-
-export type InterventionState = {
- runs: InterventionRun[];
- activeIndex: number;
-};
-
-/** Build initial InterventionState from persisted runs.
- * The first persisted run is the base run (all CI > 0 nodes), auto-created during graph computation. */
-export function buildInterventionState(persistedRuns: InterventionRunSummary[]): InterventionState {
- if (persistedRuns.length === 0) throw new Error("Graph must have at least one intervention run (the base run)");
- const runs: InterventionRun[] = persistedRuns.map(
- (r): BakedRun => ({
- kind: "baked",
- id: r.id,
- selectedNodes: new Set(r.selected_nodes),
- result: r.result,
- createdAt: r.created_at,
- }),
- );
- return { runs, activeIndex: 0 };
-}
-
-/** Get all interventable node keys with CI > 0 from a nodeCiVals record */
-export function getInterventableNodes(nodeCiVals: Record): Set {
- const nodes = new Set();
- for (const [nodeKey, ci] of Object.entries(nodeCiVals)) {
- if (isInterventableNode(nodeKey) && ci > 0) nodes.add(nodeKey);
- }
- return nodes;
-}
diff --git a/param_decomp_lab/app/frontend/frontend/src/lib/promptAttributionsTypes.ts b/param_decomp_lab/app/frontend/frontend/src/lib/promptAttributionsTypes.ts
deleted file mode 100644
index 867ada140..000000000
--- a/param_decomp_lab/app/frontend/frontend/src/lib/promptAttributionsTypes.ts
+++ /dev/null
@@ -1,339 +0,0 @@
-/** Types for the prompt attributions visualizer */
-
-// Server API types
-
-export type PromptPreview = {
- id: number;
- token_ids: number[];
- tokens: string[];
- preview: string;
- next_token_probs: (number | null)[]; // Probability of next token (last is null)
-};
-
-export type EdgeData = {
- src: string; // "layer:seq:cIdx"
- tgt: string; // "layer:seq:cIdx"
- val: number;
-};
-
-export type EdgeAttribution = {
- key: string; // "layer:seq:cIdx" for prompt or "layer:cIdx" for dataset
- value: number; // raw attribution value (positive or negative)
- normalizedMagnitude: number; // |value| / maxAbsValue, for color intensity (0-1)
- tokenStr: string | null; // resolved token string for embed/output layers
-};
-
-/** Sort edges by |val| desc, take top N, normalize magnitudes to [0,1]. */
-export function topEdgeAttributions(
- edges: EdgeData[],
- getKey: (e: EdgeData) => string,
- n: number,
- resolveTokenStr?: (key: string) => string | null,
-): EdgeAttribution[] {
- const sorted = [...edges].sort((a, b) => Math.abs(b.val) - Math.abs(a.val)).slice(0, n);
- const maxAbsVal = Math.abs(sorted[0]?.val || 1);
- return sorted.map((e) => {
- const key = getKey(e);
- return {
- key,
- value: e.val,
- normalizedMagnitude: Math.abs(e.val) / maxAbsVal,
- tokenStr: resolveTokenStr ? resolveTokenStr(key) : null,
- };
- });
-}
-
-export type OutputProbability = {
- prob: number; // CI-masked (PD model) probability
- logit: number; // CI-masked (PD model) raw logit
- target_prob: number; // Target model probability
- target_logit: number; // Target model raw logit
- token: string;
-};
-
-export type CISnapshot = {
- step: number;
- total_steps: number;
- layers: string[];
- seq_len: number;
- initial_alive: number[][];
- current_alive: number[][];
- l0_total: number;
- loss: number;
-};
-
-export type GraphType = "standard" | "optimized" | "manual";
-
-export type GraphData = {
- id: number;
- graphType: GraphType;
- tokens: string[];
- edges: EdgeData[];
- edgesBySource: Map; // nodeKey -> edges where this node is source
- edgesByTarget: Map; // nodeKey -> edges where this node is target
- // Absolute-target variant (∂|y|/∂x · x), null for old graphs
- edgesAbs: EdgeData[] | null;
- edgesAbsBySource: Map | null;
- edgesAbsByTarget: Map | null;
- outputProbs: Record; // key is "seq:cIdx"
- nodeCiVals: Record; // node key -> CI value (or output prob for output nodes or 1 for wte node)
- nodeSubcompActs: Record; // node key -> subcomponent activation (v_i^T @ a)
- maxAbsAttr: number; // max absolute edge value
- maxAbsAttrAbs: number | null; // max absolute edge value for abs-target variant
- maxAbsSubcompAct: number; // max absolute subcomponent activation for normalization
- l0_total: number; // total active components at current CI threshold
- optimization?: OptimizationResult;
-};
-
-/** Build edge indexes from flat edge array (single pass) */
-export function buildEdgeIndexes(edges: EdgeData[]): {
- edgesBySource: Map;
- edgesByTarget: Map;
-} {
- const edgesBySource = new Map();
- const edgesByTarget = new Map();
-
- for (const edge of edges) {
- const bySrc = edgesBySource.get(edge.src);
- if (bySrc) {
- bySrc.push(edge);
- } else {
- edgesBySource.set(edge.src, [edge]);
- }
-
- const byTgt = edgesByTarget.get(edge.tgt);
- if (byTgt) {
- byTgt.push(edge);
- } else {
- edgesByTarget.set(edge.tgt, [edge]);
- }
- }
-
- return { edgesBySource, edgesByTarget };
-}
-
-export type MaskType = "stochastic" | "ci";
-
-export type CELossResult = {
- type: "ce";
- coeff: number;
- position: number;
- label_token: number;
- label_str: string;
-};
-
-export type KLLossResult = {
- type: "kl";
- coeff: number;
- position: number;
-};
-
-export type LogitLossResult = {
- type: "logit";
- coeff: number;
- position: number;
- label_token: number;
- label_str: string;
-};
-
-export type LossResult = CELossResult | KLLossResult | LogitLossResult;
-
-export type OptimizationMetrics = {
- ci_masked_label_prob: number | null; // Probability of label under CI mask (CE loss only)
- stoch_masked_label_prob: number | null; // Probability of label under stochastic mask (CE loss only)
- adv_pgd_label_prob: number | null; // Probability of label under adversarial mask (CE loss only)
- l0_total: number; // Total L0 (active components)
-};
-
-export type PgdConfig = {
- n_steps: number;
- step_size: number;
-};
-
-export type OptimizationResult = {
- imp_min_coeff: number;
- steps: number;
- pnorm: number;
- beta: number;
- mask_type: MaskType;
- loss: LossResult;
- metrics: OptimizationMetrics;
- pgd: PgdConfig | null;
-};
-
-export type SubcomponentMetadata = {
- subcomponent_idx: number;
- mean_ci: number;
-};
-
-export type ActivationContextsSummary = Record