diff --git a/.gitignore b/.gitignore index d7b421f..76a33e2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,35 @@ # Runtime data generated by local Docker deployment authz-service/runtime/data/ +authz-service/src/data/ app-instance/runtime/instances/ app-instance/runtime/registry/ router-proxy/runtime/conf.d/ +runtime/ +sessions/ +**/sessions/state.db +**/runtime/**/*.lock # Local build / cache artifacts **/__pycache__/ **/.pytest_cache/ **/node_modules/ **/.next/ +**/.next-dev/ +**/.turbo/ +**/.ruff_cache/ +**/.mypy_cache/ +**/.cache/ +**/.venv/ +**/dist/ +**/build/ +**/*.egg-info/ +**/tsconfig.tsbuildinfo *.log +*.tmp +*.py[cod] + +# Local secrets / env files +.env +*.env +*.pem +app-instance/frontend/.env_prod diff --git a/README.md b/README.md index c945db8..7c5c634 100644 --- a/README.md +++ b/README.md @@ -377,7 +377,7 @@ http://alice.203.0.113.10.nip.io:8088 写到每个实例自己的: ```text -app-instance/runtime/instances//nanobot-home/config.json +app-instance/runtime/instances//beaver-home/config.json ``` 不是写在 AuthZ 的某个 setting 里。 diff --git a/app-instance/backend/README.md b/app-instance/backend/README.md index 8746639..c115a1d 100644 --- a/app-instance/backend/README.md +++ b/app-instance/backend/README.md @@ -1,8 +1,6 @@ # Beaver Backend -这是新的 `Beaver` 后端。 - -旧实现已保留在 [backend-old](/home/ivan/xuan/nano_project/app-instance/backend-old),新目录用于按 [change.md](/home/ivan/xuan/nano_project/app-instance/backend/change.md) 的蓝图逐步重建后端。 +这是 `Beaver` 后端。 当前已经落地的主线: @@ -28,11 +26,4 @@ ## 说明 -这个目录已经不是空骨架,但仍不等于完成迁移。 - -后续迁移原则: - -1. 不再新增 `nanobot` 命名。 -2. 不在新目录中保留 `third_party/`。 -3. 所有 agent 最终都复用 `beaver.engine`。 -4. 高级 team 策略先编译成 Beaver 自有 `ExecutionGraph`,不直接暴露 swarms runtime。 +后端已切到 Beaver 主线,不再保留旧实现、vendored 第三方 runtime 或迁移期旧命名兼容入口。所有 agent 运行都复用 `beaver.engine`,多 agent 协调通过 Beaver 自有 coordinator 和 `ExecutionGraph` 表达。 diff --git a/app-instance/backend/beaver/engine/context/builder.py b/app-instance/backend/beaver/engine/context/builder.py index c09e2d5..e365897 100644 --- a/app-instance/backend/beaver/engine/context/builder.py +++ b/app-instance/backend/beaver/engine/context/builder.py @@ -16,7 +16,7 @@ 1. 先服务单 agent 主链 2. 先支持 frozen curated memory,而不是 live memory -3. skills 按 Hermes 风格支持“显式激活消息注入”,不在这里做磁盘扫描 +3. skills 通过显式激活消息注入,不在这里做磁盘扫描 4. 为后续 channel / gateway / team metadata 预留注入位,但不提前做复杂逻辑 """ @@ -45,7 +45,7 @@ class SkillContext: - `name`:用于生成激活提示 - `content`:skill 的完整正文 - 注意:按当前 Hermes 风格实现,skill 正文不再塞进 system prompt,而是转成显式消息注入。 + 注意:skill 正文不再塞进 system prompt,而是转成显式消息注入。 """ name: str @@ -151,7 +151,7 @@ class ContextBuilder: - 身份与总规则要最靠前 - session/execution 是本轮运行语境,优先级高于长期记忆 - memory 必须是 frozen snapshot,避免中途写 memory 后 prompt 失真 - - activated skill 正文按 Hermes 风格放到显式消息里,避免 system prompt 持续膨胀 + - activated skill 正文放到显式消息里,避免 system prompt 持续膨胀 """ sections: list[str] = [BEAVER_USER_ASSISTANT_IDENTITY_PROMPT] @@ -190,7 +190,7 @@ class ContextBuilder: 这里做三件事: 1. 先生成最终 system prompt - 2. 按 Hermes 风格,把已激活 skill 的完整正文作为显式消息注入 + 2. 把已激活 skill 的完整正文作为显式消息注入 3. 把历史消息按原顺序接到后面 4. 如果存在当前用户输入,则把本轮输入追加为最后一条 user message @@ -348,7 +348,7 @@ class ContextBuilder: return "# Current Session\n\n" + "\n".join(rows) def build_skill_activation_messages(self, activated_skills: list[SkillContext]) -> list[dict[str, str]]: - """按 Hermes 风格把已激活 skill 转成显式消息。 + """把已激活 skill 转成显式消息。 关键区别: - system prompt 只保留轻量 skills index diff --git a/app-instance/backend/beaver/engine/providers/runtime.py b/app-instance/backend/beaver/engine/providers/runtime.py index baf59b8..7ac8e3a 100644 --- a/app-instance/backend/beaver/engine/providers/runtime.py +++ b/app-instance/backend/beaver/engine/providers/runtime.py @@ -1,4 +1,4 @@ -"""Hermes 风格的 provider runtime resolution。""" +"""Provider runtime resolution for Beaver.""" from __future__ import annotations @@ -165,7 +165,7 @@ def resolve_fallback_runtime( ) -> ProviderRuntime | None: """把 fallback 配置解析成独立 runtime。 - Hermes 的 fallback 是“主 provider 失败后切换到另一个 provider:model”。 + fallback 的语义是“主 provider 失败后切换到另一个 provider:model”。 这里先把 fallback 解析独立出来,具体何时激活交给上层 chain/factory。 """ diff --git a/app-instance/backend/beaver/engine/session/store.py b/app-instance/backend/beaver/engine/session/store.py index 853b1f5..68865fb 100644 --- a/app-instance/backend/beaver/engine/session/store.py +++ b/app-instance/backend/beaver/engine/session/store.py @@ -1,6 +1,6 @@ """Beaver session 子系统的 SQLite 存储实现。 -设计来源主要参考 Hermes-agent: +设计目标: 1. SQLite 作为统一 session/transcript backend 2. WAL 模式支持多读单写 3. FTS5 支持跨 session 文本检索 diff --git a/app-instance/backend/beaver/foundation/config/loader.py b/app-instance/backend/beaver/foundation/config/loader.py index 5d40dec..ce75a8b 100644 --- a/app-instance/backend/beaver/foundation/config/loader.py +++ b/app-instance/backend/beaver/foundation/config/loader.py @@ -35,14 +35,12 @@ def default_config_path(*, workspace: str | Path | None = None) -> Path: Priority: 1. `BEAVER_CONFIG_PATH` - 2. `NANOBOT_CONFIG_PATH` for compatibility during migration - 3. `BEAVER_HOME/config.json` - 4. `NANOBOT_HOME/config.json` for migration compatibility - 5. `/.beaver/config.json` - 6. `./.beaver/config.json` + 2. `BEAVER_HOME/config.json` + 3. `/.beaver/config.json` + 4. `./.beaver/config.json` """ - explicit = os.getenv("BEAVER_CONFIG_PATH") or os.getenv("NANOBOT_CONFIG_PATH") + explicit = os.getenv("BEAVER_CONFIG_PATH") if explicit: return Path(explicit).expanduser() @@ -50,10 +48,6 @@ def default_config_path(*, workspace: str | Path | None = None) -> Path: if beaver_home: return Path(beaver_home).expanduser() / "config.json" - nanobot_home = os.getenv("NANOBOT_HOME") - if nanobot_home: - return Path(nanobot_home).expanduser() / "config.json" - root = Path(workspace).expanduser() if workspace is not None else Path.cwd() return root / ".beaver" / "config.json" diff --git a/app-instance/backend/beaver/foundation/models/cron.py b/app-instance/backend/beaver/foundation/models/cron.py index f2ba924..4b9cf5d 100644 --- a/app-instance/backend/beaver/foundation/models/cron.py +++ b/app-instance/backend/beaver/foundation/models/cron.py @@ -1,8 +1,7 @@ """Scheduled task models for Beaver cron. -The scheduler borrows Hermes' durable JSON + explicit schedule parsing shape, -but the execution target is Beaver Task mode: every trigger creates a normal -Task run instead of a detached agent turn. +Every trigger targets Beaver Task mode so scheduled work remains visible as a +normal Task instead of a detached agent turn. """ from __future__ import annotations diff --git a/app-instance/backend/beaver/integrations/outlook/__init__.py b/app-instance/backend/beaver/integrations/outlook/__init__.py index c4f3b7a..8c2b6ca 100644 --- a/app-instance/backend/beaver/integrations/outlook/__init__.py +++ b/app-instance/backend/beaver/integrations/outlook/__init__.py @@ -19,7 +19,7 @@ from beaver.foundation.config import BeaverConfig from beaver.integrations.authz import AuthzClient -OUTLOOK_SERVER_ID = os.getenv("BEAVER_OUTLOOK_MCP_SERVER_ID") or os.getenv("NANOBOT_OUTLOOK_MCP_SERVER_ID", "outlook_mcp") +OUTLOOK_SERVER_ID = os.getenv("BEAVER_OUTLOOK_MCP_SERVER_ID", "outlook_mcp") OUTLOOK_OVERVIEW_MESSAGE_LIMIT = 8 OUTLOOK_OVERVIEW_EVENT_LIMIT = 20 OUTLOOK_MAX_PAGE_SIZE = 100 @@ -31,11 +31,11 @@ class OutlookIntegrationError(RuntimeError): @dataclass(frozen=True) class OutlookDefaults: - domain: str = os.getenv("NANOBOT_OUTLOOK_DEFAULT_DOMAIN", "") - service_endpoint: str = os.getenv("NANOBOT_OUTLOOK_DEFAULT_EWS_URL", "") - server: str = os.getenv("NANOBOT_OUTLOOK_DEFAULT_EWS_SERVER", "") - default_timezone: str = os.getenv("NANOBOT_OUTLOOK_DEFAULT_TIMEZONE", "Asia/Shanghai") - autodiscover: bool = os.getenv("NANOBOT_OUTLOOK_DEFAULT_AUTODISCOVER", "0") == "1" + domain: str = os.getenv("BEAVER_OUTLOOK_DEFAULT_DOMAIN", "") + service_endpoint: str = os.getenv("BEAVER_OUTLOOK_DEFAULT_EWS_URL", "") + server: str = os.getenv("BEAVER_OUTLOOK_DEFAULT_EWS_SERVER", "") + default_timezone: str = os.getenv("BEAVER_OUTLOOK_DEFAULT_TIMEZONE", "Asia/Shanghai") + autodiscover: bool = os.getenv("BEAVER_OUTLOOK_DEFAULT_AUTODISCOVER", "0") == "1" @dataclass(frozen=True) @@ -71,7 +71,7 @@ OUTLOOK_TOOL_NAMES = [ def _call_timeout_seconds() -> float: - raw = os.getenv("NANOBOT_OUTLOOK_MCP_CALL_TIMEOUT_SECONDS", "").strip() + raw = os.getenv("BEAVER_OUTLOOK_MCP_CALL_TIMEOUT_SECONDS", "").strip() try: return max(1.0, float(raw)) if raw else 10.0 except ValueError: @@ -108,8 +108,8 @@ def outlook_defaults() -> dict[str, Any]: return { "provider": "ews", "server_id": OUTLOOK_SERVER_ID, - "mcp_command": os.getenv("NANOBOT_OUTLOOK_MCP_COMMAND", "bw-outlook-mcp"), - "mcp_extra_args": shlex.split(os.getenv("NANOBOT_OUTLOOK_MCP_EXTRA_ARGS", "").strip()), + "mcp_command": os.getenv("BEAVER_OUTLOOK_MCP_COMMAND", "bw-outlook-mcp"), + "mcp_extra_args": shlex.split(os.getenv("BEAVER_OUTLOOK_MCP_EXTRA_ARGS", "").strip()), "fields": asdict(OutlookDefaults()), } diff --git a/app-instance/backend/beaver/interfaces/cli/main.py b/app-instance/backend/beaver/interfaces/cli/main.py index d9897ab..5a7d131 100644 --- a/app-instance/backend/beaver/interfaces/cli/main.py +++ b/app-instance/backend/beaver/interfaces/cli/main.py @@ -1,7 +1,5 @@ """CLI entry for Beaver.""" -from pathlib import Path - try: import typer except ModuleNotFoundError: # pragma: no cover - fallback for skeleton-only environments @@ -29,8 +27,6 @@ except ModuleNotFoundError: # pragma: no cover - fallback for skeleton-only env typer = _FallbackTyper() # type: ignore[assignment] from beaver.services.agent_service import AgentService -from beaver.services.hermes_migration import HermesMigrationService -from beaver.skills.specs import SkillSpecStore app = typer.Typer(help="Beaver backend CLI") if hasattr(typer, "Typer") else typer @@ -59,26 +55,6 @@ def run( typer.echo(result.output_text) -@app.command("migrate-hermes") -def migrate_hermes( - repo: str = typer.Option(..., "--repo", help="Local checkout of https://github.com/NousResearch/hermes-agent."), - workspace: str | None = typer.Option(None, "--workspace", help="Workspace root to import skills into."), - manifest: str | None = typer.Option(None, "--manifest", help="Path for hermes_migration_manifest.json."), - dry_run: bool = typer.Option(False, "--dry-run", help="Only write the manifest without importing skills."), -) -> None: - """Import no-credential Hermes Agent skills and write a manifest.""" - - service = AgentService(workspace=workspace) - loaded = service.create_loop().boot() - store = loaded.skill_spec_store or SkillSpecStore(loaded.workspace) - migration = HermesMigrationService(store, manifest_path=Path(manifest) if manifest else None) - result = migration.migrate(repo, dry_run=dry_run) - typer.echo( - f"Hermes migration complete: {len(result['included'])} included, " - f"{len(result['skipped'])} skipped." - ) - - def main() -> None: """Project script entrypoint.""" app() diff --git a/app-instance/backend/beaver/interfaces/mcp/tools_server.py b/app-instance/backend/beaver/interfaces/mcp/tools_server.py index 2d2446b..a333b10 100644 --- a/app-instance/backend/beaver/interfaces/mcp/tools_server.py +++ b/app-instance/backend/beaver/interfaces/mcp/tools_server.py @@ -58,7 +58,7 @@ LOCAL_TOOL_CATEGORIES = { def _workspace_path(value: str | None = None) -> Path: - raw = value or os.getenv("BEAVER_WORKSPACE") or os.getenv("NANOBOT_WORKSPACE") + raw = value or os.getenv("BEAVER_WORKSPACE") if raw: return Path(raw).expanduser().resolve() return Path.cwd() diff --git a/app-instance/backend/beaver/interfaces/web/app.py b/app-instance/backend/beaver/interfaces/web/app.py index 46e1885..4568e5e 100644 --- a/app-instance/backend/beaver/interfaces/web/app.py +++ b/app-instance/backend/beaver/interfaces/web/app.py @@ -23,7 +23,6 @@ from beaver.foundation.models import CronExecutionResult, CronRunRecord from beaver.integrations.mcp import MCPConnectionManager from beaver.services.agent_service import NOTIFICATION_SESSION_ID, AgentService from beaver.services.cron_service import CronService, schedule_from_api -from beaver.services.skill_migration import SkillMigrationService from beaver.services.skillhub_service import SkillHubService from beaver.skills.learning import SkillLearningWorker, SkillLearningWorkerConfig from beaver.skills.catalog.utils import parse_frontmatter @@ -305,7 +304,7 @@ def create_app( ) app.state.auth_tokens = {} app.state.handoff_codes = {} - app.state.auth_file = Path(os.getenv("BEAVER_AUTH_FILE") or os.getenv("NANOBOT_AUTH_FILE") or "") + app.state.auth_file = Path(os.getenv("BEAVER_AUTH_FILE") or "") max_file_size = 50 * 1024 * 1024 @app.get("/api/ping", response_model=WebStatusResponse) @@ -427,7 +426,6 @@ def create_app( _clean_text(payload.get("base_url")) or config.backend_identity.public_base_url or os.getenv("BEAVER_FRONTEND_PUBLIC_BASE_URL") - or os.getenv("NANOBOT_FRONTEND_PUBLIC_BASE_URL") or str(request.base_url).rstrip("/") ) frontend_base_url = _clean_text(payload.get("frontend_base_url")) or public_base_url @@ -526,7 +524,7 @@ def create_app( return { "id": username, "username": username, - "email": os.getenv("BEAVER_BACKEND_IDENTITY__EMAIL") or os.getenv("NANOBOT_BACKEND_IDENTITY__EMAIL", ""), + "email": os.getenv("BEAVER_BACKEND_IDENTITY__EMAIL", ""), "role": "owner", "quota_tier": "single-user", } @@ -1184,30 +1182,6 @@ def create_app( ) return result - @app.get("/api/tools/servers") - async def list_tool_servers(request: Request) -> list[dict[str, Any]]: - return await list_mcp_servers(request) - - @app.get("/api/tools") - async def list_tools(request: Request) -> dict[str, Any]: - servers = await list_mcp_servers(request) - tool_groups = await list_mcp_tools(request) - server_map = {server["id"]: server for server in servers} - grouped = {"local": [], "online": []} - for group in tool_groups: - server = server_map.get(group["server_id"], {}) - kind = str(server.get("kind") or "online") - item = { - **group, - "server_name": server.get("name") or group["server_id"], - "transport": server.get("transport"), - "kind": kind, - "category": server.get("category") or kind, - "status": server.get("status"), - } - grouped["local" if kind == "local" else "online"].append(item) - return {"servers": servers, "groups": grouped} - @app.get("/api/skills") async def list_skills(request: Request) -> list[dict[str, Any]]: loaded = get_agent_service(request).create_loop().boot() @@ -1301,19 +1275,6 @@ def create_app( raise HTTPException(status_code=400, detail=str(exc)) from exc return draft - @app.post("/api/skills/migrate") - async def migrate_skills(request: Request) -> dict[str, Any]: - loaded = get_agent_service(request).create_loop().boot() - return SkillMigrationService(loaded.skill_spec_store).migrate_all() # type: ignore[arg-type] - - @app.get("/api/skills/migration-manifest") - async def get_skill_migration_manifest(request: Request) -> dict[str, Any]: - loaded = get_agent_service(request).create_loop().boot() - path = loaded.workspace / "skill_migration_manifest.json" - if not path.exists(): - return {"included": [], "skipped": []} - return json.loads(path.read_text(encoding="utf-8")) - @app.get("/api/marketplaces/skills/search") async def search_skillhub( request: Request, @@ -2482,7 +2443,7 @@ def _provider_enabled(provider_name: str, provider_cfg: Any) -> bool: def _auth_file_path() -> Path: - raw = os.getenv("BEAVER_AUTH_FILE") or os.getenv("NANOBOT_AUTH_FILE") + raw = os.getenv("BEAVER_AUTH_FILE") if raw: return Path(raw) return Path.home() / ".beaver" / "web_auth_users.json" @@ -2542,7 +2503,7 @@ def _issue_web_token(app: FastAPI, username: str) -> str: def _handoff_ttl_seconds() -> int: - raw = os.getenv("NANOBOT_HANDOFF_CODE_TTL_SECONDS", "90").strip() + raw = os.getenv("BEAVER_HANDOFF_CODE_TTL_SECONDS", "90").strip() try: return max(15, int(raw)) except ValueError: @@ -2550,7 +2511,7 @@ def _handoff_ttl_seconds() -> int: def _handoff_replay_window_seconds() -> int: - raw = os.getenv("NANOBOT_HANDOFF_REPLAY_WINDOW_SECONDS", "15").strip() + raw = os.getenv("BEAVER_HANDOFF_REPLAY_WINDOW_SECONDS", "15").strip() try: return max(1, int(raw)) except ValueError: @@ -2637,22 +2598,18 @@ def _require_web_user(app: FastAPI, authorization: str | None) -> str: def _backend_connection_view(request: Request) -> dict[str, Any]: public_base_url = ( os.getenv("BEAVER_BACKEND_IDENTITY__PUBLIC_BASE_URL") - or os.getenv("NANOBOT_BACKEND_IDENTITY__PUBLIC_BASE_URL") or os.getenv("BEAVER_FRONTEND_PUBLIC_BASE_URL") - or os.getenv("NANOBOT_FRONTEND_PUBLIC_BASE_URL") or str(request.base_url).rstrip("/") ) backend_id = ( os.getenv("BEAVER_BACKEND_IDENTITY__BACKEND_ID") - or os.getenv("NANOBOT_BACKEND_IDENTITY__BACKEND_ID") or os.getenv("BEAVER_BACKEND_IDENTITY__CLIENT_ID") - or os.getenv("NANOBOT_BACKEND_IDENTITY__CLIENT_ID") ) - client_id = os.getenv("BEAVER_BACKEND_IDENTITY__CLIENT_ID") or os.getenv("NANOBOT_BACKEND_IDENTITY__CLIENT_ID") or backend_id + client_id = os.getenv("BEAVER_BACKEND_IDENTITY__CLIENT_ID") or backend_id return { "backend_id": backend_id, "client_id": client_id, - "name": os.getenv("BEAVER_BACKEND_IDENTITY__NAME") or os.getenv("NANOBOT_BACKEND_IDENTITY__NAME") or backend_id, + "name": os.getenv("BEAVER_BACKEND_IDENTITY__NAME") or backend_id, "public_base_url": public_base_url, "api_base_url": public_base_url, "frontend_base_url": public_base_url, @@ -2663,16 +2620,14 @@ def _backend_connection_view(request: Request) -> dict[str, Any]: def _local_backend_view() -> dict[str, Any]: return { - "backend_id": os.getenv("BEAVER_BACKEND_IDENTITY__BACKEND_ID") or os.getenv("NANOBOT_BACKEND_IDENTITY__BACKEND_ID"), - "client_id": os.getenv("BEAVER_BACKEND_IDENTITY__CLIENT_ID") or os.getenv("NANOBOT_BACKEND_IDENTITY__CLIENT_ID"), - "name": os.getenv("BEAVER_BACKEND_IDENTITY__NAME") or os.getenv("NANOBOT_BACKEND_IDENTITY__NAME"), + "backend_id": os.getenv("BEAVER_BACKEND_IDENTITY__BACKEND_ID"), + "client_id": os.getenv("BEAVER_BACKEND_IDENTITY__CLIENT_ID"), + "name": os.getenv("BEAVER_BACKEND_IDENTITY__NAME"), "public_base_url": os.getenv("BEAVER_BACKEND_IDENTITY__PUBLIC_BASE_URL") - or os.getenv("NANOBOT_BACKEND_IDENTITY__PUBLIC_BASE_URL") - or os.getenv("BEAVER_FRONTEND_PUBLIC_BASE_URL") - or os.getenv("NANOBOT_FRONTEND_PUBLIC_BASE_URL"), + or os.getenv("BEAVER_FRONTEND_PUBLIC_BASE_URL"), "authz": { - "enabled": (os.getenv("BEAVER_AUTHZ__ENABLED") or os.getenv("NANOBOT_AUTHZ__ENABLED", "")).strip() in {"1", "true", "True"}, - "base_url": os.getenv("BEAVER_AUTHZ__BASE_URL") or os.getenv("NANOBOT_AUTHZ__BASE_URL"), + "enabled": os.getenv("BEAVER_AUTHZ__ENABLED", "").strip() in {"1", "true", "True"}, + "base_url": os.getenv("BEAVER_AUTHZ__BASE_URL"), }, } diff --git a/app-instance/backend/beaver/memory/curated/store.py b/app-instance/backend/beaver/memory/curated/store.py index a02616f..99c93e6 100644 --- a/app-instance/backend/beaver/memory/curated/store.py +++ b/app-instance/backend/beaver/memory/curated/store.py @@ -1,6 +1,6 @@ """Beaver 的精炼长期记忆存储层。 -这个文件实现的是以 Hermes-agent 为基线的 curated memory 模型,目标不是 +这个文件实现的是 Beaver curated memory 模型,目标不是 “把所有历史都存下来”,而是只保存跨会话仍然值得保留的稳定事实。 核心设计: diff --git a/app-instance/backend/beaver/services/cron_service.py b/app-instance/backend/beaver/services/cron_service.py index d723697..21678a9 100644 --- a/app-instance/backend/beaver/services/cron_service.py +++ b/app-instance/backend/beaver/services/cron_service.py @@ -38,10 +38,9 @@ _MAX_HISTORY = 20 class CronService: """Persistent single-timer scheduler. - Hermes' cron implementation stores jobs as JSON and ticks safely in the - background. Beaver keeps that shape, but the callback is required to route - agent work through Task mode so every scheduled trigger is visible as a - normal Task. + Jobs are stored as JSON and ticked safely in the background. The callback + routes agent work through Task mode so every scheduled trigger is visible as + a normal Task. """ def __init__(self, store_path: str | Path, *, on_job: CronCallback | None = None) -> None: diff --git a/app-instance/backend/beaver/services/memory_service.py b/app-instance/backend/beaver/services/memory_service.py index 7133742..91dd5b8 100644 --- a/app-instance/backend/beaver/services/memory_service.py +++ b/app-instance/backend/beaver/services/memory_service.py @@ -43,7 +43,7 @@ class MemoryService: def reload_for_new_run(self) -> None: """每次新 run 开始前刷新 live state。 - 这是 Hermes 风格 memory policy 的关键点: + 这是 Beaver memory policy 的关键点: - 上一次会话中通过 tool 写入的持久记忆,下一次运行应该能看到 - 但同一次 run 中途写入的新记忆,不应反向修改当前 frozen snapshot """ diff --git a/app-instance/backend/beaver/skills/catalog/loader.py b/app-instance/backend/beaver/skills/catalog/loader.py index 7d097cc..4c2b46f 100644 --- a/app-instance/backend/beaver/skills/catalog/loader.py +++ b/app-instance/backend/beaver/skills/catalog/loader.py @@ -237,7 +237,7 @@ class SkillsLoader: def build_skills_summary(self) -> str: """构建可注入 system prompt 的 skills index。 - 虽然函数名还沿用 `summary`,但当前语义已经更接近 Hermes 的 skills index: + 虽然函数名还沿用 `summary`,但当前语义是轻量 skills index: - 这里只告诉模型“系统里有哪些 skill 可用” - 不负责把 skill 正文塞进 system prompt - 真正激活的 skill 正文由 resolver/builder 走显式消息注入 diff --git a/app-instance/backend/beaver/skills/catalog/utils.py b/app-instance/backend/beaver/skills/catalog/utils.py index 8d8ded3..4c1e75e 100644 --- a/app-instance/backend/beaver/skills/catalog/utils.py +++ b/app-instance/backend/beaver/skills/catalog/utils.py @@ -87,9 +87,7 @@ def strip_frontmatter(content: str) -> str: def parse_skill_metadata_blob(raw: str) -> dict[str, Any]: """解析 metadata 字段里的 JSON 扩展配置。 - 为了兼容旧 nanobot 习惯,这里同时支持: - - `nanobot` - - `openclaw` + Supports plain metadata objects and the current `openclaw` namespace. 第一版主要关心的字段有: - `always` @@ -103,7 +101,7 @@ def parse_skill_metadata_blob(raw: str) -> dict[str, Any]: if not isinstance(data, dict): return {} - nested = data.get("nanobot", data.get("openclaw", data)) + nested = data.get("openclaw", data) return nested if isinstance(nested, dict) else {} diff --git a/app-instance/backend/beaver/tools/base.py b/app-instance/backend/beaver/tools/base.py index 668bd39..bc4f1ed 100644 --- a/app-instance/backend/beaver/tools/base.py +++ b/app-instance/backend/beaver/tools/base.py @@ -20,6 +20,7 @@ from __future__ import annotations from abc import ABC, abstractmethod from dataclasses import dataclass, field +import inspect import json from typing import Any @@ -181,9 +182,21 @@ class ObjectBackedTool(BaseTool): arguments["current_session_id"] = context.session_id if "workspace" not in arguments and hasattr(self.backend, "workspace"): arguments["workspace"] = context.workspace - if "metadata" not in arguments: + if "metadata" not in arguments and self._backend_accepts_argument("metadata"): arguments["metadata"] = context.metadata + def _backend_accepts_argument(self, name: str) -> bool: + try: + signature = inspect.signature(self.backend.execute) + except (TypeError, ValueError): + return False + for parameter in signature.parameters.values(): + if parameter.kind == inspect.Parameter.VAR_KEYWORD: + return True + if parameter.name == name: + return True + return False + @staticmethod def _normalize_output(content: Any) -> dict[str, Any]: """把后端工具返回值转成统一 success/content/error 语义。 diff --git a/app-instance/backend/beaver/tools/builtins/cron.py b/app-instance/backend/beaver/tools/builtins/cron.py index a3834cf..e42eef5 100644 --- a/app-instance/backend/beaver/tools/builtins/cron.py +++ b/app-instance/backend/beaver/tools/builtins/cron.py @@ -33,7 +33,7 @@ CRON_TOOL_PARAMETERS: dict[str, Any] = { }, "schedule": { "type": "string", - "description": "Hermes-style schedule, for example 'every 15m', '0 9 * * *', or an ISO datetime.", + "description": "Schedule expression, for example 'every 15m', '0 9 * * *', or an ISO datetime.", }, "every_seconds": { "type": "integer", diff --git a/app-instance/backend/beaver/tools/builtins/memory.py b/app-instance/backend/beaver/tools/builtins/memory.py index 9ed2c06..d1447a1 100644 --- a/app-instance/backend/beaver/tools/builtins/memory.py +++ b/app-instance/backend/beaver/tools/builtins/memory.py @@ -59,7 +59,7 @@ def memory_tool( old_text: str | None = None, store: MemoryStore | None = None, ) -> str: - """分发 Hermes 风格的 CRUD memory API,并返回 JSON 字符串。 + """分发 CRUD memory API,并返回 JSON 字符串。 这里统一采用 JSON 返回,是为了兼容常见 tool-calling 场景: - LLM 更容易消费结构化结果 diff --git a/app-instance/backend/beaver/tools/builtins/session_search.py b/app-instance/backend/beaver/tools/builtins/session_search.py index 3125cbe..9a227d5 100644 --- a/app-instance/backend/beaver/tools/builtins/session_search.py +++ b/app-instance/backend/beaver/tools/builtins/session_search.py @@ -1,6 +1,6 @@ """Beaver 内置 session_search tool。 -这个工具对应 Hermes-agent 的跨会话检索能力,目标不是把所有历史内容塞回主上下文, +这个工具提供跨会话检索能力,目标不是把所有历史内容塞回主上下文, 而是按需从过去的 session 中找回“之前发生过什么”。 当前实现保留了几个关键行为: @@ -28,7 +28,7 @@ class SessionSearchDB(Protocol): """session_search 依赖的最小数据库契约。 这里没有直接绑定某个具体 SQLite 实现,而是先定义行为接口。 - 这样后面无论你接的是 Hermes 风格 state DB、还是 Beaver 自己的 transcript store, + 这样后面无论你接的是当前 SQLite state DB、还是其他 transcript store, 只要满足这些方法就能工作。 """ diff --git a/app-instance/backend/beaver/tools/builtins/skill_view.py b/app-instance/backend/beaver/tools/builtins/skill_view.py index 83a382b..18e3dea 100644 --- a/app-instance/backend/beaver/tools/builtins/skill_view.py +++ b/app-instance/backend/beaver/tools/builtins/skill_view.py @@ -1,6 +1,6 @@ """Beaver 内置 skill_view tool。 -这个工具对应 Hermes 风格的显式 skill loading path: +这个工具对应显式 skill loading path: 1. skill 正文默认不会长期塞进 system prompt 2. 模型若想查看某个 skill 的完整正文或支持文件,必须显式调用 `skill_view` diff --git a/app-instance/backend/tests/unit/test_config_loader.py b/app-instance/backend/tests/unit/test_config_loader.py index c353f1c..3d07234 100644 --- a/app-instance/backend/tests/unit/test_config_loader.py +++ b/app-instance/backend/tests/unit/test_config_loader.py @@ -1,5 +1,4 @@ import json -from pathlib import Path from beaver.engine import AgentLoop, EngineLoader from beaver.engine.providers import make_provider_bundle @@ -139,9 +138,36 @@ def test_openai_compatible_qwen_config_keeps_openai_provider() -> None: assert bundle.main_provider._resolve_model("qwen-plus") == "openai/qwen-plus" -def test_load_config_reads_stevenli_mcp_authz_identity() -> None: - repo_root = Path(__file__).resolve().parents[4] - config_path = repo_root / "app-instance" / "runtime" / "instances" / "stevenli" / "nanobot-home" / "config.json" +def test_load_config_reads_mcp_authz_identity(tmp_path) -> None: + config_path = tmp_path / "beaver-home" / "config.json" + config_path.parent.mkdir() + config_path.write_text( + json.dumps( + { + "tools": { + "mcpServers": { + "outlook_mcp": { + "url": "http://10.6.80.29:8000/mcp", + "authMode": "oauth_backend_token", + "authAudience": "mcp:outlook_mcp", + "authScopes": ["list_tools", "tool:mail_list_messages"], + "toolTimeout": 60, + "sensitive": True, + } + } + }, + "authz": { + "enabled": True, + "baseUrl": "http://nano-authz-service:19090", + }, + "backend_identity": { + "backend_id": "stevenli", + "client_id": "stevenli", + }, + } + ), + encoding="utf-8", + ) config = load_config(config_path=config_path) server = config.tools.mcp_servers["outlook_mcp"] diff --git a/app-instance/backend/tests/unit/test_cron_service.py b/app-instance/backend/tests/unit/test_cron_service.py index 7584d69..2aeb6b6 100644 --- a/app-instance/backend/tests/unit/test_cron_service.py +++ b/app-instance/backend/tests/unit/test_cron_service.py @@ -6,7 +6,7 @@ from beaver.tools.builtins import CronTool from beaver.services.cron_service import CronService, compute_next_run, parse_schedule, schedule_from_api -def test_parse_hermes_style_schedules() -> None: +def test_parse_schedule_expressions() -> None: interval = parse_schedule("every 15m") assert interval.kind == "every" assert interval.every_ms == 15 * 60 * 1000 diff --git a/app-instance/backend/tests/unit/test_marketplace_and_mcp.py b/app-instance/backend/tests/unit/test_marketplace_and_mcp.py index 3534727..e7a60ec 100644 --- a/app-instance/backend/tests/unit/test_marketplace_and_mcp.py +++ b/app-instance/backend/tests/unit/test_marketplace_and_mcp.py @@ -1,13 +1,11 @@ import asyncio import io -import json import zipfile from types import SimpleNamespace import pytest from beaver.interfaces.web.app import _create_skill_upload_draft -from beaver.services.hermes_migration import HermesMigrationService from beaver.services.skillhub_service import SkillHubService from beaver.skills.drafts import DraftService from beaver.skills.specs import SkillSpecStore @@ -101,27 +99,6 @@ def test_upload_skill_zip_keeps_supporting_files_on_draft(tmp_path): assert upload_dir.endswith(draft["draft_id"]) -def test_hermes_migration_manifest_includes_no_credential_skill_and_skips_api_skill(tmp_path): - repo = tmp_path / "hermes" - safe = repo / "skills" / "safe" - unsafe = repo / "skills" / "unsafe" - safe.mkdir(parents=True) - unsafe.mkdir(parents=True) - safe.joinpath("SKILL.md").write_text("---\nname: safe\n---\nUse local files only.\n", encoding="utf-8") - unsafe.joinpath("SKILL.md").write_text("---\nname: unsafe\n---\nRequires API_KEY.\n", encoding="utf-8") - - store = SkillSpecStore(tmp_path / "workspace") - manifest = HermesMigrationService(store).migrate(repo) - included = {item["skill_name"] for item in manifest["included"]} - skipped = {item.get("skill_name"): item["reason"] for item in manifest["skipped"]} - - assert "safe" in included - assert skipped["unsafe"] == "requires_external_credentials" - assert store.get_skill_spec("safe") is not None - manifest_path = tmp_path / "workspace" / "hermes_migration_manifest.json" - assert json.loads(manifest_path.read_text(encoding="utf-8"))["source"] == "hermes-agent" - - def test_mcp_wrapper_metadata_preserves_server_id_with_underscores(): tool_def = SimpleNamespace(name="auth_status", description="Auth", inputSchema={"type": "object", "properties": {}}) diff --git a/app-instance/frontend/README.md b/app-instance/frontend/README.md index 5877a95..c1f735a 100644 --- a/app-instance/frontend/README.md +++ b/app-instance/frontend/README.md @@ -53,10 +53,9 @@ | `/status` | 系统状态 | | `/cron` | 定时任务 | | `/skills` | 技能管理 | -| `/plugins` | 插件管理 | | `/agents` | 智能体管理 | | `/mcp` | MCP 服务管理 | -| `/marketplace` | 插件市场 | +| `/marketplace` | 技能市场 | | `/files` | 工作区文件管理 | | `/help` | 帮助说明 | @@ -240,15 +239,9 @@ docker build \ - 状态接口 - WebSocket 连接 -### 2. 命令名和目录名未做品牌迁移 +### 2. 技术标识 -当前仓库的部分技术标识仍沿用旧命名,例如: - -- `nanobot web` -- `~/.beaver/plugins/` -- 本地存储中的旧 token key - -这些属于兼容性和后端约定的一部分,前端展示品牌已替换为 `Boardware Genius`,但技术标识没有在这个仓库里强制迁移。 +当前前端使用 Beaver 技术命名,本地 token、语言和 handoff 状态都使用 `beaver_*` key。 ### 3. 动态内容可能仍包含英文 diff --git a/app-instance/frontend/app/(app)/notifications/[scheduledRunId]/page.tsx b/app-instance/frontend/app/(app)/notifications/[scheduledRunId]/page.tsx index 0d95b26..360076d 100644 --- a/app-instance/frontend/app/(app)/notifications/[scheduledRunId]/page.tsx +++ b/app-instance/frontend/app/(app)/notifications/[scheduledRunId]/page.tsx @@ -149,7 +149,6 @@ export default function NotificationDetailPage() { processArtifacts={[]} selectedRunId={null} onSelectRun={() => {}} - onCancelRun={() => {}} onFeedback={() => {}} /> diff --git a/app-instance/frontend/app/(app)/page.tsx b/app-instance/frontend/app/(app)/page.tsx index 744028c..415a337 100644 --- a/app-instance/frontend/app/(app)/page.tsx +++ b/app-instance/frontend/app/(app)/page.tsx @@ -7,7 +7,6 @@ import { Brain, Plus, Send, Trash2, X } from 'lucide-react'; import { ChatWorkbench } from '@/components/chat-workbench/ChatWorkbench'; import { ScrollArea } from '@/components/ui/scroll-area'; import { - cancelDelegation, archiveSession, createSession, getActiveTask, @@ -464,18 +463,6 @@ export default function ChatPage() { setSessionId(key); }; - const handleCancelRun = useCallback(async (runId: string) => { - try { - await cancelDelegation(runId); - } catch (err: any) { - addMessage({ - role: 'assistant', - content: pickAppText(locale, `取消任务 ${runId} 失败:${err.message || '未知错误'}`, `Failed to cancel task ${runId}: ${err.message || 'Unknown error'}`), - timestamp: new Date().toISOString(), - }); - } - }, [addMessage, locale]); - const removePendingFile = useCallback((file: File) => { setPendingFiles((prev) => prev.filter((item) => item.file !== file)); }, []); @@ -566,7 +553,6 @@ export default function ChatPage() { processArtifacts={sessionProcessArtifacts} selectedRunId={selectedSessionRunId} onSelectRun={(runId) => setSelectedRunId(selectedSessionRunId === runId ? null : runId)} - onCancelRun={handleCancelRun} onFeedback={handleFeedback} /> diff --git a/app-instance/frontend/app/(app)/skills/page.tsx b/app-instance/frontend/app/(app)/skills/page.tsx index 8630c58..6a0ba78 100644 --- a/app-instance/frontend/app/(app)/skills/page.tsx +++ b/app-instance/frontend/app/(app)/skills/page.tsx @@ -40,7 +40,6 @@ import { listSkillCandidates, listSkillDrafts, listSkills, - migrateSkills, publishSkillDraft, regenerateSkillDraft, rejectSkillDraft, @@ -207,15 +206,6 @@ export default function SkillsPage() { {t('上传技能', 'Upload skill')} - diff --git a/app-instance/frontend/app/(app)/status/page.tsx b/app-instance/frontend/app/(app)/status/page.tsx index abada94..322b445 100644 --- a/app-instance/frontend/app/(app)/status/page.tsx +++ b/app-instance/frontend/app/(app)/status/page.tsx @@ -15,17 +15,7 @@ import { Settings2, ScrollText, } from 'lucide-react'; -import { getStatus, restartSystem, updateProviderConfig } from '@/lib/api'; -import { - AlertDialog, - AlertDialogAction, - AlertDialogCancel, - AlertDialogContent, - AlertDialogDescription, - AlertDialogFooter, - AlertDialogHeader, - AlertDialogTitle, -} from '@/components/ui/alert-dialog'; +import { getStatus, updateProviderConfig } from '@/lib/api'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; @@ -57,9 +47,6 @@ export default function StatusPage() { const [status, setStatus] = useState(null); const [error, setError] = useState(null); const [loading, setLoading] = useState(true); - const [restartDialogOpen, setRestartDialogOpen] = useState(false); - const [restarting, setRestarting] = useState(false); - const [restartError, setRestartError] = useState(null); const [selectedProvider, setSelectedProvider] = useState(null); const [providerForm, setProviderForm] = useState(() => ({ enabled: false, @@ -88,36 +75,6 @@ export default function StatusPage() { loadStatus(); }, []); - useEffect(() => { - if (!restarting) { - return; - } - - const intervalId = window.setInterval(async () => { - try { - await getStatus(); - window.location.reload(); - } catch { - // Ignore failures until the container is back. - } - }, 3000); - - return () => { - window.clearInterval(intervalId); - }; - }, [restarting]); - - const handleRestart = async () => { - setRestartError(null); - try { - await restartSystem(); - setRestartDialogOpen(false); - setRestarting(true); - } catch (err: any) { - setRestartError(err.message || pickAppText(locale, '重启失败', 'Restart failed')); - } - }; - const openProviderDialog = (provider: ProviderStatus) => { setSelectedProvider(provider); setProviderError(null); @@ -204,7 +161,7 @@ export default function StatusPage() { )}

- @@ -223,13 +180,8 @@ export default function StatusPage() {

{pickAppText(locale, '运行与调试', 'Runtime and debugging')}

- {restarting - ? pickAppText(locale, '正在重启当前 docker,服务恢复后页面会自动刷新。', 'Restarting the current Docker container. The page will refresh automatically once the service is back.') - : pickAppText(locale, '查看每次对话的运行日志,或重启当前 docker 容器。重启完成后需要重新登录。', 'Inspect per-chat runtime logs or restart the current Docker container. You will need to sign in again afterwards.')} + {pickAppText(locale, '查看每次对话的运行日志和当前实例运行状态。', 'Inspect per-chat runtime logs and current instance status.')}

- {restartError ? ( -

{restartError}

- ) : null}
- - - - - {pickAppText(locale, '确认重启当前实例?', 'Restart the current instance?')} - - {pickAppText(locale, '这会重启当前 docker 容器,页面会短暂不可用。由于当前登录态保存在内存里,重启完成后需要重新登录。', 'This restarts the current Docker container and the page will be temporarily unavailable. Because the current sign-in state is stored in memory, you will need to sign in again after the restart.')} - - - - {pickAppText(locale, '取消', 'Cancel')} - - {restarting ? pickAppText(locale, '重启中...', 'Restarting...') : pickAppText(locale, '确认重启', 'Confirm restart')} - - - -
diff --git a/app-instance/frontend/app/(app)/tasks/[taskId]/page.tsx b/app-instance/frontend/app/(app)/tasks/[taskId]/page.tsx index ad4e5ba..add50a9 100644 --- a/app-instance/frontend/app/(app)/tasks/[taskId]/page.tsx +++ b/app-instance/frontend/app/(app)/tasks/[taskId]/page.tsx @@ -3,21 +3,21 @@ import Link from 'next/link'; import { useParams, useRouter } from 'next/navigation'; import React, { useMemo, useState } from 'react'; -import { AlertCircle, ArrowLeft, Bot, CheckCircle2, Download, FileText, HelpCircle, MessageSquare, RefreshCw, RotateCcw, Trash2, User, XCircle } from 'lucide-react'; +import { AlertCircle, ArrowLeft, Bot, CheckCircle2, Download, FileText, HelpCircle, MessageSquare, RefreshCw, Trash2, User, XCircle } from 'lucide-react'; -import { OfficeStatusBadge, formatOfficeDuration, formatOfficeTime, progressPercent } from '@/components/office/OfficeShared'; +import { TaskRuntimeStatusBadge, formatTaskRuntimeDuration, formatTaskRuntimeTime, progressPercent } from '@/components/task-runtime/TaskRuntimeShared'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Textarea } from '@/components/ui/textarea'; -import { cancelDelegation, deleteBackendTask, getBackendTask, getFileUrl, retryDelegation, submitChatFeedback } from '@/lib/api'; +import { deleteBackendTask, getBackendTask, getFileUrl, submitChatFeedback } from '@/lib/api'; import { pickAppText } from '@/lib/i18n/core'; import { useAppI18n } from '@/lib/i18n/provider'; -import { buildOfficeView, isOfficeTaskTerminal, type OfficeTaskView } from '@/lib/office'; +import { buildTaskRuntimeView, type TaskRuntimeNodeView } from '@/lib/task-runtime'; import { useChatStore } from '@/lib/store'; import type { BackendTask, BackendTaskRun, ProcessArtifact, ProcessEvent } from '@/types'; -function taskVisibleStatus(task: OfficeTaskView, locale: 'zh-CN' | 'en-US') { +function taskVisibleStatus(task: TaskRuntimeNodeView, locale: 'zh-CN' | 'en-US') { if (task.status === 'error') return pickAppText(locale, '任务失败', 'Task failed'); if (task.status === 'cancelled') return pickAppText(locale, '已取消', 'Cancelled'); return task.stageLabel || task.status; @@ -46,7 +46,7 @@ export default function TaskDetailPage() { const updateMessageFeedback = useChatStore((state) => state.updateMessageFeedback); const task = useMemo( - () => buildOfficeView(taskId, { sessions, processRuns, processEvents, processArtifacts }, locale), + () => buildTaskRuntimeView(taskId, { sessions, processRuns, processEvents, processArtifacts }, locale), [locale, processArtifacts, processEvents, processRuns, sessions, taskId] ); const [backendTask, setBackendTask] = useState(null); @@ -105,7 +105,7 @@ export default function TaskDetailPage() { return map; }, [artifacts]); const phaseGroups = useMemo(() => { - const groups = new Map(); + const groups = new Map(); for (const item of task?.tasks ?? []) { const label = item.stageLabel || taskVisibleStatus(item, locale); groups.set(label, [...(groups.get(label) ?? []), item]); @@ -180,7 +180,7 @@ export default function TaskDetailPage() {
{pickAppText(locale, '来源会话', 'Session')}: {backendTask.session_id} {pickAppText(locale, '创建者', 'Creator')}: {backendTask.creator} - {pickAppText(locale, '更新', 'Updated')}: {formatOfficeTime(backendTask.updated_at, locale)} + {pickAppText(locale, '更新', 'Updated')}: {formatTaskRuntimeTime(backendTask.updated_at, locale)}
@@ -242,7 +242,7 @@ export default function TaskDetailPage() {
{humanFeedback(String(item.feedback_type || ''), locale)}
{item.comment ?

{String(item.comment)}

: null} - {item.created_at ?

{formatOfficeTime(String(item.created_at), locale)}

: null} + {item.created_at ?

{formatTaskRuntimeTime(String(item.created_at), locale)}

: null}
)) )} @@ -295,25 +295,6 @@ export default function TaskDetailPage() {
-
- - -
@@ -322,20 +303,20 @@ export default function TaskDetailPage() {

{task.title}

- +
{pickAppText(locale, '来源会话', 'Session')}: {task.sourceSessionLabel} {pickAppText(locale, '主 Agent', 'Lead agent')}: {task.rootActorName} - {pickAppText(locale, '开始', 'Started')}: {formatOfficeTime(task.createdAt, locale)} - {pickAppText(locale, '耗时', 'Duration')}: {formatOfficeDuration(task.durationMs, locale)} + {pickAppText(locale, '开始', 'Started')}: {formatTaskRuntimeTime(task.createdAt, locale)} + {pickAppText(locale, '耗时', 'Duration')}: {formatTaskRuntimeDuration(task.durationMs, locale)}
- +
@@ -398,7 +379,7 @@ export default function TaskDetailPage() {
{node.title}
{node.actorName}
- +
{node.summary || taskVisibleStatus(node, locale)} @@ -426,13 +407,13 @@ export default function TaskDetailPage() {
{selectedNode.title}
{selectedNode.runId}
- +

{selectedNode.summary || '-'}

{(eventsByRun.get(selectedNode.runId) ?? []).slice(-5).map((event) => (
{event.kind}
-
{event.text || formatOfficeTime(event.created_at, locale)}
+
{event.text || formatTaskRuntimeTime(event.created_at, locale)}
))}
@@ -548,7 +529,7 @@ function BackendRunConversation({ run, index }: { run: BackendTaskRun; index: nu
{run.title || pickAppText(locale, `Agent ${index + 1}`, `Agent ${index + 1}`)}
- {run.started_at ? formatOfficeTime(run.started_at, locale) : pickAppText(locale, '时间未知', 'Unknown time')} + {run.started_at ? formatTaskRuntimeTime(run.started_at, locale) : pickAppText(locale, '时间未知', 'Unknown time')} {run.finish_reason ? ` · ${humanFinishReason(run.finish_reason, locale)}` : ''}
@@ -573,7 +554,7 @@ function BackendRunConversation({ run, index }: { run: BackendTaskRun; index: nu
{isAssistant ? run.title || pickAppText(locale, 'Agent 回复', 'Agent reply') : isTool ? message.tool_name || pickAppText(locale, '工具结果', 'Tool result') : pickAppText(locale, '用户要求', 'User request')} - {message.created_at ? {formatOfficeTime(message.created_at, locale)} : null} + {message.created_at ? {formatTaskRuntimeTime(message.created_at, locale)} : null}
{message.content} diff --git a/app-instance/frontend/app/(app)/tasks/page.tsx b/app-instance/frontend/app/(app)/tasks/page.tsx index c05f985..f62b462 100644 --- a/app-instance/frontend/app/(app)/tasks/page.tsx +++ b/app-instance/frontend/app/(app)/tasks/page.tsx @@ -5,7 +5,7 @@ import { useSearchParams } from 'next/navigation'; import React, { useEffect, useMemo, useState } from 'react'; import { AlertCircle, ArrowRight, Clock3, FolderDown, ListTodo, Loader2, Play, Plus, RefreshCw, Trash2, X } from 'lucide-react'; -import { formatOfficeTime } from '@/components/office/OfficeShared'; +import { formatTaskRuntimeTime } from '@/components/task-runtime/TaskRuntimeShared'; import { TaskManagementTabs } from '@/components/task-management/TaskManagementTabs'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; @@ -151,7 +151,7 @@ function OrdinaryTasks() { {task.run_ids.length} {task.skill_names.length} - {formatOfficeTime(task.updated_at, locale)} + {formatTaskRuntimeTime(task.updated_at, locale)}
- )} {pickAppText(locale, `${memberRuns.length} 个子任务`, `${memberRuns.length} subtasks`)} diff --git a/app-instance/frontend/components/chat-workbench/ChatWorkbench.tsx b/app-instance/frontend/components/chat-workbench/ChatWorkbench.tsx index fad4694..cbb5902 100644 --- a/app-instance/frontend/components/chat-workbench/ChatWorkbench.tsx +++ b/app-instance/frontend/components/chat-workbench/ChatWorkbench.tsx @@ -15,7 +15,6 @@ export function ChatWorkbench({ processArtifacts, selectedRunId, onSelectRun, - onCancelRun, onFeedback, }: { messages: ChatMessage[]; @@ -27,7 +26,6 @@ export function ChatWorkbench({ processArtifacts: ProcessArtifact[]; selectedRunId: string | null; onSelectRun: (runId: string) => void; - onCancelRun: (runId: string) => void; onFeedback: (runId: string, feedbackType: 'satisfied' | 'revise' | 'abandon', comment?: string) => void; }) { return ( @@ -42,7 +40,6 @@ export function ChatWorkbench({ processArtifacts={processArtifacts} selectedRunId={selectedRunId} onSelectRun={onSelectRun} - onCancelRun={onCancelRun} onFeedback={onFeedback} />
diff --git a/app-instance/frontend/components/chat-workbench/MessageList.tsx b/app-instance/frontend/components/chat-workbench/MessageList.tsx index c9c47e4..a6a129c 100644 --- a/app-instance/frontend/components/chat-workbench/MessageList.tsx +++ b/app-instance/frontend/components/chat-workbench/MessageList.tsx @@ -329,7 +329,6 @@ export function MessageList({ processArtifacts, selectedRunId, onSelectRun, - onCancelRun, onFeedback, }: { messages: ChatMessage[]; @@ -341,7 +340,6 @@ export function MessageList({ processArtifacts: ProcessArtifact[]; selectedRunId: string | null; onSelectRun: (runId: string) => void; - onCancelRun: (runId: string) => void; onFeedback: (runId: string, feedbackType: 'satisfied' | 'revise' | 'abandon', comment?: string) => void; }) { const { locale } = useAppI18n(); @@ -411,7 +409,6 @@ export function MessageList({ artifacts={processArtifacts} selectedRunId={selectedRunId} onSelectRun={onSelectRun} - onCancelRun={onCancelRun} /> ) )} diff --git a/app-instance/frontend/components/task-runtime/TaskRuntimeShared.tsx b/app-instance/frontend/components/task-runtime/TaskRuntimeShared.tsx index 5d036c4..52c4ece 100644 --- a/app-instance/frontend/components/task-runtime/TaskRuntimeShared.tsx +++ b/app-instance/frontend/components/task-runtime/TaskRuntimeShared.tsx @@ -3,14 +3,14 @@ import { useAppI18n } from '@/lib/i18n/provider'; import { Badge } from '@/components/ui/badge'; import { cn } from '@/lib/utils'; -import type { OfficeTaskStatus, OfficeZoneView } from '@/lib/office'; -import { officeTaskStatusLabel } from '@/lib/office'; +import type { TaskRuntimeStatus } from '@/lib/task-runtime'; +import { taskRuntimeStatusLabel } from '@/lib/task-runtime'; -export function OfficeStatusBadge({ +export function TaskRuntimeStatusBadge({ status, className, }: { - status: OfficeTaskStatus; + status: TaskRuntimeStatus; className?: string; }) { const { locale } = useAppI18n(); @@ -30,12 +30,12 @@ export function OfficeStatusBadge({ className )} > - {officeTaskStatusLabel(status, locale)} + {taskRuntimeStatusLabel(status, locale)} ); } -export function formatOfficeTime(value?: string | null, locale: 'zh-CN' | 'en-US' = 'zh-CN'): string { +export function formatTaskRuntimeTime(value?: string | null, locale: 'zh-CN' | 'en-US' = 'zh-CN'): string { if (!value) return '-'; const date = new Date(value); if (Number.isNaN(date.getTime())) return value; @@ -47,7 +47,7 @@ export function formatOfficeTime(value?: string | null, locale: 'zh-CN' | 'en-US }).format(date); } -export function formatOfficeDuration(durationMs: number | null, locale: 'zh-CN' | 'en-US' = 'zh-CN'): string { +export function formatTaskRuntimeDuration(durationMs: number | null, locale: 'zh-CN' | 'en-US' = 'zh-CN'): string { if (durationMs === null || durationMs < 0) return '-'; if (durationMs < 1000) return locale === 'en-US' ? '<1s' : '<1秒'; @@ -65,15 +65,3 @@ export function progressPercent(value: number | null, max: number | null): numbe if (value === null || max === null || max <= 0) return 0; return Math.max(0, Math.min(100, Math.round((value / max) * 100))); } - -export function zonePanelClassName(zone: OfficeZoneView): string { - return cn( - 'relative min-h-[220px] overflow-hidden rounded-2xl border p-4 shadow-sm', - 'before:pointer-events-none before:absolute before:inset-0 before:bg-[radial-gradient(circle_at_top_left,rgba(255,255,255,0.9),transparent_40%)]', - zone.tone === 'info' && 'border-[#BCC4CE] bg-[#E4E7EB]/70', - zone.tone === 'warn' && 'border-[#B8AEA8] bg-[#E7E2DE]/70', - zone.tone === 'danger' && 'border-[#B8AEA8] bg-[#E7E2DE]/80', - zone.tone === 'success' && 'border-[#B7C2B5] bg-[#E3E8E2]/75', - zone.tone === 'neutral' && 'border-border bg-card' - ); -} diff --git a/app-instance/frontend/lib/api.ts b/app-instance/frontend/lib/api.ts index 7eef5d0..8633249 100644 --- a/app-instance/frontend/lib/api.ts +++ b/app-instance/frontend/lib/api.ts @@ -1,9 +1,6 @@ -// Nanobot API client — single-user direct mode. +// Beaver API client - single-user direct mode. import type { - AuthzBackendRecord, - AuthzChannelSettings, - AuthzRegisterBackendResponse, AuthzStatus, AuthUser, ActiveTask, @@ -12,11 +9,8 @@ import type { ChatMessage, CronJob, FileAttachment, - Marketplace, - MarketplacePlugin, NotificationDetail, NotificationRun, - PluginInfo, ProviderConfigPayload, Session, SessionDetail, @@ -33,7 +27,6 @@ import type { SkillHubVersionsResponse, SkillLearningCandidate, SkillReviewRecord, - SlashCommand, SessionProcessProjection, SystemStatus, TokenResponse, @@ -55,8 +48,8 @@ import { getCurrentAppLocale, pickAppText } from '@/lib/i18n/core'; const API_URL = process.env.NEXT_PUBLIC_API_URL?.trim(); const WS_URL = process.env.NEXT_PUBLIC_WS_URL?.trim(); const DEFAULT_API_URL = 'http://127.0.0.1:18080'; -const ACCESS_TOKEN_KEY = 'nanobot_access_token'; -const REFRESH_TOKEN_KEY = 'nanobot_refresh_token'; +const ACCESS_TOKEN_KEY = 'beaver_access_token'; +const REFRESH_TOKEN_KEY = 'beaver_refresh_token'; const REQUEST_TIMEOUT_MS = 8000; const OUTLOOK_REQUEST_TIMEOUT_MS = 45000; const SKILL_LEARNING_REQUEST_TIMEOUT_MS = 120000; @@ -636,16 +629,6 @@ export async function updateProviderConfig( }); } -export async function restartSystem(): Promise<{ - ok: boolean; - restarting: boolean; - detail: string; -}> { - return fetchJSON('/api/system/restart', { - method: 'POST', - }); -} - // --------------------------------------------------------------------------- // Cron (proxied) // --------------------------------------------------------------------------- @@ -861,14 +844,6 @@ export async function rollbackPublishedSkill( }); } -export async function listCommands(): Promise { - return fetchJSON('/api/commands'); -} - -export async function listPlugins(): Promise { - return fetchJSON('/api/plugins'); -} - export async function listAgents(): Promise { return fetchJSON('/api/agents'); } @@ -957,18 +932,6 @@ export async function deleteSubagent(subagentId: string): Promise { }); } -export async function cancelDelegation(runId: string): Promise<{ ok: boolean; run_id: string }> { - return fetchJSON(`/api/delegations/${encodeURIComponent(runId)}/cancel`, { - method: 'POST', - }); -} - -export async function retryDelegation(runId: string): Promise<{ ok: boolean; run_id: string }> { - return fetchJSON(`/api/delegations/${encodeURIComponent(runId)}/retry`, { - method: 'POST', - }); -} - export async function listMcpServers(): Promise { return fetchJSON('/api/mcp/servers'); } @@ -1022,122 +985,6 @@ export async function getAuthzStatus(): Promise { return fetchJSON('/api/authz/status'); } -export async function bindLocalBackendIdentity(payload: { - backend_id: string; - client_id: string; - client_secret: string; - name?: string; - public_base_url?: string; - authz_base_url?: string; - authz_enabled?: boolean; -}): Promise> { - return fetchJSON('/api/authz/local-backend/bind', { - method: 'POST', - body: JSON.stringify(payload), - }); -} - -export async function listAuthzBackends(): Promise { - return fetchJSON('/api/authz/backends'); -} - -export async function registerAuthzBackend(payload: { - name?: string; - backend_id?: string; - base_url?: string; - save_to_backend?: boolean; - authz_base_url?: string; -}): Promise { - return fetchJSON('/api/authz/backends/register', { - method: 'POST', - body: JSON.stringify(payload), - }); -} - -export async function getAuthzBackend(backendId: string): Promise { - return fetchJSON(`/api/authz/backends/${encodeURIComponent(backendId)}`); -} - -export async function enableAuthzBackend(backendId: string): Promise { - return fetchJSON(`/api/authz/backends/${encodeURIComponent(backendId)}/enable`, { - method: 'POST', - }); -} - -export async function disableAuthzBackend(backendId: string): Promise { - return fetchJSON(`/api/authz/backends/${encodeURIComponent(backendId)}/disable`, { - method: 'POST', - }); -} - -export async function rotateAuthzBackendSecret(backendId: string): Promise> { - return fetchJSON(`/api/authz/backends/${encodeURIComponent(backendId)}/rotate-secret`, { - method: 'POST', - }); -} - -export async function getAuthzBackendPermissions(backendId: string): Promise> { - return fetchJSON(`/api/authz/backends/${encodeURIComponent(backendId)}/permissions`); -} - -export async function setAuthzBackendPermissions( - backendId: string, - payload: Record -): Promise> { - return fetchJSON(`/api/authz/backends/${encodeURIComponent(backendId)}/permissions`, { - method: 'POST', - body: JSON.stringify(payload), - }); -} - -export async function getAuthzBackendOutlookSettings(backendId: string): Promise> { - return fetchJSON(`/api/authz/backends/${encodeURIComponent(backendId)}/settings/outlook`); -} - -export async function setAuthzBackendOutlookSettings( - backendId: string, - payload: Record -): Promise> { - return fetchJSON(`/api/authz/backends/${encodeURIComponent(backendId)}/settings/outlook`, { - method: 'POST', - body: JSON.stringify(payload), - }); -} - -export async function deleteAuthzBackendOutlookSettings(backendId: string): Promise> { - return fetchJSON(`/api/authz/backends/${encodeURIComponent(backendId)}/settings/outlook`, { - method: 'DELETE', - }); -} - -export async function listAuthzChannelSettings(): Promise> { - return fetchJSON('/api/authz/channel-settings'); -} - -export async function getAuthzChannelSettings(channelId: string): Promise { - return fetchJSON(`/api/authz/channel-settings/${encodeURIComponent(channelId)}`); -} - -export async function setAuthzChannelSettings( - channelId: string, - payload: { - configured?: boolean; - config?: Record; - secrets?: Record; - } -): Promise { - return fetchJSON(`/api/authz/channel-settings/${encodeURIComponent(channelId)}`, { - method: 'POST', - body: JSON.stringify(payload), - }); -} - -export async function deleteAuthzChannelSettings(channelId: string): Promise> { - return fetchJSON(`/api/authz/channel-settings/${encodeURIComponent(channelId)}`, { - method: 'DELETE', - }); -} - export async function testMcpServer(serverId: string): Promise> { return fetchJSON(`/api/mcp/servers/${encodeURIComponent(serverId)}/test`, { method: 'POST', @@ -1282,10 +1129,6 @@ export async function uploadSkill(file: File): Promise { return res.json(); } -export async function migrateSkills(): Promise<{ included: Array>; skipped: Array> }> { - return fetchJSON('/api/skills/migrate', { method: 'POST', timeoutMs: 45000 }); -} - // --------------------------------------------------------------------------- // SkillHub marketplace // --------------------------------------------------------------------------- @@ -1356,50 +1199,6 @@ export async function installSkillHubSkill( ); } -// --------------------------------------------------------------------------- -// Marketplace (proxied) -// --------------------------------------------------------------------------- - -export async function listMarketplaces(): Promise { - return fetchJSON('/api/marketplaces'); -} - -export async function addMarketplace(source: string): Promise { - return fetchJSON('/api/marketplaces', { - method: 'POST', - body: JSON.stringify({ source }), - }); -} - -export async function removeMarketplace(name: string): Promise { - await fetchJSON(`/api/marketplaces/${encodeURIComponent(name)}`, { - method: 'DELETE', - }); -} - -export async function updateMarketplace(name: string): Promise { - return fetchJSON(`/api/marketplaces/${encodeURIComponent(name)}/update`, { - method: 'POST', - }); -} - -export async function listMarketplacePlugins(name: string): Promise { - return fetchJSON(`/api/marketplaces/${encodeURIComponent(name)}/plugins`); -} - -export async function installMarketplacePlugin(marketplaceName: string, pluginName: string): Promise { - await fetchJSON( - `/api/marketplaces/${encodeURIComponent(marketplaceName)}/plugins/${encodeURIComponent(pluginName)}/install`, - { method: 'POST' } - ); -} - -export async function uninstallPlugin(pluginName: string): Promise { - await fetchJSON(`/api/plugins/${encodeURIComponent(pluginName)}`, { - method: 'DELETE', - }); -} - // --------------------------------------------------------------------------- // Files (proxied) // --------------------------------------------------------------------------- diff --git a/app-instance/frontend/lib/i18n/common.ts b/app-instance/frontend/lib/i18n/common.ts index db4a6e7..928ca82 100644 --- a/app-instance/frontend/lib/i18n/common.ts +++ b/app-instance/frontend/lib/i18n/common.ts @@ -1,10 +1,10 @@ -import type { OfficeTaskStatus } from '@/lib/office'; +import type { TaskRuntimeStatus } from '@/lib/task-runtime'; import type { ProcessArtifact, ProcessRun } from '@/types'; import { getCurrentAppLocale, pickAppText, type AppLocale } from '@/lib/i18n/core'; import type { WsStatus } from '@/lib/api'; export function appStatusLabel( - status: ProcessRun['status'] | OfficeTaskStatus | string, + status: ProcessRun['status'] | TaskRuntimeStatus | string, locale: AppLocale = getCurrentAppLocale() ): string { if (status === 'queued') return pickAppText(locale, '排队中', 'Queued'); @@ -63,12 +63,12 @@ export function appArtifactPreview(artifact: ProcessArtifact, locale: AppLocale export function appConnectionStatusLabel( wsStatus: WsStatus, - nanobotReady: boolean | null, + beaverReady: boolean | null, locale: AppLocale = getCurrentAppLocale() ): string { - const isOnline = wsStatus === 'connected' && nanobotReady === true; - const isChecking = wsStatus === 'connected' && nanobotReady === null; - const isOffline = wsStatus === 'disconnected' || (wsStatus === 'connected' && nanobotReady === false); + const isOnline = wsStatus === 'connected' && beaverReady === true; + const isChecking = wsStatus === 'connected' && beaverReady === null; + const isOffline = wsStatus === 'disconnected' || (wsStatus === 'connected' && beaverReady === false); if (isOnline) return pickAppText(locale, '已连接', 'Connected'); if (isChecking) return pickAppText(locale, '检查中', 'Checking'); diff --git a/app-instance/frontend/lib/i18n/core.ts b/app-instance/frontend/lib/i18n/core.ts index 6657b82..40e9411 100644 --- a/app-instance/frontend/lib/i18n/core.ts +++ b/app-instance/frontend/lib/i18n/core.ts @@ -1,5 +1,5 @@ -export const APP_LOCALE_COOKIE = 'nanobot_locale'; -export const APP_LOCALE_STORAGE_KEY = 'nanobot_locale'; +export const APP_LOCALE_COOKIE = 'beaver_locale'; +export const APP_LOCALE_STORAGE_KEY = 'beaver_locale'; export const APP_LOCALES = ['zh-CN', 'en-US'] as const; diff --git a/app-instance/frontend/lib/store.ts b/app-instance/frontend/lib/store.ts index f6c590f..79d645c 100644 --- a/app-instance/frontend/lib/store.ts +++ b/app-instance/frontend/lib/store.ts @@ -14,7 +14,7 @@ import type { } from '@/types'; import type { WsStatus } from '@/lib/api'; -const ACTIVE_SESSION_STORAGE_KEY = 'nanobot_active_session_id'; +const ACTIVE_SESSION_STORAGE_KEY = 'beaver_active_session_id'; function getInitialSessionId(): string { if (typeof window === 'undefined') { @@ -40,7 +40,7 @@ interface ChatStore { streamingContent: string; wsStatus: WsStatus; isThinking: boolean; - nanobotReady: boolean | null; + beaverReady: boolean | null; sessions: Session[]; processRuns: ProcessRun[]; processEvents: ProcessEvent[]; @@ -68,7 +68,7 @@ interface ChatStore { clearMessages: () => void; setWsStatus: (status: WsStatus) => void; setIsThinking: (thinking: boolean) => void; - setNanobotReady: (ready: boolean | null) => void; + setBeaverReady: (ready: boolean | null) => void; resetProcessState: () => void; ingestProcessEvent: (event: ProcessWsEvent) => void; setSessionProcess: (sessionId: string, projection: SessionProcessProjection) => void; @@ -135,7 +135,7 @@ export const useChatStore = create((set) => ({ streamingContent: '', wsStatus: 'disconnected', isThinking: false, - nanobotReady: null, + beaverReady: null, sessions: [], processRuns: [], processEvents: [], @@ -175,7 +175,7 @@ export const useChatStore = create((set) => ({ clearMessages: () => set({ messages: [], streamingContent: '' }), setWsStatus: (status) => set({ wsStatus: status }), setIsThinking: (thinking) => set({ isThinking: thinking }), - setNanobotReady: (ready) => set({ nanobotReady: ready }), + setBeaverReady: (ready) => set({ beaverReady: ready }), resetProcessState: () => set({ processRuns: [], diff --git a/app-instance/frontend/lib/task-runtime.test.ts b/app-instance/frontend/lib/task-runtime.test.ts index e4d99de..f34bb32 100644 --- a/app-instance/frontend/lib/task-runtime.test.ts +++ b/app-instance/frontend/lib/task-runtime.test.ts @@ -1,9 +1,9 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; -import { buildOfficeTaskList, buildOfficeView } from '@/lib/office'; +import { buildTaskRuntimeView } from '@/lib/task-runtime'; import type { ProcessArtifact, ProcessEvent, ProcessRun, Session } from '@/types'; -describe('office view builders', () => { +describe('runtime view builders', () => { beforeEach(() => { vi.useFakeTimers(); vi.setSystemTime(new Date('2026-03-24T12:00:00.000Z')); @@ -13,7 +13,7 @@ describe('office view builders', () => { vi.useRealTimers(); }); - it('builds an office view from a root run tree', () => { + it('builds a runtime view from a root run tree', () => { const sessions: Session[] = [ { key: 'web:default', @@ -118,26 +118,21 @@ describe('office view builders', () => { }, ]; - const office = buildOfficeView('run-root', { + const runtime = buildTaskRuntimeView('run-root', { sessions, processRuns, processEvents, processArtifacts, }); - expect(office).not.toBeNull(); - expect(office?.taskId).toBe('run-root'); - expect(office?.title).toBe('整理竞品研究并给出结论'); - expect(office?.sourceSessionLabel).toBe('需求讨论'); - expect(office?.members).toHaveLength(3); - expect(office?.tasks).toHaveLength(3); - expect(office?.assignments).toHaveLength(1); - expect(office?.progress.label).toBe('已完成子任务 1 / 3'); - expect(office?.currentStageLabel).toBe('分析结果'); - expect(office?.stats.artifactCount).toBe(1); - expect(office?.zones.find((zone) => zone.id === 'workspace')?.memberIds).toContain('main-agent'); - expect(office?.zones.find((zone) => zone.id === 'collab')?.memberIds).toContain('research-agent'); - expect(office?.zones.find((zone) => zone.id === 'research')?.memberIds).toContain('search-mcp'); + expect(runtime).not.toBeNull(); + expect(runtime?.taskId).toBe('run-root'); + expect(runtime?.title).toBe('整理竞品研究并给出结论'); + expect(runtime?.sourceSessionLabel).toBe('需求讨论'); + expect(runtime?.tasks).toHaveLength(3); + expect(runtime?.progress.label).toBe('已完成子任务 1 / 3'); + expect(runtime?.stats.artifactCount).toBe(1); + expect(runtime?.stats.alertCount).toBe(0); }); it('marks stale waiting tasks as blocked and emits alerts', () => { @@ -155,109 +150,14 @@ describe('office view builders', () => { }, ]; - const office = buildOfficeView('run-blocked', { + const runtime = buildTaskRuntimeView('run-blocked', { sessions: [], processRuns, processEvents: [], processArtifacts: [], }); - expect(office?.status).toBe('blocked'); - expect(office?.alerts).toHaveLength(1); - expect(office?.alerts[0].level).toBe('warn'); - expect(office?.members[0].zoneId).toBe('collab'); - }); - - it('builds a filtered task list and sorts active tasks ahead of finished ones', () => { - const sessions: Session[] = [ - { key: 'web:alpha', path: 'Alpha Session' }, - { key: 'web:beta', path: 'Beta Session' }, - ]; - - const processRuns: ProcessRun[] = [ - { - run_id: 'run-active', - parent_run_id: null, - session_id: 'web:alpha', - actor_type: 'agent', - actor_id: 'agent-a', - actor_name: 'Agent A', - title: '执行活跃任务', - status: 'running', - started_at: '2026-03-24T11:20:00.000Z', - }, - { - run_id: 'run-done', - parent_run_id: null, - session_id: 'web:alpha', - actor_type: 'agent', - actor_id: 'agent-b', - actor_name: 'Agent B', - title: '已结束任务', - status: 'done', - started_at: '2026-03-24T10:00:00.000Z', - finished_at: '2026-03-24T10:08:00.000Z', - }, - { - run_id: 'run-other-session', - parent_run_id: null, - session_id: 'web:beta', - actor_type: 'agent', - actor_id: 'agent-c', - actor_name: 'Agent C', - title: '其他会话任务', - status: 'running', - started_at: '2026-03-24T11:00:00.000Z', - }, - ]; - - const tasks = buildOfficeTaskList({ - sessionId: 'web:alpha', - sessions, - processRuns, - processEvents: [], - processArtifacts: [], - }); - - expect(tasks).toHaveLength(2); - expect(tasks[0].taskId).toBe('run-active'); - expect(tasks[1].taskId).toBe('run-done'); - expect(tasks[0].sessionLabel).toBe('Alpha Session'); - }); - - it('keeps office tasks visible when the root run inherits session from descendants', () => { - const tasks = buildOfficeTaskList({ - sessionId: 'web:alpha', - sessions: [{ key: 'web:alpha', path: 'Alpha Session' }], - processRuns: [ - { - run_id: 'run-root-no-session', - parent_run_id: null, - actor_type: 'agent', - actor_id: 'agent-a', - actor_name: 'Agent A', - title: '根任务缺少会话字段', - status: 'running', - started_at: '2026-03-24T11:20:00.000Z', - }, - { - run_id: 'run-child-with-session', - parent_run_id: 'run-root-no-session', - session_id: 'web:alpha', - actor_type: 'agent', - actor_id: 'agent-b', - actor_name: 'Agent B', - title: '子任务仍带着会话字段', - status: 'running', - started_at: '2026-03-24T11:21:00.000Z', - }, - ], - processEvents: [], - processArtifacts: [], - }); - - expect(tasks).toHaveLength(1); - expect(tasks[0].taskId).toBe('run-root-no-session'); - expect(tasks[0].sessionId).toBe('web:alpha'); + expect(runtime?.status).toBe('blocked'); + expect(runtime?.stats.alertCount).toBe(1); }); }); diff --git a/app-instance/frontend/lib/task-runtime.ts b/app-instance/frontend/lib/task-runtime.ts index 14f55a4..88c8845 100644 --- a/app-instance/frontend/lib/task-runtime.ts +++ b/app-instance/frontend/lib/task-runtime.ts @@ -1,5 +1,4 @@ import type { - ProcessActorType, ProcessArtifact, ProcessEvent, ProcessRun, @@ -8,108 +7,42 @@ import type { } from '@/types'; import { getCurrentAppLocale, pickAppText, type AppLocale } from '@/lib/i18n/core'; -const TERMINAL_STATUSES = new Set(['done', 'error', 'cancelled']); +const TERMINAL_STATUSES = new Set(['done', 'error', 'cancelled']); const STALE_WAITING_MS = 2 * 60 * 1000; -export type OfficeTaskStatus = ProcessRunStatus | 'blocked'; +export type TaskRuntimeStatus = ProcessRunStatus | 'blocked'; -export type OfficeZoneId = - | 'reception' - | 'workspace' - | 'collab' - | 'research' - | 'alert' - | 'done'; - -export interface OfficeProgressView { - mode: 'stage' | 'ratio' | 'status'; +export interface TaskRuntimeProgressView { label: string; value: number | null; max: number | null; - stageLabel: string | null; } -export interface OfficeStatsView { +export interface TaskRuntimeStatsView { totalRuns: number; activeRuns: number; - doneRuns: number; - errorRuns: number; - cancelledRuns: number; - memberCount: number; artifactCount: number; + alertCount: number; } -export interface OfficeZoneView { - id: OfficeZoneId; - label: string; - memberIds: string[]; - taskIds: string[]; - tone: 'neutral' | 'info' | 'warn' | 'danger' | 'success'; -} - -export interface OfficeMemberView { - memberId: string; - actorId: string; - actorName: string; - actorType: ProcessActorType; - status: OfficeTaskStatus; - zoneId: OfficeZoneId; - currentRunId: string; - currentTitle: string; - stageLabel: string | null; - summary: string | null; - startedAt: string | null; - updatedAt: string | null; - finishedAt: string | null; - childRunIds: string[]; - artifactCount: number; - isPrimary: boolean; -} - -export interface OfficeTaskView { +export interface TaskRuntimeNodeView { taskId: string; runId: string; - parentRunId: string | null; - actorId: string; actorName: string; - actorType: ProcessActorType; title: string; - status: OfficeTaskStatus; + status: TaskRuntimeStatus; stageLabel: string | null; summary: string | null; - startedAt: string; updatedAt: string; - finishedAt: string | null; childTaskIds: string[]; - artifactCount: number; - errorText: string | null; isRoot: boolean; } -export interface OfficeAssignmentView { - ownerRunId: string; - ownerActorName: string; - assigneeRunIds: string[]; - assigneeActorNames: string[]; - label: string; -} - -export interface OfficeAlertView { - id: string; - level: 'info' | 'warn' | 'error'; - title: string; - description: string | null; - runId: string | null; - actorId: string | null; - createdAt: string; -} - -export interface OfficeView { - officeId: string; +export interface TaskRuntimeView { taskId: string; sessionId: string | null; title: string; - status: OfficeTaskStatus; + status: TaskRuntimeStatus; createdAt: string; updatedAt: string; finishedAt: string | null; @@ -117,38 +50,12 @@ export interface OfficeView { sourceSessionLabel: string; rootRunId: string; rootActorName: string; - currentStageLabel: string | null; - progress: OfficeProgressView; - stats: OfficeStatsView; - alerts: OfficeAlertView[]; - zones: OfficeZoneView[]; - members: OfficeMemberView[]; - tasks: OfficeTaskView[]; - assignments: OfficeAssignmentView[]; - detailRunIds: string[]; + progress: TaskRuntimeProgressView; + stats: TaskRuntimeStatsView; + tasks: TaskRuntimeNodeView[]; } -export interface OfficeTaskListItem { - officeId: string; - taskId: string; - sessionId: string | null; - sessionLabel: string; - title: string; - status: OfficeTaskStatus; - createdAt: string; - updatedAt: string; - finishedAt: string | null; - rootRunId: string; - rootActorName: string; - memberCount: number; - activeRuns: number; - errorCount: number; - artifactCount: number; - currentStageLabel: string | null; - progress: OfficeProgressView; -} - -type BuildOfficeInput = { +type BuildTaskRuntimeInput = { sessions: Session[]; processRuns: ProcessRun[]; processEvents: ProcessEvent[]; @@ -235,11 +142,6 @@ function buildChildrenMap(processRuns: ProcessRun[]): Map return map; } -function findRootRuns(processRuns: ProcessRun[]): ProcessRun[] { - const runIds = new Set(processRuns.map((run) => run.run_id)); - return processRuns.filter((run) => !run.parent_run_id || !runIds.has(run.parent_run_id)); -} - function collectRunTree(rootRun: ProcessRun, childrenMap: Map): ProcessRun[] { const collected: ProcessRun[] = []; const stack = [rootRun]; @@ -279,7 +181,7 @@ function getRunUpdatedAt( function deriveStageLabel( run: ProcessRun, runEvents: ProcessEvent[], - fallbackStatus: OfficeTaskStatus, + fallbackStatus: TaskRuntimeStatus, locale: AppLocale, ): string | null { const runMetadataLabel = readMetadataString(run.metadata, [ @@ -315,7 +217,7 @@ function deriveRunStatus( run: ProcessRun, updatedAt: string, now: number, -): OfficeTaskStatus { +): TaskRuntimeStatus { if (run.status !== 'waiting') return run.status; const updatedTime = toTime(updatedAt); if (updatedTime !== null && now - updatedTime > STALE_WAITING_MS) { @@ -324,88 +226,16 @@ function deriveRunStatus( return 'waiting'; } -function mapZoneId(status: OfficeTaskStatus, actorType: ProcessActorType): OfficeZoneId { - if (status === 'queued') return 'reception'; - if (status === 'waiting' || status === 'blocked') return actorType === 'mcp' ? 'research' : 'collab'; - if (status === 'running') return actorType === 'mcp' ? 'research' : 'workspace'; - if (status === 'done') return 'collab'; - return 'alert'; -} - -function zoneLabel(zoneId: OfficeZoneId, locale: AppLocale): string { - if (zoneId === 'reception') return pickAppText(locale, '接待区', 'Reception'); - if (zoneId === 'workspace') return pickAppText(locale, '工位区', 'Workspace'); - if (zoneId === 'collab') return pickAppText(locale, '协作区', 'Collaboration'); - if (zoneId === 'research') return pickAppText(locale, '研究区', 'Research'); - if (zoneId === 'alert') return pickAppText(locale, '异常区', 'Alerts'); - return pickAppText(locale, '完成区', 'Completed'); -} - -function zoneTone(zoneId: OfficeZoneId): OfficeZoneView['tone'] { - if (zoneId === 'workspace' || zoneId === 'research') return 'info'; - if (zoneId === 'collab' || zoneId === 'reception') return 'warn'; - if (zoneId === 'alert') return 'danger'; - if (zoneId === 'done') return 'success'; - return 'neutral'; -} - -function taskStatusPriority(status: OfficeTaskStatus): number { - if (status === 'running') return 6; - if (status === 'blocked') return 5; - if (status === 'waiting') return 4; - if (status === 'queued') return 3; - if (status === 'error') return 2; - if (status === 'cancelled') return 1; - return 0; -} - -function selectDisplayRun( - runs: ProcessRun[], - eventsByRun: Map, - artifactsByRun: Map, - now: number, -): { run: ProcessRun; status: OfficeTaskStatus; updatedAt: string } { - const sorted = [...runs] - .map((run) => { - const updatedAt = getRunUpdatedAt(run, eventsByRun, artifactsByRun); - const status = deriveRunStatus(run, updatedAt, now); - return { run, status, updatedAt }; - }) - .sort((a, b) => { - const byStatus = taskStatusPriority(b.status) - taskStatusPriority(a.status); - if (byStatus !== 0) return byStatus; - return compareIsoDesc(a.updatedAt, b.updatedAt); - }); - - return sorted[0]; -} - -function deriveErrorText(run: ProcessRun, runEvents: ProcessEvent[], locale: AppLocale): string | null { - if (run.status !== 'error') return null; - const direct = firstString(run.summary); - if (direct) return direct; - const sortedEvents = [...runEvents].sort((a, b) => compareIsoDesc(a.created_at, b.created_at)); - for (const event of sortedEvents) { - if (event.status === 'error' && firstString(event.text)) { - return event.text!.trim(); - } - } - return pickAppText(locale, '任务执行失败', 'Task execution failed'); -} - function deriveProgress( rootRun: ProcessRun, taskRuns: ProcessRun[], - taskViews: OfficeTaskView[], locale: AppLocale, -): OfficeProgressView { +): TaskRuntimeProgressView { const stageValue = readMetadataNumber(rootRun.metadata, ['stage_index', 'step_index', 'phase_index']); const stageMax = readMetadataNumber(rootRun.metadata, ['stage_total', 'step_total', 'phase_total']); - const stageLabel = readMetadataString(rootRun.metadata, ['stage_label', 'stage', 'phase_label', 'step_label']); if (stageValue !== null && stageMax !== null && stageMax > 0) { return { - mode: 'ratio', label: pickAppText( locale, `阶段 ${Math.min(stageValue, stageMax)} / ${stageMax}`, @@ -413,14 +243,12 @@ function deriveProgress( ), value: stageValue, max: stageMax, - stageLabel, }; } const doneRuns = taskRuns.filter((run) => run.status === 'done').length; if (taskRuns.length > 0) { return { - mode: 'ratio', label: pickAppText( locale, `已完成子任务 ${doneRuns} / ${taskRuns.length}`, @@ -428,97 +256,25 @@ function deriveProgress( ), value: doneRuns, max: taskRuns.length, - stageLabel: stageLabel ?? taskViews.find((item) => item.isRoot)?.stageLabel ?? null, }; } return { - mode: 'status', label: pickAppText(locale, '等待任务数据', 'Waiting for task data'), value: null, max: null, - stageLabel, }; } -function buildAlerts( - taskViews: OfficeTaskView[], - now: number, - locale: AppLocale, -): OfficeAlertView[] { - const alerts: OfficeAlertView[] = []; - - for (const task of taskViews) { - if (task.status === 'error') { - alerts.push({ - id: `error:${task.runId}`, - level: 'error', - title: pickAppText(locale, `${task.actorName} 执行失败`, `${task.actorName} failed`), - description: task.errorText, - runId: task.runId, - actorId: task.actorId, - createdAt: task.updatedAt, - }); - } else if (task.status === 'blocked') { - alerts.push({ - id: `blocked:${task.runId}`, - level: 'warn', - title: pickAppText(locale, `${task.actorName} 长时间等待`, `${task.actorName} has been waiting for a while`), - description: pickAppText(locale, '该任务长时间无更新,可能存在阻塞。', 'This task has not updated for a while and may be blocked.'), - runId: task.runId, - actorId: task.actorId, - createdAt: task.updatedAt, - }); - } else if (task.status === 'waiting') { - const updatedTime = toTime(task.updatedAt); - if (updatedTime !== null && now - updatedTime > STALE_WAITING_MS) { - alerts.push({ - id: `stale:${task.runId}`, - level: 'warn', - title: pickAppText(locale, `${task.actorName} 等待时间偏长`, `${task.actorName} has been waiting longer than expected`), - description: pickAppText(locale, '该任务仍处于等待态,建议查看详情确认依赖是否卡住。', 'This task is still waiting. Check the details to confirm whether a dependency is stuck.'), - runId: task.runId, - actorId: task.actorId, - createdAt: task.updatedAt, - }); - } - } - } - - return alerts.sort((a, b) => compareIsoDesc(a.createdAt, b.createdAt)); +function countAlerts(taskViews: TaskRuntimeNodeView[]): number { + return taskViews.filter((task) => task.status === 'error' || task.status === 'blocked').length; } -function buildZones(members: OfficeMemberView[], tasks: OfficeTaskView[], locale: AppLocale): OfficeZoneView[] { - const ids: OfficeZoneId[] = ['reception', 'workspace', 'collab', 'research', 'alert', 'done']; - return ids.map((id) => ({ - id, - label: zoneLabel(id, locale), - memberIds: members.filter((member) => member.zoneId === id).map((member) => member.memberId), - taskIds: tasks.filter((task) => mapZoneId(task.status, task.actorType) === id).map((task) => task.taskId), - tone: zoneTone(id), - })); -} - -function buildAssignments(taskRuns: ProcessRun[], childrenMap: Map, locale: AppLocale): OfficeAssignmentView[] { - return taskRuns - .filter((run) => (childrenMap.get(run.run_id) ?? []).length > 0) - .map((run) => { - const children = childrenMap.get(run.run_id) ?? []; - return { - ownerRunId: run.run_id, - ownerActorName: run.actor_name, - assigneeRunIds: children.map((item) => item.run_id), - assigneeActorNames: children.map((item) => item.actor_name), - label: pickAppText(locale, `${run.actor_name} 分派了 ${children.length} 个子任务`, `${run.actor_name} assigned ${children.length} subtasks`), - }; - }); -} - -export function isOfficeTaskTerminal(status: OfficeTaskStatus): boolean { +export function isTaskRuntimeTerminal(status: TaskRuntimeStatus): boolean { return TERMINAL_STATUSES.has(status); } -export function officeTaskStatusLabel(status: OfficeTaskStatus, locale: AppLocale = getCurrentAppLocale()): string { +export function taskRuntimeStatusLabel(status: TaskRuntimeStatus, locale: AppLocale = getCurrentAppLocale()): string { if (status === 'queued') return pickAppText(locale, '排队中', 'Queued'); if (status === 'running') return pickAppText(locale, '进行中', 'In Progress'); if (status === 'waiting') return pickAppText(locale, '等待中', 'Waiting'); @@ -528,11 +284,11 @@ export function officeTaskStatusLabel(status: OfficeTaskStatus, locale: AppLocal return pickAppText(locale, '已取消', 'Cancelled'); } -export function buildOfficeView( +export function buildTaskRuntimeView( taskId: string, - input: BuildOfficeInput, + input: BuildTaskRuntimeInput, locale: AppLocale = getCurrentAppLocale(), -): OfficeView | null { +): TaskRuntimeView | null { const { sessions, processRuns, processEvents, processArtifacts } = input; const runById = new Map(processRuns.map((run) => [run.run_id, run])); const rootRun = runById.get(taskId); @@ -547,7 +303,7 @@ export function buildOfficeView( const artifactsByRun = groupByRunId(taskArtifacts); const now = Date.now(); - const taskViews: OfficeTaskView[] = taskRuns + const taskViews: TaskRuntimeNodeView[] = taskRuns .map((run) => { const runEvents = eventsByRun.get(run.run_id) ?? []; const updatedAt = getRunUpdatedAt(run, eventsByRun, artifactsByRun); @@ -560,72 +316,24 @@ export function buildOfficeView( return { taskId: run.run_id, runId: run.run_id, - parentRunId: run.parent_run_id ?? null, - actorId: run.actor_id, actorName: run.actor_name, - actorType: run.actor_type, title: run.title, status, stageLabel, summary: firstString(run.summary), - startedAt: run.started_at, updatedAt, - finishedAt: run.finished_at ?? null, childTaskIds, - artifactCount: (artifactsByRun.get(run.run_id) ?? []).length, - errorText: deriveErrorText(run, runEvents, locale), isRoot: run.run_id === rootRun.run_id, }; }) .sort((a, b) => { if (a.isRoot !== b.isRoot) return a.isRoot ? -1 : 1; - if (isOfficeTaskTerminal(a.status) !== isOfficeTaskTerminal(b.status)) { - return isOfficeTaskTerminal(a.status) ? 1 : -1; + if (isTaskRuntimeTerminal(a.status) !== isTaskRuntimeTerminal(b.status)) { + return isTaskRuntimeTerminal(a.status) ? 1 : -1; } return compareIsoDesc(a.updatedAt, b.updatedAt); }); - const actorRuns = new Map(); - for (const run of taskRuns) { - const collection = actorRuns.get(run.actor_id); - if (collection) { - collection.push(run); - continue; - } - actorRuns.set(run.actor_id, [run]); - } - - const members: OfficeMemberView[] = Array.from(actorRuns.entries()) - .map(([actorId, runs]) => { - const display = selectDisplayRun(runs, eventsByRun, artifactsByRun, now); - const currentRun = display.run; - const currentTask = taskViews.find((task) => task.runId === currentRun.run_id); - return { - memberId: actorId, - actorId, - actorName: currentRun.actor_name, - actorType: currentRun.actor_type, - status: display.status, - zoneId: mapZoneId(display.status, currentRun.actor_type), - currentRunId: currentRun.run_id, - currentTitle: currentRun.title, - stageLabel: currentTask?.stageLabel ?? null, - summary: currentTask?.summary ?? null, - startedAt: currentRun.started_at ?? null, - updatedAt: display.updatedAt, - finishedAt: currentRun.finished_at ?? null, - childRunIds: (childrenMap.get(currentRun.run_id) ?? []).map((child) => child.run_id), - artifactCount: runs.reduce((count, run) => count + (artifactsByRun.get(run.run_id) ?? []).length, 0), - isPrimary: currentRun.run_id === rootRun.run_id, - }; - }) - .sort((a, b) => { - if (a.isPrimary !== b.isPrimary) return a.isPrimary ? -1 : 1; - const byStatus = taskStatusPriority(b.status) - taskStatusPriority(a.status); - if (byStatus !== 0) return byStatus; - return compareIsoDesc(a.updatedAt, b.updatedAt); - }); - const sessionId = rootRun.session_id ?? taskRuns.find((run) => run.session_id)?.session_id ?? null; const updatedAt = latestTimestamp([ ...taskViews.map((task) => task.updatedAt), @@ -633,8 +341,8 @@ export function buildOfficeView( rootRun.started_at, ]) ?? rootRun.started_at; const derivedRootStatus = deriveRunStatus(rootRun, updatedAt, now); - const alerts = buildAlerts(taskViews, now, locale); - const progress = deriveProgress(rootRun, taskRuns, taskViews, locale); + const alertCount = countAlerts(taskViews); + const progress = deriveProgress(rootRun, taskRuns, locale); const sourceSessionLabel = getSessionLabel(sessions, sessionId, locale); const createdAt = rootRun.started_at; const finishedAt = rootRun.finished_at ?? null; @@ -646,7 +354,6 @@ export function buildOfficeView( : null; return { - officeId: rootRun.run_id, taskId: rootRun.run_id, sessionId, title: rootRun.title || pickAppText(locale, `任务 ${rootRun.run_id.slice(0, 8)}`, `Task ${rootRun.run_id.slice(0, 8)}`), @@ -658,60 +365,13 @@ export function buildOfficeView( sourceSessionLabel, rootRunId: rootRun.run_id, rootActorName: rootRun.actor_name, - currentStageLabel: deriveStageLabel(rootRun, eventsByRun.get(rootRun.run_id) ?? [], derivedRootStatus, locale), progress, stats: { totalRuns: taskRuns.length, - activeRuns: taskViews.filter((task) => !isOfficeTaskTerminal(task.status)).length, - doneRuns: taskViews.filter((task) => task.status === 'done').length, - errorRuns: taskViews.filter((task) => task.status === 'error').length, - cancelledRuns: taskViews.filter((task) => task.status === 'cancelled').length, - memberCount: members.length, + activeRuns: taskViews.filter((task) => !isTaskRuntimeTerminal(task.status)).length, artifactCount: taskArtifacts.length, + alertCount, }, - alerts, - zones: buildZones(members, taskViews, locale), - members, tasks: taskViews, - assignments: buildAssignments(taskRuns, childrenMap, locale), - detailRunIds: taskViews.map((task) => task.runId), }; } - -export function buildOfficeTaskList( - input: BuildOfficeInput & { sessionId?: string | null }, - locale: AppLocale = getCurrentAppLocale(), -): OfficeTaskListItem[] { - const rootRuns = findRootRuns(input.processRuns); - const offices = rootRuns - .map((rootRun) => buildOfficeView(rootRun.run_id, input, locale)) - .filter((office): office is OfficeView => office !== null) - .filter((office) => !input.sessionId || office.sessionId === input.sessionId); - - return offices - .map((office) => ({ - officeId: office.officeId, - taskId: office.taskId, - sessionId: office.sessionId, - sessionLabel: office.sourceSessionLabel, - title: office.title, - status: office.status, - createdAt: office.createdAt, - updatedAt: office.updatedAt, - finishedAt: office.finishedAt, - rootRunId: office.rootRunId, - rootActorName: office.rootActorName, - memberCount: office.members.length, - activeRuns: office.stats.activeRuns, - errorCount: office.stats.errorRuns, - artifactCount: office.stats.artifactCount, - currentStageLabel: office.currentStageLabel, - progress: office.progress, - })) - .sort((a, b) => { - if (isOfficeTaskTerminal(a.status) !== isOfficeTaskTerminal(b.status)) { - return isOfficeTaskTerminal(a.status) ? 1 : -1; - } - return compareIsoDesc(a.updatedAt, b.updatedAt); - }); -} diff --git a/app-instance/frontend/next.config.js b/app-instance/frontend/next.config.js index 68bc2c9..12389cd 100644 --- a/app-instance/frontend/next.config.js +++ b/app-instance/frontend/next.config.js @@ -6,14 +6,6 @@ const nextConfig = { ignoreDuringBuilds: true, }, images: { unoptimized: true }, - webpack: (config) => { - config.resolve = config.resolve || {}; - config.resolve.alias = { - ...(config.resolve.alias || {}), - phaser3spectorjs: false, - }; - return config; - }, }; module.exports = nextConfig; diff --git a/app-instance/frontend/package-lock.json b/app-instance/frontend/package-lock.json index 7fc3e2a..6511c69 100644 --- a/app-instance/frontend/package-lock.json +++ b/app-instance/frontend/package-lock.json @@ -1,93 +1,48 @@ { - "name": "nextjs", + "name": "beaver-app-instance-frontend", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "nextjs", + "name": "beaver-app-instance-frontend", "version": "0.1.0", "dependencies": { - "@hookform/resolvers": "^3.9.0", "@next/swc-wasm-nodejs": "13.5.1", - "@radix-ui/react-accordion": "^1.2.0", - "@radix-ui/react-alert-dialog": "^1.1.1", - "@radix-ui/react-aspect-ratio": "^1.1.0", "@radix-ui/react-avatar": "^1.1.0", - "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-collapsible": "^1.1.0", - "@radix-ui/react-context-menu": "^2.2.1", "@radix-ui/react-dialog": "^1.1.1", - "@radix-ui/react-dropdown-menu": "^2.1.1", - "@radix-ui/react-hover-card": "^1.1.1", "@radix-ui/react-label": "^2.1.0", - "@radix-ui/react-menubar": "^1.1.1", - "@radix-ui/react-navigation-menu": "^1.2.0", "@radix-ui/react-popover": "^1.1.1", - "@radix-ui/react-progress": "^1.1.0", - "@radix-ui/react-radio-group": "^1.2.0", "@radix-ui/react-scroll-area": "^1.1.0", "@radix-ui/react-select": "^2.1.1", "@radix-ui/react-separator": "^1.1.0", - "@radix-ui/react-slider": "^1.2.0", "@radix-ui/react-slot": "^1.1.0", "@radix-ui/react-switch": "^1.1.0", "@radix-ui/react-tabs": "^1.1.0", - "@radix-ui/react-toast": "^1.2.15", - "@radix-ui/react-toggle": "^1.1.0", - "@radix-ui/react-toggle-group": "^1.1.0", - "@radix-ui/react-tooltip": "^1.1.2", - "@supabase/supabase-js": "^2.58.0", "@tailwindcss/typography": "^0.5.19", - "@types/file-saver": "^2.0.7", - "@types/jspdf": "^1.3.3", "@types/node": "20.6.2", "@types/react": "18.2.22", "@types/react-dom": "18.2.7", "autoprefixer": "10.4.15", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", - "cmdk": "^1.0.0", - "date-fns": "^3.6.0", - "docx": "^9.5.1", - "echarts": "^6.0.0", - "echarts-for-react": "^3.0.5", - "embla-carousel-react": "^8.3.0", "eslint": "8.49.0", "eslint-config-next": "13.5.1", - "file-saver": "^2.0.5", - "input-otp": "^1.2.4", - "jspdf": "^3.0.3", - "jspdf-autotable": "^5.0.2", "lucide-react": "^0.446.0", "next": "13.5.1", - "next-themes": "^0.3.0", - "pdfmake": "^0.2.20", - "pdfmake-with-chinese-fonts": "^1.0.16", - "phaser": "^3.90.0", "postcss": "8.4.30", "react": "18.2.0", - "react-day-picker": "^8.10.1", "react-dom": "18.2.0", - "react-force-graph-2d": "^1.29.0", - "react-hook-form": "^7.53.0", "react-markdown": "^10.1.0", - "react-resizable-panels": "^2.1.3", - "react-resize-detector": "^12.3.0", - "recharts": "^2.12.7", "remark-gfm": "^4.0.1", - "sonner": "^1.5.0", "tailwind-merge": "^2.5.2", "tailwindcss": "3.3.3", "tailwindcss-animate": "^1.0.7", "typescript": "5.2.2", - "vaul": "^0.9.9", - "xlsx": "^0.18.5", - "zod": "^3.23.8", "zustand": "^5.0.8" }, "devDependencies": { - "@types/pdfmake": "^0.2.12", "vite-tsconfig-paths": "^4.3.2", "vitest": "^1.6.1" } @@ -103,15 +58,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/runtime": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", - "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", @@ -589,79 +535,6 @@ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==" }, - "node_modules/@foliojs-fork/fontkit": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@foliojs-fork/fontkit/-/fontkit-1.9.2.tgz", - "integrity": "sha512-IfB5EiIb+GZk+77TRB86AHroVaqfq8JRFlUbz0WEwsInyCG0epX2tCPOy+UfaWPju30DeVoUAXfzWXmhn753KA==", - "license": "MIT", - "dependencies": { - "@foliojs-fork/restructure": "^2.0.2", - "brotli": "^1.2.0", - "clone": "^1.0.4", - "deep-equal": "^1.0.0", - "dfa": "^1.2.0", - "tiny-inflate": "^1.0.2", - "unicode-properties": "^1.2.2", - "unicode-trie": "^2.0.0" - } - }, - "node_modules/@foliojs-fork/fontkit/node_modules/deep-equal": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", - "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", - "license": "MIT", - "dependencies": { - "is-arguments": "^1.1.1", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.5.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@foliojs-fork/linebreak": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@foliojs-fork/linebreak/-/linebreak-1.1.2.tgz", - "integrity": "sha512-ZPohpxxbuKNE0l/5iBJnOAfUaMACwvUIKCvqtWGKIMv1lPYoNjYXRfhi9FeeV9McBkBLxsMFWTVVhHJA8cyzvg==", - "license": "MIT", - "dependencies": { - "base64-js": "1.3.1", - "unicode-trie": "^2.0.0" - } - }, - "node_modules/@foliojs-fork/pdfkit": { - "version": "0.15.3", - "resolved": "https://registry.npmjs.org/@foliojs-fork/pdfkit/-/pdfkit-0.15.3.tgz", - "integrity": "sha512-Obc0Wmy3bm7BINFVvPhcl2rnSSK61DQrlHU8aXnAqDk9LCjWdUOPwhgD8Ywz5VtuFjRxmVOM/kQ/XLIBjDvltw==", - "license": "MIT", - "dependencies": { - "@foliojs-fork/fontkit": "^1.9.2", - "@foliojs-fork/linebreak": "^1.1.1", - "crypto-js": "^4.2.0", - "jpeg-exif": "^1.1.4", - "png-js": "^1.0.0" - } - }, - "node_modules/@foliojs-fork/restructure": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@foliojs-fork/restructure/-/restructure-2.0.2.tgz", - "integrity": "sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA==", - "license": "MIT" - }, - "node_modules/@hookform/resolvers": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.9.0.tgz", - "integrity": "sha512-bU0Gr4EepJ/EQsH/IwEzYLsT/PEj5C0ynLQ4m+GSHS+xKH4TfSelhluTgOaoc4kA5s7eCsQbM4wvZLzELmWzUg==", - "peerDependencies": { - "react-hook-form": "^7.0.0" - } - }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", @@ -1004,63 +877,6 @@ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" }, - "node_modules/@radix-ui/react-accordion": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.1.tgz", - "integrity": "sha512-bg/l7l5QzUjgsh8kjwDFommzAshnUsuVMV5NM56QVCm+7ZckYdd9P/ExR8xG/Oup0OajVxNLaHJ1tb8mXk+nzQ==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collapsible": "1.1.1", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-controllable-state": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-alert-dialog": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.2.tgz", - "integrity": "sha512-eGSlLzPhKO+TErxkiGcCZGuvbVMnLA1MTnyBksGOeGRGkxHiiJUujsjmNTdWTm4iHVSRaUao9/4Ur671auMghQ==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-dialog": "1.1.2", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-arrow": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz", @@ -1083,28 +899,6 @@ } } }, - "node_modules/@radix-ui/react-aspect-ratio": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.0.tgz", - "integrity": "sha512-dP87DM/Y7jFlPgUZTlhx6FF5CEzOiaxp2rBCKlaXlpH5Ip/9Fg5zZ9lDOQ5o/MOfUlf36eak14zoWYpgcgGoOg==", - "dependencies": { - "@radix-ui/react-primitive": "2.0.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-avatar": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-avatar/-/react-avatar-1.1.1.tgz", @@ -1130,35 +924,6 @@ } } }, - "node_modules/@radix-ui/react-checkbox": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.1.2.tgz", - "integrity": "sha512-/i0fl686zaJbDQLNKrkCbMyDm6FQMt4jg323k7HuqitoANm9sE23Ql8yOK3Wusk34HSLKDChhMux05FnP6KUkw==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-presence": "1.1.1", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-previous": "1.1.0", - "@radix-ui/react-use-size": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-collapsible": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.1.tgz", @@ -1255,33 +1020,6 @@ } } }, - "node_modules/@radix-ui/react-context-menu": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context-menu/-/react-context-menu-2.2.2.tgz", - "integrity": "sha512-99EatSTpW+hRYHt7m8wdDlLtkmTovEe8Z/hnxUPV+SKuuNL5HWNhQI4QSdjZqNSgXHay2z4M3Dym73j9p2Gx5Q==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-menu": "2.1.2", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-dialog": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.2.tgz", @@ -1357,34 +1095,6 @@ } } }, - "node_modules/@radix-ui/react-dropdown-menu": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.2.tgz", - "integrity": "sha512-GVZMR+eqK8/Kes0a36Qrv+i20bAPXSn8rCBTHx30w+3ECnR5o3xixAlqcVaYvLeyKUsm0aqyhWfmUcqufM8nYA==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-menu": "2.1.2", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-controllable-state": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-focus-guards": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz", @@ -1423,36 +1133,6 @@ } } }, - "node_modules/@radix-ui/react-hover-card": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-hover-card/-/react-hover-card-1.1.2.tgz", - "integrity": "sha512-Y5w0qGhysvmqsIy6nQxaPa6mXNKznfoGjOfBgzOjocLxr2XlSjqBMYQQL+FfyogsMuX+m8cZyQGYhJxvxUzO4w==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.1", - "@radix-ui/react-popper": "1.2.0", - "@radix-ui/react-portal": "1.1.2", - "@radix-ui/react-presence": "1.1.1", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-controllable-state": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-id": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", @@ -1492,111 +1172,6 @@ } } }, - "node_modules/@radix-ui/react-menu": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.2.tgz", - "integrity": "sha512-lZ0R4qR2Al6fZ4yCCZzu/ReTFrylHFxIqy7OezIpWF4bL0o9biKo0pFIvkaew3TyZ9Fy5gYVrR5zCGZBVbO1zg==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.1", - "@radix-ui/react-focus-guards": "1.1.1", - "@radix-ui/react-focus-scope": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-popper": "1.2.0", - "@radix-ui/react-portal": "1.1.2", - "@radix-ui/react-presence": "1.1.1", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-roving-focus": "1.1.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.6.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-menubar": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-menubar/-/react-menubar-1.1.2.tgz", - "integrity": "sha512-cKmj5Gte7LVyuz+8gXinxZAZECQU+N7aq5pw7kUPpx3xjnDXDbsdzHtCCD2W72bwzy74AvrqdYnKYS42ueskUQ==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-menu": "2.1.2", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-roving-focus": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-navigation-menu": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.1.tgz", - "integrity": "sha512-egDo0yJD2IK8L17gC82vptkvW1jLeni1VuqCyzY727dSJdk5cDjINomouLoNk8RVF7g2aNIfENKWL4UzeU9c8Q==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.1", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-presence": "1.1.1", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-use-previous": "1.1.0", - "@radix-ui/react-visually-hidden": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-popover": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.2.tgz", @@ -1746,74 +1321,6 @@ } } }, - "node_modules/@radix-ui/react-progress": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-progress/-/react-progress-1.1.0.tgz", - "integrity": "sha512-aSzvnYpP725CROcxAOEBVZZSIQVQdHgBr2QQFKySsaD14u8dNT0batuXI+AAGDdAHfXH8rbnHmjYFqVJ21KkRg==", - "dependencies": { - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-primitive": "2.0.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-progress/node_modules/@radix-ui/react-context": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", - "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-radio-group": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-radio-group/-/react-radio-group-1.2.1.tgz", - "integrity": "sha512-kdbv54g4vfRjja9DNWPMxKvXblzqbpEC8kspEkZ6dVP7kQksGCn+iZHkcCz2nb00+lPdRvxrqy4WrvvV1cNqrQ==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-presence": "1.1.1", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-roving-focus": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-previous": "1.1.0", - "@radix-ui/react-use-size": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-roving-focus": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz", @@ -1952,38 +1459,6 @@ } } }, - "node_modules/@radix-ui/react-slider": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.2.1.tgz", - "integrity": "sha512-bEzQoDW0XP+h/oGbutF5VMWJPAl/UU8IJjr7h02SOHDIIIxq+cep8nItVNoBV+OMmahCdqdF38FTpmXoqQUGvw==", - "dependencies": { - "@radix-ui/number": "1.1.0", - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-collection": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0", - "@radix-ui/react-use-previous": "1.1.0", - "@radix-ui/react-use-size": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", @@ -2058,407 +1533,6 @@ } } }, - "node_modules/@radix-ui/react-toast": { - "version": "1.2.15", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.15.tgz", - "integrity": "sha512-3OSz3TacUWy4WtOXV38DggwxoqJK4+eDkNMl5Z/MJZaoUPaP4/9lf81xXMe1I2ReTAptverZUpbPY4wWwWyL5g==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-collection": "1.1.7", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-dismissable-layer": "1.1.11", - "@radix-ui/react-portal": "1.1.9", - "@radix-ui/react-presence": "1.1.5", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-controllable-state": "1.2.2", - "@radix-ui/react-use-layout-effect": "1.1.1", - "@radix-ui/react-visually-hidden": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/primitive": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.3.tgz", - "integrity": "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==", - "license": "MIT" - }, - "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-collection": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.7.tgz", - "integrity": "sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-context": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-context": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.2.tgz", - "integrity": "sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.11.tgz", - "integrity": "sha512-Nqcp+t5cTB8BinFkZgXiMJniQH0PsUt2k51FUhbdfeKvc4ACcG2uQniY/8+h1Yv6Kza4Q7lD7PQV0z0oicE0Mg==", - "license": "MIT", - "dependencies": { - "@radix-ui/primitive": "1.1.3", - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-callback-ref": "1.1.1", - "@radix-ui/react-use-escape-keydown": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-portal": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.9.tgz", - "integrity": "sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-presence": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.5.tgz", - "integrity": "sha512-/jfEwNDdQVBCNvjkGit4h6pMOzq8bHkopq458dPt2lMjx+eBQUohZNG9A7DtO/O5ukSbxuaNGXMjHicgwy6rQQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-primitive": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.1.3.tgz", - "integrity": "sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-slot": "1.2.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.1.tgz", - "integrity": "sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.2.2.tgz", - "integrity": "sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-effect-event": "0.0.2", - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.1.tgz", - "integrity": "sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toast/node_modules/@radix-ui/react-visually-hidden": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.2.3.tgz", - "integrity": "sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-primitive": "2.1.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toggle": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle/-/react-toggle-1.1.0.tgz", - "integrity": "sha512-gwoxaKZ0oJ4vIgzsfESBuSgJNdc0rv12VhHgcqN0TEJmmZixXG/2XpsLK8kzNWYcnaoRIEEQc0bEi3dIvdUpjw==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-controllable-state": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toggle-group": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.0.tgz", - "integrity": "sha512-PpTJV68dZU2oqqgq75Uzto5o/XfOVgkrJ9rulVmfTKxWp3HfUjHE6CP/WLRR4AzPX9HWxw7vFow2me85Yu+Naw==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-direction": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-roving-focus": "1.1.0", - "@radix-ui/react-toggle": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-toggle-group/node_modules/@radix-ui/react-context": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", - "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-tooltip": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.3.tgz", - "integrity": "sha512-Z4w1FIS0BqVFI2c1jZvb/uDVJijJjJ2ZMuPV81oVgTZ7g3BZxobplnMVvXtFWgtozdvYJ+MFWtwkM5S2HnAong==", - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.1", - "@radix-ui/react-dismissable-layer": "1.1.1", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-popper": "1.2.0", - "@radix-ui/react-portal": "1.1.2", - "@radix-ui/react-presence": "1.1.1", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "@radix-ui/react-visually-hidden": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-use-callback-ref": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", @@ -2490,39 +1564,6 @@ } } }, - "node_modules/@radix-ui/react-use-effect-event": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-effect-event/-/react-use-effect-event-0.0.2.tgz", - "integrity": "sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==", - "license": "MIT", - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-effect-event/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.1.tgz", - "integrity": "sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==", - "license": "MIT", - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/@radix-ui/react-use-escape-keydown": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", @@ -2996,73 +2037,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@supabase/auth-js": { - "version": "2.72.0", - "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.72.0.tgz", - "integrity": "sha512-4+bnUrtTDK1YD0/FCx2YtMiQH5FGu9Jlf4IQi5kcqRwRwqp2ey39V61nHNdH86jm3DIzz0aZKiWfTW8qXk1swQ==", - "dependencies": { - "@supabase/node-fetch": "^2.6.14" - } - }, - "node_modules/@supabase/functions-js": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.5.0.tgz", - "integrity": "sha512-SXBx6Jvp+MOBekeKFu+G11YLYPeVeGQl23eYyAG9+Ro0pQ1aIP0UZNIBxHKNHqxzR0L0n6gysNr2KT3841NATw==", - "dependencies": { - "@supabase/node-fetch": "^2.6.14" - } - }, - "node_modules/@supabase/node-fetch": { - "version": "2.6.15", - "resolved": "https://registry.npmjs.org/@supabase/node-fetch/-/node-fetch-2.6.15.tgz", - "integrity": "sha512-1ibVeYUacxWYi9i0cf5efil6adJ9WRyZBLivgjs+AUpewx1F3xPi7gLgaASI2SmIQxPoCEjAsLAzKPgMJVgOUQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - } - }, - "node_modules/@supabase/postgrest-js": { - "version": "1.21.4", - "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-1.21.4.tgz", - "integrity": "sha512-TxZCIjxk6/dP9abAi89VQbWWMBbybpGWyvmIzTd79OeravM13OjR/YEYeyUOPcM1C3QyvXkvPZhUfItvmhY1IQ==", - "dependencies": { - "@supabase/node-fetch": "^2.6.14" - } - }, - "node_modules/@supabase/realtime-js": { - "version": "2.15.5", - "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.15.5.tgz", - "integrity": "sha512-/Rs5Vqu9jejRD8ZeuaWXebdkH+J7V6VySbCZ/zQM93Ta5y3mAmocjioa/nzlB6qvFmyylUgKVS1KpE212t30OA==", - "dependencies": { - "@supabase/node-fetch": "^2.6.13", - "@types/phoenix": "^1.6.6", - "@types/ws": "^8.18.1", - "ws": "^8.18.2" - } - }, - "node_modules/@supabase/storage-js": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.12.2.tgz", - "integrity": "sha512-SiySHxi3q7gia7NBYpsYRu8gyI0NhFwSORMxbZIxJ/zAVkN6QpwDRan158CJ+UdzD4WB/rQMAGRqIJQP+7ccAQ==", - "dependencies": { - "@supabase/node-fetch": "^2.6.14" - } - }, - "node_modules/@supabase/supabase-js": { - "version": "2.58.0", - "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.58.0.tgz", - "integrity": "sha512-Tm1RmQpoAKdQr4/8wiayGti/no+If7RtveVZjHR8zbO7hhQjmPW2Ok5ZBPf1MGkt5c+9R85AVMsTfSaqAP1sUg==", - "dependencies": { - "@supabase/auth-js": "2.72.0", - "@supabase/functions-js": "2.5.0", - "@supabase/node-fetch": "2.6.15", - "@supabase/postgrest-js": "1.21.4", - "@supabase/realtime-js": "2.15.5", - "@supabase/storage-js": "2.12.2" - } - }, "node_modules/@swc/helpers": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", @@ -3096,66 +2070,6 @@ "node": ">=4" } }, - "node_modules/@tweenjs/tween.js": { - "version": "25.0.0", - "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-25.0.0.tgz", - "integrity": "sha512-XKLA6syeBUaPzx4j3qwMqzzq+V4uo72BnlbOjmuljLrRqdsd3qnzvZZoxvMHZ23ndsRS4aufU6JOZYpCbU6T1A==", - "license": "MIT" - }, - "node_modules/@types/d3-array": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", - "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==" - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" - }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==" - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==" - }, - "node_modules/@types/d3-scale": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", - "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-shape": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", - "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", - "dependencies": { - "@types/d3-path": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", - "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==" - }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" - }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -3180,12 +2094,6 @@ "@types/estree": "*" } }, - "node_modules/@types/file-saver": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.7.tgz", - "integrity": "sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==", - "license": "MIT" - }, "node_modules/@types/hast": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", @@ -3200,12 +2108,6 @@ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" }, - "node_modules/@types/jspdf": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@types/jspdf/-/jspdf-1.3.3.tgz", - "integrity": "sha512-DqwyAKpVuv+7DniCp2Deq1xGvfdnKSNgl9Agun2w6dFvR5UKamiv4VfYUgcypd8S9ojUyARFIlZqBrYrBMQlew==", - "license": "MIT" - }, "node_modules/@types/mdast": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", @@ -3226,50 +2128,11 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.2.tgz", "integrity": "sha512-Y+/1vGBHV/cYk6OI1Na/LHzwnlNCAfU3ZNGrc1LdRe/LAIbdDPTTv/HU3M7yXN448aTVDq3eKRm2cg7iKLb8gw==" }, - "node_modules/@types/pako": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/pako/-/pako-2.0.4.tgz", - "integrity": "sha512-VWDCbrLeVXJM9fihYodcLiIv0ku+AlOa/TQ1SvYOaBuyrSKgEcro95LJyIsJ4vSo6BXIxOKxiJAat04CmST9Fw==", - "license": "MIT" - }, - "node_modules/@types/pdfkit": { - "version": "0.17.3", - "resolved": "https://registry.npmmirror.com/@types/pdfkit/-/pdfkit-0.17.3.tgz", - "integrity": "sha512-E4tp2qFaghqfS4K5TR4Gn1uTIkg0UAkhUgvVIszr5cS6ZmbioPWEkvhNDy3GtR9qdKC8DLQAnaaMlTcf346VsA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/pdfmake": { - "version": "0.2.12", - "resolved": "https://registry.npmmirror.com/@types/pdfmake/-/pdfmake-0.2.12.tgz", - "integrity": "sha512-YV3oY+J1eSHVH22fPuevE2kQdWvrpkEgYyHacExxgr//ZPjCitAggnysGjx/2VgiH0lEAGQ+5R+wZUGbAXn1Qg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/pdfkit": "*" - } - }, - "node_modules/@types/phoenix": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.6.tgz", - "integrity": "sha512-PIzZZlEppgrpoT2QgbnDU+MMzuR6BbCjllj0bM70lWoejMeNJAxCchxnv7J3XFkI8MpygtRpzXrIlmWUBclP5A==" - }, "node_modules/@types/prop-types": { "version": "15.7.13", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==" }, - "node_modules/@types/raf": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.3.tgz", - "integrity": "sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==", - "license": "MIT", - "optional": true - }, "node_modules/@types/react": { "version": "18.2.22", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.22.tgz", @@ -3293,27 +2156,12 @@ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.23.0.tgz", "integrity": "sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw==" }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "license": "MIT", - "optional": true - }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "license": "MIT" }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@typescript-eslint/parser": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", @@ -3543,15 +2391,6 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/accessor-fn": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/accessor-fn/-/accessor-fn-1.5.3.tgz", - "integrity": "sha512-rkAofCwe/FvYFUlMB0v0gWmhqtfAtV1IUkdPbfhTUyYniu5LrC0A0UJkTH0Jv3S8SvwkmfuAlY+mQIJATdocMA==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, "node_modules/acorn": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", @@ -3585,15 +2424,6 @@ "node": ">=0.4.0" } }, - "node_modules/adler-32": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz", - "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -3923,32 +2753,6 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/base64-arraybuffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", - "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", - "license": "MIT" - }, - "node_modules/bezier-js": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-6.1.4.tgz", - "integrity": "sha512-PA0FW9ZpcHbojUCMu28z9Vg/fNkwTj5YhusSAjHHDfHDGLxJ6YUKrAN2vk1fP2MMOxVw4Oko16FMlRGVBGqLKg==", - "license": "MIT", - "funding": { - "type": "individual", - "url": "https://github.com/Pomax/bezierjs/blob/master/FUNDING.md" - } - }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -3980,15 +2784,6 @@ "node": ">=8" } }, - "node_modules/brotli": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", - "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", - "license": "MIT", - "dependencies": { - "base64-js": "^1.1.2" - } - }, "node_modules/browserslist": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", @@ -4094,38 +2889,6 @@ } ] }, - "node_modules/canvas-color-tracker": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/canvas-color-tracker/-/canvas-color-tracker-1.3.2.tgz", - "integrity": "sha512-ryQkDX26yJ3CXzb3hxUVNlg1NKE4REc5crLBq661Nxzr8TNd236SaEf2ffYLXyI5tSABSeguHLqcVq4vf9L3Zg==", - "license": "MIT", - "dependencies": { - "tinycolor2": "^1.6.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/canvg": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/canvg/-/canvg-3.0.11.tgz", - "integrity": "sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA==", - "license": "MIT", - "optional": true, - "dependencies": { - "@babel/runtime": "^7.12.5", - "@types/raf": "^3.4.0", - "core-js": "^3.8.3", - "raf": "^3.4.1", - "regenerator-runtime": "^0.13.7", - "rgbcolor": "^1.0.1", - "stackblur-canvas": "^2.0.0", - "svg-pathdata": "^6.0.3" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", @@ -4136,19 +2899,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/cfb": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz", - "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", - "license": "Apache-2.0", - "dependencies": { - "adler-32": "~1.3.0", - "crc-32": "~1.2.0" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/chai": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", @@ -4294,15 +3044,6 @@ "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -4311,375 +3052,6 @@ "node": ">=6" } }, - "node_modules/cmdk": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.0.0.tgz", - "integrity": "sha512-gDzVf0a09TvoJ5jnuPvygTB77+XdOSwEmJ88L6XPFPlv7T3RxbP9jgenfylrAMD0+Le1aO0nVjQUzl2g+vjz5Q==", - "dependencies": { - "@radix-ui/react-dialog": "1.0.5", - "@radix-ui/react-primitive": "1.0.3" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.1.tgz", - "integrity": "sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==", - "dependencies": { - "@babel/runtime": "^7.13.10" - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-compose-refs": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz", - "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-context": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.1.tgz", - "integrity": "sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-dialog": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.0.5.tgz", - "integrity": "sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-context": "1.0.1", - "@radix-ui/react-dismissable-layer": "1.0.5", - "@radix-ui/react-focus-guards": "1.0.1", - "@radix-ui/react-focus-scope": "1.0.4", - "@radix-ui/react-id": "1.0.1", - "@radix-ui/react-portal": "1.0.4", - "@radix-ui/react-presence": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-slot": "1.0.2", - "@radix-ui/react-use-controllable-state": "1.0.1", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.5" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.5.tgz", - "integrity": "sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/primitive": "1.0.1", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1", - "@radix-ui/react-use-escape-keydown": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-focus-guards": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.1.tgz", - "integrity": "sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-focus-scope": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.4.tgz", - "integrity": "sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-primitive": "1.0.3", - "@radix-ui/react-use-callback-ref": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-id": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.1.tgz", - "integrity": "sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-layout-effect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-portal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.4.tgz", - "integrity": "sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-primitive": "1.0.3" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-presence": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.1.tgz", - "integrity": "sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1", - "@radix-ui/react-use-layout-effect": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-primitive": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz", - "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-slot": "1.0.2" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-slot": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", - "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-compose-refs": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.1.tgz", - "integrity": "sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.1.tgz", - "integrity": "sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.3.tgz", - "integrity": "sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==", - "dependencies": { - "@babel/runtime": "^7.13.10", - "@radix-ui/react-use-callback-ref": "1.0.1" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.1.tgz", - "integrity": "sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==", - "dependencies": { - "@babel/runtime": "^7.13.10" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/cmdk/node_modules/react-remove-scroll": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz", - "integrity": "sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==", - "dependencies": { - "react-remove-scroll-bar": "^2.3.3", - "react-style-singleton": "^2.2.1", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/codepage": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz", - "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -4726,36 +3098,6 @@ "dev": true, "license": "MIT" }, - "node_modules/core-js": { - "version": "3.46.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.46.0.tgz", - "integrity": "sha512-vDMm9B0xnqqZ8uSBpZ8sNtRtOdmfShrvT6h2TuQGLs0Is+cR0DYbj/KWP6ALVNbWPpqA/qPLoOuppJN07humpA==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "license": "Apache-2.0", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -4769,22 +3111,6 @@ "node": ">= 8" } }, - "node_modules/crypto-js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", - "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", - "license": "MIT" - }, - "node_modules/css-line-break": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz", - "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==", - "license": "MIT", - "optional": true, - "dependencies": { - "utrie": "^1.0.2" - } - }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -4801,232 +3127,6 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, - "node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-binarytree": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/d3-binarytree/-/d3-binarytree-1.0.2.tgz", - "integrity": "sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw==", - "license": "MIT" - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-force-3d": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/d3-force-3d/-/d3-force-3d-3.0.6.tgz", - "integrity": "sha512-4tsKHUPLOVkyfEffZo1v6sFHvGFwAIIjt/W8IThbp08DYAsXZck+2pSHEG5W1+gQgEvFLdZkYvmJAbRM2EzMnA==", - "license": "MIT", - "dependencies": { - "d3-binarytree": "1", - "d3-dispatch": "1 - 3", - "d3-octree": "1", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-octree": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-octree/-/d3-octree-1.1.0.tgz", - "integrity": "sha512-F8gPlqpP+HwRPMO/8uOu5wjH110+6q4cgJvgJT6vlpy3BEaDIKlTZrgHKZSp/i1InRpVfh4puY/kvL6MxK930A==", - "license": "MIT" - }, - "node_modules/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "dependencies": { - "d3-path": "^3.1.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -5080,15 +3180,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/date-fns": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", - "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } - }, "node_modules/debug": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", @@ -5105,11 +3196,6 @@ } } }, - "node_modules/decimal.js-light": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", - "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" - }, "node_modules/decode-named-character-reference": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz", @@ -5231,12 +3317,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/dfa": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", - "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==", - "license": "MIT" - }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -5279,134 +3359,16 @@ "node": ">=6.0.0" } }, - "node_modules/docx": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/docx/-/docx-9.5.1.tgz", - "integrity": "sha512-ABDI7JEirFD2+bHhOBlsGZxaG1UgZb2M/QMKhLSDGgVNhxDesTCDcP+qoDnDGjZ4EOXTRfUjUgwHVuZ6VSTfWQ==", - "license": "MIT", - "dependencies": { - "@types/node": "^24.0.1", - "hash.js": "^1.1.7", - "jszip": "^3.10.1", - "nanoid": "^5.1.3", - "xml": "^1.0.1", - "xml-js": "^1.6.8" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/docx/node_modules/@types/node": { - "version": "24.9.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.1.tgz", - "integrity": "sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==", - "license": "MIT", - "dependencies": { - "undici-types": "~7.16.0" - } - }, - "node_modules/docx/node_modules/nanoid": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.6.tgz", - "integrity": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/dompurify": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.0.tgz", - "integrity": "sha512-r+f6MYR1gGN1eJv0TVQbhA7if/U7P87cdPl3HN5rikqaBSBxLiCb/b9O+2eG0cxz0ghyU+mU1QkbsOwERMYlWQ==", - "license": "(MPL-2.0 OR Apache-2.0)", - "optional": true, - "optionalDependencies": { - "@types/trusted-types": "^2.0.7" - } - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, - "node_modules/echarts": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/echarts/-/echarts-6.0.0.tgz", - "integrity": "sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "2.3.0", - "zrender": "6.0.0" - } - }, - "node_modules/echarts-for-react": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/echarts-for-react/-/echarts-for-react-3.0.5.tgz", - "integrity": "sha512-YpEI5Ty7O/2nvCfQ7ybNa+S90DwE8KYZWacGvJW4luUqywP7qStQ+pxDlYOmr4jGDu10mhEkiAuMKcUlT4W5vg==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "size-sensor": "^1.0.1" - }, - "peerDependencies": { - "echarts": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", - "react": "^15.0.0 || >=16.0.0" - } - }, - "node_modules/echarts/node_modules/tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", - "license": "0BSD" - }, "node_modules/electron-to-chromium": { "version": "1.5.34", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.34.tgz", "integrity": "sha512-/TZAiChbAflBNjCg+VvstbcwAtIL/VdMFO3NgRFIzBjpvPzWOTIbbO8kNb6RwU4bt9TP7K+3KqBKw/lOU+Y+GA==" }, - "node_modules/embla-carousel": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.3.0.tgz", - "integrity": "sha512-Ve8dhI4w28qBqR8J+aMtv7rLK89r1ZA5HocwFz6uMB/i5EiC7bGI7y+AM80yAVUJw3qqaZYK7clmZMUR8kM3UA==" - }, - "node_modules/embla-carousel-react": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/embla-carousel-react/-/embla-carousel-react-8.3.0.tgz", - "integrity": "sha512-P1FlinFDcIvggcErRjNuVqnUR8anyo8vLMIH8Rthgofw7Nj8qTguCa2QjFAbzxAUTQTPNNjNL7yt0BGGinVdFw==", - "dependencies": { - "embla-carousel": "8.3.0", - "embla-carousel-reactive-utils": "8.3.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.1 || ^18.0.0" - } - }, - "node_modules/embla-carousel-reactive-utils": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.3.0.tgz", - "integrity": "sha512-EYdhhJ302SC4Lmkx8GRsp0sjUhEN4WyFXPOk0kGu9OXZSRMmcBlRgTvHcq8eKJE1bXWBsOi1T83B+BSSVZSmwQ==", - "peerDependencies": { - "embla-carousel": "8.3.0" - } - }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -5593,16 +3555,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-toolkit": { - "version": "1.42.0", - "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.42.0.tgz", - "integrity": "sha512-SLHIyY7VfDJBM8clz4+T2oquwTQxEzu263AyhVK4jREOAwJ+8eebaa4wM3nlvnAqhDrMm2EsA6hWHaQsMPQ1nA==", - "license": "MIT", - "workspaces": [ - "docs", - "benchmarks" - ] - }, "node_modules/esbuild": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", @@ -6081,11 +4033,6 @@ "node": ">=0.10.0" } }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, "node_modules/execa": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", @@ -6121,14 +4068,6 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, - "node_modules/fast-equals": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz", - "integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", @@ -6165,17 +4104,6 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, - "node_modules/fast-png": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/fast-png/-/fast-png-6.4.0.tgz", - "integrity": "sha512-kAqZq1TlgBjZcLr5mcN6NP5Rv4V2f22z00c3g8vRrwkcqjerx7BEhPbOnWCPqaHUl2XWQBJQvOT/FQhdMT7X/Q==", - "license": "MIT", - "dependencies": { - "@types/pako": "^2.0.3", - "iobuffer": "^5.3.2", - "pako": "^2.1.0" - } - }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", @@ -6184,12 +4112,6 @@ "reusify": "^1.0.4" } }, - "node_modules/fflate": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", - "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", - "license": "MIT" - }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -6201,12 +4123,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/file-saver": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", - "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==", - "license": "MIT" - }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -6251,20 +4167,6 @@ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" }, - "node_modules/float-tooltip": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/float-tooltip/-/float-tooltip-1.7.5.tgz", - "integrity": "sha512-/kXzuDnnBqyyWyhDMH7+PfP8J/oXiAavGzcRxASOMRHFuReDtofizLLJsf7nnDLAfEaMW4pVWaXrAjtnglpEkg==", - "license": "MIT", - "dependencies": { - "d3-selection": "2 - 3", - "kapsule": "^1.16", - "preact": "10" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -6273,32 +4175,6 @@ "is-callable": "^1.1.3" } }, - "node_modules/force-graph": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/force-graph/-/force-graph-1.51.0.tgz", - "integrity": "sha512-aTnihCmiMA0ItLJLCbrQYS9mzriopW24goFPgUnKAAmAlPogTSmFWqoBPMXzIfPb7bs04Hur5zEI4WYgLW3Sig==", - "license": "MIT", - "dependencies": { - "@tweenjs/tween.js": "18 - 25", - "accessor-fn": "1", - "bezier-js": "3 - 6", - "canvas-color-tracker": "^1.3", - "d3-array": "1 - 3", - "d3-drag": "2 - 3", - "d3-force-3d": "2 - 3", - "d3-scale": "1 - 4", - "d3-scale-chromatic": "1 - 3", - "d3-selection": "2 - 3", - "d3-zoom": "2 - 3", - "float-tooltip": "^1.7", - "index-array-by": "1", - "kapsule": "^1.16", - "lodash-es": "4" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/foreground-child": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", @@ -6314,15 +4190,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/frac": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", - "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, "node_modules/fraction.js": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", @@ -6637,16 +4504,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -6708,20 +4565,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/html2canvas": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/html2canvas/-/html2canvas-1.4.1.tgz", - "integrity": "sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==", - "license": "MIT", - "optional": true, - "dependencies": { - "css-line-break": "^2.1.0", - "text-segmentation": "^1.0.3" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/human-signals": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", @@ -6732,18 +4575,6 @@ "node": ">=16.17.0" } }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -6752,12 +4583,6 @@ "node": ">= 4" } }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "license": "MIT" - }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -6781,15 +4606,6 @@ "node": ">=0.8.19" } }, - "node_modules/index-array-by": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/index-array-by/-/index-array-by-1.4.2.tgz", - "integrity": "sha512-SP23P27OUKzXWEC/TOyWlwLviofQkCSCKONnc62eItjp69yCZZPqDQtr3Pw5gJDnPeUMqExmKydNZaJO0FU9pw==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -6811,15 +4627,6 @@ "integrity": "sha512-gtGXVaBdl5mAes3rPcMedEBm12ibjt1kDMFfheul1wUAOVEJW60voNdMVzVkfLN06O7ZaD/rxhfKgtlgtTbMjg==", "license": "MIT" }, - "node_modules/input-otp": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/input-otp/-/input-otp-1.2.4.tgz", - "integrity": "sha512-md6rhmD+zmMnUh5crQNSQxq3keBRYvE3odbr4Qb9g2NWzQv9azi+t1a3X4TBTbh98fsGHgEEJlzbe1q860uGCA==", - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, "node_modules/internal-slot": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", @@ -6833,14 +4640,6 @@ "node": ">= 0.4" } }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "engines": { - "node": ">=12" - } - }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -6849,12 +4648,6 @@ "loose-envify": "^1.0.0" } }, - "node_modules/iobuffer": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/iobuffer/-/iobuffer-5.4.0.tgz", - "integrity": "sha512-DRebOWuqDvxunfkNJAlc3IzWIPD5xVxwUNbHr7xKB8E6aLJxIPfNX3CoMJghcFjpv6RWQsrcJbghtEwSPoJqMA==", - "license": "MIT" - }, "node_modules/is-alphabetical": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", @@ -7328,15 +5121,6 @@ "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/jerrypick": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/jerrypick/-/jerrypick-1.1.2.tgz", - "integrity": "sha512-YKnxXEekXKzhpf7CLYA0A+oDP8V0OhICNCr5lv96FvSsDEmrb0GKM776JgQvHTMjr7DTTPEVv/1Ciaw0uEWzBA==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, "node_modules/jiti": { "version": "1.21.6", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", @@ -7345,12 +5129,6 @@ "jiti": "bin/jiti.js" } }, - "node_modules/jpeg-exif": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/jpeg-exif/-/jpeg-exif-1.1.4.tgz", - "integrity": "sha512-a+bKEcCjtuW5WTdgeXFzswSrdqi0jk4XlEtZlx5A94wCoBpFjfFTbo/Tra5SpNCl/YFZPvcV1dJc+TAYeg6ROQ==", - "license": "MIT" - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -7393,32 +5171,6 @@ "json5": "lib/cli.js" } }, - "node_modules/jspdf": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-3.0.3.tgz", - "integrity": "sha512-eURjAyz5iX1H8BOYAfzvdPfIKK53V7mCpBTe7Kb16PaM8JSXEcUQNBQaiWMI8wY5RvNOPj4GccMjTlfwRBd+oQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.26.9", - "fast-png": "^6.2.0", - "fflate": "^0.8.1" - }, - "optionalDependencies": { - "canvg": "^3.0.11", - "core-js": "^3.6.0", - "dompurify": "^3.2.4", - "html2canvas": "^1.0.0-rc.5" - } - }, - "node_modules/jspdf-autotable": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/jspdf-autotable/-/jspdf-autotable-5.0.2.tgz", - "integrity": "sha512-YNKeB7qmx3pxOLcNeoqAv3qTS7KuvVwkFe5AduCawpop3NOkBUtqDToxNc225MlNecxT4kP2Zy3z/y/yvGdXUQ==", - "license": "MIT", - "peerDependencies": { - "jspdf": "^2 || ^3" - } - }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -7433,36 +5185,6 @@ "node": ">=4.0" } }, - "node_modules/jszip": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", - "license": "(MIT OR GPL-3.0-or-later)", - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "node_modules/jszip/node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "license": "(MIT AND Zlib)" - }, - "node_modules/kapsule": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/kapsule/-/kapsule-1.16.3.tgz", - "integrity": "sha512-4+5mNNf4vZDSwPhKprKwz3330iisPrb08JyMgbsdFrimBCKNHecua/WBwvVg3n7vwx0C1ARjfhwIpbrbd9n5wg==", - "license": "MIT", - "dependencies": { - "lodash-es": "4" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -7499,15 +5221,6 @@ "node": ">= 0.8.0" } }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "license": "MIT", - "dependencies": { - "immediate": "~3.0.5" - } - }, "node_modules/lilconfig": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", @@ -7552,17 +5265,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "license": "MIT" - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -8517,12 +6219,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "license": "ISC" - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -8654,15 +6350,6 @@ } } }, - "node_modules/next-themes": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.3.0.tgz", - "integrity": "sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w==", - "peerDependencies": { - "react": "^16.8 || ^17 || ^18", - "react-dom": "^16.8 || ^17 || ^18" - } - }, "node_modules/next/node_modules/postcss": { "version": "8.4.14", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", @@ -8943,12 +6630,6 @@ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" }, - "node_modules/pako": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==", - "license": "(MIT AND Zlib)" - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -9054,49 +6735,6 @@ "node": "*" } }, - "node_modules/pdfmake": { - "version": "0.2.20", - "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.2.20.tgz", - "integrity": "sha512-bGbxbGFP5p8PWNT3Phsu1ZcRLnRfF6jmnuKTkgmt6i5PZzSdX6JaB+NeTz9q+aocfW8SE9GUjL3o/5GroBqGcQ==", - "license": "MIT", - "dependencies": { - "@foliojs-fork/linebreak": "^1.1.2", - "@foliojs-fork/pdfkit": "^0.15.3", - "iconv-lite": "^0.6.3", - "xmldoc": "^2.0.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/pdfmake-with-chinese-fonts": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/pdfmake-with-chinese-fonts/-/pdfmake-with-chinese-fonts-1.0.16.tgz", - "integrity": "sha512-oELPEOo8U1rROX1hkGBvDJTGhwMQNrYVt6vkRgVN6nRNDF3vav+VKpuVv1xj04D3CNykLp5lNWNncsJ8ttxP4A==", - "license": "MIT" - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "license": "MIT", - "optional": true - }, - "node_modules/phaser": { - "version": "3.90.0", - "resolved": "https://registry.npmjs.org/phaser/-/phaser-3.90.0.tgz", - "integrity": "sha512-/cziz/5ZIn02uDkC9RzN8VF9x3Gs3XdFFf9nkiMEQT3p7hQlWuyjy4QWosU802qqno2YSLn2BfqwOKLv/sSVfQ==", - "license": "MIT", - "dependencies": { - "eventemitter3": "^5.0.1" - } - }, - "node_modules/phaser/node_modules/eventemitter3": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", - "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", - "license": "MIT" - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -9149,11 +6787,6 @@ "dev": true, "license": "MIT" }, - "node_modules/png-js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz", - "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g==" - }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", @@ -9309,16 +6942,6 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, - "node_modules/preact": { - "version": "10.27.2", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.27.2.tgz", - "integrity": "sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -9362,12 +6985,6 @@ "dev": true, "license": "MIT" }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -9415,16 +7032,6 @@ } ] }, - "node_modules/raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "license": "MIT", - "optional": true, - "dependencies": { - "performance-now": "^2.1.0" - } - }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -9436,19 +7043,6 @@ "node": ">=0.10.0" } }, - "node_modules/react-day-picker": { - "version": "8.10.1", - "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-8.10.1.tgz", - "integrity": "sha512-TMx7fNbhLk15eqcMt+7Z7S2KF7mfTId/XJDjKE8f+IUcFn0l08/kI4FiYTL/0yuOLmEcbR4Fwe3GJf/NiiMnPA==", - "funding": { - "type": "individual", - "url": "https://github.com/sponsors/gpbl" - }, - "peerDependencies": { - "date-fns": "^2.28.0 || ^3.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/react-dom": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", @@ -9461,58 +7055,11 @@ "react": "^18.2.0" } }, - "node_modules/react-force-graph-2d": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/react-force-graph-2d/-/react-force-graph-2d-1.29.0.tgz", - "integrity": "sha512-Xv5IIk+hsZmB3F2ibja/t6j/b0/1T9dtFOQacTUoLpgzRHrO6wPu1GtQ2LfRqI/imgtaapnXUgQaE8g8enPo5w==", - "license": "MIT", - "dependencies": { - "force-graph": "^1.51", - "prop-types": "15", - "react-kapsule": "^2.5" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-hook-form": { - "version": "7.53.0", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.53.0.tgz", - "integrity": "sha512-M1n3HhqCww6S2hxLxciEXy2oISPnAzxY7gvwVPrtlczTM/1dDadXgUxDpHMrMTblDOcm/AXtXxHwZ3jpg1mqKQ==", - "engines": { - "node": ">=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-hook-form" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18 || ^19" - } - }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, - "node_modules/react-kapsule": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/react-kapsule/-/react-kapsule-2.5.7.tgz", - "integrity": "sha512-kifAF4ZPD77qZKc4CKLmozq6GY1sBzPEJTIJb0wWFK6HsePJatK3jXplZn2eeAt3x67CDozgi7/rO8fNQ/AL7A==", - "license": "MIT", - "dependencies": { - "jerrypick": "^1.1.1" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "react": ">=16.13.1" - } - }, "node_modules/react-markdown": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", @@ -9585,41 +7132,6 @@ } } }, - "node_modules/react-resizable-panels": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/react-resizable-panels/-/react-resizable-panels-2.1.4.tgz", - "integrity": "sha512-kzue8lsoSBdyyd2IfXLQMMhNujOxRoGVus+63K95fQqleGxTfvgYLTzbwYMOODeAHqnkjb3WV/Ks7f5+gDYZuQ==", - "peerDependencies": { - "react": "^16.14.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-resize-detector": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-12.3.0.tgz", - "integrity": "sha512-mIDOVrTHKGnKe6qEUWi8dFdfHM5CPyTOpqoHctdMQf89Ljm/0qqDIzkP3vTRZZJi9/raaMiRxDEOqO4you5x+A==", - "license": "MIT", - "dependencies": { - "es-toolkit": "^1.39.6" - }, - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0" - } - }, - "node_modules/react-smooth": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.1.tgz", - "integrity": "sha512-OE4hm7XqR0jNOq3Qmk9mFLyd6p2+j6bvbPJ7qlB7+oo0eNcL2l7WQzG6MBnT3EXY6xzkLMUBec3AfewJdA0J8w==", - "dependencies": { - "fast-equals": "^5.0.1", - "prop-types": "^15.8.1", - "react-transition-group": "^4.4.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/react-style-singleton": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", @@ -9642,21 +7154,6 @@ } } }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -9665,27 +7162,6 @@ "pify": "^2.3.0" } }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readable-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -9697,36 +7173,6 @@ "node": ">=8.10.0" } }, - "node_modules/recharts": { - "version": "2.12.7", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.12.7.tgz", - "integrity": "sha512-hlLJMhPQfv4/3NBSAyq3gzGg4h2v69RJh6KU7b3pXYNNAELs9kEoXOjbkxdXpALqKBoVmVptGfLpxdaVYqjmXQ==", - "dependencies": { - "clsx": "^2.0.0", - "eventemitter3": "^4.0.1", - "lodash": "^4.17.21", - "react-is": "^16.10.2", - "react-smooth": "^4.0.0", - "recharts-scale": "^0.4.4", - "tiny-invariant": "^1.3.1", - "victory-vendor": "^36.6.8" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/recharts-scale": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", - "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", - "dependencies": { - "decimal.js-light": "^2.4.1" - } - }, "node_modules/reflect.getprototypeof": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", @@ -9747,13 +7193,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "license": "MIT", - "optional": true - }, "node_modules/regexp.prototype.flags": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", @@ -9878,16 +7317,6 @@ "node": ">=0.10.0" } }, - "node_modules/rgbcolor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz", - "integrity": "sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==", - "license": "MIT OR SEE LICENSE IN FEEL-FREE.md", - "optional": true, - "engines": { - "node": ">= 0.8.15" - } - }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -9987,12 +7416,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "license": "MIT" - }, "node_modules/safe-regex-test": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", @@ -10009,18 +7432,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "license": "ISC" - }, "node_modules/scheduler": { "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", @@ -10070,12 +7481,6 @@ "node": ">= 0.4" } }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "license": "MIT" - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -10130,12 +7535,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/size-sensor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/size-sensor/-/size-sensor-1.0.2.tgz", - "integrity": "sha512-2NCmWxY7A9pYKGXNBfteo4hy14gWu47rg5692peVMst6lQLPKrVjhY+UTEsPI5ceFRJSl3gVgMYaUi/hKuaiKw==", - "license": "ISC" - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -10144,15 +7543,6 @@ "node": ">=8" } }, - "node_modules/sonner": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sonner/-/sonner-1.5.0.tgz", - "integrity": "sha512-FBjhG/gnnbN6FY0jaNnqZOMmB73R+5IiyYAw8yBj7L54ER7HB3fOSE5OFiQiE2iXWxeXKvg6fIP4LtVppHEdJA==", - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -10171,18 +7561,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/ssf": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", - "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", - "license": "Apache-2.0", - "dependencies": { - "frac": "~1.1.2" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -10190,16 +7568,6 @@ "dev": true, "license": "MIT" }, - "node_modules/stackblur-canvas": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.7.0.tgz", - "integrity": "sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.14" - } - }, "node_modules/std-env": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", @@ -10226,15 +7594,6 @@ "node": ">=10.0.0" } }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -10597,16 +7956,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/svg-pathdata": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz", - "integrity": "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/tailwind-merge": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.3.tgz", @@ -10668,16 +8017,6 @@ "node": ">=6" } }, - "node_modules/text-segmentation": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz", - "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==", - "license": "MIT", - "optional": true, - "dependencies": { - "utrie": "^1.0.2" - } - }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -10702,17 +8041,6 @@ "node": ">=0.8" } }, - "node_modules/tiny-inflate": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", - "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", - "license": "MIT" - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" - }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", @@ -10720,12 +8048,6 @@ "dev": true, "license": "MIT" }, - "node_modules/tinycolor2": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", - "license": "MIT" - }, "node_modules/tinypool": { "version": "0.8.4", "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", @@ -10757,11 +8079,6 @@ "node": ">=8.0" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", @@ -10969,38 +8286,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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==", - "license": "MIT" - }, - "node_modules/unicode-properties": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", - "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.0", - "unicode-trie": "^2.0.0" - } - }, - "node_modules/unicode-trie": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", - "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", - "license": "MIT", - "dependencies": { - "pako": "^0.2.5", - "tiny-inflate": "^1.0.0" - } - }, - "node_modules/unicode-trie/node_modules/pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", - "license": "MIT" - }, "node_modules/unified": { "version": "11.0.5", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", @@ -11171,28 +8456,6 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, - "node_modules/utrie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz", - "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==", - "license": "MIT", - "optional": true, - "dependencies": { - "base64-arraybuffer": "^1.0.2" - } - }, - "node_modules/vaul": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/vaul/-/vaul-0.9.9.tgz", - "integrity": "sha512-7afKg48srluhZwIkaU+lgGtFCUsYBSGOl8vcc8N/M3YQlZFlynHD15AE+pwrYdc826o7nrIND4lL9Y6b9WWZZQ==", - "dependencies": { - "@radix-ui/react-dialog": "^1.1.1" - }, - "peerDependencies": { - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0" - } - }, "node_modules/vfile": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", @@ -11221,27 +8484,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/victory-vendor": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", - "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", - "dependencies": { - "@types/d3-array": "^3.0.3", - "@types/d3-ease": "^3.0.0", - "@types/d3-interpolate": "^3.0.1", - "@types/d3-scale": "^4.0.2", - "@types/d3-shape": "^3.1.0", - "@types/d3-time": "^3.0.0", - "@types/d3-timer": "^3.0.0", - "d3-array": "^3.1.6", - "d3-ease": "^3.0.1", - "d3-interpolate": "^3.0.1", - "d3-scale": "^4.0.2", - "d3-shape": "^3.1.0", - "d3-time": "^3.0.0", - "d3-timer": "^3.0.1" - } - }, "node_modules/vite": { "version": "5.4.21", "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", @@ -11452,20 +8694,6 @@ "node": ">=10.13.0" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -11572,24 +8800,6 @@ "node": ">=8" } }, - "node_modules/wmf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", - "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/word": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz", - "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8" - } - }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", @@ -11690,77 +8900,6 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, - "node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xlsx": { - "version": "0.18.5", - "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz", - "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", - "license": "Apache-2.0", - "dependencies": { - "adler-32": "~1.3.0", - "cfb": "~1.2.1", - "codepage": "~1.15.0", - "crc-32": "~1.2.1", - "ssf": "~0.11.2", - "wmf": "~1.0.1", - "word": "~0.3.0" - }, - "bin": { - "xlsx": "bin/xlsx.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", - "license": "MIT" - }, - "node_modules/xml-js": { - "version": "1.6.11", - "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", - "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", - "license": "MIT", - "dependencies": { - "sax": "^1.2.4" - }, - "bin": { - "xml-js": "bin/cli.js" - } - }, - "node_modules/xmldoc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-2.0.2.tgz", - "integrity": "sha512-UiRwoSStEXS3R+YE8OqYv3jebza8cBBAI2y8g3B15XFkn3SbEOyyLnmPHjLBPZANrPJKEzxxB7A3XwcLikQVlQ==", - "license": "MIT", - "dependencies": { - "sax": "^1.2.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/yaml": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", @@ -11783,29 +8922,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/zod": { - "version": "3.23.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zrender": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/zrender/-/zrender-6.0.0.tgz", - "integrity": "sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==", - "license": "BSD-3-Clause", - "dependencies": { - "tslib": "2.3.0" - } - }, - "node_modules/zrender/node_modules/tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", - "license": "0BSD" - }, "node_modules/zustand": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.8.tgz", diff --git a/app-instance/frontend/package.json b/app-instance/frontend/package.json index 9784831..afb2d10 100644 --- a/app-instance/frontend/package.json +++ b/app-instance/frontend/package.json @@ -1,5 +1,5 @@ { - "name": "nextjs", + "name": "beaver-app-instance-frontend", "version": "0.1.0", "private": true, "scripts": { @@ -11,86 +11,41 @@ "test": "vitest run" }, "dependencies": { - "@hookform/resolvers": "^3.9.0", "@next/swc-wasm-nodejs": "13.5.1", - "@radix-ui/react-accordion": "^1.2.0", - "@radix-ui/react-alert-dialog": "^1.1.1", - "@radix-ui/react-aspect-ratio": "^1.1.0", "@radix-ui/react-avatar": "^1.1.0", - "@radix-ui/react-checkbox": "^1.1.1", "@radix-ui/react-collapsible": "^1.1.0", - "@radix-ui/react-context-menu": "^2.2.1", "@radix-ui/react-dialog": "^1.1.1", - "@radix-ui/react-dropdown-menu": "^2.1.1", - "@radix-ui/react-hover-card": "^1.1.1", "@radix-ui/react-label": "^2.1.0", - "@radix-ui/react-menubar": "^1.1.1", - "@radix-ui/react-navigation-menu": "^1.2.0", "@radix-ui/react-popover": "^1.1.1", - "@radix-ui/react-progress": "^1.1.0", - "@radix-ui/react-radio-group": "^1.2.0", "@radix-ui/react-scroll-area": "^1.1.0", "@radix-ui/react-select": "^2.1.1", "@radix-ui/react-separator": "^1.1.0", - "@radix-ui/react-slider": "^1.2.0", "@radix-ui/react-slot": "^1.1.0", "@radix-ui/react-switch": "^1.1.0", "@radix-ui/react-tabs": "^1.1.0", - "@radix-ui/react-toast": "^1.2.15", - "@radix-ui/react-toggle": "^1.1.0", - "@radix-ui/react-toggle-group": "^1.1.0", - "@radix-ui/react-tooltip": "^1.1.2", - "@supabase/supabase-js": "^2.58.0", "@tailwindcss/typography": "^0.5.19", - "@types/file-saver": "^2.0.7", - "@types/jspdf": "^1.3.3", "@types/node": "20.6.2", "@types/react": "18.2.22", "@types/react-dom": "18.2.7", "autoprefixer": "10.4.15", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", - "cmdk": "^1.0.0", - "date-fns": "^3.6.0", - "docx": "^9.5.1", - "echarts": "^6.0.0", - "echarts-for-react": "^3.0.5", - "embla-carousel-react": "^8.3.0", "eslint": "8.49.0", "eslint-config-next": "13.5.1", - "file-saver": "^2.0.5", - "input-otp": "^1.2.4", - "jspdf": "^3.0.3", - "jspdf-autotable": "^5.0.2", "lucide-react": "^0.446.0", "next": "13.5.1", - "next-themes": "^0.3.0", - "pdfmake": "^0.2.20", - "pdfmake-with-chinese-fonts": "^1.0.16", - "phaser": "^3.90.0", "postcss": "8.4.30", "react": "18.2.0", - "react-day-picker": "^8.10.1", "react-dom": "18.2.0", - "react-force-graph-2d": "^1.29.0", - "react-hook-form": "^7.53.0", "react-markdown": "^10.1.0", - "react-resizable-panels": "^2.1.3", - "react-resize-detector": "^12.3.0", - "recharts": "^2.12.7", "remark-gfm": "^4.0.1", - "sonner": "^1.5.0", "tailwind-merge": "^2.5.2", "tailwindcss": "3.3.3", "tailwindcss-animate": "^1.0.7", "typescript": "5.2.2", - "vaul": "^0.9.9", - "xlsx": "^0.18.5", - "zod": "^3.23.8", "zustand": "^5.0.8" }, "devDependencies": { - "@types/pdfmake": "^0.2.12", "vite-tsconfig-paths": "^4.3.2", "vitest": "^1.6.1" } diff --git a/app-instance/frontend/types/index.ts b/app-instance/frontend/types/index.ts index bd68c4a..f5174fc 100644 --- a/app-instance/frontend/types/index.ts +++ b/app-instance/frontend/types/index.ts @@ -1,4 +1,4 @@ -// Nanobot frontend types +// Beaver frontend types export interface AuthUser { id: string; @@ -222,34 +222,6 @@ export interface SkillDetailResponse { frontmatter?: Record; } -export interface SlashCommand { - name: string; - description: string; - argument_hint: string | null; - plugin_name: string; -} - -export interface PluginAgent { - name: string; - description: string; - model: string | null; -} - -export interface PluginCommand { - name: string; - description: string; - argument_hint: string | null; -} - -export interface PluginInfo { - name: string; - description: string; - source: 'global' | 'workspace'; - agents: PluginAgent[]; - commands: PluginCommand[]; - skills: string[]; -} - export interface CronJob { id: string; name: string; @@ -380,19 +352,6 @@ export interface ActiveTask { updated_at: string; } -export interface Marketplace { - name: string; - source: string; - type: 'local' | 'git'; -} - -export interface MarketplacePlugin { - name: string; - description: string; - marketplace_name: string; - installed: boolean; -} - export interface SkillHubVersionRef { id?: number; version: string; @@ -557,14 +516,6 @@ export interface AuthzLocalBackendStatus { registered: boolean; } -export interface AuthzChannelSettings { - configured: boolean; - config?: Record; - secrets_masked?: boolean; - secret_keys?: string[]; - updated_at?: string; -} - export interface AuthzStatus { enabled: boolean; base_url: string; @@ -573,35 +524,10 @@ export interface AuthzStatus { backend?: Record; permissions?: Record; outlook?: Record; - channel_settings?: Record; + channel_settings?: Record; error?: string; } -export interface AuthzBackendRecord { - backend_id: string; - name: string; - base_url: string; - frontend_base_url?: string | null; - status: string; - created_at: string; - updated_at: string; - is_local_backend?: boolean; -} - -export interface AuthzRegisterBackendResponse { - backend_id: string; - client_id: string; - client_secret: string; - created_at: string; - saved_to_backend: boolean; - local_backend?: AuthzLocalBackendStatus & { - authz?: { - enabled: boolean; - base_url: string; - }; - }; -} - export interface OutlookMailboxAddress { emailAddress?: { name?: string | null; diff --git a/app-instance/instance-registry.py b/app-instance/instance-registry.py index 4d6539e..e83edcb 100755 --- a/app-instance/instance-registry.py +++ b/app-instance/instance-registry.py @@ -43,8 +43,6 @@ def _normalize_record(record: dict[str, Any]) -> dict[str, Any]: "api_base_url", ): normalized[key] = str(record.get(key, "") or "") - if not normalized["beaver_home"]: - normalized["beaver_home"] = str(record.get("nanobot_home", "") or "") return normalized diff --git a/auth-portal/src/app/api/runtime/login/route.ts b/auth-portal/src/app/api/runtime/login/route.ts index a89a053..c231af2 100644 --- a/auth-portal/src/app/api/runtime/login/route.ts +++ b/auth-portal/src/app/api/runtime/login/route.ts @@ -20,7 +20,7 @@ function errorDetail(error: unknown): string { export async function POST(request: NextRequest) { const locale = normalizePortalLocale( - request.cookies.get('nanobot_locale')?.value || + request.cookies.get('beaver_locale')?.value || request.headers.get('accept-language') ); diff --git a/auth-portal/src/app/api/runtime/register/route.ts b/auth-portal/src/app/api/runtime/register/route.ts index 930408b..fcb1142 100644 --- a/auth-portal/src/app/api/runtime/register/route.ts +++ b/auth-portal/src/app/api/runtime/register/route.ts @@ -20,7 +20,7 @@ function errorDetail(error: unknown): string { export async function POST(request: NextRequest) { const locale = normalizePortalLocale( - request.cookies.get('nanobot_locale')?.value || + request.cookies.get('beaver_locale')?.value || request.headers.get('accept-language') ); diff --git a/auth-portal/src/lib/i18n/core.ts b/auth-portal/src/lib/i18n/core.ts index 9163de0..2d09392 100644 --- a/auth-portal/src/lib/i18n/core.ts +++ b/auth-portal/src/lib/i18n/core.ts @@ -1,5 +1,5 @@ -export const PORTAL_LOCALE_COOKIE = 'nanobot_locale'; -export const PORTAL_LOCALE_STORAGE_KEY = 'nanobot_locale'; +export const PORTAL_LOCALE_COOKIE = 'beaver_locale'; +export const PORTAL_LOCALE_STORAGE_KEY = 'beaver_locale'; export const PORTAL_LOCALES = ['zh-CN', 'en-US'] as const; diff --git a/auth-portal/src/package-lock.json b/auth-portal/src/package-lock.json index 552997e..b3b1ef8 100644 --- a/auth-portal/src/package-lock.json +++ b/auth-portal/src/package-lock.json @@ -1,11 +1,11 @@ { - "name": "nanobot-auth-portal", + "name": "beaver-auth-portal", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "nanobot-auth-portal", + "name": "beaver-auth-portal", "version": "0.1.0", "dependencies": { "next": "13.5.1", diff --git a/auth-portal/src/package.json b/auth-portal/src/package.json index b0c8c56..84781af 100644 --- a/auth-portal/src/package.json +++ b/auth-portal/src/package.json @@ -1,5 +1,5 @@ { - "name": "nanobot-auth-portal", + "name": "beaver-auth-portal", "version": "0.1.0", "private": true, "scripts": { @@ -20,4 +20,3 @@ "typescript": "5.2.2" } } - diff --git a/authz-service/README.md b/authz-service/README.md index e0904da..bf22094 100644 --- a/authz-service/README.md +++ b/authz-service/README.md @@ -51,7 +51,7 @@ curl http://127.0.0.1:19090/.well-known/jwks.json - 例如 `https://authz.example.com` - 如果要让 AuthZ 负责编排实例注册,还要设置 `DEPLOY_API_BASE_URL` - 如果 deploy-control 开了鉴权,还要设置 `DEPLOY_API_TOKEN` -- 不要把 `src/data/` 里的本地示例或真实数据直接拿去打镜像 +- 不要提交本地运行产生的 `runtime/data/` 内容 ## API 说明 diff --git a/deploy-control/server.py b/deploy-control/server.py index c91278d..8cd9e8c 100755 --- a/deploy-control/server.py +++ b/deploy-control/server.py @@ -307,7 +307,7 @@ def _upsert_registry_record(record: dict[str, Any]) -> dict[str, Any]: "--instance-root", str(record.get("instance_root", "") or "").strip(), "--beaver-home", - str(record.get("beaver_home", "") or record.get("nanobot_home", "") or "").strip(), + str(record.get("beaver_home", "") or "").strip(), "--config-path", str(record.get("config_path", "") or "").strip(), "--auth-users-path",