From 4a839d1599d0e4bfc0ea50bac80cf6377e4389cf Mon Sep 17 00:00:00 2001 From: YUZHEthefool <2804776511@qq.com> Date: Fri, 18 Sep 2026 01:14:09 +0800 Subject: [PATCH 1/7] feat(btw): switch a coding CLI's own provider from the dashboard --- astrbot/core/agent/btw/cli_global_config.py | 510 + astrbot/core/auth/models.py | 2 + astrbot/core/auth/registry.py | 4 + astrbot/core/config/default.py | 5 + astrbot/core/utils/process_tree.py | 75 +- astrbot/dashboard/api/coding_cli.py | 180 + astrbot/dashboard/api/router.py | 2 + astrbot/dashboard/schemas.py | 7 + .../src/api/generated/openapi-v1/index.ts | 1419 +-- .../src/api/generated/openapi-v1/sdk.gen.ts | 5726 +++-------- .../src/api/generated/openapi-v1/types.gen.ts | 8682 ++++++++--------- dashboard/src/api/v1/codingCli.ts | 63 + dashboard/src/api/v1/index.ts | 1 + .../i18n/locales/en-US/core/navigation.json | 3 +- .../i18n/locales/zh-CN/core/navigation.json | 3 +- .../full/vertical-sidebar/sidebarItem.ts | 5 + dashboard/src/router/MainRoutes.ts | 5 + dashboard/src/views/CliConfigPage.vue | 841 ++ dashboard/tests/cliConfigPage.vitest.ts | 335 + docs/public/openapi.json | 78 + docs/scripts/update_openapi_json.py | 1 + openspec/openapi-v1.yaml | 55 + tests/unit/test_btw_cli_global_config.py | 235 + tests/unit/test_config_metadata_i18n.py | 17 +- tests/unit/test_dashboard_coding_cli.py | 105 + 25 files changed, 8191 insertions(+), 10168 deletions(-) create mode 100644 astrbot/core/agent/btw/cli_global_config.py create mode 100644 astrbot/dashboard/api/coding_cli.py create mode 100644 dashboard/src/api/v1/codingCli.ts create mode 100644 dashboard/src/views/CliConfigPage.vue create mode 100644 dashboard/tests/cliConfigPage.vitest.ts create mode 100644 tests/unit/test_btw_cli_global_config.py create mode 100644 tests/unit/test_dashboard_coding_cli.py diff --git a/astrbot/core/agent/btw/cli_global_config.py b/astrbot/core/agent/btw/cli_global_config.py new file mode 100644 index 0000000000..2d01b5106a --- /dev/null +++ b/astrbot/core/agent/btw/cli_global_config.py @@ -0,0 +1,510 @@ +"""Provider presets the operator switches a coding CLI between. + +This is the configuration half of what a provider switcher does: the operator +keeps a list of providers per CLI, and making one current writes it into that +CLI's own global configuration. There is deliberately no routing, proxying, or +format conversion here -- a run still layers its own config over whatever the +CLI reads, so nothing about a delegated run changes. + +The list is AstrBot's own (``btw.cli_providers``) rather than a coding agent's +``providers``: an agent's presets exist to configure *a delegated run*, and are +scoped to that agent, whereas this list is what the CLI uses for everything the +operator does by hand. + +Two files are involved per CLI and neither is ours: + +* Claude Code keeps everything in ``~/.claude/settings.json``, and merges the + ``env`` block over the process environment. It is JSON, so it is parsed, + merged key by key, and written back with every other key preserved. +* Codex keeps ``~/.codex/config.toml`` and ``~/.codex/auth.json``. The standard + library reads TOML but cannot write it, and rewriting a file we cannot parse + faithfully would drop the user's comments, so AstrBot's keys are written as a + comment-delimited section instead. TOML requires top-level keys to precede + every table, so the section goes at the top of the file and the rest is left + byte for byte as it was. + +Everything is backed up once before the first write, written atomically, and +restricted to the owner when it holds a credential. +""" + +import json +import os +import re +import tempfile +from collections.abc import Mapping +from dataclasses import dataclass +from pathlib import Path + +from astrbot import logger + +CODING_GLOBAL_AGENT_TYPES = ("claude_code", "codex") + +# What AstrBot writes into a file it does not own. +CLAUDE_SETTINGS_FILE = "settings.json" +CODEX_CONFIG_FILE = "config.toml" +CODEX_AUTH_FILE = "auth.json" +CODEX_PROVIDER_ID = "astrbot_btw" +CODEX_MANAGED_BEGIN = "# >>> astrbot btw (managed; do not edit between these lines)" +CODEX_MANAGED_END = "# <<< astrbot btw" +# Every credential AstrBot stores in ``auth.json`` is named with this prefix. +_CODEX_KEY_PREFIX = "ASTRBOT_BTW_CODEX_KEY_" + +# A one-time copy of the file as it was before AstrBot first wrote to it. +BACKUP_SUFFIX = ".astrbot-backup" +# A file holding a credential is readable by its owner and nobody else. +PRIVATE_FILE_MODE = 0o600 + + +@dataclass(frozen=True, slots=True) +class ManagedFile: + """One file AstrBot writes into, and what it currently holds.""" + + path: Path + exists: bool + managed: bool + # What AstrBot last wrote, as far as it can be read back. A credential is + # reported as present, never as its value. + base_url: str + model: str + has_credential: bool + backed_up: bool + + +def claude_home() -> Path: + """Return the Claude Code configuration directory.""" + configured = os.environ.get("CLAUDE_CONFIG_DIR") + return Path(configured) if configured else Path.home() / ".claude" + + +def codex_home() -> Path: + """Return the Codex configuration directory.""" + configured = os.environ.get("CODEX_HOME") + return Path(configured) if configured else Path.home() / ".codex" + + +def target_path(cli: str) -> Path: + """Return the file a provider for ``cli`` is written into.""" + if cli == "claude_code": + return claude_home() / CLAUDE_SETTINGS_FILE + if cli == "codex": + return codex_home() / CODEX_CONFIG_FILE + raise ValueError(f"Unknown coding agent type: {cli!r}") + + +def provider_slug(provider_id: object) -> str: + """Return the filesystem-safe form of a provider id.""" + safe = re.sub(r"[^A-Za-z0-9_.-]+", "-", str(provider_id or "provider")).strip("-.") + return safe[:64] or "provider" + + +def credential_env_name(provider_id: object) -> str: + """Return the variable a Codex provider's section reads its key from.""" + return f"{_CODEX_KEY_PREFIX}{provider_slug(provider_id).upper().replace('-', '_')}" + + +# ── the provider list ──────────────────────────────────────────────────────── + + +def _text(value: object, default: str = "") -> str: + return value if isinstance(value, str) else default + + +def normalize_cli_providers(raw: object) -> list[dict]: + """Return the usable provider entries of a profile, in order. + + A malformed entry is dropped rather than raised: the list comes from a + profile, and one bad entry must not stop the others from being usable. + """ + providers: list[dict] = [] + seen: set[str] = set() + for entry in raw if isinstance(raw, list) else []: + if not isinstance(entry, Mapping): + continue + provider_id = _text(entry.get("id")).strip() + if not provider_id or provider_id in seen: + continue + seen.add(provider_id) + providers.append( + { + "id": provider_id, + "name": _text(entry.get("name"), provider_id).strip() or provider_id, + "cli": _text(entry.get("cli")).strip(), + "base_url": _text(entry.get("base_url")).strip(), + "api_key": _text(entry.get("api_key")).strip(), + "model": _text(entry.get("model")).strip(), + "note": _text(entry.get("note")).strip(), + } + ) + return providers + + +def providers_for_cli(raw: object, cli: str) -> list[dict]: + """Return the entries that apply to one CLI, and the ones for both. + + An entry with no ``cli`` applies to every CLI AstrBot knows how to write, + which is what an operator means when they do not pick one. + """ + return [ + provider + for provider in normalize_cli_providers(raw) + if not provider["cli"] or provider["cli"] == cli + ] + + +def select_provider(raw: object, provider_id: str) -> dict | None: + """Return the named provider, or ``None`` when the list has no such id.""" + wanted = provider_id.strip() + if not wanted: + return None + for provider in normalize_cli_providers(raw): + if provider["id"] == wanted: + return provider + return None + + +# ── reading and writing the CLI's own files ────────────────────────────────── + + +def _backup_path(path: Path) -> Path: + return path.with_name(path.name + BACKUP_SUFFIX) + + +def _read_json(path: Path) -> dict: + """Return a JSON object from ``path``, or an empty one. + + A file that cannot be parsed is treated as absent rather than replaced: the + operator's own configuration is not this module's to discard. + """ + if not path.is_file(): + return {} + try: + payload = json.loads(path.read_text(encoding="utf-8-sig")) + except OSError, ValueError: + logger.warning("%s is not valid JSON; leaving it alone.", path) + return {} + return payload if isinstance(payload, dict) else {} + + +def _atomic_write(path: Path, text: str, *, private: bool) -> None: + """Replace ``path`` so a reader never sees a partial file.""" + path.parent.mkdir(parents=True, exist_ok=True) + descriptor, name = tempfile.mkstemp(prefix=".astrbot-", dir=path.parent) + temporary = Path(name) + try: + with os.fdopen(descriptor, "w", encoding="utf-8", newline="\n") as handle: + handle.write(text) + handle.flush() + os.fsync(handle.fileno()) + if private: + os.chmod(temporary, PRIVATE_FILE_MODE) + os.replace(temporary, path) + temporary = None + _fsync_directory(path.parent) + finally: + if temporary is not None: + temporary.unlink(missing_ok=True) + + +def _fsync_directory(directory: Path) -> None: + """Flush a directory entry, where the platform lets us open one. + + Best effort by design: neither step is what makes the write correct, and a + platform that refuses either one still has the rename, which is the part + that matters. + """ + try: + descriptor = os.open(directory, os.O_RDONLY) + except OSError: + # Windows cannot open a directory this way. + return + try: + os.fsync(descriptor) + except OSError: + # A filesystem that does not support it; the rename already landed. + pass + finally: + os.close(descriptor) + + +def _back_up_once(path: Path) -> Path | None: + """Copy the file aside the first time AstrBot writes to it.""" + if not path.is_file(): + return None + backup = _backup_path(path) + if backup.exists(): + return backup + _atomic_write(backup, path.read_text(encoding="utf-8"), private=False) + return backup + + +def _managed_block(base_url: str, model: str, env_key: str) -> str: + """Return the Codex section AstrBot owns.""" + lines = [CODEX_MANAGED_BEGIN] + lines.append(f"model_provider = {json.dumps(CODEX_PROVIDER_ID)}") + if model: + lines.append(f"model = {json.dumps(model)}") + lines.append("") + lines.append(f"[model_providers.{CODEX_PROVIDER_ID}]") + lines.append(f"name = {json.dumps('AstrBot')}") + lines.append(f"base_url = {json.dumps(base_url)}") + if env_key: + lines.append(f'env_key = "{env_key}"') + lines.append(f"wire_api = {json.dumps('responses')}") + lines.append(CODEX_MANAGED_END) + return "\n".join(lines) + + +def _strip_managed_block(text: str) -> str: + """Return ``text`` without AstrBot's section, keeping everything else.""" + start = text.find(CODEX_MANAGED_BEGIN) + if start == -1: + return text + end = text.find(CODEX_MANAGED_END, start) + if end == -1: + # No closing marker: the file was edited by hand or truncated. Leave it + # alone rather than guess where the section was meant to end. + return text + end += len(CODEX_MANAGED_END) + while end < len(text) and text[end] == "\n": + end += 1 + return text[:start] + text[end:] + + +def read_state(cli: str) -> ManagedFile: + """Report what the CLI's global config currently holds. + + Never returns a credential, only whether one is present. + """ + path = target_path(cli) + if cli == "claude_code": + payload = _read_json(path) + env = payload.get("env") + env = env if isinstance(env, Mapping) else {} + return ManagedFile( + path=path, + exists=path.is_file(), + # Claude Code merges `env`, so AstrBot has no section of its own to + # point at: it manages exactly the keys it writes. + managed=any( + key in env + for key in ( + "ANTHROPIC_BASE_URL", + "ANTHROPIC_MODEL", + "ANTHROPIC_AUTH_TOKEN", + ) + ), + base_url=str(env.get("ANTHROPIC_BASE_URL", "") or ""), + model=str(env.get("ANTHROPIC_MODEL", "") or ""), + has_credential=bool(env.get("ANTHROPIC_AUTH_TOKEN")), + backed_up=_backup_path(path).is_file(), + ) + + text = path.read_text(encoding="utf-8", errors="replace") if path.is_file() else "" + base_url = "" + model = "" + env_key = "" + start = text.find(CODEX_MANAGED_BEGIN) + end = text.find(CODEX_MANAGED_END, start) if start != -1 else -1 + if start != -1 and end != -1: + for line in text[start:end].splitlines(): + key, _, value = line.partition("=") + value = value.strip().strip('"') + if key.strip() == "base_url": + base_url = value + elif key.strip() == "model": + model = value + elif key.strip() == "env_key": + env_key = value + auth = _read_json(codex_home() / CODEX_AUTH_FILE) + return ManagedFile( + path=path, + exists=path.is_file(), + managed=start != -1 and end != -1, + base_url=base_url, + model=model, + has_credential=bool(auth.get(env_key)) if env_key else False, + backed_up=_backup_path(path).is_file(), + ) + + +def apply_provider(cli: str, provider: Mapping) -> ManagedFile: + """Make one provider the CLI's default on this host. + + Args: + cli: ``claude_code`` or ``codex``. + provider: A normalized provider entry. + + Returns: + The state the target file is in after the write. + """ + if cli not in CODING_GLOBAL_AGENT_TYPES: + raise ValueError(f"Unknown coding agent type: {cli!r}") + provider_id = _text(provider.get("id")).strip() + base_url = _text(provider.get("base_url")).strip() + model = _text(provider.get("model")).strip() + api_key = _text(provider.get("api_key")).strip() + if not provider_id: + raise ValueError("A provider needs an id before it can be applied.") + if not base_url and not api_key: + raise ValueError( + "A provider needs an endpoint or a key before it can be applied." + ) + + path = target_path(cli) + _back_up_once(path) + + if cli == "claude_code": + payload = _read_json(path) + env = payload.get("env") + env = dict(env) if isinstance(env, Mapping) else {} + env["ANTHROPIC_BASE_URL"] = base_url + if model: + env["ANTHROPIC_MODEL"] = model + else: + env.pop("ANTHROPIC_MODEL", None) + if api_key: + env["ANTHROPIC_AUTH_TOKEN"] = api_key + else: + env.pop("ANTHROPIC_AUTH_TOKEN", None) + payload["env"] = env + _atomic_write( + path, + json.dumps(payload, ensure_ascii=False, indent=2) + "\n", + private=bool(api_key), + ) + return read_state(cli) + + env_key = credential_env_name(provider_id) + existing = ( + path.read_text(encoding="utf-8", errors="replace") if path.is_file() else "" + ) + block = _managed_block(base_url, model, env_key if api_key else "") + rest = _strip_managed_block(existing) + _atomic_write(path, f"{block}\n" + (f"\n{rest}" if rest else ""), private=False) + + _apply_codex_credential(env_key, api_key) + return read_state(cli) + + +def _apply_codex_credential(env_key: str, api_key: str) -> None: + """Put one provider's key in ``auth.json``, or take it out. + + Only this provider's own variable is touched: switching to a provider that + has no key must not delete the key a different provider stored. + """ + auth_path = codex_home() / CODEX_AUTH_FILE + if not api_key and not auth_path.is_file(): + return + _back_up_once(auth_path) + auth = _read_json(auth_path) + if api_key: + auth[env_key] = api_key + else: + auth.pop(env_key, None) + if auth or auth_path.is_file(): + _atomic_write( + auth_path, + json.dumps(auth, ensure_ascii=False, indent=2) + "\n", + private=True, + ) + + +def remove_provider(cli: str, provider_id: str = "") -> ManagedFile: + """Take AstrBot's configuration back out, leaving the user's own. + + Restores the pre-AstrBot file when there is a backup, because that is the + only record of what the user had before; otherwise it removes just the keys + AstrBot wrote. A provider id drops that provider's stored credential too. + """ + if cli not in CODING_GLOBAL_AGENT_TYPES: + raise ValueError(f"Unknown coding agent type: {cli!r}") + path = target_path(cli) + + if provider_id: + _drop_credentials_for(provider_id) + # The config file still names the section; whether to clear it is the + # caller's choice, so nothing else changes here. + return read_state(cli) + + backup = _backup_path(path) + if backup.is_file(): + _atomic_write(path, backup.read_text(encoding="utf-8"), private=False) + backup.unlink() + # The backup restores the config file only; a credential lives in + # auth.json, which AstrBot has no earlier version of to put back. + if cli == "codex": + _drop_stored_credentials() + return read_state(cli) + + if not path.is_file(): + return read_state(cli) + + if cli == "claude_code": + payload = _read_json(path) + env = payload.get("env") + if isinstance(env, Mapping): + env = dict(env) + for key in ( + "ANTHROPIC_BASE_URL", + "ANTHROPIC_MODEL", + "ANTHROPIC_AUTH_TOKEN", + ): + env.pop(key, None) + if env: + payload["env"] = env + else: + payload.pop("env", None) + _atomic_write( + path, + json.dumps(payload, ensure_ascii=False, indent=2) + "\n", + private=False, + ) + return read_state(cli) + + _atomic_write( + path, + _strip_managed_block(path.read_text(encoding="utf-8", errors="replace")), + private=False, + ) + _drop_stored_credentials() + return read_state(cli) + + +def _drop_credentials_for(provider_id: str) -> None: + """Forget one provider's stored credential.""" + auth_path = codex_home() / CODEX_AUTH_FILE + if not auth_path.is_file(): + return + auth = _read_json(auth_path) + key = credential_env_name(provider_id) + if key not in auth: + return + auth.pop(key, None) + _atomic_write( + auth_path, + json.dumps(auth, ensure_ascii=False, indent=2) + "\n", + private=True, + ) + + +def _drop_stored_credentials() -> None: + """Remove every Codex credential AstrBot put in ``auth.json``. + + Matched on the section's own prefix rather than on a name built from one + provider id: the section may name a variable an earlier version wrote, and + leaving a key behind is the one outcome worth being wide about. + """ + auth_path = codex_home() / CODEX_AUTH_FILE + if not auth_path.is_file(): + return + auth = _read_json(auth_path) + stored = [key for key in auth if key.upper().startswith(_CODEX_KEY_PREFIX)] + if not stored: + return + for key in stored: + auth.pop(key, None) + _atomic_write( + auth_path, + json.dumps(auth, ensure_ascii=False, indent=2) + "\n", + private=True, + ) diff --git a/astrbot/core/auth/models.py b/astrbot/core/auth/models.py index e7c28f56cf..dcc1b03c2a 100644 --- a/astrbot/core/auth/models.py +++ b/astrbot/core/auth/models.py @@ -59,6 +59,7 @@ class Role(StrEnum): "platform.read", "provider.manage", "provider.credentials.write", + "coding_cli.config.write", "platform.manage", "agent.manage", "extension.read", @@ -144,6 +145,7 @@ def restore_capability_config_id(config_id: str | None) -> str | None: "tool.computer_use", "data.export_all", "provider.credentials.write", + "coding_cli.config.write", "identity.manage", "dashboard.account.manage", "filesystem.manage", diff --git a/astrbot/core/auth/registry.py b/astrbot/core/auth/registry.py index 69064d651a..1052794942 100644 --- a/astrbot/core/auth/registry.py +++ b/astrbot/core/auth/registry.py @@ -91,6 +91,10 @@ class Relation(StrEnum): "platform.read": _SESSION_AND_ABOVE, "provider.manage": _INSTANCE_AND_ABOVE, "provider.credentials.write": _INSTANCE_AND_ABOVE, + # Writing a preset into the CLI's own global configuration replaces what the + # user runs interactively and can persist a credential in that file, so it + # sits at the same level as a provider credential change and is high-risk. + "coding_cli.config.write": _INSTANCE_AND_ABOVE, "platform.manage": _INSTANCE_AND_ABOVE, "agent.manage": _SESSION_OWNER_AND_ABOVE, "extension.read": _SESSION_AND_ABOVE, diff --git a/astrbot/core/config/default.py b/astrbot/core/config/default.py index bef7f5296d..e1d67cd107 100644 --- a/astrbot/core/config/default.py +++ b/astrbot/core/config/default.py @@ -233,6 +233,11 @@ def get_local_permission_defaults(system: str | None = None) -> dict: "plugin_routes": [], "mcp_routes": [], "skill_routes": [], + # Provider presets the operator manages for the coding CLIs themselves. + # Separate from a coding agent's own `providers`: this list is what the + # CLI's global configuration is switched between, not what a delegated + # run is layered with. + "cli_providers": [], }, "provider_stt_settings": { "enable": False, diff --git a/astrbot/core/utils/process_tree.py b/astrbot/core/utils/process_tree.py index 1bd9e07bb6..2a933f9c50 100644 --- a/astrbot/core/utils/process_tree.py +++ b/astrbot/core/utils/process_tree.py @@ -29,7 +29,18 @@ import sys import threading import time -from ctypes import wintypes +from ctypes import ( + POINTER, + Structure, + byref, + c_int, + c_longlong, + c_size_t, + c_ulonglong, + c_void_p, + sizeof, + wintypes, +) from typing import Any from astrbot import logger @@ -61,7 +72,7 @@ _JOB_TERMINATE_EXIT_CODE = 1 -class _ThreadEntry32(ctypes.Structure): +class _ThreadEntry32(Structure): _fields_ = ( ("dwSize", wintypes.DWORD), ("cntUsage", wintypes.DWORD), @@ -73,23 +84,23 @@ class _ThreadEntry32(ctypes.Structure): ) -class _BasicLimitInformation(ctypes.Structure): +class _BasicLimitInformation(Structure): _fields_ = ( - ("PerProcessUserTimeLimit", ctypes.c_longlong), - ("PerJobUserTimeLimit", ctypes.c_longlong), + ("PerProcessUserTimeLimit", c_longlong), + ("PerJobUserTimeLimit", c_longlong), ("LimitFlags", wintypes.DWORD), - ("MinimumWorkingSetSize", ctypes.c_size_t), - ("MaximumWorkingSetSize", ctypes.c_size_t), + ("MinimumWorkingSetSize", c_size_t), + ("MaximumWorkingSetSize", c_size_t), ("ActiveProcessLimit", wintypes.DWORD), - ("Affinity", ctypes.c_size_t), + ("Affinity", c_size_t), ("PriorityClass", wintypes.DWORD), ("SchedulingClass", wintypes.DWORD), ) -class _IoCounters(ctypes.Structure): +class _IoCounters(Structure): _fields_ = tuple( - (name, ctypes.c_ulonglong) + (name, c_ulonglong) for name in ( "ReadOperationCount", "WriteOperationCount", @@ -101,14 +112,14 @@ class _IoCounters(ctypes.Structure): ) -class _ExtendedLimitInformation(ctypes.Structure): +class _ExtendedLimitInformation(Structure): _fields_ = ( ("BasicLimitInformation", _BasicLimitInformation), ("IoInfo", _IoCounters), - ("ProcessMemoryLimit", ctypes.c_size_t), - ("JobMemoryLimit", ctypes.c_size_t), - ("PeakProcessMemoryUsed", ctypes.c_size_t), - ("PeakJobMemoryUsed", ctypes.c_size_t), + ("ProcessMemoryLimit", c_size_t), + ("JobMemoryLimit", c_size_t), + ("PeakProcessMemoryUsed", c_size_t), + ("PeakJobMemoryUsed", c_size_t), ) @@ -116,7 +127,8 @@ def _kernel32() -> Any: """Return the Windows kernel library, or ``None`` off Windows.""" if sys.platform != "win32": return None - return ctypes.WinDLL("kernel32", use_last_error=True) + windll = getattr(ctypes, "WinDLL", None) + return windll("kernel32", use_last_error=True) if windll else None def _last_error() -> int: @@ -124,8 +136,11 @@ def _last_error() -> int: ``ctypes.get_last_error`` exists only on Windows and only when the library that failed was loaded with ``use_last_error``, so it is looked up rather - than referenced: this module is imported on POSIX as well. + than referenced: this module is imported on POSIX as well, where the name + does not exist at all. """ + import ctypes + getter = getattr(ctypes, "get_last_error", None) return int(getter()) if getter is not None else 0 @@ -135,12 +150,12 @@ def _last_error() -> int: # wrong one fails here rather than as a misread handle at kill time. if _KERNEL32 is not None: # pragma: no cover - Windows only _KERNEL32.CreateJobObjectW.restype = wintypes.HANDLE - _KERNEL32.CreateJobObjectW.argtypes = (ctypes.c_void_p, wintypes.LPCWSTR) + _KERNEL32.CreateJobObjectW.argtypes = (c_void_p, wintypes.LPCWSTR) _KERNEL32.SetInformationJobObject.restype = wintypes.BOOL _KERNEL32.SetInformationJobObject.argtypes = ( wintypes.HANDLE, - ctypes.c_int, - ctypes.c_void_p, + c_int, + c_void_p, wintypes.DWORD, ) _KERNEL32.OpenProcess.restype = wintypes.HANDLE @@ -153,14 +168,14 @@ def _last_error() -> int: _KERNEL32.IsProcessInJob.argtypes = ( wintypes.HANDLE, wintypes.HANDLE, - ctypes.POINTER(ctypes.c_int), + POINTER(c_int), ) _KERNEL32.CreateToolhelp32Snapshot.restype = wintypes.HANDLE _KERNEL32.CreateToolhelp32Snapshot.argtypes = (wintypes.DWORD, wintypes.DWORD) _KERNEL32.Thread32First.restype = wintypes.BOOL - _KERNEL32.Thread32First.argtypes = (wintypes.HANDLE, ctypes.c_void_p) + _KERNEL32.Thread32First.argtypes = (wintypes.HANDLE, c_void_p) _KERNEL32.Thread32Next.restype = wintypes.BOOL - _KERNEL32.Thread32Next.argtypes = (wintypes.HANDLE, ctypes.c_void_p) + _KERNEL32.Thread32Next.argtypes = (wintypes.HANDLE, c_void_p) _KERNEL32.OpenThread.restype = wintypes.HANDLE _KERNEL32.OpenThread.argtypes = (wintypes.DWORD, wintypes.BOOL, wintypes.DWORD) _KERNEL32.ResumeThread.restype = wintypes.DWORD @@ -199,8 +214,8 @@ def create(cls) -> ProcessTree: if not _KERNEL32.SetInformationJobObject( job, _JOB_OBJECT_EXTENDED_LIMIT_INFORMATION, - ctypes.byref(limits), - ctypes.sizeof(limits), + byref(limits), + sizeof(limits), ): logger.debug("Could not configure the job object; closing it.") _KERNEL32.CloseHandle(job) @@ -490,8 +505,8 @@ def _wait_until_in_job(handle: int, job: int) -> bool: """ deadline = time.monotonic() + _JOB_OBJECT_ASSIGN_TIMEOUT_MS / 1000 while True: - in_job = ctypes.c_int() - if _KERNEL32.IsProcessInJob(handle, job, ctypes.byref(in_job)): + in_job = c_int() + if _KERNEL32.IsProcessInJob(handle, job, byref(in_job)): if in_job.value: return True elif _last_error() != _ERROR_INSUFFICIENT_BUFFER: @@ -516,8 +531,8 @@ def _resume(pid: int) -> None: return try: entry = _ThreadEntry32() - entry.dwSize = ctypes.sizeof(entry) - found = _KERNEL32.Thread32First(snapshot, ctypes.byref(entry)) + entry.dwSize = sizeof(entry) + found = _KERNEL32.Thread32First(snapshot, byref(entry)) while found: if entry.th32OwnerProcessID == pid: handle = _KERNEL32.OpenThread( @@ -531,6 +546,6 @@ def _resume(pid: int) -> None: ) finally: _KERNEL32.CloseHandle(handle) - found = _KERNEL32.Thread32Next(snapshot, ctypes.byref(entry)) + found = _KERNEL32.Thread32Next(snapshot, byref(entry)) finally: _KERNEL32.CloseHandle(snapshot) diff --git a/astrbot/dashboard/api/coding_cli.py b/astrbot/dashboard/api/coding_cli.py new file mode 100644 index 0000000000..3f84432eb7 --- /dev/null +++ b/astrbot/dashboard/api/coding_cli.py @@ -0,0 +1,180 @@ +"""Manage the provider presets a coding CLI's own configuration is switched between. + +The run path layers a config the CLI loads in addition to the user's own, so a +delegated run never rewrites what the operator runs interactively. These routes +are the other, explicitly-invoked path: the operator asking for one provider to +become the CLI's default on this host. That replaces the user's own settings +and persists a credential in a file AstrBot does not own, so a switch is +high-risk and therefore step-up. + +The provider list itself is ordinary configuration (``btw.cli_providers``), and +is saved through the config profile the same way any other setting is. Only +the switch touches a file outside AstrBot's data directory. +""" + +from typing import Any, NoReturn + +from fastapi import APIRouter, Depends, Request + +from astrbot.core.agent.btw import cli_global_config +from astrbot.core.auth.models import Resource +from astrbot.dashboard.responses import ApiError, ok +from astrbot.dashboard.schemas import CodingCliSwitchRequest + +from .auth import ( + AuthContext, + require_resource_action, + require_scope, +) + +router = APIRouter(tags=["Coding CLI"]) + +# Every write into a CLI's own global config asks for this one action. +WRITE_ACTION = "coding_cli.config.write" + + +async def require_coding_cli_scope(request: Request) -> AuthContext: + """Authenticate as config management; the action is decided per resource.""" + return await require_scope(request, "config", authorize_action=False) + + +async def authorize_coding_cli(request: Request, auth: AuthContext) -> None: + """Require the high-risk action that switching a CLI's provider needs.""" + await require_resource_action( + request, + auth, + action=WRITE_ACTION, + resource=Resource.instance("default"), + ) + + +def _raise(exc: Exception) -> NoReturn: + raise ApiError(str(exc), status_code=400) from exc + + +def _state(cli: str) -> dict[str, Any]: + """Serialize one CLI's state without ever naming a stored credential.""" + state = cli_global_config.read_state(cli) + return { + "cli": cli, + "path": str(state.path), + "exists": state.exists, + "managed": state.managed, + "backed_up": state.backed_up, + "base_url": state.base_url, + "model": state.model, + "has_credential": state.has_credential, + } + + +def _is_current(provider: dict, state: cli_global_config.ManagedFile) -> bool: + """Return whether the CLI's file currently holds this provider. + + Compares the endpoint and model rather than the credential: AstrBot cannot + read a stored key back, and the endpoint is what identifies a provider. + """ + if not state.managed or not provider["base_url"]: + return False + if provider["base_url"] != state.base_url: + return False + return not provider["model"] or provider["model"] == state.model + + +def _cli_payload(cli: str, raw: Any) -> dict[str, Any]: + """One CLI's file state plus the providers it can be switched to.""" + state = cli_global_config.read_state(cli) + return { + **_state(cli), + "providers": [ + { + "id": provider["id"], + "name": provider["name"], + "base_url": provider["base_url"], + "model": provider["model"], + "note": provider["note"], + # A key is reported as present, never as its value. + "has_api_key": bool(provider["api_key"]), + "current": _is_current(provider, state), + } + for provider in cli_global_config.providers_for_cli(raw, cli) + ], + } + + +def _provider_for(cli: str, config: Any, provider_id: str) -> dict: + """Return the named provider from the profile's list, or refuse.""" + btw = config.get("btw", {}) if isinstance(config, dict) else {} + raw = btw.get("cli_providers") if isinstance(btw, dict) else None + provider = cli_global_config.select_provider(raw, provider_id) + if provider is None: + raise ApiError(f"No provider with the id {provider_id!r} is configured.") + if provider["cli"] and provider["cli"] != cli: + raise ApiError( + f"The provider {provider_id!r} is scoped to {provider['cli']!r}, so it " + f"cannot be applied to {cli!r}." + ) + return provider + + +def _config_of(request: Request) -> Any: + """Return the running profile, which holds the operator's provider list.""" + runtime = getattr(request.app.state, "runtime", None) + services = getattr(runtime, "services", None) + profiles = getattr(services, "config_profiles", None) + acm = getattr(profiles, "acm", None) + configs = getattr(acm, "confs", None) + if not isinstance(configs, dict): + raise ApiError("Configuration is unavailable", status_code=503) + return configs.get("default", {}) + + +@router.get("/coding-cli/global-config") +async def get_global_config( + request: Request, + auth: AuthContext = Depends(require_coding_cli_scope), +): + """Report each CLI's own configuration and the providers it can use.""" + await authorize_coding_cli(request, auth) + btw = _config_of(request).get("btw", {}) + raw = btw.get("cli_providers") if isinstance(btw, dict) else None + return ok( + { + "clis": [ + _cli_payload(cli, raw) + for cli in cli_global_config.CODING_GLOBAL_AGENT_TYPES + ] + } + ) + + +@router.put("/coding-cli/global-config") +async def switch_provider( + payload: CodingCliSwitchRequest, + request: Request, + auth: AuthContext = Depends(require_coding_cli_scope), +): + """Make one configured provider the CLI's default on this host.""" + await authorize_coding_cli(request, auth) + provider = _provider_for(payload.cli, _config_of(request), payload.provider_id) + try: + cli_global_config.apply_provider(payload.cli, provider) + except (OSError, ValueError) as exc: + _raise(exc) + return ok(_state(payload.cli)) + + +@router.delete("/coding-cli/global-config/{cli}") +async def remove_global_config( + cli: str, + request: Request, + auth: AuthContext = Depends(require_coding_cli_scope), +): + """Take AstrBot's configuration back out of the CLI's own file.""" + await authorize_coding_cli(request, auth) + if cli not in cli_global_config.CODING_GLOBAL_AGENT_TYPES: + raise ApiError(f"Unknown coding agent type: {cli!r}") + try: + cli_global_config.remove_provider(cli) + except (OSError, ValueError) as exc: + _raise(exc) + return ok(_state(cli)) diff --git a/astrbot/dashboard/api/router.py b/astrbot/dashboard/api/router.py index 0bdfd7d4b5..9747ddfa44 100644 --- a/astrbot/dashboard/api/router.py +++ b/astrbot/dashboard/api/router.py @@ -10,6 +10,7 @@ from .bots import router as bots_router from .chat import router as chat_router from .chat_projects import router as chat_projects_router +from .coding_cli import router as coding_cli_router from .config_profiles import router as config_profiles_router from .conversations import router as conversations_router from .cron import router as cron_router @@ -44,6 +45,7 @@ def build_api_router() -> APIRouter: router.include_router(appearance_router) router.include_router(backups_router) router.include_router(config_profiles_router) + router.include_router(coding_cli_router) router.include_router(api_keys_router) router.include_router(bots_router) router.include_router(providers_router) diff --git a/astrbot/dashboard/schemas.py b/astrbot/dashboard/schemas.py index 7a0e67458d..813192828d 100644 --- a/astrbot/dashboard/schemas.py +++ b/astrbot/dashboard/schemas.py @@ -843,3 +843,10 @@ class SessionGroupRequest(OpenModel): umos: list[str] | None = None add_umos: list[str] | None = None remove_umos: list[str] | None = None + + +class CodingCliSwitchRequest(BaseModel): + """Ask for one configured provider to become a CLI's default on this host.""" + + cli: Literal["claude_code", "codex"] + provider_id: str diff --git a/dashboard/src/api/generated/openapi-v1/index.ts b/dashboard/src/api/generated/openapi-v1/index.ts index 5c40529dd2..b4713a0196 100644 --- a/dashboard/src/api/generated/openapi-v1/index.ts +++ b/dashboard/src/api/generated/openapi-v1/index.ts @@ -1,1419 +1,4 @@ // This file is auto-generated by @hey-api/openapi-ts -export { - abortBackupUpload, - addChatProjectSession, - batchDeleteChatSessions, - batchDeleteConversations, - batchUpdateSessionProvider, - batchUpdateSessionService, - bindPluginSource, - bulkToggleBuiltinCommands, - checkBackup, - cleanupStorage, - completeBackupUpload, - completeMcp, - completeMcpOAuthCallback, - createApiKey, - createAuthorizationAccount, - createBackup, - createBot, - createChatProject, - createChatSession, - createChatThread, - createConfigProfile, - createCronJob, - createDataFileEntry, - createKnowledgeBase, - createMcpServer, - createMemoryFact, - createPersona, - createPersonaFolder, - createPluginDashboardPageSession, - createPluginSource, - createProvider, - createProviderInSource, - createProviderSource, - createSessionGroup, - createT2iTemplate, - deleteApiKey, - deleteAppearanceWallpaper, - deleteAttachment, - deleteBackup, - deleteBot, - deleteChatProject, - deleteChatSession, - deleteChatThread, - deleteConfigProfile, - deleteConfigRoute, - deleteConversation, - deleteCronJob, - deleteDataFileEntry, - deleteKnowledgeBase, - deleteKnowledgeChunk, - deleteKnowledgeDocument, - deleteMcpServer, - deleteMemoryFact, - deleteNeoSkillCandidate, - deleteNeoSkillRelease, - deletePersona, - deletePersonaFolder, - deletePluginConfigFile, - deletePluginSource, - deleteProvider, - deleteProviderSource, - deleteSessionGroup, - deleteSessionRules, - deleteSkill, - deleteT2iTemplate, - downloadAttachment, - downloadBackup, - downloadChatProjectWorkspaceFile, - downloadDataFile, - downloadOpenApiFile, - downloadSkill, - evaluateNeoSkillCandidate, - exportConversations, - getActiveT2iTemplate, - getAppearanceWallpaper, - getAppearanceWallpaperThumbnail, - getAttachment, - getAuthSetupStatus, - getBackupProgress, - getBot, - getChangelog, - getChatProject, - getChatProjectWorkspaceFile, - getChatSession, - getChatThread, - getConfigProfile, - getConfigProfileSchema, - getConversation, - getConversationFilterOptions, - getDataFileContent, - getDataFileMetadata, - getFileByName, - getFirstNotice, - getKnowledgeBase, - getKnowledgeBaseStats, - getKnowledgeDocument, - getKnowledgeTask, - getLogHistory, - getMcpCatalog, - getMcpOAuthStatus, - getMcpPrompt, - getMemoryFact, - getMemoryStats, - getNeoSkillPayload, - getPersona, - getPersonaTree, - getPlugin, - getPluginChangelog, - getPluginConfig, - getPluginConfigSchema, - getPluginDashboardCatalog, - getPluginReadme, - getProvider, - getProviderEmbeddingDimension, - getProviderSchema, - getProviderSource, - getProviderTokenStats, - getPublicVersions, - getSkillFile, - getStartTime, - getStats, - getStorageStatus, - getSubagentConfig, - getSystemConfig, - getSystemConfigRuntime, - getSystemConfigSchema, - getT2iRuntimeStats, - getT2iTemplate, - getTokenFile, - getTraceSettings, - getVersion, - grantAuthorizationRoleBinding, - importBackup, - importKnowledgeDocumentFromUrl, - importKnowledgeDocuments, - initBackupUpload, - installPipPackage, - installPluginFromGithub, - installPluginFromUpload, - installPluginFromUrl, - invokeBotAction, - invokePluginDashboardAction, - invokePluginDashboardFile, - invokePluginDashboardUpload, - issueAuthorizationBatchRevokeStepUp, - issueAuthorizationStepUp, - issueWebChatAuthorizationStepUp, - listActiveUmos, - listApiKeys, - listAppearanceWallpapers, - listAuthorizationAccounts, - listAuthorizationAudit, - listAuthorizationRoleBindings, - listBackups, - listBots, - listBotStats, - listBotTypes, - listChangelogVersions, - listChatConfigs, - listChatProjects, - listChatProjectSessions, - listChatProjectWorkspaceFiles, - listChatSessions, - listCommandConflicts, - listCommands, - listConfigProfiles, - listConfigRoutes, - listConversations, - listCronJobs, - listDataFileTree, - listFailedPlugins, - listImBots, - listKnowledgeBases, - listKnowledgeChunks, - listKnowledgeDocuments, - listMcpPrompts, - listMcpResources, - listMcpResourceTemplates, - listMcpServers, - listMemoryFacts, - listMemoryOperations, - listMemoryProfiles, - listNeoSkillCandidates, - listNeoSkillReleases, - listPersonaFolders, - listPersonas, - listPluginConfigFiles, - listPluginMarket, - listPluginMarketCategories, - listPlugins, - listPluginSources, - listProviders, - listProvidersBySource, - listProviderSourceModels, - listProviderSources, - listSessionGroups, - listSessionRules, - listSessions, - listSkillFiles, - listSkills, - listSubagentAvailableTools, - listT2iTemplates, - listTools, - login, - logout, - moveDataFileEntry, - movePersonaItem, - openChatWebSocket, - openUnifiedChatWebSocket, - type Options, - promoteNeoSkillCandidate, - readMcpResource, - receivePlatformWebhook, - recoverTotp, - refreshMemoryProfile, - regenerateChatMessage, - registerBotType, - reindexKnowledgeDocument, - reloadFailedPlugin, - reloadPlugin, - removeChatProjectSession, - renameBackup, - renameConfigProfile, - reorderPersonaItems, - replaceConfigRoutes, - replaceConversationMessages, - replacePluginSources, - resetDefaultT2iTemplate, - restartCore, - restoreMemoryFact, - resumeChatRun, - retrieveKnowledgeBase, - revokeApiKey, - revokeAuthorizationRoleBinding, - revokeAuthorizationRoleBindings, - revokeMcpOAuth, - rollbackNeoSkillRelease, - runCronJob, - searchDataFiles, - sendChatMessage, - sendChatThreadMessage, - sendImMessage, - setActiveT2iTemplate, - setBotEnabled, - setMcpServerEnabled, - setParallelEnabled, - setPluginEnabled, - setProviderEnabled, - setToolEnabled, - setToolParallel, - setupAuth, - setupTotp, - startMcpOAuth, - stopChatSession, - streamLiveLogs, - syncModelScopeMcpServers, - syncNeoSkillRelease, - testBot, - testGhproxyConnection, - testMcpServer, - testProvider, - uninstallFailedPlugin, - uninstallPlugin, - updateAuthAccount, - updateAuthorizationAccount, - updateBot, - updateChatMessage, - updateChatProject, - updateChatSession, - updateCommand, - updateConfigProfileContent, - updateConversation, - updateCronJob, - updateDataFileContent, - updateKnowledgeBase, - updateMcpServer, - updateMemoryFact, - updatePersona, - updatePersonaFolder, - updatePlugin, - updatePluginConfig, - updatePluginLogLevel, - updatePlugins, - updateProvider, - updateSessionGroup, - updateSkill, - updateSkillFile, - updateSubagentConfig, - updateSystemConfig, - updateT2iTemplate, - updateTraceSettings, - uploadAppearanceWallpaper, - uploadBackup, - uploadBackupChunk, - uploadDataFile, - uploadFile, - uploadKnowledgeDocument, - uploadOpenApiFile, - uploadPluginConfigFiles, - uploadSkill, - uploadSkillsBatch, - upsertConfigRoute, - upsertProviderSource, - upsertSessionRule, - verifyPlatformWebhook, -} from './sdk.gen'; -export type { - AbortBackupUploadData, - AbortBackupUploadResponse, - AbortBackupUploadResponses, - AddChatProjectSessionData, - AddChatProjectSessionResponse, - AddChatProjectSessionResponses, - AppearanceWallpaper, - AppearanceWallpaperId, - AppearanceWallpaperListResponse, - AppearanceWallpaperResponse, - AppearanceWallpaperUploadRequest, - AttachmentId, - AttachmentIdQuery, - AuthorizationBindingBatchRevokeRequest, - AuthorizationBindingBatchRevokeRequestWritable, - AuthorizationBindingRequest, - AuthorizationStepUpRequest, - AuthorizationStepUpRequestWritable, - BackupChunkUploadRequest, - BackupExportRequest, - BackupImportRequest, - BackupRenameRequest, - BackupUploadInitRequest, - BackupUploadRequest, - BackupUploadSessionRequest, - BatchDeleteChatSessionsData, - BatchDeleteChatSessionsResponse, - BatchDeleteChatSessionsResponses, - BatchDeleteConversationsData, - BatchDeleteConversationsResponse, - BatchDeleteConversationsResponses, - BatchSessionProviderRequest, - BatchSessionServiceRequest, - BatchUpdateSessionProviderData, - BatchUpdateSessionProviderResponse, - BatchUpdateSessionProviderResponses, - BatchUpdateSessionServiceData, - BatchUpdateSessionServiceResponse, - BatchUpdateSessionServiceResponses, - BindPluginSourceData, - BindPluginSourceResponse, - BindPluginSourceResponses, - BotActionRequest, - BotConfigRequest, - BotId, - BotRegistrationRequest, - BuiltinCommandBulkToggleRequest, - BulkToggleBuiltinCommandsData, - BulkToggleBuiltinCommandsResponse, - BulkToggleBuiltinCommandsResponses, - ChatMessagePatchRequest, - ChatMessageRegenerateRequest, - ChatMessageRegenerateRequestWritable, - ChatProjectRequest, - ChatRequest, - ChatRequestWritable, - ChatSessionBatchDeleteRequest, - ChatSessionPatchRequest, - ChatThreadCreateRequest, - ChatThreadMessageRequest, - ChatThreadMessageRequestWritable, - CheckBackupData, - CheckBackupResponse, - CheckBackupResponses, - ChunkId, - CleanupStorageData, - CleanupStorageResponse, - CleanupStorageResponses, - ClientOptions, - CommandId, - CommandItem, - CommandItemEnvelope, - CommandListData, - CommandListEnvelope, - CommandPatchRequest, - CommandSummary, - CompleteBackupUploadData, - CompleteBackupUploadResponse, - CompleteBackupUploadResponses, - CompleteMcpData, - CompleteMcpOAuthCallbackData, - CompleteMcpResponse, - CompleteMcpResponses, - ConfigId, - ConfigRoutesReplaceRequest, - ConfigRouteUpsertRequest, - ConversationBatchDeleteRequest, - ConversationExportRequest, - ConversationId, - ConversationMessagesReplaceRequest, - ConversationPatchRequest, - ConversationRef, - CreateApiKeyData, - CreateApiKeyRequest, - CreateApiKeyResponse, - CreateApiKeyResponses, - CreateAuthorizationAccountData, - CreateAuthorizationAccountResponse, - CreateAuthorizationAccountResponses, - CreateBackupData, - CreateBackupResponse, - CreateBackupResponses, - CreateBotData, - CreateBotResponse, - CreateBotResponses, - CreateChatProjectData, - CreateChatProjectResponse, - CreateChatProjectResponses, - CreateChatSessionData, - CreateChatSessionResponse, - CreateChatSessionResponses, - CreateChatThreadData, - CreateChatThreadResponse, - CreateChatThreadResponses, - CreateConfigProfileData, - CreateConfigProfileRequest, - CreateConfigProfileResponse, - CreateConfigProfileResponses, - CreateCronJobData, - CreateCronJobResponse, - CreateCronJobResponses, - CreateDataFileEntryData, - CreateDataFileEntryResponse, - CreateDataFileEntryResponses, - CreateKnowledgeBaseData, - CreateKnowledgeBaseResponse, - CreateKnowledgeBaseResponses, - CreateMcpServerData, - CreateMcpServerResponse, - CreateMcpServerResponses, - CreateMemoryFactData, - CreateMemoryFactResponse, - CreateMemoryFactResponses, - CreatePersonaData, - CreatePersonaFolderData, - CreatePersonaFolderResponse, - CreatePersonaFolderResponses, - CreatePersonaResponse, - CreatePersonaResponses, - CreatePluginDashboardPageSessionData, - CreatePluginDashboardPageSessionError, - CreatePluginDashboardPageSessionErrors, - CreatePluginDashboardPageSessionResponse, - CreatePluginDashboardPageSessionResponses, - CreatePluginSourceData, - CreatePluginSourceResponse, - CreatePluginSourceResponses, - CreateProviderData, - CreateProviderInSourceData, - CreateProviderInSourceResponse, - CreateProviderInSourceResponses, - CreateProviderResponse, - CreateProviderResponses, - CreateProviderSourceData, - CreateProviderSourceResponse, - CreateProviderSourceResponses, - CreateSessionGroupData, - CreateSessionGroupResponse, - CreateSessionGroupResponses, - CreateT2iTemplateData, - CreateT2iTemplateResponse, - CreateT2iTemplateResponses, - CronJobPatchRequest, - CronJobRequest, - DashboardAccountCreateRequest, - DashboardAccountCreateRequestWritable, - DashboardAccountUpdateRequest, - DashboardAccountUpdateRequestWritable, - DataFileContentRequest, - DataFileDeleteRequest, - DataFileEntryRequest, - DataFileMoveRequest, - DataFilePath, - DeleteApiKeyData, - DeleteApiKeyResponse, - DeleteApiKeyResponses, - DeleteAppearanceWallpaperData, - DeleteAppearanceWallpaperError, - DeleteAppearanceWallpaperErrors, - DeleteAppearanceWallpaperResponse, - DeleteAppearanceWallpaperResponses, - DeleteAttachmentData, - DeleteAttachmentResponse, - DeleteAttachmentResponses, - DeleteBackupData, - DeleteBackupResponse, - DeleteBackupResponses, - DeleteBotData, - DeleteBotResponse, - DeleteBotResponses, - DeleteChatProjectData, - DeleteChatProjectResponse, - DeleteChatProjectResponses, - DeleteChatSessionData, - DeleteChatSessionResponse, - DeleteChatSessionResponses, - DeleteChatThreadData, - DeleteChatThreadResponse, - DeleteChatThreadResponses, - DeleteConfigProfileData, - DeleteConfigProfileResponse, - DeleteConfigProfileResponses, - DeleteConfigRouteData, - DeleteConfigRouteResponse, - DeleteConfigRouteResponses, - DeleteConversationData, - DeleteConversationResponse, - DeleteConversationResponses, - DeleteCronJobData, - DeleteCronJobResponse, - DeleteCronJobResponses, - DeleteDataFileEntryData, - DeleteDataFileEntryResponse, - DeleteDataFileEntryResponses, - DeleteKnowledgeBaseData, - DeleteKnowledgeBaseResponse, - DeleteKnowledgeBaseResponses, - DeleteKnowledgeChunkData, - DeleteKnowledgeChunkResponse, - DeleteKnowledgeChunkResponses, - DeleteKnowledgeDocumentData, - DeleteKnowledgeDocumentResponse, - DeleteKnowledgeDocumentResponses, - DeleteMcpServerData, - DeleteMcpServerResponse, - DeleteMcpServerResponses, - DeleteMemoryFactData, - DeleteMemoryFactResponse, - DeleteMemoryFactResponses, - DeleteNeoSkillCandidateData, - DeleteNeoSkillCandidateResponse, - DeleteNeoSkillCandidateResponses, - DeleteNeoSkillReleaseData, - DeleteNeoSkillReleaseResponse, - DeleteNeoSkillReleaseResponses, - DeletePersonaData, - DeletePersonaFolderData, - DeletePersonaFolderResponse, - DeletePersonaFolderResponses, - DeletePersonaResponse, - DeletePersonaResponses, - DeletePluginConfigFileData, - DeletePluginConfigFileResponse, - DeletePluginConfigFileResponses, - DeletePluginSourceData, - DeletePluginSourceResponse, - DeletePluginSourceResponses, - DeleteProviderData, - DeleteProviderResponse, - DeleteProviderResponses, - DeleteProviderSourceData, - DeleteProviderSourceResponse, - DeleteProviderSourceResponses, - DeleteSessionGroupData, - DeleteSessionGroupResponse, - DeleteSessionGroupResponses, - DeleteSessionRulesData, - DeleteSessionRulesResponse, - DeleteSessionRulesResponses, - DeleteSkillData, - DeleteSkillResponse, - DeleteSkillResponses, - DeleteT2iTemplateData, - DeleteT2iTemplateResponse, - DeleteT2iTemplateResponses, - DocumentId, - DownloadAttachmentData, - DownloadAttachmentResponse, - DownloadAttachmentResponses, - DownloadBackupData, - DownloadBackupResponse, - DownloadBackupResponses, - DownloadChatProjectWorkspaceFileData, - DownloadChatProjectWorkspaceFileResponse, - DownloadChatProjectWorkspaceFileResponses, - DownloadDataFileData, - DownloadDataFileResponse, - DownloadDataFileResponses, - DownloadOpenApiFileData, - DownloadOpenApiFileResponse, - DownloadOpenApiFileResponses, - DownloadSkillData, - DownloadSkillResponse, - DownloadSkillResponses, - DynamicConfig, - EnabledPatch, - ErrorEnvelope, - EvaluateNeoSkillCandidateData, - EvaluateNeoSkillCandidateResponse, - EvaluateNeoSkillCandidateResponses, - ExportConversationsData, - ExportConversationsResponse, - ExportConversationsResponses, - ExtensionId, - FactId, - Filename, - FilePath, - FileUploadRequest, - FolderId, - GetActiveT2iTemplateData, - GetActiveT2iTemplateResponse, - GetActiveT2iTemplateResponses, - GetAppearanceWallpaperData, - GetAppearanceWallpaperError, - GetAppearanceWallpaperErrors, - GetAppearanceWallpaperResponse, - GetAppearanceWallpaperResponses, - GetAppearanceWallpaperThumbnailData, - GetAppearanceWallpaperThumbnailError, - GetAppearanceWallpaperThumbnailErrors, - GetAppearanceWallpaperThumbnailResponse, - GetAppearanceWallpaperThumbnailResponses, - GetAttachmentData, - GetAttachmentResponse, - GetAttachmentResponses, - GetAuthSetupStatusData, - GetAuthSetupStatusResponse, - GetAuthSetupStatusResponses, - GetBackupProgressData, - GetBackupProgressResponse, - GetBackupProgressResponses, - GetBotData, - GetBotResponse, - GetBotResponses, - GetChangelogData, - GetChangelogError, - GetChangelogErrors, - GetChangelogResponse, - GetChangelogResponses, - GetChatProjectData, - GetChatProjectResponse, - GetChatProjectResponses, - GetChatProjectWorkspaceFileData, - GetChatProjectWorkspaceFileResponse, - GetChatProjectWorkspaceFileResponses, - GetChatSessionData, - GetChatSessionResponse, - GetChatSessionResponses, - GetChatThreadData, - GetChatThreadResponse, - GetChatThreadResponses, - GetConfigProfileData, - GetConfigProfileResponse, - GetConfigProfileResponses, - GetConfigProfileSchemaData, - GetConfigProfileSchemaResponse, - GetConfigProfileSchemaResponses, - GetConversationData, - GetConversationFilterOptionsData, - GetConversationFilterOptionsResponse, - GetConversationFilterOptionsResponses, - GetConversationResponse, - GetConversationResponses, - GetDataFileContentData, - GetDataFileContentResponse, - GetDataFileContentResponses, - GetDataFileMetadataData, - GetDataFileMetadataResponse, - GetDataFileMetadataResponses, - GetFileByNameData, - GetFileByNameResponse, - GetFileByNameResponses, - GetFirstNoticeData, - GetFirstNoticeResponse, - GetFirstNoticeResponses, - GetKnowledgeBaseData, - GetKnowledgeBaseResponse, - GetKnowledgeBaseResponses, - GetKnowledgeBaseStatsData, - GetKnowledgeBaseStatsResponse, - GetKnowledgeBaseStatsResponses, - GetKnowledgeDocumentData, - GetKnowledgeDocumentResponse, - GetKnowledgeDocumentResponses, - GetKnowledgeTaskData, - GetKnowledgeTaskResponse, - GetKnowledgeTaskResponses, - GetLogHistoryData, - GetLogHistoryResponse, - GetLogHistoryResponses, - GetMcpCatalogData, - GetMcpCatalogResponse, - GetMcpCatalogResponses, - GetMcpOAuthStatusData, - GetMcpOAuthStatusResponse, - GetMcpOAuthStatusResponses, - GetMcpPromptData, - GetMcpPromptResponse, - GetMcpPromptResponses, - GetMemoryFactData, - GetMemoryFactResponse, - GetMemoryFactResponses, - GetMemoryStatsData, - GetMemoryStatsResponse, - GetMemoryStatsResponses, - GetNeoSkillPayloadData, - GetNeoSkillPayloadResponse, - GetNeoSkillPayloadResponses, - GetPersonaData, - GetPersonaResponse, - GetPersonaResponses, - GetPersonaTreeData, - GetPersonaTreeResponse, - GetPersonaTreeResponses, - GetPluginChangelogData, - GetPluginChangelogResponse, - GetPluginChangelogResponses, - GetPluginConfigData, - GetPluginConfigResponse, - GetPluginConfigResponses, - GetPluginConfigSchemaData, - GetPluginConfigSchemaResponse, - GetPluginConfigSchemaResponses, - GetPluginDashboardCatalogData, - GetPluginDashboardCatalogError, - GetPluginDashboardCatalogErrors, - GetPluginDashboardCatalogResponse, - GetPluginDashboardCatalogResponses, - GetPluginData, - GetPluginReadmeData, - GetPluginReadmeResponse, - GetPluginReadmeResponses, - GetPluginResponse, - GetPluginResponses, - GetProviderData, - GetProviderEmbeddingDimensionData, - GetProviderEmbeddingDimensionResponse, - GetProviderEmbeddingDimensionResponses, - GetProviderResponse, - GetProviderResponses, - GetProviderSchemaData, - GetProviderSchemaResponse, - GetProviderSchemaResponses, - GetProviderSourceData, - GetProviderSourceResponse, - GetProviderSourceResponses, - GetProviderTokenStatsData, - GetProviderTokenStatsResponse, - GetProviderTokenStatsResponses, - GetPublicVersionsData, - GetPublicVersionsResponse, - GetPublicVersionsResponses, - GetSkillFileData, - GetSkillFileResponse, - GetSkillFileResponses, - GetStartTimeData, - GetStartTimeResponse, - GetStartTimeResponses, - GetStatsData, - GetStatsResponse, - GetStatsResponses, - GetStorageStatusData, - GetStorageStatusResponse, - GetStorageStatusResponses, - GetSubagentConfigData, - GetSubagentConfigResponse, - GetSubagentConfigResponses, - GetSystemConfigData, - GetSystemConfigResponse, - GetSystemConfigResponses, - GetSystemConfigRuntimeData, - GetSystemConfigRuntimeResponse, - GetSystemConfigRuntimeResponses, - GetSystemConfigSchemaData, - GetSystemConfigSchemaResponse, - GetSystemConfigSchemaResponses, - GetT2iRuntimeStatsData, - GetT2iRuntimeStatsResponse, - GetT2iRuntimeStatsResponses, - GetT2iTemplateData, - GetT2iTemplateResponse, - GetT2iTemplateResponses, - GetTokenFileData, - GetTokenFileResponse, - GetTokenFileResponses, - GetTraceSettingsData, - GetTraceSettingsResponse, - GetTraceSettingsResponses, - GetVersionData, - GetVersionResponse, - GetVersionResponses, - GhproxyTestRequest, - GrantAuthorizationRoleBindingData, - GrantAuthorizationRoleBindingResponse, - GrantAuthorizationRoleBindingResponses, - GroupId, - ImMessageRequest, - ImportBackupData, - ImportBackupResponse, - ImportBackupResponses, - ImportKnowledgeDocumentFromUrlData, - ImportKnowledgeDocumentFromUrlError, - ImportKnowledgeDocumentFromUrlErrors, - ImportKnowledgeDocumentFromUrlResponse, - ImportKnowledgeDocumentFromUrlResponses, - ImportKnowledgeDocumentsData, - ImportKnowledgeDocumentsError, - ImportKnowledgeDocumentsErrors, - ImportKnowledgeDocumentsResponse, - ImportKnowledgeDocumentsResponses, - InitBackupUploadData, - InitBackupUploadResponse, - InitBackupUploadResponses, - InstallPipPackageData, - InstallPipPackageResponse, - InstallPipPackageResponses, - InstallPluginFromGithubData, - InstallPluginFromGithubResponse, - InstallPluginFromGithubResponses, - InstallPluginFromUploadData, - InstallPluginFromUploadResponse, - InstallPluginFromUploadResponses, - InstallPluginFromUrlData, - InstallPluginFromUrlResponse, - InstallPluginFromUrlResponses, - InvokeBotActionData, - InvokeBotActionResponse, - InvokeBotActionResponses, - InvokePluginDashboardActionData, - InvokePluginDashboardActionError, - InvokePluginDashboardActionErrors, - InvokePluginDashboardActionResponse, - InvokePluginDashboardActionResponses, - InvokePluginDashboardFileData, - InvokePluginDashboardFileError, - InvokePluginDashboardFileErrors, - InvokePluginDashboardFileResponse, - InvokePluginDashboardFileResponses, - InvokePluginDashboardUploadData, - InvokePluginDashboardUploadError, - InvokePluginDashboardUploadErrors, - InvokePluginDashboardUploadResponse, - InvokePluginDashboardUploadResponses, - IssueAuthorizationBatchRevokeStepUpData, - IssueAuthorizationBatchRevokeStepUpResponse, - IssueAuthorizationBatchRevokeStepUpResponses, - IssueAuthorizationStepUpData, - IssueAuthorizationStepUpResponse, - IssueAuthorizationStepUpResponses, - IssueWebChatAuthorizationStepUpData, - IssueWebChatAuthorizationStepUpResponse, - IssueWebChatAuthorizationStepUpResponses, - JsonSchema, - KbId, - KeyId, - KnowledgeBaseCreateRequest, - KnowledgeBaseRequest, - KnowledgeDocument, - KnowledgeDocumentImportRequest, - KnowledgeDocumentUploadRequest, - KnowledgeDocumentUrlImportRequest, - KnowledgeRetrieveRequest, - ListActiveUmosData, - ListActiveUmosResponse, - ListActiveUmosResponses, - ListApiKeysData, - ListApiKeysResponse, - ListApiKeysResponses, - ListAppearanceWallpapersData, - ListAppearanceWallpapersResponse, - ListAppearanceWallpapersResponses, - ListAuthorizationAccountsData, - ListAuthorizationAccountsResponse, - ListAuthorizationAccountsResponses, - ListAuthorizationAuditData, - ListAuthorizationAuditResponse, - ListAuthorizationAuditResponses, - ListAuthorizationRoleBindingsData, - ListAuthorizationRoleBindingsResponse, - ListAuthorizationRoleBindingsResponses, - ListBackupsData, - ListBackupsResponse, - ListBackupsResponses, - ListBotsData, - ListBotsResponse, - ListBotsResponses, - ListBotStatsData, - ListBotStatsResponse, - ListBotStatsResponses, - ListBotTypesData, - ListBotTypesResponse, - ListBotTypesResponses, - ListChangelogVersionsData, - ListChangelogVersionsResponse, - ListChangelogVersionsResponses, - ListChatConfigsData, - ListChatConfigsResponse, - ListChatConfigsResponses, - ListChatProjectsData, - ListChatProjectSessionsData, - ListChatProjectSessionsResponse, - ListChatProjectSessionsResponses, - ListChatProjectsResponse, - ListChatProjectsResponses, - ListChatProjectWorkspaceFilesData, - ListChatProjectWorkspaceFilesResponse, - ListChatProjectWorkspaceFilesResponses, - ListChatSessionsData, - ListChatSessionsResponse, - ListChatSessionsResponses, - ListCommandConflictsData, - ListCommandConflictsResponse, - ListCommandConflictsResponses, - ListCommandsData, - ListCommandsResponse, - ListCommandsResponses, - ListConfigProfilesData, - ListConfigProfilesResponse, - ListConfigProfilesResponses, - ListConfigRoutesData, - ListConfigRoutesResponse, - ListConfigRoutesResponses, - ListConversationsData, - ListConversationsResponse, - ListConversationsResponses, - ListCronJobsData, - ListCronJobsResponse, - ListCronJobsResponses, - ListDataFileTreeData, - ListDataFileTreeResponse, - ListDataFileTreeResponses, - ListFailedPluginsData, - ListFailedPluginsResponse, - ListFailedPluginsResponses, - ListImBotsData, - ListImBotsResponse, - ListImBotsResponses, - ListKnowledgeBasesData, - ListKnowledgeBasesResponse, - ListKnowledgeBasesResponses, - ListKnowledgeChunksData, - ListKnowledgeChunksResponse, - ListKnowledgeChunksResponses, - ListKnowledgeDocumentsData, - ListKnowledgeDocumentsResponse, - ListKnowledgeDocumentsResponses, - ListMcpPromptsData, - ListMcpPromptsResponse, - ListMcpPromptsResponses, - ListMcpResourcesData, - ListMcpResourcesResponse, - ListMcpResourcesResponses, - ListMcpResourceTemplatesData, - ListMcpResourceTemplatesResponse, - ListMcpResourceTemplatesResponses, - ListMcpServersData, - ListMcpServersResponse, - ListMcpServersResponses, - ListMemoryFactsData, - ListMemoryFactsResponse, - ListMemoryFactsResponses, - ListMemoryOperationsData, - ListMemoryOperationsResponse, - ListMemoryOperationsResponses, - ListMemoryProfilesData, - ListMemoryProfilesResponse, - ListMemoryProfilesResponses, - ListNeoSkillCandidatesData, - ListNeoSkillCandidatesResponse, - ListNeoSkillCandidatesResponses, - ListNeoSkillReleasesData, - ListNeoSkillReleasesResponse, - ListNeoSkillReleasesResponses, - ListPersonaFoldersData, - ListPersonaFoldersResponse, - ListPersonaFoldersResponses, - ListPersonasData, - ListPersonasResponse, - ListPersonasResponses, - ListPluginConfigFilesData, - ListPluginConfigFilesResponse, - ListPluginConfigFilesResponses, - ListPluginMarketCategoriesData, - ListPluginMarketCategoriesResponse, - ListPluginMarketCategoriesResponses, - ListPluginMarketData, - ListPluginMarketResponse, - ListPluginMarketResponses, - ListPluginsData, - ListPluginSourcesData, - ListPluginSourcesResponse, - ListPluginSourcesResponses, - ListPluginsResponse, - ListPluginsResponses, - ListProvidersBySourceData, - ListProvidersBySourceResponse, - ListProvidersBySourceResponses, - ListProvidersData, - ListProviderSourceModelsData, - ListProviderSourceModelsResponse, - ListProviderSourceModelsResponses, - ListProviderSourcesData, - ListProviderSourcesResponse, - ListProviderSourcesResponses, - ListProvidersResponse, - ListProvidersResponses, - ListSessionGroupsData, - ListSessionGroupsResponse, - ListSessionGroupsResponses, - ListSessionRulesData, - ListSessionRulesResponse, - ListSessionRulesResponses, - ListSessionsData, - ListSessionsResponse, - ListSessionsResponses, - ListSkillFilesData, - ListSkillFilesResponse, - ListSkillFilesResponses, - ListSkillsData, - ListSkillsResponse, - ListSkillsResponses, - ListSubagentAvailableToolsData, - ListSubagentAvailableToolsResponse, - ListSubagentAvailableToolsResponses, - ListT2iTemplatesData, - ListT2iTemplatesResponse, - ListT2iTemplatesResponses, - ListToolsData, - ListToolsResponse, - ListToolsResponses, - LoginData, - LoginError, - LoginErrors, - LoginRequest, - LoginResponse, - LoginResponses, - LogoutData, - LogoutResponse, - LogoutResponses, - McpCompletionRequest, - McpPromptGetRequest, - McpResourceReadRequest, - McpServerConfig, - MemoryFactActionRequest, - MemoryFactCreateRequest, - MemoryFactPatchRequest, - MemoryProfileRefreshRequest, - MessagePart, - ModelScopeSyncRequest, - MoveDataFileEntryData, - MoveDataFileEntryResponse, - MoveDataFileEntryResponses, - MovePersonaItemData, - MovePersonaItemResponse, - MovePersonaItemResponses, - Name, - NameRequest, - NeoCandidateActionRequest, - NeoReleaseActionRequest, - NeoSyncRequest, - OpenChatWebSocketData, - OpenUnifiedChatWebSocketData, - Page, - PageSize, - PersonaFolderRequest, - PersonaId, - PersonaMoveRequest, - PersonaRequest, - PipInstallRequest, - PluginActionId, - PluginBatchUpdateRequest, - PluginConfigFileDeleteRequest, - PluginDashboardAction, - PluginDashboardActionRequest, - PluginDashboardCatalog, - PluginDashboardCatalogResponse, - PluginDashboardFileRequest, - PluginDashboardFileResponse, - PluginDashboardFileTicket, - PluginDashboardPage, - PluginDashboardSession, - PluginDashboardSessionRequest, - PluginDashboardSessionResponse, - PluginDashboardUploadMetadata, - PluginDashboardUploadRequest, - PluginGithubInstallRequest, - PluginId, - PluginPageId, - PluginSourceBindRequest, - PluginSourceRequest, - PluginUpdateRequest, - PluginUploadInstallRequest, - PluginUrlInstallRequest, - PromoteNeoSkillCandidateData, - PromoteNeoSkillCandidateResponse, - PromoteNeoSkillCandidateResponses, - ProviderConfigRequest, - ProviderEmbeddingDimensionRequest, - ProviderId, - ProviderSourceConfigRequest, - ReadMcpResourceData, - ReadMcpResourceResponse, - ReadMcpResourceResponses, - ReceivePlatformWebhookData, - ReceivePlatformWebhookResponses, - RecoverTotpData, - RecoverTotpResponse, - RecoverTotpResponses, - RefreshMemoryProfileData, - RefreshMemoryProfileResponse, - RefreshMemoryProfileResponses, - RegenerateChatMessageData, - RegenerateChatMessageResponse, - RegenerateChatMessageResponses, - RegisterBotTypeData, - RegisterBotTypeResponse, - RegisterBotTypeResponses, - ReindexKnowledgeDocumentData, - ReindexKnowledgeDocumentError, - ReindexKnowledgeDocumentErrors, - ReindexKnowledgeDocumentResponse, - ReindexKnowledgeDocumentResponses, - ReloadFailedPluginData, - ReloadFailedPluginResponse, - ReloadFailedPluginResponses, - ReloadPluginData, - ReloadPluginResponse, - ReloadPluginResponses, - RemoveChatProjectSessionData, - RemoveChatProjectSessionResponse, - RemoveChatProjectSessionResponses, - RenameBackupData, - RenameBackupResponse, - RenameBackupResponses, - RenameConfigProfileData, - RenameConfigProfileResponse, - RenameConfigProfileResponses, - RenameRequest, - ReorderPersonaItemsData, - ReorderPersonaItemsResponse, - ReorderPersonaItemsResponses, - ReorderRequest, - ReplaceConfigRoutesData, - ReplaceConfigRoutesResponse, - ReplaceConfigRoutesResponses, - ReplaceConversationMessagesData, - ReplaceConversationMessagesResponse, - ReplaceConversationMessagesResponses, - ReplacePluginSourcesData, - ReplacePluginSourcesResponse, - ReplacePluginSourcesResponses, - ResetDefaultT2iTemplateData, - ResetDefaultT2iTemplateResponse, - ResetDefaultT2iTemplateResponses, - RestartCoreData, - RestartCoreResponse, - RestartCoreResponses, - RestoreMemoryFactData, - RestoreMemoryFactResponse, - RestoreMemoryFactResponses, - ResumeChatRunData, - ResumeChatRunResponse, - ResumeChatRunResponses, - RetrieveKnowledgeBaseData, - RetrieveKnowledgeBaseResponse, - RetrieveKnowledgeBaseResponses, - RevokeApiKeyData, - RevokeApiKeyResponse, - RevokeApiKeyResponses, - RevokeAuthorizationRoleBindingData, - RevokeAuthorizationRoleBindingResponse, - RevokeAuthorizationRoleBindingResponses, - RevokeAuthorizationRoleBindingsData, - RevokeAuthorizationRoleBindingsResponse, - RevokeAuthorizationRoleBindingsResponses, - RevokeMcpOAuthData, - RevokeMcpOAuthResponse, - RevokeMcpOAuthResponses, - RollbackNeoSkillReleaseData, - RollbackNeoSkillReleaseResponse, - RollbackNeoSkillReleaseResponses, - RunCronJobData, - RunCronJobResponse, - RunCronJobResponses, - RuntimeInfo, - SearchDataFilesData, - SearchDataFilesResponse, - SearchDataFilesResponses, - SendChatMessageData, - SendChatMessageResponse, - SendChatMessageResponses, - SendChatThreadMessageData, - SendChatThreadMessageResponse, - SendChatThreadMessageResponses, - SendImMessageData, - SendImMessageResponse, - SendImMessageResponses, - ServerName, - SessionGroupRequest, - SessionId, - SessionRuleRequest, - SetActiveT2iTemplateData, - SetActiveT2iTemplateResponse, - SetActiveT2iTemplateResponses, - SetBotEnabledData, - SetBotEnabledResponse, - SetBotEnabledResponses, - SetMcpServerEnabledData, - SetMcpServerEnabledResponse, - SetMcpServerEnabledResponses, - SetParallelEnabledData, - SetParallelEnabledResponse, - SetParallelEnabledResponses, - SetPluginEnabledData, - SetPluginEnabledResponse, - SetPluginEnabledResponses, - SetProviderEnabledData, - SetProviderEnabledResponse, - SetProviderEnabledResponses, - SetToolEnabledData, - SetToolEnabledResponse, - SetToolEnabledResponses, - SetToolParallelData, - SetToolParallelResponse, - SetToolParallelResponses, - SetupAuthData, - SetupAuthRequest, - SetupAuthResponse, - SetupAuthResponses, - SetupTotpData, - SetupTotpResponse, - SetupTotpResponses, - SkillInventoryData, - SkillInventoryItem, - SkillInventoryResponse, - SkillName, - SkillPatchRequest, - SkillUploadRequest, - SourceId, - StartMcpOAuthData, - StartMcpOAuthResponse, - StartMcpOAuthResponses, - StopChatSessionData, - StopChatSessionResponse, - StopChatSessionResponses, - StorageCleanupRequest, - StreamLiveLogsData, - StreamLiveLogsResponse, - StreamLiveLogsResponses, - SubAgentConfigRequest, - SuccessEnvelope, - SyncModelScopeMcpServersData, - SyncModelScopeMcpServersResponse, - SyncModelScopeMcpServersResponses, - SyncNeoSkillReleaseData, - SyncNeoSkillReleaseResponse, - SyncNeoSkillReleaseResponses, - T2iTemplateContentRequest, - T2iTemplateRequest, - TaskId, - TestBotData, - TestBotResponse, - TestBotResponses, - TestGhproxyConnectionData, - TestGhproxyConnectionResponse, - TestGhproxyConnectionResponses, - TestMcpServerData, - TestMcpServerResponse, - TestMcpServerResponses, - TestProviderData, - TestProviderResponse, - TestProviderResponses, - ToolId, - TotpSetupRequest, - TraceSettingsRequest, - Umo, - UmoListRequest, - UninstallFailedPluginData, - UninstallFailedPluginResponse, - UninstallFailedPluginResponses, - UninstallPluginData, - UninstallPluginResponse, - UninstallPluginResponses, - UpdateAccountRequest, - UpdateAuthAccountData, - UpdateAuthAccountResponse, - UpdateAuthAccountResponses, - UpdateAuthorizationAccountData, - UpdateAuthorizationAccountResponse, - UpdateAuthorizationAccountResponses, - UpdateBotData, - UpdateBotResponse, - UpdateBotResponses, - UpdateChatMessageData, - UpdateChatMessageResponse, - UpdateChatMessageResponses, - UpdateChatProjectData, - UpdateChatProjectResponse, - UpdateChatProjectResponses, - UpdateChatSessionData, - UpdateChatSessionResponse, - UpdateChatSessionResponses, - UpdateCommandData, - UpdateCommandResponse, - UpdateCommandResponses, - UpdateConfigProfileContentData, - UpdateConfigProfileContentResponse, - UpdateConfigProfileContentResponses, - UpdateConversationData, - UpdateConversationResponse, - UpdateConversationResponses, - UpdateCronJobData, - UpdateCronJobResponse, - UpdateCronJobResponses, - UpdateDataFileContentData, - UpdateDataFileContentError, - UpdateDataFileContentErrors, - UpdateDataFileContentResponse, - UpdateDataFileContentResponses, - UpdateKnowledgeBaseData, - UpdateKnowledgeBaseResponse, - UpdateKnowledgeBaseResponses, - UpdateMcpServerData, - UpdateMcpServerResponse, - UpdateMcpServerResponses, - UpdateMemoryFactData, - UpdateMemoryFactResponse, - UpdateMemoryFactResponses, - UpdatePersonaData, - UpdatePersonaFolderData, - UpdatePersonaFolderResponse, - UpdatePersonaFolderResponses, - UpdatePersonaResponse, - UpdatePersonaResponses, - UpdatePluginConfigData, - UpdatePluginConfigResponse, - UpdatePluginConfigResponses, - UpdatePluginData, - UpdatePluginLogLevelData, - UpdatePluginLogLevelResponse, - UpdatePluginLogLevelResponses, - UpdatePluginResponse, - UpdatePluginResponses, - UpdatePluginsData, - UpdatePluginsResponse, - UpdatePluginsResponses, - UpdateProviderData, - UpdateProviderResponse, - UpdateProviderResponses, - UpdateSessionGroupData, - UpdateSessionGroupResponse, - UpdateSessionGroupResponses, - UpdateSkillData, - UpdateSkillFileData, - UpdateSkillFileResponse, - UpdateSkillFileResponses, - UpdateSkillResponse, - UpdateSkillResponses, - UpdateSubagentConfigData, - UpdateSubagentConfigResponse, - UpdateSubagentConfigResponses, - UpdateSystemConfigData, - UpdateSystemConfigResponse, - UpdateSystemConfigResponses, - UpdateT2iTemplateData, - UpdateT2iTemplateResponse, - UpdateT2iTemplateResponses, - UpdateTraceSettingsData, - UpdateTraceSettingsResponse, - UpdateTraceSettingsResponses, - UploadAppearanceWallpaperData, - UploadAppearanceWallpaperError, - UploadAppearanceWallpaperErrors, - UploadAppearanceWallpaperResponse, - UploadAppearanceWallpaperResponses, - UploadBackupChunkData, - UploadBackupChunkResponse, - UploadBackupChunkResponses, - UploadBackupData, - UploadBackupResponse, - UploadBackupResponses, - UploadDataFileData, - UploadDataFileResponse, - UploadDataFileResponses, - UploadFileData, - UploadFileResponse, - UploadFileResponses, - UploadKnowledgeDocumentData, - UploadKnowledgeDocumentError, - UploadKnowledgeDocumentErrors, - UploadKnowledgeDocumentResponse, - UploadKnowledgeDocumentResponses, - UploadOpenApiFileData, - UploadOpenApiFileResponse, - UploadOpenApiFileResponses, - UploadPluginConfigFilesData, - UploadPluginConfigFilesResponse, - UploadPluginConfigFilesResponses, - UploadSkillData, - UploadSkillResponse, - UploadSkillResponses, - UploadSkillsBatchData, - UploadSkillsBatchResponse, - UploadSkillsBatchResponses, - UpsertConfigRouteData, - UpsertConfigRouteResponse, - UpsertConfigRouteResponses, - UpsertProviderSourceData, - UpsertProviderSourceResponse, - UpsertProviderSourceResponses, - UpsertSessionRuleData, - UpsertSessionRuleResponse, - UpsertSessionRuleResponses, - VerifyPlatformWebhookData, - VerifyPlatformWebhookResponses, - WebChatStepUpRequest, - WebChatStepUpRequestWritable, - WebhookUuid, -} from './types.gen'; +export { abortBackupUpload, addChatProjectSession, batchDeleteChatSessions, batchDeleteConversations, batchUpdateSessionProvider, batchUpdateSessionService, bindPluginSource, bulkToggleBuiltinCommands, checkBackup, cleanupStorage, completeBackupUpload, completeMcp, completeMcpOAuthCallback, createApiKey, createAuthorizationAccount, createBackup, createBot, createChatProject, createChatSession, createChatThread, createConfigProfile, createCronJob, createDataFileEntry, createKnowledgeBase, createMcpServer, createMemoryFact, createPersona, createPersonaFolder, createPluginDashboardPageSession, createPluginSource, createProvider, createProviderInSource, createProviderSource, createSessionGroup, createT2iTemplate, deleteApiKey, deleteAppearanceWallpaper, deleteAttachment, deleteBackup, deleteBot, deleteChatProject, deleteChatSession, deleteChatThread, deleteConfigProfile, deleteConfigRoute, deleteConversation, deleteCronJob, deleteDataFileEntry, deleteKnowledgeBase, deleteKnowledgeChunk, deleteKnowledgeDocument, deleteMcpServer, deleteMemoryFact, deleteNeoSkillCandidate, deleteNeoSkillRelease, deletePersona, deletePersonaFolder, deletePluginConfigFile, deletePluginSource, deleteProvider, deleteProviderSource, deleteSessionGroup, deleteSessionRules, deleteSkill, deleteT2iTemplate, downloadAttachment, downloadBackup, downloadChatProjectWorkspaceFile, downloadDataFile, downloadOpenApiFile, downloadSkill, evaluateNeoSkillCandidate, exportConversations, getActiveT2iTemplate, getAppearanceWallpaper, getAppearanceWallpaperThumbnail, getAttachment, getAuthSetupStatus, getBackupProgress, getBot, getChangelog, getChatProject, getChatProjectWorkspaceFile, getChatSession, getChatThread, getCodingCliGlobalConfig, getConfigProfile, getConfigProfileSchema, getConversation, getConversationFilterOptions, getDataFileContent, getDataFileMetadata, getFileByName, getFirstNotice, getKnowledgeBase, getKnowledgeBaseStats, getKnowledgeDocument, getKnowledgeTask, getLogHistory, getMcpCatalog, getMcpOAuthStatus, getMcpPrompt, getMemoryFact, getMemoryStats, getNeoSkillPayload, getPersona, getPersonaTree, getPlugin, getPluginChangelog, getPluginConfig, getPluginConfigSchema, getPluginDashboardCatalog, getPluginReadme, getProvider, getProviderEmbeddingDimension, getProviderSchema, getProviderSource, getProviderTokenStats, getPublicVersions, getSkillFile, getStartTime, getStats, getStorageStatus, getSubagentConfig, getSystemConfig, getSystemConfigRuntime, getSystemConfigSchema, getT2iRuntimeStats, getT2iTemplate, getTokenFile, getTraceSettings, getVersion, grantAuthorizationRoleBinding, importBackup, importKnowledgeDocumentFromUrl, importKnowledgeDocuments, initBackupUpload, installPipPackage, installPluginFromGithub, installPluginFromUpload, installPluginFromUrl, invokeBotAction, invokePluginDashboardAction, invokePluginDashboardFile, invokePluginDashboardUpload, issueAuthorizationBatchRevokeStepUp, issueAuthorizationStepUp, issueWebChatAuthorizationStepUp, listActiveUmos, listApiKeys, listAppearanceWallpapers, listAuthorizationAccounts, listAuthorizationAudit, listAuthorizationRoleBindings, listBackups, listBots, listBotStats, listBotTypes, listChangelogVersions, listChatConfigs, listChatProjects, listChatProjectSessions, listChatProjectWorkspaceFiles, listChatSessions, listCommandConflicts, listCommands, listConfigProfiles, listConfigRoutes, listConversations, listCronJobs, listDataFileTree, listFailedPlugins, listImBots, listKnowledgeBases, listKnowledgeChunks, listKnowledgeDocuments, listMcpPrompts, listMcpResources, listMcpResourceTemplates, listMcpServers, listMemoryFacts, listMemoryOperations, listMemoryProfiles, listNeoSkillCandidates, listNeoSkillReleases, listPersonaFolders, listPersonas, listPluginConfigFiles, listPluginMarket, listPluginMarketCategories, listPlugins, listPluginSources, listProviders, listProvidersBySource, listProviderSourceModels, listProviderSources, listSessionGroups, listSessionRules, listSessions, listSkillFiles, listSkills, listSubagentAvailableTools, listT2iTemplates, listTools, login, logout, moveDataFileEntry, movePersonaItem, openChatWebSocket, openUnifiedChatWebSocket, type Options, promoteNeoSkillCandidate, readMcpResource, receivePlatformWebhook, recoverTotp, refreshMemoryProfile, regenerateChatMessage, registerBotType, reindexKnowledgeDocument, reloadFailedPlugin, reloadPlugin, removeChatProjectSession, removeCodingCliGlobalConfig, renameBackup, renameConfigProfile, reorderPersonaItems, replaceConfigRoutes, replaceConversationMessages, replacePluginSources, resetDefaultT2iTemplate, restartCore, restoreMemoryFact, resumeChatRun, retrieveKnowledgeBase, revokeApiKey, revokeAuthorizationRoleBinding, revokeAuthorizationRoleBindings, revokeMcpOAuth, rollbackNeoSkillRelease, runCronJob, searchDataFiles, sendChatMessage, sendChatThreadMessage, sendImMessage, setActiveT2iTemplate, setBotEnabled, setMcpServerEnabled, setParallelEnabled, setPluginEnabled, setProviderEnabled, setToolEnabled, setToolParallel, setupAuth, setupTotp, startMcpOAuth, stopChatSession, streamLiveLogs, switchCodingCliProvider, syncModelScopeMcpServers, syncNeoSkillRelease, testBot, testGhproxyConnection, testMcpServer, testProvider, uninstallFailedPlugin, uninstallPlugin, updateAuthAccount, updateAuthorizationAccount, updateBot, updateChatMessage, updateChatProject, updateChatSession, updateCommand, updateConfigProfileContent, updateConversation, updateCronJob, updateDataFileContent, updateKnowledgeBase, updateMcpServer, updateMemoryFact, updatePersona, updatePersonaFolder, updatePlugin, updatePluginConfig, updatePluginLogLevel, updatePlugins, updateProvider, updateSessionGroup, updateSkill, updateSkillFile, updateSubagentConfig, updateSystemConfig, updateT2iTemplate, updateTraceSettings, uploadAppearanceWallpaper, uploadBackup, uploadBackupChunk, uploadDataFile, uploadFile, uploadKnowledgeDocument, uploadOpenApiFile, uploadPluginConfigFiles, uploadSkill, uploadSkillsBatch, upsertConfigRoute, upsertProviderSource, upsertSessionRule, verifyPlatformWebhook } from './sdk.gen'; +export type { AbortBackupUploadData, AbortBackupUploadResponse, AbortBackupUploadResponses, AddChatProjectSessionData, AddChatProjectSessionResponse, AddChatProjectSessionResponses, AppearanceWallpaper, AppearanceWallpaperId, AppearanceWallpaperListResponse, AppearanceWallpaperResponse, AppearanceWallpaperUploadRequest, AttachmentId, AttachmentIdQuery, AuthorizationBindingBatchRevokeRequest, AuthorizationBindingBatchRevokeRequestWritable, AuthorizationBindingRequest, AuthorizationStepUpRequest, AuthorizationStepUpRequestWritable, BackupChunkUploadRequest, BackupExportRequest, BackupImportRequest, BackupRenameRequest, BackupUploadInitRequest, BackupUploadRequest, BackupUploadSessionRequest, BatchDeleteChatSessionsData, BatchDeleteChatSessionsResponse, BatchDeleteChatSessionsResponses, BatchDeleteConversationsData, BatchDeleteConversationsResponse, BatchDeleteConversationsResponses, BatchSessionProviderRequest, BatchSessionServiceRequest, BatchUpdateSessionProviderData, BatchUpdateSessionProviderResponse, BatchUpdateSessionProviderResponses, BatchUpdateSessionServiceData, BatchUpdateSessionServiceResponse, BatchUpdateSessionServiceResponses, BindPluginSourceData, BindPluginSourceResponse, BindPluginSourceResponses, BotActionRequest, BotConfigRequest, BotId, BotRegistrationRequest, BuiltinCommandBulkToggleRequest, BulkToggleBuiltinCommandsData, BulkToggleBuiltinCommandsResponse, BulkToggleBuiltinCommandsResponses, ChatMessagePatchRequest, ChatMessageRegenerateRequest, ChatMessageRegenerateRequestWritable, ChatProjectRequest, ChatRequest, ChatRequestWritable, ChatSessionBatchDeleteRequest, ChatSessionPatchRequest, ChatThreadCreateRequest, ChatThreadMessageRequest, ChatThreadMessageRequestWritable, CheckBackupData, CheckBackupResponse, CheckBackupResponses, ChunkId, CleanupStorageData, CleanupStorageResponse, CleanupStorageResponses, ClientOptions, CodingCli, CodingCliSwitchRequest, CommandId, CommandItem, CommandItemEnvelope, CommandListData, CommandListEnvelope, CommandPatchRequest, CommandSummary, CompleteBackupUploadData, CompleteBackupUploadResponse, CompleteBackupUploadResponses, CompleteMcpData, CompleteMcpOAuthCallbackData, CompleteMcpResponse, CompleteMcpResponses, ConfigId, ConfigRoutesReplaceRequest, ConfigRouteUpsertRequest, ConversationBatchDeleteRequest, ConversationExportRequest, ConversationId, ConversationMessagesReplaceRequest, ConversationPatchRequest, ConversationRef, CreateApiKeyData, CreateApiKeyRequest, CreateApiKeyResponse, CreateApiKeyResponses, CreateAuthorizationAccountData, CreateAuthorizationAccountResponse, CreateAuthorizationAccountResponses, CreateBackupData, CreateBackupResponse, CreateBackupResponses, CreateBotData, CreateBotResponse, CreateBotResponses, CreateChatProjectData, CreateChatProjectResponse, CreateChatProjectResponses, CreateChatSessionData, CreateChatSessionResponse, CreateChatSessionResponses, CreateChatThreadData, CreateChatThreadResponse, CreateChatThreadResponses, CreateConfigProfileData, CreateConfigProfileRequest, CreateConfigProfileResponse, CreateConfigProfileResponses, CreateCronJobData, CreateCronJobResponse, CreateCronJobResponses, CreateDataFileEntryData, CreateDataFileEntryResponse, CreateDataFileEntryResponses, CreateKnowledgeBaseData, CreateKnowledgeBaseResponse, CreateKnowledgeBaseResponses, CreateMcpServerData, CreateMcpServerResponse, CreateMcpServerResponses, CreateMemoryFactData, CreateMemoryFactResponse, CreateMemoryFactResponses, CreatePersonaData, CreatePersonaFolderData, CreatePersonaFolderResponse, CreatePersonaFolderResponses, CreatePersonaResponse, CreatePersonaResponses, CreatePluginDashboardPageSessionData, CreatePluginDashboardPageSessionError, CreatePluginDashboardPageSessionErrors, CreatePluginDashboardPageSessionResponse, CreatePluginDashboardPageSessionResponses, CreatePluginSourceData, CreatePluginSourceResponse, CreatePluginSourceResponses, CreateProviderData, CreateProviderInSourceData, CreateProviderInSourceResponse, CreateProviderInSourceResponses, CreateProviderResponse, CreateProviderResponses, CreateProviderSourceData, CreateProviderSourceResponse, CreateProviderSourceResponses, CreateSessionGroupData, CreateSessionGroupResponse, CreateSessionGroupResponses, CreateT2iTemplateData, CreateT2iTemplateResponse, CreateT2iTemplateResponses, CronJobPatchRequest, CronJobRequest, DashboardAccountCreateRequest, DashboardAccountCreateRequestWritable, DashboardAccountUpdateRequest, DashboardAccountUpdateRequestWritable, DataFileContentRequest, DataFileDeleteRequest, DataFileEntryRequest, DataFileMoveRequest, DataFilePath, DeleteApiKeyData, DeleteApiKeyResponse, DeleteApiKeyResponses, DeleteAppearanceWallpaperData, DeleteAppearanceWallpaperError, DeleteAppearanceWallpaperErrors, DeleteAppearanceWallpaperResponse, DeleteAppearanceWallpaperResponses, DeleteAttachmentData, DeleteAttachmentResponse, DeleteAttachmentResponses, DeleteBackupData, DeleteBackupResponse, DeleteBackupResponses, DeleteBotData, DeleteBotResponse, DeleteBotResponses, DeleteChatProjectData, DeleteChatProjectResponse, DeleteChatProjectResponses, DeleteChatSessionData, DeleteChatSessionResponse, DeleteChatSessionResponses, DeleteChatThreadData, DeleteChatThreadResponse, DeleteChatThreadResponses, DeleteConfigProfileData, DeleteConfigProfileResponse, DeleteConfigProfileResponses, DeleteConfigRouteData, DeleteConfigRouteResponse, DeleteConfigRouteResponses, DeleteConversationData, DeleteConversationResponse, DeleteConversationResponses, DeleteCronJobData, DeleteCronJobResponse, DeleteCronJobResponses, DeleteDataFileEntryData, DeleteDataFileEntryResponse, DeleteDataFileEntryResponses, DeleteKnowledgeBaseData, DeleteKnowledgeBaseResponse, DeleteKnowledgeBaseResponses, DeleteKnowledgeChunkData, DeleteKnowledgeChunkResponse, DeleteKnowledgeChunkResponses, DeleteKnowledgeDocumentData, DeleteKnowledgeDocumentResponse, DeleteKnowledgeDocumentResponses, DeleteMcpServerData, DeleteMcpServerResponse, DeleteMcpServerResponses, DeleteMemoryFactData, DeleteMemoryFactResponse, DeleteMemoryFactResponses, DeleteNeoSkillCandidateData, DeleteNeoSkillCandidateResponse, DeleteNeoSkillCandidateResponses, DeleteNeoSkillReleaseData, DeleteNeoSkillReleaseResponse, DeleteNeoSkillReleaseResponses, DeletePersonaData, DeletePersonaFolderData, DeletePersonaFolderResponse, DeletePersonaFolderResponses, DeletePersonaResponse, DeletePersonaResponses, DeletePluginConfigFileData, DeletePluginConfigFileResponse, DeletePluginConfigFileResponses, DeletePluginSourceData, DeletePluginSourceResponse, DeletePluginSourceResponses, DeleteProviderData, DeleteProviderResponse, DeleteProviderResponses, DeleteProviderSourceData, DeleteProviderSourceResponse, DeleteProviderSourceResponses, DeleteSessionGroupData, DeleteSessionGroupResponse, DeleteSessionGroupResponses, DeleteSessionRulesData, DeleteSessionRulesResponse, DeleteSessionRulesResponses, DeleteSkillData, DeleteSkillResponse, DeleteSkillResponses, DeleteT2iTemplateData, DeleteT2iTemplateResponse, DeleteT2iTemplateResponses, DocumentId, DownloadAttachmentData, DownloadAttachmentResponse, DownloadAttachmentResponses, DownloadBackupData, DownloadBackupResponse, DownloadBackupResponses, DownloadChatProjectWorkspaceFileData, DownloadChatProjectWorkspaceFileResponse, DownloadChatProjectWorkspaceFileResponses, DownloadDataFileData, DownloadDataFileResponse, DownloadDataFileResponses, DownloadOpenApiFileData, DownloadOpenApiFileResponse, DownloadOpenApiFileResponses, DownloadSkillData, DownloadSkillResponse, DownloadSkillResponses, DynamicConfig, EnabledPatch, ErrorEnvelope, EvaluateNeoSkillCandidateData, EvaluateNeoSkillCandidateResponse, EvaluateNeoSkillCandidateResponses, ExportConversationsData, ExportConversationsResponse, ExportConversationsResponses, ExtensionId, FactId, Filename, FilePath, FileUploadRequest, FolderId, GetActiveT2iTemplateData, GetActiveT2iTemplateResponse, GetActiveT2iTemplateResponses, GetAppearanceWallpaperData, GetAppearanceWallpaperError, GetAppearanceWallpaperErrors, GetAppearanceWallpaperResponse, GetAppearanceWallpaperResponses, GetAppearanceWallpaperThumbnailData, GetAppearanceWallpaperThumbnailError, GetAppearanceWallpaperThumbnailErrors, GetAppearanceWallpaperThumbnailResponse, GetAppearanceWallpaperThumbnailResponses, GetAttachmentData, GetAttachmentResponse, GetAttachmentResponses, GetAuthSetupStatusData, GetAuthSetupStatusResponse, GetAuthSetupStatusResponses, GetBackupProgressData, GetBackupProgressResponse, GetBackupProgressResponses, GetBotData, GetBotResponse, GetBotResponses, GetChangelogData, GetChangelogError, GetChangelogErrors, GetChangelogResponse, GetChangelogResponses, GetChatProjectData, GetChatProjectResponse, GetChatProjectResponses, GetChatProjectWorkspaceFileData, GetChatProjectWorkspaceFileResponse, GetChatProjectWorkspaceFileResponses, GetChatSessionData, GetChatSessionResponse, GetChatSessionResponses, GetChatThreadData, GetChatThreadResponse, GetChatThreadResponses, GetCodingCliGlobalConfigData, GetCodingCliGlobalConfigResponse, GetCodingCliGlobalConfigResponses, GetConfigProfileData, GetConfigProfileResponse, GetConfigProfileResponses, GetConfigProfileSchemaData, GetConfigProfileSchemaResponse, GetConfigProfileSchemaResponses, GetConversationData, GetConversationFilterOptionsData, GetConversationFilterOptionsResponse, GetConversationFilterOptionsResponses, GetConversationResponse, GetConversationResponses, GetDataFileContentData, GetDataFileContentResponse, GetDataFileContentResponses, GetDataFileMetadataData, GetDataFileMetadataResponse, GetDataFileMetadataResponses, GetFileByNameData, GetFileByNameResponse, GetFileByNameResponses, GetFirstNoticeData, GetFirstNoticeResponse, GetFirstNoticeResponses, GetKnowledgeBaseData, GetKnowledgeBaseResponse, GetKnowledgeBaseResponses, GetKnowledgeBaseStatsData, GetKnowledgeBaseStatsResponse, GetKnowledgeBaseStatsResponses, GetKnowledgeDocumentData, GetKnowledgeDocumentResponse, GetKnowledgeDocumentResponses, GetKnowledgeTaskData, GetKnowledgeTaskResponse, GetKnowledgeTaskResponses, GetLogHistoryData, GetLogHistoryResponse, GetLogHistoryResponses, GetMcpCatalogData, GetMcpCatalogResponse, GetMcpCatalogResponses, GetMcpOAuthStatusData, GetMcpOAuthStatusResponse, GetMcpOAuthStatusResponses, GetMcpPromptData, GetMcpPromptResponse, GetMcpPromptResponses, GetMemoryFactData, GetMemoryFactResponse, GetMemoryFactResponses, GetMemoryStatsData, GetMemoryStatsResponse, GetMemoryStatsResponses, GetNeoSkillPayloadData, GetNeoSkillPayloadResponse, GetNeoSkillPayloadResponses, GetPersonaData, GetPersonaResponse, GetPersonaResponses, GetPersonaTreeData, GetPersonaTreeResponse, GetPersonaTreeResponses, GetPluginChangelogData, GetPluginChangelogResponse, GetPluginChangelogResponses, GetPluginConfigData, GetPluginConfigResponse, GetPluginConfigResponses, GetPluginConfigSchemaData, GetPluginConfigSchemaResponse, GetPluginConfigSchemaResponses, GetPluginDashboardCatalogData, GetPluginDashboardCatalogError, GetPluginDashboardCatalogErrors, GetPluginDashboardCatalogResponse, GetPluginDashboardCatalogResponses, GetPluginData, GetPluginReadmeData, GetPluginReadmeResponse, GetPluginReadmeResponses, GetPluginResponse, GetPluginResponses, GetProviderData, GetProviderEmbeddingDimensionData, GetProviderEmbeddingDimensionResponse, GetProviderEmbeddingDimensionResponses, GetProviderResponse, GetProviderResponses, GetProviderSchemaData, GetProviderSchemaResponse, GetProviderSchemaResponses, GetProviderSourceData, GetProviderSourceResponse, GetProviderSourceResponses, GetProviderTokenStatsData, GetProviderTokenStatsResponse, GetProviderTokenStatsResponses, GetPublicVersionsData, GetPublicVersionsResponse, GetPublicVersionsResponses, GetSkillFileData, GetSkillFileResponse, GetSkillFileResponses, GetStartTimeData, GetStartTimeResponse, GetStartTimeResponses, GetStatsData, GetStatsResponse, GetStatsResponses, GetStorageStatusData, GetStorageStatusResponse, GetStorageStatusResponses, GetSubagentConfigData, GetSubagentConfigResponse, GetSubagentConfigResponses, GetSystemConfigData, GetSystemConfigResponse, GetSystemConfigResponses, GetSystemConfigRuntimeData, GetSystemConfigRuntimeResponse, GetSystemConfigRuntimeResponses, GetSystemConfigSchemaData, GetSystemConfigSchemaResponse, GetSystemConfigSchemaResponses, GetT2iRuntimeStatsData, GetT2iRuntimeStatsResponse, GetT2iRuntimeStatsResponses, GetT2iTemplateData, GetT2iTemplateResponse, GetT2iTemplateResponses, GetTokenFileData, GetTokenFileResponse, GetTokenFileResponses, GetTraceSettingsData, GetTraceSettingsResponse, GetTraceSettingsResponses, GetVersionData, GetVersionResponse, GetVersionResponses, GhproxyTestRequest, GrantAuthorizationRoleBindingData, GrantAuthorizationRoleBindingResponse, GrantAuthorizationRoleBindingResponses, GroupId, ImMessageRequest, ImportBackupData, ImportBackupResponse, ImportBackupResponses, ImportKnowledgeDocumentFromUrlData, ImportKnowledgeDocumentFromUrlError, ImportKnowledgeDocumentFromUrlErrors, ImportKnowledgeDocumentFromUrlResponse, ImportKnowledgeDocumentFromUrlResponses, ImportKnowledgeDocumentsData, ImportKnowledgeDocumentsError, ImportKnowledgeDocumentsErrors, ImportKnowledgeDocumentsResponse, ImportKnowledgeDocumentsResponses, InitBackupUploadData, InitBackupUploadResponse, InitBackupUploadResponses, InstallPipPackageData, InstallPipPackageResponse, InstallPipPackageResponses, InstallPluginFromGithubData, InstallPluginFromGithubResponse, InstallPluginFromGithubResponses, InstallPluginFromUploadData, InstallPluginFromUploadResponse, InstallPluginFromUploadResponses, InstallPluginFromUrlData, InstallPluginFromUrlResponse, InstallPluginFromUrlResponses, InvokeBotActionData, InvokeBotActionResponse, InvokeBotActionResponses, InvokePluginDashboardActionData, InvokePluginDashboardActionError, InvokePluginDashboardActionErrors, InvokePluginDashboardActionResponse, InvokePluginDashboardActionResponses, InvokePluginDashboardFileData, InvokePluginDashboardFileError, InvokePluginDashboardFileErrors, InvokePluginDashboardFileResponse, InvokePluginDashboardFileResponses, InvokePluginDashboardUploadData, InvokePluginDashboardUploadError, InvokePluginDashboardUploadErrors, InvokePluginDashboardUploadResponse, InvokePluginDashboardUploadResponses, IssueAuthorizationBatchRevokeStepUpData, IssueAuthorizationBatchRevokeStepUpResponse, IssueAuthorizationBatchRevokeStepUpResponses, IssueAuthorizationStepUpData, IssueAuthorizationStepUpResponse, IssueAuthorizationStepUpResponses, IssueWebChatAuthorizationStepUpData, IssueWebChatAuthorizationStepUpResponse, IssueWebChatAuthorizationStepUpResponses, JsonSchema, KbId, KeyId, KnowledgeBaseCreateRequest, KnowledgeBaseRequest, KnowledgeDocument, KnowledgeDocumentImportRequest, KnowledgeDocumentUploadRequest, KnowledgeDocumentUrlImportRequest, KnowledgeRetrieveRequest, ListActiveUmosData, ListActiveUmosResponse, ListActiveUmosResponses, ListApiKeysData, ListApiKeysResponse, ListApiKeysResponses, ListAppearanceWallpapersData, ListAppearanceWallpapersResponse, ListAppearanceWallpapersResponses, ListAuthorizationAccountsData, ListAuthorizationAccountsResponse, ListAuthorizationAccountsResponses, ListAuthorizationAuditData, ListAuthorizationAuditResponse, ListAuthorizationAuditResponses, ListAuthorizationRoleBindingsData, ListAuthorizationRoleBindingsResponse, ListAuthorizationRoleBindingsResponses, ListBackupsData, ListBackupsResponse, ListBackupsResponses, ListBotsData, ListBotsResponse, ListBotsResponses, ListBotStatsData, ListBotStatsResponse, ListBotStatsResponses, ListBotTypesData, ListBotTypesResponse, ListBotTypesResponses, ListChangelogVersionsData, ListChangelogVersionsResponse, ListChangelogVersionsResponses, ListChatConfigsData, ListChatConfigsResponse, ListChatConfigsResponses, ListChatProjectsData, ListChatProjectSessionsData, ListChatProjectSessionsResponse, ListChatProjectSessionsResponses, ListChatProjectsResponse, ListChatProjectsResponses, ListChatProjectWorkspaceFilesData, ListChatProjectWorkspaceFilesResponse, ListChatProjectWorkspaceFilesResponses, ListChatSessionsData, ListChatSessionsResponse, ListChatSessionsResponses, ListCommandConflictsData, ListCommandConflictsResponse, ListCommandConflictsResponses, ListCommandsData, ListCommandsResponse, ListCommandsResponses, ListConfigProfilesData, ListConfigProfilesResponse, ListConfigProfilesResponses, ListConfigRoutesData, ListConfigRoutesResponse, ListConfigRoutesResponses, ListConversationsData, ListConversationsResponse, ListConversationsResponses, ListCronJobsData, ListCronJobsResponse, ListCronJobsResponses, ListDataFileTreeData, ListDataFileTreeResponse, ListDataFileTreeResponses, ListFailedPluginsData, ListFailedPluginsResponse, ListFailedPluginsResponses, ListImBotsData, ListImBotsResponse, ListImBotsResponses, ListKnowledgeBasesData, ListKnowledgeBasesResponse, ListKnowledgeBasesResponses, ListKnowledgeChunksData, ListKnowledgeChunksResponse, ListKnowledgeChunksResponses, ListKnowledgeDocumentsData, ListKnowledgeDocumentsResponse, ListKnowledgeDocumentsResponses, ListMcpPromptsData, ListMcpPromptsResponse, ListMcpPromptsResponses, ListMcpResourcesData, ListMcpResourcesResponse, ListMcpResourcesResponses, ListMcpResourceTemplatesData, ListMcpResourceTemplatesResponse, ListMcpResourceTemplatesResponses, ListMcpServersData, ListMcpServersResponse, ListMcpServersResponses, ListMemoryFactsData, ListMemoryFactsResponse, ListMemoryFactsResponses, ListMemoryOperationsData, ListMemoryOperationsResponse, ListMemoryOperationsResponses, ListMemoryProfilesData, ListMemoryProfilesResponse, ListMemoryProfilesResponses, ListNeoSkillCandidatesData, ListNeoSkillCandidatesResponse, ListNeoSkillCandidatesResponses, ListNeoSkillReleasesData, ListNeoSkillReleasesResponse, ListNeoSkillReleasesResponses, ListPersonaFoldersData, ListPersonaFoldersResponse, ListPersonaFoldersResponses, ListPersonasData, ListPersonasResponse, ListPersonasResponses, ListPluginConfigFilesData, ListPluginConfigFilesResponse, ListPluginConfigFilesResponses, ListPluginMarketCategoriesData, ListPluginMarketCategoriesResponse, ListPluginMarketCategoriesResponses, ListPluginMarketData, ListPluginMarketResponse, ListPluginMarketResponses, ListPluginsData, ListPluginSourcesData, ListPluginSourcesResponse, ListPluginSourcesResponses, ListPluginsResponse, ListPluginsResponses, ListProvidersBySourceData, ListProvidersBySourceResponse, ListProvidersBySourceResponses, ListProvidersData, ListProviderSourceModelsData, ListProviderSourceModelsResponse, ListProviderSourceModelsResponses, ListProviderSourcesData, ListProviderSourcesResponse, ListProviderSourcesResponses, ListProvidersResponse, ListProvidersResponses, ListSessionGroupsData, ListSessionGroupsResponse, ListSessionGroupsResponses, ListSessionRulesData, ListSessionRulesResponse, ListSessionRulesResponses, ListSessionsData, ListSessionsResponse, ListSessionsResponses, ListSkillFilesData, ListSkillFilesResponse, ListSkillFilesResponses, ListSkillsData, ListSkillsResponse, ListSkillsResponses, ListSubagentAvailableToolsData, ListSubagentAvailableToolsResponse, ListSubagentAvailableToolsResponses, ListT2iTemplatesData, ListT2iTemplatesResponse, ListT2iTemplatesResponses, ListToolsData, ListToolsResponse, ListToolsResponses, LoginData, LoginError, LoginErrors, LoginRequest, LoginResponse, LoginResponses, LogoutData, LogoutResponse, LogoutResponses, McpCompletionRequest, McpPromptGetRequest, McpResourceReadRequest, McpServerConfig, MemoryFactActionRequest, MemoryFactCreateRequest, MemoryFactPatchRequest, MemoryProfileRefreshRequest, MessagePart, ModelScopeSyncRequest, MoveDataFileEntryData, MoveDataFileEntryResponse, MoveDataFileEntryResponses, MovePersonaItemData, MovePersonaItemResponse, MovePersonaItemResponses, Name, NameRequest, NeoCandidateActionRequest, NeoReleaseActionRequest, NeoSyncRequest, OpenChatWebSocketData, OpenUnifiedChatWebSocketData, Page, PageSize, PersonaFolderRequest, PersonaId, PersonaMoveRequest, PersonaRequest, PipInstallRequest, PluginActionId, PluginBatchUpdateRequest, PluginConfigFileDeleteRequest, PluginDashboardAction, PluginDashboardActionRequest, PluginDashboardCatalog, PluginDashboardCatalogResponse, PluginDashboardFileRequest, PluginDashboardFileResponse, PluginDashboardFileTicket, PluginDashboardPage, PluginDashboardSession, PluginDashboardSessionRequest, PluginDashboardSessionResponse, PluginDashboardUploadMetadata, PluginDashboardUploadRequest, PluginGithubInstallRequest, PluginId, PluginPageId, PluginSourceBindRequest, PluginSourceRequest, PluginUpdateRequest, PluginUploadInstallRequest, PluginUrlInstallRequest, PromoteNeoSkillCandidateData, PromoteNeoSkillCandidateResponse, PromoteNeoSkillCandidateResponses, ProviderConfigRequest, ProviderEmbeddingDimensionRequest, ProviderId, ProviderSourceConfigRequest, ReadMcpResourceData, ReadMcpResourceResponse, ReadMcpResourceResponses, ReceivePlatformWebhookData, ReceivePlatformWebhookResponses, RecoverTotpData, RecoverTotpResponse, RecoverTotpResponses, RefreshMemoryProfileData, RefreshMemoryProfileResponse, RefreshMemoryProfileResponses, RegenerateChatMessageData, RegenerateChatMessageResponse, RegenerateChatMessageResponses, RegisterBotTypeData, RegisterBotTypeResponse, RegisterBotTypeResponses, ReindexKnowledgeDocumentData, ReindexKnowledgeDocumentError, ReindexKnowledgeDocumentErrors, ReindexKnowledgeDocumentResponse, ReindexKnowledgeDocumentResponses, ReloadFailedPluginData, ReloadFailedPluginResponse, ReloadFailedPluginResponses, ReloadPluginData, ReloadPluginResponse, ReloadPluginResponses, RemoveChatProjectSessionData, RemoveChatProjectSessionResponse, RemoveChatProjectSessionResponses, RemoveCodingCliGlobalConfigData, RemoveCodingCliGlobalConfigResponse, RemoveCodingCliGlobalConfigResponses, RenameBackupData, RenameBackupResponse, RenameBackupResponses, RenameConfigProfileData, RenameConfigProfileResponse, RenameConfigProfileResponses, RenameRequest, ReorderPersonaItemsData, ReorderPersonaItemsResponse, ReorderPersonaItemsResponses, ReorderRequest, ReplaceConfigRoutesData, ReplaceConfigRoutesResponse, ReplaceConfigRoutesResponses, ReplaceConversationMessagesData, ReplaceConversationMessagesResponse, ReplaceConversationMessagesResponses, ReplacePluginSourcesData, ReplacePluginSourcesResponse, ReplacePluginSourcesResponses, ResetDefaultT2iTemplateData, ResetDefaultT2iTemplateResponse, ResetDefaultT2iTemplateResponses, RestartCoreData, RestartCoreResponse, RestartCoreResponses, RestoreMemoryFactData, RestoreMemoryFactResponse, RestoreMemoryFactResponses, ResumeChatRunData, ResumeChatRunResponse, ResumeChatRunResponses, RetrieveKnowledgeBaseData, RetrieveKnowledgeBaseResponse, RetrieveKnowledgeBaseResponses, RevokeApiKeyData, RevokeApiKeyResponse, RevokeApiKeyResponses, RevokeAuthorizationRoleBindingData, RevokeAuthorizationRoleBindingResponse, RevokeAuthorizationRoleBindingResponses, RevokeAuthorizationRoleBindingsData, RevokeAuthorizationRoleBindingsResponse, RevokeAuthorizationRoleBindingsResponses, RevokeMcpOAuthData, RevokeMcpOAuthResponse, RevokeMcpOAuthResponses, RollbackNeoSkillReleaseData, RollbackNeoSkillReleaseResponse, RollbackNeoSkillReleaseResponses, RunCronJobData, RunCronJobResponse, RunCronJobResponses, RuntimeInfo, SearchDataFilesData, SearchDataFilesResponse, SearchDataFilesResponses, SendChatMessageData, SendChatMessageResponse, SendChatMessageResponses, SendChatThreadMessageData, SendChatThreadMessageResponse, SendChatThreadMessageResponses, SendImMessageData, SendImMessageResponse, SendImMessageResponses, ServerName, SessionGroupRequest, SessionId, SessionRuleRequest, SetActiveT2iTemplateData, SetActiveT2iTemplateResponse, SetActiveT2iTemplateResponses, SetBotEnabledData, SetBotEnabledResponse, SetBotEnabledResponses, SetMcpServerEnabledData, SetMcpServerEnabledResponse, SetMcpServerEnabledResponses, SetParallelEnabledData, SetParallelEnabledResponse, SetParallelEnabledResponses, SetPluginEnabledData, SetPluginEnabledResponse, SetPluginEnabledResponses, SetProviderEnabledData, SetProviderEnabledResponse, SetProviderEnabledResponses, SetToolEnabledData, SetToolEnabledResponse, SetToolEnabledResponses, SetToolParallelData, SetToolParallelResponse, SetToolParallelResponses, SetupAuthData, SetupAuthRequest, SetupAuthResponse, SetupAuthResponses, SetupTotpData, SetupTotpResponse, SetupTotpResponses, SkillInventoryData, SkillInventoryItem, SkillInventoryResponse, SkillName, SkillPatchRequest, SkillUploadRequest, SourceId, StartMcpOAuthData, StartMcpOAuthResponse, StartMcpOAuthResponses, StopChatSessionData, StopChatSessionResponse, StopChatSessionResponses, StorageCleanupRequest, StreamLiveLogsData, StreamLiveLogsResponse, StreamLiveLogsResponses, SubAgentConfigRequest, SuccessEnvelope, SwitchCodingCliProviderData, SwitchCodingCliProviderResponse, SwitchCodingCliProviderResponses, SyncModelScopeMcpServersData, SyncModelScopeMcpServersResponse, SyncModelScopeMcpServersResponses, SyncNeoSkillReleaseData, SyncNeoSkillReleaseResponse, SyncNeoSkillReleaseResponses, T2iTemplateContentRequest, T2iTemplateRequest, TaskId, TestBotData, TestBotResponse, TestBotResponses, TestGhproxyConnectionData, TestGhproxyConnectionResponse, TestGhproxyConnectionResponses, TestMcpServerData, TestMcpServerResponse, TestMcpServerResponses, TestProviderData, TestProviderResponse, TestProviderResponses, ToolId, TotpSetupRequest, TraceSettingsRequest, Umo, UmoListRequest, UninstallFailedPluginData, UninstallFailedPluginResponse, UninstallFailedPluginResponses, UninstallPluginData, UninstallPluginResponse, UninstallPluginResponses, UpdateAccountRequest, UpdateAuthAccountData, UpdateAuthAccountResponse, UpdateAuthAccountResponses, UpdateAuthorizationAccountData, UpdateAuthorizationAccountResponse, UpdateAuthorizationAccountResponses, UpdateBotData, UpdateBotResponse, UpdateBotResponses, UpdateChatMessageData, UpdateChatMessageResponse, UpdateChatMessageResponses, UpdateChatProjectData, UpdateChatProjectResponse, UpdateChatProjectResponses, UpdateChatSessionData, UpdateChatSessionResponse, UpdateChatSessionResponses, UpdateCommandData, UpdateCommandResponse, UpdateCommandResponses, UpdateConfigProfileContentData, UpdateConfigProfileContentResponse, UpdateConfigProfileContentResponses, UpdateConversationData, UpdateConversationResponse, UpdateConversationResponses, UpdateCronJobData, UpdateCronJobResponse, UpdateCronJobResponses, UpdateDataFileContentData, UpdateDataFileContentError, UpdateDataFileContentErrors, UpdateDataFileContentResponse, UpdateDataFileContentResponses, UpdateKnowledgeBaseData, UpdateKnowledgeBaseResponse, UpdateKnowledgeBaseResponses, UpdateMcpServerData, UpdateMcpServerResponse, UpdateMcpServerResponses, UpdateMemoryFactData, UpdateMemoryFactResponse, UpdateMemoryFactResponses, UpdatePersonaData, UpdatePersonaFolderData, UpdatePersonaFolderResponse, UpdatePersonaFolderResponses, UpdatePersonaResponse, UpdatePersonaResponses, UpdatePluginConfigData, UpdatePluginConfigResponse, UpdatePluginConfigResponses, UpdatePluginData, UpdatePluginLogLevelData, UpdatePluginLogLevelResponse, UpdatePluginLogLevelResponses, UpdatePluginResponse, UpdatePluginResponses, UpdatePluginsData, UpdatePluginsResponse, UpdatePluginsResponses, UpdateProviderData, UpdateProviderResponse, UpdateProviderResponses, UpdateSessionGroupData, UpdateSessionGroupResponse, UpdateSessionGroupResponses, UpdateSkillData, UpdateSkillFileData, UpdateSkillFileResponse, UpdateSkillFileResponses, UpdateSkillResponse, UpdateSkillResponses, UpdateSubagentConfigData, UpdateSubagentConfigResponse, UpdateSubagentConfigResponses, UpdateSystemConfigData, UpdateSystemConfigResponse, UpdateSystemConfigResponses, UpdateT2iTemplateData, UpdateT2iTemplateResponse, UpdateT2iTemplateResponses, UpdateTraceSettingsData, UpdateTraceSettingsResponse, UpdateTraceSettingsResponses, UploadAppearanceWallpaperData, UploadAppearanceWallpaperError, UploadAppearanceWallpaperErrors, UploadAppearanceWallpaperResponse, UploadAppearanceWallpaperResponses, UploadBackupChunkData, UploadBackupChunkResponse, UploadBackupChunkResponses, UploadBackupData, UploadBackupResponse, UploadBackupResponses, UploadDataFileData, UploadDataFileResponse, UploadDataFileResponses, UploadFileData, UploadFileResponse, UploadFileResponses, UploadKnowledgeDocumentData, UploadKnowledgeDocumentError, UploadKnowledgeDocumentErrors, UploadKnowledgeDocumentResponse, UploadKnowledgeDocumentResponses, UploadOpenApiFileData, UploadOpenApiFileResponse, UploadOpenApiFileResponses, UploadPluginConfigFilesData, UploadPluginConfigFilesResponse, UploadPluginConfigFilesResponses, UploadSkillData, UploadSkillResponse, UploadSkillResponses, UploadSkillsBatchData, UploadSkillsBatchResponse, UploadSkillsBatchResponses, UpsertConfigRouteData, UpsertConfigRouteResponse, UpsertConfigRouteResponses, UpsertProviderSourceData, UpsertProviderSourceResponse, UpsertProviderSourceResponses, UpsertSessionRuleData, UpsertSessionRuleResponse, UpsertSessionRuleResponses, VerifyPlatformWebhookData, VerifyPlatformWebhookResponses, WebChatStepUpRequest, WebChatStepUpRequestWritable, WebhookUuid } from './types.gen'; diff --git a/dashboard/src/api/generated/openapi-v1/sdk.gen.ts b/dashboard/src/api/generated/openapi-v1/sdk.gen.ts index e8d7ff6ce8..1e63aae43e 100644 --- a/dashboard/src/api/generated/openapi-v1/sdk.gen.ts +++ b/dashboard/src/api/generated/openapi-v1/sdk.gen.ts @@ -1,6545 +1,3785 @@ // This file is auto-generated by @hey-api/openapi-ts -import { - type Client, - type ClientMeta, - formDataBodySerializer, - type Options as Options2, - type RequestResult, - type ServerSentEventsResult, - type TDataShape, -} from './client'; +import { type Client, type ClientMeta, formDataBodySerializer, type Options as Options2, type RequestResult, type ServerSentEventsResult, type TDataShape } from './client'; import { client } from './client.gen'; -import type { - AbortBackupUploadData, - AbortBackupUploadResponses, - AddChatProjectSessionData, - AddChatProjectSessionResponses, - BatchDeleteChatSessionsData, - BatchDeleteChatSessionsResponses, - BatchDeleteConversationsData, - BatchDeleteConversationsResponses, - BatchUpdateSessionProviderData, - BatchUpdateSessionProviderResponses, - BatchUpdateSessionServiceData, - BatchUpdateSessionServiceResponses, - BindPluginSourceData, - BindPluginSourceResponses, - BulkToggleBuiltinCommandsData, - BulkToggleBuiltinCommandsResponses, - CheckBackupData, - CheckBackupResponses, - CleanupStorageData, - CleanupStorageResponses, - CompleteBackupUploadData, - CompleteBackupUploadResponses, - CompleteMcpData, - CompleteMcpOAuthCallbackData, - CompleteMcpResponses, - CreateApiKeyData, - CreateApiKeyResponses, - CreateAuthorizationAccountData, - CreateAuthorizationAccountResponses, - CreateBackupData, - CreateBackupResponses, - CreateBotData, - CreateBotResponses, - CreateChatProjectData, - CreateChatProjectResponses, - CreateChatSessionData, - CreateChatSessionResponses, - CreateChatThreadData, - CreateChatThreadResponses, - CreateConfigProfileData, - CreateConfigProfileResponses, - CreateCronJobData, - CreateCronJobResponses, - CreateDataFileEntryData, - CreateDataFileEntryResponses, - CreateKnowledgeBaseData, - CreateKnowledgeBaseResponses, - CreateMcpServerData, - CreateMcpServerResponses, - CreateMemoryFactData, - CreateMemoryFactResponses, - CreatePersonaData, - CreatePersonaFolderData, - CreatePersonaFolderResponses, - CreatePersonaResponses, - CreatePluginDashboardPageSessionData, - CreatePluginDashboardPageSessionErrors, - CreatePluginDashboardPageSessionResponses, - CreatePluginSourceData, - CreatePluginSourceResponses, - CreateProviderData, - CreateProviderInSourceData, - CreateProviderInSourceResponses, - CreateProviderResponses, - CreateProviderSourceData, - CreateProviderSourceResponses, - CreateSessionGroupData, - CreateSessionGroupResponses, - CreateT2iTemplateData, - CreateT2iTemplateResponses, - DeleteApiKeyData, - DeleteApiKeyResponses, - DeleteAppearanceWallpaperData, - DeleteAppearanceWallpaperErrors, - DeleteAppearanceWallpaperResponses, - DeleteAttachmentData, - DeleteAttachmentResponses, - DeleteBackupData, - DeleteBackupResponses, - DeleteBotData, - DeleteBotResponses, - DeleteChatProjectData, - DeleteChatProjectResponses, - DeleteChatSessionData, - DeleteChatSessionResponses, - DeleteChatThreadData, - DeleteChatThreadResponses, - DeleteConfigProfileData, - DeleteConfigProfileResponses, - DeleteConfigRouteData, - DeleteConfigRouteResponses, - DeleteConversationData, - DeleteConversationResponses, - DeleteCronJobData, - DeleteCronJobResponses, - DeleteDataFileEntryData, - DeleteDataFileEntryResponses, - DeleteKnowledgeBaseData, - DeleteKnowledgeBaseResponses, - DeleteKnowledgeChunkData, - DeleteKnowledgeChunkResponses, - DeleteKnowledgeDocumentData, - DeleteKnowledgeDocumentResponses, - DeleteMcpServerData, - DeleteMcpServerResponses, - DeleteMemoryFactData, - DeleteMemoryFactResponses, - DeleteNeoSkillCandidateData, - DeleteNeoSkillCandidateResponses, - DeleteNeoSkillReleaseData, - DeleteNeoSkillReleaseResponses, - DeletePersonaData, - DeletePersonaFolderData, - DeletePersonaFolderResponses, - DeletePersonaResponses, - DeletePluginConfigFileData, - DeletePluginConfigFileResponses, - DeletePluginSourceData, - DeletePluginSourceResponses, - DeleteProviderData, - DeleteProviderResponses, - DeleteProviderSourceData, - DeleteProviderSourceResponses, - DeleteSessionGroupData, - DeleteSessionGroupResponses, - DeleteSessionRulesData, - DeleteSessionRulesResponses, - DeleteSkillData, - DeleteSkillResponses, - DeleteT2iTemplateData, - DeleteT2iTemplateResponses, - DownloadAttachmentData, - DownloadAttachmentResponses, - DownloadBackupData, - DownloadBackupResponses, - DownloadChatProjectWorkspaceFileData, - DownloadChatProjectWorkspaceFileResponses, - DownloadDataFileData, - DownloadDataFileResponses, - DownloadOpenApiFileData, - DownloadOpenApiFileResponses, - DownloadSkillData, - DownloadSkillResponses, - EvaluateNeoSkillCandidateData, - EvaluateNeoSkillCandidateResponses, - ExportConversationsData, - ExportConversationsResponses, - GetActiveT2iTemplateData, - GetActiveT2iTemplateResponses, - GetAppearanceWallpaperData, - GetAppearanceWallpaperErrors, - GetAppearanceWallpaperResponses, - GetAppearanceWallpaperThumbnailData, - GetAppearanceWallpaperThumbnailErrors, - GetAppearanceWallpaperThumbnailResponses, - GetAttachmentData, - GetAttachmentResponses, - GetAuthSetupStatusData, - GetAuthSetupStatusResponses, - GetBackupProgressData, - GetBackupProgressResponses, - GetBotData, - GetBotResponses, - GetChangelogData, - GetChangelogErrors, - GetChangelogResponses, - GetChatProjectData, - GetChatProjectResponses, - GetChatProjectWorkspaceFileData, - GetChatProjectWorkspaceFileResponses, - GetChatSessionData, - GetChatSessionResponses, - GetChatThreadData, - GetChatThreadResponses, - GetConfigProfileData, - GetConfigProfileResponses, - GetConfigProfileSchemaData, - GetConfigProfileSchemaResponses, - GetConversationData, - GetConversationFilterOptionsData, - GetConversationFilterOptionsResponses, - GetConversationResponses, - GetDataFileContentData, - GetDataFileContentResponses, - GetDataFileMetadataData, - GetDataFileMetadataResponses, - GetFileByNameData, - GetFileByNameResponses, - GetFirstNoticeData, - GetFirstNoticeResponses, - GetKnowledgeBaseData, - GetKnowledgeBaseResponses, - GetKnowledgeBaseStatsData, - GetKnowledgeBaseStatsResponses, - GetKnowledgeDocumentData, - GetKnowledgeDocumentResponses, - GetKnowledgeTaskData, - GetKnowledgeTaskResponses, - GetLogHistoryData, - GetLogHistoryResponses, - GetMcpCatalogData, - GetMcpCatalogResponses, - GetMcpOAuthStatusData, - GetMcpOAuthStatusResponses, - GetMcpPromptData, - GetMcpPromptResponses, - GetMemoryFactData, - GetMemoryFactResponses, - GetMemoryStatsData, - GetMemoryStatsResponses, - GetNeoSkillPayloadData, - GetNeoSkillPayloadResponses, - GetPersonaData, - GetPersonaResponses, - GetPersonaTreeData, - GetPersonaTreeResponses, - GetPluginChangelogData, - GetPluginChangelogResponses, - GetPluginConfigData, - GetPluginConfigResponses, - GetPluginConfigSchemaData, - GetPluginConfigSchemaResponses, - GetPluginDashboardCatalogData, - GetPluginDashboardCatalogErrors, - GetPluginDashboardCatalogResponses, - GetPluginData, - GetPluginReadmeData, - GetPluginReadmeResponses, - GetPluginResponses, - GetProviderData, - GetProviderEmbeddingDimensionData, - GetProviderEmbeddingDimensionResponses, - GetProviderResponses, - GetProviderSchemaData, - GetProviderSchemaResponses, - GetProviderSourceData, - GetProviderSourceResponses, - GetProviderTokenStatsData, - GetProviderTokenStatsResponses, - GetPublicVersionsData, - GetPublicVersionsResponses, - GetSkillFileData, - GetSkillFileResponses, - GetStartTimeData, - GetStartTimeResponses, - GetStatsData, - GetStatsResponses, - GetStorageStatusData, - GetStorageStatusResponses, - GetSubagentConfigData, - GetSubagentConfigResponses, - GetSystemConfigData, - GetSystemConfigResponses, - GetSystemConfigRuntimeData, - GetSystemConfigRuntimeResponses, - GetSystemConfigSchemaData, - GetSystemConfigSchemaResponses, - GetT2iRuntimeStatsData, - GetT2iRuntimeStatsResponses, - GetT2iTemplateData, - GetT2iTemplateResponses, - GetTokenFileData, - GetTokenFileResponses, - GetTraceSettingsData, - GetTraceSettingsResponses, - GetVersionData, - GetVersionResponses, - GrantAuthorizationRoleBindingData, - GrantAuthorizationRoleBindingResponses, - ImportBackupData, - ImportBackupResponses, - ImportKnowledgeDocumentFromUrlData, - ImportKnowledgeDocumentFromUrlErrors, - ImportKnowledgeDocumentFromUrlResponses, - ImportKnowledgeDocumentsData, - ImportKnowledgeDocumentsErrors, - ImportKnowledgeDocumentsResponses, - InitBackupUploadData, - InitBackupUploadResponses, - InstallPipPackageData, - InstallPipPackageResponses, - InstallPluginFromGithubData, - InstallPluginFromGithubResponses, - InstallPluginFromUploadData, - InstallPluginFromUploadResponses, - InstallPluginFromUrlData, - InstallPluginFromUrlResponses, - InvokeBotActionData, - InvokeBotActionResponses, - InvokePluginDashboardActionData, - InvokePluginDashboardActionErrors, - InvokePluginDashboardActionResponses, - InvokePluginDashboardFileData, - InvokePluginDashboardFileErrors, - InvokePluginDashboardFileResponses, - InvokePluginDashboardUploadData, - InvokePluginDashboardUploadErrors, - InvokePluginDashboardUploadResponses, - IssueAuthorizationBatchRevokeStepUpData, - IssueAuthorizationBatchRevokeStepUpResponses, - IssueAuthorizationStepUpData, - IssueAuthorizationStepUpResponses, - IssueWebChatAuthorizationStepUpData, - IssueWebChatAuthorizationStepUpResponses, - ListActiveUmosData, - ListActiveUmosResponses, - ListApiKeysData, - ListApiKeysResponses, - ListAppearanceWallpapersData, - ListAppearanceWallpapersResponses, - ListAuthorizationAccountsData, - ListAuthorizationAccountsResponses, - ListAuthorizationAuditData, - ListAuthorizationAuditResponses, - ListAuthorizationRoleBindingsData, - ListAuthorizationRoleBindingsResponses, - ListBackupsData, - ListBackupsResponses, - ListBotsData, - ListBotsResponses, - ListBotStatsData, - ListBotStatsResponses, - ListBotTypesData, - ListBotTypesResponses, - ListChangelogVersionsData, - ListChangelogVersionsResponses, - ListChatConfigsData, - ListChatConfigsResponses, - ListChatProjectsData, - ListChatProjectSessionsData, - ListChatProjectSessionsResponses, - ListChatProjectsResponses, - ListChatProjectWorkspaceFilesData, - ListChatProjectWorkspaceFilesResponses, - ListChatSessionsData, - ListChatSessionsResponses, - ListCommandConflictsData, - ListCommandConflictsResponses, - ListCommandsData, - ListCommandsResponses, - ListConfigProfilesData, - ListConfigProfilesResponses, - ListConfigRoutesData, - ListConfigRoutesResponses, - ListConversationsData, - ListConversationsResponses, - ListCronJobsData, - ListCronJobsResponses, - ListDataFileTreeData, - ListDataFileTreeResponses, - ListFailedPluginsData, - ListFailedPluginsResponses, - ListImBotsData, - ListImBotsResponses, - ListKnowledgeBasesData, - ListKnowledgeBasesResponses, - ListKnowledgeChunksData, - ListKnowledgeChunksResponses, - ListKnowledgeDocumentsData, - ListKnowledgeDocumentsResponses, - ListMcpPromptsData, - ListMcpPromptsResponses, - ListMcpResourcesData, - ListMcpResourcesResponses, - ListMcpResourceTemplatesData, - ListMcpResourceTemplatesResponses, - ListMcpServersData, - ListMcpServersResponses, - ListMemoryFactsData, - ListMemoryFactsResponses, - ListMemoryOperationsData, - ListMemoryOperationsResponses, - ListMemoryProfilesData, - ListMemoryProfilesResponses, - ListNeoSkillCandidatesData, - ListNeoSkillCandidatesResponses, - ListNeoSkillReleasesData, - ListNeoSkillReleasesResponses, - ListPersonaFoldersData, - ListPersonaFoldersResponses, - ListPersonasData, - ListPersonasResponses, - ListPluginConfigFilesData, - ListPluginConfigFilesResponses, - ListPluginMarketCategoriesData, - ListPluginMarketCategoriesResponses, - ListPluginMarketData, - ListPluginMarketResponses, - ListPluginsData, - ListPluginSourcesData, - ListPluginSourcesResponses, - ListPluginsResponses, - ListProvidersBySourceData, - ListProvidersBySourceResponses, - ListProvidersData, - ListProviderSourceModelsData, - ListProviderSourceModelsResponses, - ListProviderSourcesData, - ListProviderSourcesResponses, - ListProvidersResponses, - ListSessionGroupsData, - ListSessionGroupsResponses, - ListSessionRulesData, - ListSessionRulesResponses, - ListSessionsData, - ListSessionsResponses, - ListSkillFilesData, - ListSkillFilesResponses, - ListSkillsData, - ListSkillsResponses, - ListSubagentAvailableToolsData, - ListSubagentAvailableToolsResponses, - ListT2iTemplatesData, - ListT2iTemplatesResponses, - ListToolsData, - ListToolsResponses, - LoginData, - LoginErrors, - LoginResponses, - LogoutData, - LogoutResponses, - MoveDataFileEntryData, - MoveDataFileEntryResponses, - MovePersonaItemData, - MovePersonaItemResponses, - OpenChatWebSocketData, - OpenUnifiedChatWebSocketData, - PromoteNeoSkillCandidateData, - PromoteNeoSkillCandidateResponses, - ReadMcpResourceData, - ReadMcpResourceResponses, - ReceivePlatformWebhookData, - ReceivePlatformWebhookResponses, - RecoverTotpData, - RecoverTotpResponses, - RefreshMemoryProfileData, - RefreshMemoryProfileResponses, - RegenerateChatMessageData, - RegenerateChatMessageResponse, - RegenerateChatMessageResponses, - RegisterBotTypeData, - RegisterBotTypeResponses, - ReindexKnowledgeDocumentData, - ReindexKnowledgeDocumentErrors, - ReindexKnowledgeDocumentResponses, - ReloadFailedPluginData, - ReloadFailedPluginResponses, - ReloadPluginData, - ReloadPluginResponses, - RemoveChatProjectSessionData, - RemoveChatProjectSessionResponses, - RenameBackupData, - RenameBackupResponses, - RenameConfigProfileData, - RenameConfigProfileResponses, - ReorderPersonaItemsData, - ReorderPersonaItemsResponses, - ReplaceConfigRoutesData, - ReplaceConfigRoutesResponses, - ReplaceConversationMessagesData, - ReplaceConversationMessagesResponses, - ReplacePluginSourcesData, - ReplacePluginSourcesResponses, - ResetDefaultT2iTemplateData, - ResetDefaultT2iTemplateResponses, - RestartCoreData, - RestartCoreResponses, - RestoreMemoryFactData, - RestoreMemoryFactResponses, - ResumeChatRunData, - ResumeChatRunResponse, - ResumeChatRunResponses, - RetrieveKnowledgeBaseData, - RetrieveKnowledgeBaseResponses, - RevokeApiKeyData, - RevokeApiKeyResponses, - RevokeAuthorizationRoleBindingData, - RevokeAuthorizationRoleBindingResponses, - RevokeAuthorizationRoleBindingsData, - RevokeAuthorizationRoleBindingsResponses, - RevokeMcpOAuthData, - RevokeMcpOAuthResponses, - RollbackNeoSkillReleaseData, - RollbackNeoSkillReleaseResponses, - RunCronJobData, - RunCronJobResponses, - SearchDataFilesData, - SearchDataFilesResponses, - SendChatMessageData, - SendChatMessageResponse, - SendChatMessageResponses, - SendChatThreadMessageData, - SendChatThreadMessageResponse, - SendChatThreadMessageResponses, - SendImMessageData, - SendImMessageResponses, - SetActiveT2iTemplateData, - SetActiveT2iTemplateResponses, - SetBotEnabledData, - SetBotEnabledResponses, - SetMcpServerEnabledData, - SetMcpServerEnabledResponses, - SetParallelEnabledData, - SetParallelEnabledResponses, - SetPluginEnabledData, - SetPluginEnabledResponses, - SetProviderEnabledData, - SetProviderEnabledResponses, - SetToolEnabledData, - SetToolEnabledResponses, - SetToolParallelData, - SetToolParallelResponses, - SetupAuthData, - SetupAuthResponses, - SetupTotpData, - SetupTotpResponses, - StartMcpOAuthData, - StartMcpOAuthResponses, - StopChatSessionData, - StopChatSessionResponses, - StreamLiveLogsData, - StreamLiveLogsResponse, - StreamLiveLogsResponses, - SyncModelScopeMcpServersData, - SyncModelScopeMcpServersResponses, - SyncNeoSkillReleaseData, - SyncNeoSkillReleaseResponses, - TestBotData, - TestBotResponses, - TestGhproxyConnectionData, - TestGhproxyConnectionResponses, - TestMcpServerData, - TestMcpServerResponses, - TestProviderData, - TestProviderResponses, - UninstallFailedPluginData, - UninstallFailedPluginResponses, - UninstallPluginData, - UninstallPluginResponses, - UpdateAuthAccountData, - UpdateAuthAccountResponses, - UpdateAuthorizationAccountData, - UpdateAuthorizationAccountResponses, - UpdateBotData, - UpdateBotResponses, - UpdateChatMessageData, - UpdateChatMessageResponses, - UpdateChatProjectData, - UpdateChatProjectResponses, - UpdateChatSessionData, - UpdateChatSessionResponses, - UpdateCommandData, - UpdateCommandResponses, - UpdateConfigProfileContentData, - UpdateConfigProfileContentResponses, - UpdateConversationData, - UpdateConversationResponses, - UpdateCronJobData, - UpdateCronJobResponses, - UpdateDataFileContentData, - UpdateDataFileContentErrors, - UpdateDataFileContentResponses, - UpdateKnowledgeBaseData, - UpdateKnowledgeBaseResponses, - UpdateMcpServerData, - UpdateMcpServerResponses, - UpdateMemoryFactData, - UpdateMemoryFactResponses, - UpdatePersonaData, - UpdatePersonaFolderData, - UpdatePersonaFolderResponses, - UpdatePersonaResponses, - UpdatePluginConfigData, - UpdatePluginConfigResponses, - UpdatePluginData, - UpdatePluginLogLevelData, - UpdatePluginLogLevelResponses, - UpdatePluginResponses, - UpdatePluginsData, - UpdatePluginsResponses, - UpdateProviderData, - UpdateProviderResponses, - UpdateSessionGroupData, - UpdateSessionGroupResponses, - UpdateSkillData, - UpdateSkillFileData, - UpdateSkillFileResponses, - UpdateSkillResponses, - UpdateSubagentConfigData, - UpdateSubagentConfigResponses, - UpdateSystemConfigData, - UpdateSystemConfigResponses, - UpdateT2iTemplateData, - UpdateT2iTemplateResponses, - UpdateTraceSettingsData, - UpdateTraceSettingsResponses, - UploadAppearanceWallpaperData, - UploadAppearanceWallpaperErrors, - UploadAppearanceWallpaperResponses, - UploadBackupChunkData, - UploadBackupChunkResponses, - UploadBackupData, - UploadBackupResponses, - UploadDataFileData, - UploadDataFileResponses, - UploadFileData, - UploadFileResponses, - UploadKnowledgeDocumentData, - UploadKnowledgeDocumentErrors, - UploadKnowledgeDocumentResponses, - UploadOpenApiFileData, - UploadOpenApiFileResponses, - UploadPluginConfigFilesData, - UploadPluginConfigFilesResponses, - UploadSkillData, - UploadSkillResponses, - UploadSkillsBatchData, - UploadSkillsBatchResponses, - UpsertConfigRouteData, - UpsertConfigRouteResponses, - UpsertProviderSourceData, - UpsertProviderSourceResponses, - UpsertSessionRuleData, - UpsertSessionRuleResponses, - VerifyPlatformWebhookData, - VerifyPlatformWebhookResponses, -} from './types.gen'; - -export type Options< - TData extends TDataShape = TDataShape, - ThrowOnError extends boolean = boolean, - TResponse = unknown, -> = Options2 & { - /** - * You can provide a client instance returned by `createClient()` instead of - * individual options. This might be also useful if you want to implement a - * custom client. - */ - client?: Client; - /** - * You can pass arbitrary values through the `meta` object. This can be - * used to access values that aren't defined as part of the SDK function. - */ - meta?: keyof ClientMeta extends never ? Record : ClientMeta; +import type { AbortBackupUploadData, AbortBackupUploadResponses, AddChatProjectSessionData, AddChatProjectSessionResponses, BatchDeleteChatSessionsData, BatchDeleteChatSessionsResponses, BatchDeleteConversationsData, BatchDeleteConversationsResponses, BatchUpdateSessionProviderData, BatchUpdateSessionProviderResponses, BatchUpdateSessionServiceData, BatchUpdateSessionServiceResponses, BindPluginSourceData, BindPluginSourceResponses, BulkToggleBuiltinCommandsData, BulkToggleBuiltinCommandsResponses, CheckBackupData, CheckBackupResponses, CleanupStorageData, CleanupStorageResponses, CompleteBackupUploadData, CompleteBackupUploadResponses, CompleteMcpData, CompleteMcpOAuthCallbackData, CompleteMcpResponses, CreateApiKeyData, CreateApiKeyResponses, CreateAuthorizationAccountData, CreateAuthorizationAccountResponses, CreateBackupData, CreateBackupResponses, CreateBotData, CreateBotResponses, CreateChatProjectData, CreateChatProjectResponses, CreateChatSessionData, CreateChatSessionResponses, CreateChatThreadData, CreateChatThreadResponses, CreateConfigProfileData, CreateConfigProfileResponses, CreateCronJobData, CreateCronJobResponses, CreateDataFileEntryData, CreateDataFileEntryResponses, CreateKnowledgeBaseData, CreateKnowledgeBaseResponses, CreateMcpServerData, CreateMcpServerResponses, CreateMemoryFactData, CreateMemoryFactResponses, CreatePersonaData, CreatePersonaFolderData, CreatePersonaFolderResponses, CreatePersonaResponses, CreatePluginDashboardPageSessionData, CreatePluginDashboardPageSessionErrors, CreatePluginDashboardPageSessionResponses, CreatePluginSourceData, CreatePluginSourceResponses, CreateProviderData, CreateProviderInSourceData, CreateProviderInSourceResponses, CreateProviderResponses, CreateProviderSourceData, CreateProviderSourceResponses, CreateSessionGroupData, CreateSessionGroupResponses, CreateT2iTemplateData, CreateT2iTemplateResponses, DeleteApiKeyData, DeleteApiKeyResponses, DeleteAppearanceWallpaperData, DeleteAppearanceWallpaperErrors, DeleteAppearanceWallpaperResponses, DeleteAttachmentData, DeleteAttachmentResponses, DeleteBackupData, DeleteBackupResponses, DeleteBotData, DeleteBotResponses, DeleteChatProjectData, DeleteChatProjectResponses, DeleteChatSessionData, DeleteChatSessionResponses, DeleteChatThreadData, DeleteChatThreadResponses, DeleteConfigProfileData, DeleteConfigProfileResponses, DeleteConfigRouteData, DeleteConfigRouteResponses, DeleteConversationData, DeleteConversationResponses, DeleteCronJobData, DeleteCronJobResponses, DeleteDataFileEntryData, DeleteDataFileEntryResponses, DeleteKnowledgeBaseData, DeleteKnowledgeBaseResponses, DeleteKnowledgeChunkData, DeleteKnowledgeChunkResponses, DeleteKnowledgeDocumentData, DeleteKnowledgeDocumentResponses, DeleteMcpServerData, DeleteMcpServerResponses, DeleteMemoryFactData, DeleteMemoryFactResponses, DeleteNeoSkillCandidateData, DeleteNeoSkillCandidateResponses, DeleteNeoSkillReleaseData, DeleteNeoSkillReleaseResponses, DeletePersonaData, DeletePersonaFolderData, DeletePersonaFolderResponses, DeletePersonaResponses, DeletePluginConfigFileData, DeletePluginConfigFileResponses, DeletePluginSourceData, DeletePluginSourceResponses, DeleteProviderData, DeleteProviderResponses, DeleteProviderSourceData, DeleteProviderSourceResponses, DeleteSessionGroupData, DeleteSessionGroupResponses, DeleteSessionRulesData, DeleteSessionRulesResponses, DeleteSkillData, DeleteSkillResponses, DeleteT2iTemplateData, DeleteT2iTemplateResponses, DownloadAttachmentData, DownloadAttachmentResponses, DownloadBackupData, DownloadBackupResponses, DownloadChatProjectWorkspaceFileData, DownloadChatProjectWorkspaceFileResponses, DownloadDataFileData, DownloadDataFileResponses, DownloadOpenApiFileData, DownloadOpenApiFileResponses, DownloadSkillData, DownloadSkillResponses, EvaluateNeoSkillCandidateData, EvaluateNeoSkillCandidateResponses, ExportConversationsData, ExportConversationsResponses, GetActiveT2iTemplateData, GetActiveT2iTemplateResponses, GetAppearanceWallpaperData, GetAppearanceWallpaperErrors, GetAppearanceWallpaperResponses, GetAppearanceWallpaperThumbnailData, GetAppearanceWallpaperThumbnailErrors, GetAppearanceWallpaperThumbnailResponses, GetAttachmentData, GetAttachmentResponses, GetAuthSetupStatusData, GetAuthSetupStatusResponses, GetBackupProgressData, GetBackupProgressResponses, GetBotData, GetBotResponses, GetChangelogData, GetChangelogErrors, GetChangelogResponses, GetChatProjectData, GetChatProjectResponses, GetChatProjectWorkspaceFileData, GetChatProjectWorkspaceFileResponses, GetChatSessionData, GetChatSessionResponses, GetChatThreadData, GetChatThreadResponses, GetCodingCliGlobalConfigData, GetCodingCliGlobalConfigResponses, GetConfigProfileData, GetConfigProfileResponses, GetConfigProfileSchemaData, GetConfigProfileSchemaResponses, GetConversationData, GetConversationFilterOptionsData, GetConversationFilterOptionsResponses, GetConversationResponses, GetDataFileContentData, GetDataFileContentResponses, GetDataFileMetadataData, GetDataFileMetadataResponses, GetFileByNameData, GetFileByNameResponses, GetFirstNoticeData, GetFirstNoticeResponses, GetKnowledgeBaseData, GetKnowledgeBaseResponses, GetKnowledgeBaseStatsData, GetKnowledgeBaseStatsResponses, GetKnowledgeDocumentData, GetKnowledgeDocumentResponses, GetKnowledgeTaskData, GetKnowledgeTaskResponses, GetLogHistoryData, GetLogHistoryResponses, GetMcpCatalogData, GetMcpCatalogResponses, GetMcpOAuthStatusData, GetMcpOAuthStatusResponses, GetMcpPromptData, GetMcpPromptResponses, GetMemoryFactData, GetMemoryFactResponses, GetMemoryStatsData, GetMemoryStatsResponses, GetNeoSkillPayloadData, GetNeoSkillPayloadResponses, GetPersonaData, GetPersonaResponses, GetPersonaTreeData, GetPersonaTreeResponses, GetPluginChangelogData, GetPluginChangelogResponses, GetPluginConfigData, GetPluginConfigResponses, GetPluginConfigSchemaData, GetPluginConfigSchemaResponses, GetPluginDashboardCatalogData, GetPluginDashboardCatalogErrors, GetPluginDashboardCatalogResponses, GetPluginData, GetPluginReadmeData, GetPluginReadmeResponses, GetPluginResponses, GetProviderData, GetProviderEmbeddingDimensionData, GetProviderEmbeddingDimensionResponses, GetProviderResponses, GetProviderSchemaData, GetProviderSchemaResponses, GetProviderSourceData, GetProviderSourceResponses, GetProviderTokenStatsData, GetProviderTokenStatsResponses, GetPublicVersionsData, GetPublicVersionsResponses, GetSkillFileData, GetSkillFileResponses, GetStartTimeData, GetStartTimeResponses, GetStatsData, GetStatsResponses, GetStorageStatusData, GetStorageStatusResponses, GetSubagentConfigData, GetSubagentConfigResponses, GetSystemConfigData, GetSystemConfigResponses, GetSystemConfigRuntimeData, GetSystemConfigRuntimeResponses, GetSystemConfigSchemaData, GetSystemConfigSchemaResponses, GetT2iRuntimeStatsData, GetT2iRuntimeStatsResponses, GetT2iTemplateData, GetT2iTemplateResponses, GetTokenFileData, GetTokenFileResponses, GetTraceSettingsData, GetTraceSettingsResponses, GetVersionData, GetVersionResponses, GrantAuthorizationRoleBindingData, GrantAuthorizationRoleBindingResponses, ImportBackupData, ImportBackupResponses, ImportKnowledgeDocumentFromUrlData, ImportKnowledgeDocumentFromUrlErrors, ImportKnowledgeDocumentFromUrlResponses, ImportKnowledgeDocumentsData, ImportKnowledgeDocumentsErrors, ImportKnowledgeDocumentsResponses, InitBackupUploadData, InitBackupUploadResponses, InstallPipPackageData, InstallPipPackageResponses, InstallPluginFromGithubData, InstallPluginFromGithubResponses, InstallPluginFromUploadData, InstallPluginFromUploadResponses, InstallPluginFromUrlData, InstallPluginFromUrlResponses, InvokeBotActionData, InvokeBotActionResponses, InvokePluginDashboardActionData, InvokePluginDashboardActionErrors, InvokePluginDashboardActionResponses, InvokePluginDashboardFileData, InvokePluginDashboardFileErrors, InvokePluginDashboardFileResponses, InvokePluginDashboardUploadData, InvokePluginDashboardUploadErrors, InvokePluginDashboardUploadResponses, IssueAuthorizationBatchRevokeStepUpData, IssueAuthorizationBatchRevokeStepUpResponses, IssueAuthorizationStepUpData, IssueAuthorizationStepUpResponses, IssueWebChatAuthorizationStepUpData, IssueWebChatAuthorizationStepUpResponses, ListActiveUmosData, ListActiveUmosResponses, ListApiKeysData, ListApiKeysResponses, ListAppearanceWallpapersData, ListAppearanceWallpapersResponses, ListAuthorizationAccountsData, ListAuthorizationAccountsResponses, ListAuthorizationAuditData, ListAuthorizationAuditResponses, ListAuthorizationRoleBindingsData, ListAuthorizationRoleBindingsResponses, ListBackupsData, ListBackupsResponses, ListBotsData, ListBotsResponses, ListBotStatsData, ListBotStatsResponses, ListBotTypesData, ListBotTypesResponses, ListChangelogVersionsData, ListChangelogVersionsResponses, ListChatConfigsData, ListChatConfigsResponses, ListChatProjectsData, ListChatProjectSessionsData, ListChatProjectSessionsResponses, ListChatProjectsResponses, ListChatProjectWorkspaceFilesData, ListChatProjectWorkspaceFilesResponses, ListChatSessionsData, ListChatSessionsResponses, ListCommandConflictsData, ListCommandConflictsResponses, ListCommandsData, ListCommandsResponses, ListConfigProfilesData, ListConfigProfilesResponses, ListConfigRoutesData, ListConfigRoutesResponses, ListConversationsData, ListConversationsResponses, ListCronJobsData, ListCronJobsResponses, ListDataFileTreeData, ListDataFileTreeResponses, ListFailedPluginsData, ListFailedPluginsResponses, ListImBotsData, ListImBotsResponses, ListKnowledgeBasesData, ListKnowledgeBasesResponses, ListKnowledgeChunksData, ListKnowledgeChunksResponses, ListKnowledgeDocumentsData, ListKnowledgeDocumentsResponses, ListMcpPromptsData, ListMcpPromptsResponses, ListMcpResourcesData, ListMcpResourcesResponses, ListMcpResourceTemplatesData, ListMcpResourceTemplatesResponses, ListMcpServersData, ListMcpServersResponses, ListMemoryFactsData, ListMemoryFactsResponses, ListMemoryOperationsData, ListMemoryOperationsResponses, ListMemoryProfilesData, ListMemoryProfilesResponses, ListNeoSkillCandidatesData, ListNeoSkillCandidatesResponses, ListNeoSkillReleasesData, ListNeoSkillReleasesResponses, ListPersonaFoldersData, ListPersonaFoldersResponses, ListPersonasData, ListPersonasResponses, ListPluginConfigFilesData, ListPluginConfigFilesResponses, ListPluginMarketCategoriesData, ListPluginMarketCategoriesResponses, ListPluginMarketData, ListPluginMarketResponses, ListPluginsData, ListPluginSourcesData, ListPluginSourcesResponses, ListPluginsResponses, ListProvidersBySourceData, ListProvidersBySourceResponses, ListProvidersData, ListProviderSourceModelsData, ListProviderSourceModelsResponses, ListProviderSourcesData, ListProviderSourcesResponses, ListProvidersResponses, ListSessionGroupsData, ListSessionGroupsResponses, ListSessionRulesData, ListSessionRulesResponses, ListSessionsData, ListSessionsResponses, ListSkillFilesData, ListSkillFilesResponses, ListSkillsData, ListSkillsResponses, ListSubagentAvailableToolsData, ListSubagentAvailableToolsResponses, ListT2iTemplatesData, ListT2iTemplatesResponses, ListToolsData, ListToolsResponses, LoginData, LoginErrors, LoginResponses, LogoutData, LogoutResponses, MoveDataFileEntryData, MoveDataFileEntryResponses, MovePersonaItemData, MovePersonaItemResponses, OpenChatWebSocketData, OpenUnifiedChatWebSocketData, PromoteNeoSkillCandidateData, PromoteNeoSkillCandidateResponses, ReadMcpResourceData, ReadMcpResourceResponses, ReceivePlatformWebhookData, ReceivePlatformWebhookResponses, RecoverTotpData, RecoverTotpResponses, RefreshMemoryProfileData, RefreshMemoryProfileResponses, RegenerateChatMessageData, RegenerateChatMessageResponse, RegenerateChatMessageResponses, RegisterBotTypeData, RegisterBotTypeResponses, ReindexKnowledgeDocumentData, ReindexKnowledgeDocumentErrors, ReindexKnowledgeDocumentResponses, ReloadFailedPluginData, ReloadFailedPluginResponses, ReloadPluginData, ReloadPluginResponses, RemoveChatProjectSessionData, RemoveChatProjectSessionResponses, RemoveCodingCliGlobalConfigData, RemoveCodingCliGlobalConfigResponses, RenameBackupData, RenameBackupResponses, RenameConfigProfileData, RenameConfigProfileResponses, ReorderPersonaItemsData, ReorderPersonaItemsResponses, ReplaceConfigRoutesData, ReplaceConfigRoutesResponses, ReplaceConversationMessagesData, ReplaceConversationMessagesResponses, ReplacePluginSourcesData, ReplacePluginSourcesResponses, ResetDefaultT2iTemplateData, ResetDefaultT2iTemplateResponses, RestartCoreData, RestartCoreResponses, RestoreMemoryFactData, RestoreMemoryFactResponses, ResumeChatRunData, ResumeChatRunResponse, ResumeChatRunResponses, RetrieveKnowledgeBaseData, RetrieveKnowledgeBaseResponses, RevokeApiKeyData, RevokeApiKeyResponses, RevokeAuthorizationRoleBindingData, RevokeAuthorizationRoleBindingResponses, RevokeAuthorizationRoleBindingsData, RevokeAuthorizationRoleBindingsResponses, RevokeMcpOAuthData, RevokeMcpOAuthResponses, RollbackNeoSkillReleaseData, RollbackNeoSkillReleaseResponses, RunCronJobData, RunCronJobResponses, SearchDataFilesData, SearchDataFilesResponses, SendChatMessageData, SendChatMessageResponse, SendChatMessageResponses, SendChatThreadMessageData, SendChatThreadMessageResponse, SendChatThreadMessageResponses, SendImMessageData, SendImMessageResponses, SetActiveT2iTemplateData, SetActiveT2iTemplateResponses, SetBotEnabledData, SetBotEnabledResponses, SetMcpServerEnabledData, SetMcpServerEnabledResponses, SetParallelEnabledData, SetParallelEnabledResponses, SetPluginEnabledData, SetPluginEnabledResponses, SetProviderEnabledData, SetProviderEnabledResponses, SetToolEnabledData, SetToolEnabledResponses, SetToolParallelData, SetToolParallelResponses, SetupAuthData, SetupAuthResponses, SetupTotpData, SetupTotpResponses, StartMcpOAuthData, StartMcpOAuthResponses, StopChatSessionData, StopChatSessionResponses, StreamLiveLogsData, StreamLiveLogsResponse, StreamLiveLogsResponses, SwitchCodingCliProviderData, SwitchCodingCliProviderResponses, SyncModelScopeMcpServersData, SyncModelScopeMcpServersResponses, SyncNeoSkillReleaseData, SyncNeoSkillReleaseResponses, TestBotData, TestBotResponses, TestGhproxyConnectionData, TestGhproxyConnectionResponses, TestMcpServerData, TestMcpServerResponses, TestProviderData, TestProviderResponses, UninstallFailedPluginData, UninstallFailedPluginResponses, UninstallPluginData, UninstallPluginResponses, UpdateAuthAccountData, UpdateAuthAccountResponses, UpdateAuthorizationAccountData, UpdateAuthorizationAccountResponses, UpdateBotData, UpdateBotResponses, UpdateChatMessageData, UpdateChatMessageResponses, UpdateChatProjectData, UpdateChatProjectResponses, UpdateChatSessionData, UpdateChatSessionResponses, UpdateCommandData, UpdateCommandResponses, UpdateConfigProfileContentData, UpdateConfigProfileContentResponses, UpdateConversationData, UpdateConversationResponses, UpdateCronJobData, UpdateCronJobResponses, UpdateDataFileContentData, UpdateDataFileContentErrors, UpdateDataFileContentResponses, UpdateKnowledgeBaseData, UpdateKnowledgeBaseResponses, UpdateMcpServerData, UpdateMcpServerResponses, UpdateMemoryFactData, UpdateMemoryFactResponses, UpdatePersonaData, UpdatePersonaFolderData, UpdatePersonaFolderResponses, UpdatePersonaResponses, UpdatePluginConfigData, UpdatePluginConfigResponses, UpdatePluginData, UpdatePluginLogLevelData, UpdatePluginLogLevelResponses, UpdatePluginResponses, UpdatePluginsData, UpdatePluginsResponses, UpdateProviderData, UpdateProviderResponses, UpdateSessionGroupData, UpdateSessionGroupResponses, UpdateSkillData, UpdateSkillFileData, UpdateSkillFileResponses, UpdateSkillResponses, UpdateSubagentConfigData, UpdateSubagentConfigResponses, UpdateSystemConfigData, UpdateSystemConfigResponses, UpdateT2iTemplateData, UpdateT2iTemplateResponses, UpdateTraceSettingsData, UpdateTraceSettingsResponses, UploadAppearanceWallpaperData, UploadAppearanceWallpaperErrors, UploadAppearanceWallpaperResponses, UploadBackupChunkData, UploadBackupChunkResponses, UploadBackupData, UploadBackupResponses, UploadDataFileData, UploadDataFileResponses, UploadFileData, UploadFileResponses, UploadKnowledgeDocumentData, UploadKnowledgeDocumentErrors, UploadKnowledgeDocumentResponses, UploadOpenApiFileData, UploadOpenApiFileResponses, UploadPluginConfigFilesData, UploadPluginConfigFilesResponses, UploadSkillData, UploadSkillResponses, UploadSkillsBatchData, UploadSkillsBatchResponses, UpsertConfigRouteData, UpsertConfigRouteResponses, UpsertProviderSourceData, UpsertProviderSourceResponses, UpsertSessionRuleData, UpsertSessionRuleResponses, VerifyPlatformWebhookData, VerifyPlatformWebhookResponses } from './types.gen'; + +export type Options = Options2 & { + /** + * You can provide a client instance returned by `createClient()` instead of + * individual options. This might be also useful if you want to implement a + * custom client. + */ + client?: Client; + /** + * You can pass arbitrary values through the `meta` object. This can be + * used to access values that aren't defined as part of the SDK function. + */ + meta?: keyof ClientMeta extends never ? Record : ClientMeta; }; /** * List runtime data directory entries */ -export const listDataFileTree = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListDataFileTreeResponses, - unknown, - ThrowOnError - >({ - responseType: 'json', - security: [ - { - key: 'DashboardBearerAuth', - scheme: 'bearer', - type: 'http', - }, - { - in: 'cookie', - name: 'astrbot_dashboard_jwt', - type: 'apiKey', - }, - ], +export const listDataFileTree = (options?: Options): RequestResult => (options?.client ?? client).get({ + responseType: 'json', + security: [{ + key: 'DashboardBearerAuth', + scheme: 'bearer', + type: 'http' + }, { + in: 'cookie', + name: 'astrbot_dashboard_jwt', + type: 'apiKey' + }], url: '/api/v1/data-files/tree', - ...options, - }); + ...options +}); /** * Get runtime data entry metadata */ -export const getDataFileMetadata = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - GetDataFileMetadataResponses, - unknown, - ThrowOnError - >({ - responseType: 'json', - security: [ - { - key: 'DashboardBearerAuth', - scheme: 'bearer', - type: 'http', - }, - { - in: 'cookie', - name: 'astrbot_dashboard_jwt', - type: 'apiKey', - }, - ], +export const getDataFileMetadata = (options: Options): RequestResult => (options.client ?? client).get({ + responseType: 'json', + security: [{ + key: 'DashboardBearerAuth', + scheme: 'bearer', + type: 'http' + }, { + in: 'cookie', + name: 'astrbot_dashboard_jwt', + type: 'apiKey' + }], url: '/api/v1/data-files/metadata', - ...options, - }); + ...options +}); /** * Read a UTF-8 runtime data text file */ -export const getDataFileContent = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - GetDataFileContentResponses, - unknown, - ThrowOnError - >({ - responseType: 'json', - security: [ - { - key: 'DashboardBearerAuth', - scheme: 'bearer', - type: 'http', - }, - { - in: 'cookie', - name: 'astrbot_dashboard_jwt', - type: 'apiKey', - }, - ], +export const getDataFileContent = (options: Options): RequestResult => (options.client ?? client).get({ + responseType: 'json', + security: [{ + key: 'DashboardBearerAuth', + scheme: 'bearer', + type: 'http' + }, { + in: 'cookie', + name: 'astrbot_dashboard_jwt', + type: 'apiKey' + }], url: '/api/v1/data-files/content/{path}', - ...options, - }); + ...options +}); /** * Atomically save a runtime data text file */ -export const updateDataFileContent = ( - options: Options, -): RequestResult< - UpdateDataFileContentResponses, - UpdateDataFileContentErrors, - ThrowOnError -> => - (options.client ?? client).put< - UpdateDataFileContentResponses, - UpdateDataFileContentErrors, - ThrowOnError - >({ - responseType: 'json', - security: [ - { - key: 'DashboardBearerAuth', - scheme: 'bearer', - type: 'http', - }, - { - in: 'cookie', - name: 'astrbot_dashboard_jwt', - type: 'apiKey', - }, - ], +export const updateDataFileContent = (options: Options): RequestResult => (options.client ?? client).put({ + responseType: 'json', + security: [{ + key: 'DashboardBearerAuth', + scheme: 'bearer', + type: 'http' + }, { + in: 'cookie', + name: 'astrbot_dashboard_jwt', + type: 'apiKey' + }], url: '/api/v1/data-files/content/{path}', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Download a runtime data file */ -export const downloadDataFile = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - DownloadDataFileResponses, - unknown, - ThrowOnError - >({ +export const downloadDataFile = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'blob', - security: [ - { - key: 'DashboardBearerAuth', - scheme: 'bearer', - type: 'http', - }, - { - in: 'cookie', - name: 'astrbot_dashboard_jwt', - type: 'apiKey', - }, - ], + security: [{ + key: 'DashboardBearerAuth', + scheme: 'bearer', + type: 'http' + }, { + in: 'cookie', + name: 'astrbot_dashboard_jwt', + type: 'apiKey' + }], url: '/api/v1/data-files/download/{path}', - ...options, - }); + ...options +}); /** * Move or rename a runtime data entry */ -export const moveDataFileEntry = ( - options: Options, -): RequestResult => - (options.client ?? client).patch< - MoveDataFileEntryResponses, - unknown, - ThrowOnError - >({ - responseType: 'json', - security: [ - { - key: 'DashboardBearerAuth', - scheme: 'bearer', - type: 'http', - }, - { - in: 'cookie', - name: 'astrbot_dashboard_jwt', - type: 'apiKey', - }, - ], +export const moveDataFileEntry = (options: Options): RequestResult => (options.client ?? client).patch({ + responseType: 'json', + security: [{ + key: 'DashboardBearerAuth', + scheme: 'bearer', + type: 'http' + }, { + in: 'cookie', + name: 'astrbot_dashboard_jwt', + type: 'apiKey' + }], url: '/api/v1/data-files/entries', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Create a runtime data file or directory */ -export const createDataFileEntry = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - CreateDataFileEntryResponses, - unknown, - ThrowOnError - >({ - responseType: 'json', - security: [ - { - key: 'DashboardBearerAuth', - scheme: 'bearer', - type: 'http', - }, - { - in: 'cookie', - name: 'astrbot_dashboard_jwt', - type: 'apiKey', - }, - ], +export const createDataFileEntry = (options: Options): RequestResult => (options.client ?? client).post({ + responseType: 'json', + security: [{ + key: 'DashboardBearerAuth', + scheme: 'bearer', + type: 'http' + }, { + in: 'cookie', + name: 'astrbot_dashboard_jwt', + type: 'apiKey' + }], url: '/api/v1/data-files/entries', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Delete a runtime data entry */ -export const deleteDataFileEntry = ( - options: Options, -): RequestResult => - (options.client ?? client).delete< - DeleteDataFileEntryResponses, - unknown, - ThrowOnError - >({ - responseType: 'json', - security: [ - { - key: 'DashboardBearerAuth', - scheme: 'bearer', - type: 'http', - }, - { - in: 'cookie', - name: 'astrbot_dashboard_jwt', - type: 'apiKey', - }, - ], +export const deleteDataFileEntry = (options: Options): RequestResult => (options.client ?? client).delete({ + responseType: 'json', + security: [{ + key: 'DashboardBearerAuth', + scheme: 'bearer', + type: 'http' + }, { + in: 'cookie', + name: 'astrbot_dashboard_jwt', + type: 'apiKey' + }], url: '/api/v1/data-files/entries/{path}', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Upload a runtime data file */ -export const uploadDataFile = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - UploadDataFileResponses, - unknown, - ThrowOnError - >({ +export const uploadDataFile = (options: Options): RequestResult => (options.client ?? client).post({ ...formDataBodySerializer, responseType: 'json', - security: [ - { - key: 'DashboardBearerAuth', - scheme: 'bearer', - type: 'http', - }, - { - in: 'cookie', - name: 'astrbot_dashboard_jwt', - type: 'apiKey', - }, - ], + security: [{ + key: 'DashboardBearerAuth', + scheme: 'bearer', + type: 'http' + }, { + in: 'cookie', + name: 'astrbot_dashboard_jwt', + type: 'apiKey' + }], url: '/api/v1/data-files/upload', ...options, headers: { - 'Content-Type': null, - ...options.headers, - }, - }); + 'Content-Type': null, + ...options.headers + } +}); /** * Search runtime data file names */ -export const searchDataFiles = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - SearchDataFilesResponses, - unknown, - ThrowOnError - >({ - responseType: 'json', - security: [ - { - key: 'DashboardBearerAuth', - scheme: 'bearer', - type: 'http', - }, - { - in: 'cookie', - name: 'astrbot_dashboard_jwt', - type: 'apiKey', - }, - ], +export const searchDataFiles = (options: Options): RequestResult => (options.client ?? client).get({ + responseType: 'json', + security: [{ + key: 'DashboardBearerAuth', + scheme: 'bearer', + type: 'http' + }, { + in: 'cookie', + name: 'astrbot_dashboard_jwt', + type: 'apiKey' + }], url: '/api/v1/data-files/search', - ...options, - }); + ...options +}); /** * Login to the dashboard API */ -export const login = ( - options: Options, -): RequestResult => - (options.client ?? client).post({ +export const login = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', url: '/api/v1/auth/login', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Logout from the dashboard API */ -export const logout = ( - options?: Options, -): RequestResult => - (options?.client ?? client).post({ +export const logout = (options?: Options): RequestResult => (options?.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/auth/logout', - ...options, - }); + ...options +}); /** * Get first-run setup status */ -export const getAuthSetupStatus = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - GetAuthSetupStatusResponses, - unknown, - ThrowOnError - >({ +export const getAuthSetupStatus = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', url: '/api/v1/auth/setup-status', - ...options, - }); + ...options +}); /** * Complete first-run dashboard account setup */ -export const setupAuth = ( - options: Options, -): RequestResult => - (options.client ?? client).post({ +export const setupAuth = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', url: '/api/v1/auth/setup', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Start or refresh TOTP setup */ -export const setupTotp = ( - options?: Options, -): RequestResult => - (options?.client ?? client).post({ +export const setupTotp = (options?: Options): RequestResult => (options?.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/auth/totp/setup', ...options, headers: { - 'Content-Type': 'application/json', - ...options?.headers, - }, - }); + 'Content-Type': 'application/json', + ...options?.headers + } +}); /** * Generate or rotate TOTP recovery codes */ -export const recoverTotp = ( - options?: Options, -): RequestResult => - (options?.client ?? client).post( - { - responseType: 'json', - security: [{ name: 'X-API-Key', type: 'apiKey' }], - url: '/api/v1/auth/totp/recovery', - ...options, - }, - ); +export const recoverTotp = (options?: Options): RequestResult => (options?.client ?? client).post({ + responseType: 'json', + security: [{ name: 'X-API-Key', type: 'apiKey' }], + url: '/api/v1/auth/totp/recovery', + ...options +}); /** * Update dashboard account credentials */ -export const updateAuthAccount = ( - options: Options, -): RequestResult => - (options.client ?? client).patch< - UpdateAuthAccountResponses, - unknown, - ThrowOnError - >({ +export const updateAuthAccount = (options: Options): RequestResult => (options.client ?? client).patch({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/auth/account', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * List OpenAPI keys */ -export const listApiKeys = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get({ +export const listApiKeys = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/api-keys', - ...options, - }); + ...options +}); /** * Create an OpenAPI key */ -export const createApiKey = ( - options: Options, -): RequestResult => - (options.client ?? client).post( - { - responseType: 'json', - security: [{ name: 'X-API-Key', type: 'apiKey' }], - url: '/api/v1/api-keys', - ...options, - headers: { +export const createApiKey = (options: Options): RequestResult => (options.client ?? client).post({ + responseType: 'json', + security: [{ name: 'X-API-Key', type: 'apiKey' }], + url: '/api/v1/api-keys', + ...options, + headers: { 'Content-Type': 'application/json', - ...options.headers, - }, - }, - ); + ...options.headers + } +}); /** * Revoke an OpenAPI key */ -export const revokeApiKey = ( - options: Options, -): RequestResult => - (options.client ?? client).post( - { - responseType: 'json', - security: [{ name: 'X-API-Key', type: 'apiKey' }], - url: '/api/v1/api-keys/{key_id}/revoke', - ...options, - }, - ); +export const revokeApiKey = (options: Options): RequestResult => (options.client ?? client).post({ + responseType: 'json', + security: [{ name: 'X-API-Key', type: 'apiKey' }], + url: '/api/v1/api-keys/{key_id}/revoke', + ...options +}); /** * Delete an OpenAPI key */ -export const deleteApiKey = ( - options: Options, -): RequestResult => - (options.client ?? client).delete< - DeleteApiKeyResponses, - unknown, - ThrowOnError - >({ +export const deleteApiKey = (options: Options): RequestResult => (options.client ?? client).delete({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/api-keys/{key_id}', - ...options, - }); + ...options +}); /** * List role bindings */ -export const listAuthorizationRoleBindings = < - ThrowOnError extends boolean = false, ->( - options?: Options, -): RequestResult< - ListAuthorizationRoleBindingsResponses, - unknown, - ThrowOnError -> => - (options?.client ?? client).get< - ListAuthorizationRoleBindingsResponses, - unknown, - ThrowOnError - >({ +export const listAuthorizationRoleBindings = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/authorization/role-bindings', - ...options, - }); + ...options +}); /** * Grant a scoped role binding */ -export const grantAuthorizationRoleBinding = < - ThrowOnError extends boolean = false, ->( - options: Options, -): RequestResult< - GrantAuthorizationRoleBindingResponses, - unknown, - ThrowOnError -> => - (options.client ?? client).post< - GrantAuthorizationRoleBindingResponses, - unknown, - ThrowOnError - >({ +export const grantAuthorizationRoleBinding = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/authorization/role-bindings', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Revoke a scoped role binding */ -export const revokeAuthorizationRoleBinding = < - ThrowOnError extends boolean = false, ->( - options: Options, -): RequestResult< - RevokeAuthorizationRoleBindingResponses, - unknown, - ThrowOnError -> => - (options.client ?? client).post< - RevokeAuthorizationRoleBindingResponses, - unknown, - ThrowOnError - >({ +export const revokeAuthorizationRoleBinding = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/authorization/role-bindings/{binding_id}/revoke', - ...options, - }); + ...options +}); /** * Reauthenticate for one exact batch role-binding revocation */ -export const issueAuthorizationBatchRevokeStepUp = < - ThrowOnError extends boolean = false, ->( - options: Options, -): RequestResult< - IssueAuthorizationBatchRevokeStepUpResponses, - unknown, - ThrowOnError -> => - (options.client ?? client).post< - IssueAuthorizationBatchRevokeStepUpResponses, - unknown, - ThrowOnError - >({ +export const issueAuthorizationBatchRevokeStepUp = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/authorization/role-bindings/batch-revoke/step-up', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Revoke one exact batch of scoped role bindings */ -export const revokeAuthorizationRoleBindings = < - ThrowOnError extends boolean = false, ->( - options: Options, -): RequestResult< - RevokeAuthorizationRoleBindingsResponses, - unknown, - ThrowOnError -> => - (options.client ?? client).post< - RevokeAuthorizationRoleBindingsResponses, - unknown, - ThrowOnError - >({ +export const revokeAuthorizationRoleBindings = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/authorization/role-bindings/batch-revoke', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Reauthenticate and issue a one-time step-up credential */ -export const issueAuthorizationStepUp = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - IssueAuthorizationStepUpResponses, - unknown, - ThrowOnError - >({ +export const issueAuthorizationStepUp = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/authorization/step-up', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Reauthenticate and issue WebChat instance-tool proofs */ -export const issueWebChatAuthorizationStepUp = < - ThrowOnError extends boolean = false, ->( - options: Options, -): RequestResult< - IssueWebChatAuthorizationStepUpResponses, - unknown, - ThrowOnError -> => - (options.client ?? client).post< - IssueWebChatAuthorizationStepUpResponses, - unknown, - ThrowOnError - >({ - responseType: 'json', - security: [ - { - key: 'DashboardBearerAuth', - scheme: 'bearer', - type: 'http', - }, - { - in: 'cookie', - name: 'astrbot_dashboard_jwt', - type: 'apiKey', - }, - ], +export const issueWebChatAuthorizationStepUp = (options: Options): RequestResult => (options.client ?? client).post({ + responseType: 'json', + security: [{ + key: 'DashboardBearerAuth', + scheme: 'bearer', + type: 'http' + }, { + in: 'cookie', + name: 'astrbot_dashboard_jwt', + type: 'apiKey' + }], url: '/api/v1/authorization/webchat-step-up', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * List redacted authorization audit records */ -export const listAuthorizationAudit = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListAuthorizationAuditResponses, - unknown, - ThrowOnError - >({ +export const listAuthorizationAudit = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/authorization/audit', - ...options, - }); + ...options +}); /** * List stable Dashboard accounts */ -export const listAuthorizationAccounts = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListAuthorizationAccountsResponses, - unknown, - ThrowOnError - >({ +export const listAuthorizationAccounts = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/authorization/accounts', - ...options, - }); + ...options +}); /** * Create a Dashboard account and global role binding */ -export const createAuthorizationAccount = < - ThrowOnError extends boolean = false, ->( - options: Options, -): RequestResult => - (options.client ?? client).post< - CreateAuthorizationAccountResponses, - unknown, - ThrowOnError - >({ +export const createAuthorizationAccount = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/authorization/accounts', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Update or disable a Dashboard account */ -export const updateAuthorizationAccount = < - ThrowOnError extends boolean = false, ->( - options: Options, -): RequestResult => - (options.client ?? client).patch< - UpdateAuthorizationAccountResponses, - unknown, - ThrowOnError - >({ +export const updateAuthorizationAccount = (options: Options): RequestResult => (options.client ?? client).patch({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/authorization/accounts/{account_id}', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Get the system configuration schema */ -export const getSystemConfigSchema = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - GetSystemConfigSchemaResponses, - unknown, - ThrowOnError - >({ +export const getSystemConfigSchema = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/system-config/schema', - ...options, - }); + ...options +}); /** * Get the system configuration */ -export const getSystemConfig = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - GetSystemConfigResponses, - unknown, - ThrowOnError - >({ +export const getSystemConfig = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/system-config', - ...options, - }); + ...options +}); /** * Replace the system configuration */ -export const updateSystemConfig = ( - options: Options, -): RequestResult => - (options.client ?? client).put< - UpdateSystemConfigResponses, - unknown, - ThrowOnError - >({ +export const updateSystemConfig = (options: Options): RequestResult => (options.client ?? client).put({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/system-config', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Get runtime-enriched system configuration metadata */ -export const getSystemConfigRuntime = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - GetSystemConfigRuntimeResponses, - unknown, - ThrowOnError - >({ +export const getSystemConfigRuntime = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/system-config/runtime', - ...options, - }); + ...options +}); /** * Get the configuration profile schema */ -export const getConfigProfileSchema = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - GetConfigProfileSchemaResponses, - unknown, - ThrowOnError - >({ +export const getConfigProfileSchema = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/config-profiles/schema', - ...options, - }); + ...options +}); /** * List configuration profiles */ -export const listConfigProfiles = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListConfigProfilesResponses, - unknown, - ThrowOnError - >({ +export const listConfigProfiles = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/config-profiles', - ...options, - }); + ...options +}); /** * Create a configuration profile */ -export const createConfigProfile = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - CreateConfigProfileResponses, - unknown, - ThrowOnError - >({ +export const createConfigProfile = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/config-profiles', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Delete a configuration profile */ -export const deleteConfigProfile = ( - options: Options, -): RequestResult => - (options.client ?? client).delete< - DeleteConfigProfileResponses, - unknown, - ThrowOnError - >({ +export const deleteConfigProfile = (options: Options): RequestResult => (options.client ?? client).delete({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/config-profiles/{config_id}', - ...options, - }); + ...options +}); /** * Get a configuration profile */ -export const getConfigProfile = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - GetConfigProfileResponses, - unknown, - ThrowOnError - >({ +export const getConfigProfile = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/config-profiles/{config_id}', - ...options, - }); + ...options +}); /** * Rename a configuration profile */ -export const renameConfigProfile = ( - options: Options, -): RequestResult => - (options.client ?? client).patch< - RenameConfigProfileResponses, - unknown, - ThrowOnError - >({ +export const renameConfigProfile = (options: Options): RequestResult => (options.client ?? client).patch({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/config-profiles/{config_id}', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Replace a configuration profile */ -export const updateConfigProfileContent = < - ThrowOnError extends boolean = false, ->( - options: Options, -): RequestResult => - (options.client ?? client).put< - UpdateConfigProfileContentResponses, - unknown, - ThrowOnError - >({ +export const updateConfigProfileContent = (options: Options): RequestResult => (options.client ?? client).put({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/config-profiles/{config_id}', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); + +/** + * Read each coding CLI's own configuration and its providers + */ +export const getCodingCliGlobalConfig = (options?: Options): RequestResult => (options?.client ?? client).get({ + responseType: 'json', + security: [{ name: 'X-API-Key', type: 'apiKey' }], + url: '/api/v1/coding-cli/global-config', + ...options +}); + +/** + * Switch a coding CLI to one of its configured providers + */ +export const switchCodingCliProvider = (options: Options): RequestResult => (options.client ?? client).put({ + responseType: 'json', + security: [{ name: 'X-API-Key', type: 'apiKey' }], + url: '/api/v1/coding-cli/global-config', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } +}); + +/** + * Remove AstrBot's configuration from a coding CLI's global config + */ +export const removeCodingCliGlobalConfig = (options: Options): RequestResult => (options.client ?? client).delete({ + responseType: 'json', + security: [{ name: 'X-API-Key', type: 'apiKey' }], + url: '/api/v1/coding-cli/global-config/{cli}', + ...options +}); /** * List UMO to configuration profile bindings */ -export const listConfigRoutes = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListConfigRoutesResponses, - unknown, - ThrowOnError - >({ +export const listConfigRoutes = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/config-routes', - ...options, - }); + ...options +}); /** * Replace all UMO to configuration profile bindings */ -export const replaceConfigRoutes = ( - options: Options, -): RequestResult => - (options.client ?? client).put< - ReplaceConfigRoutesResponses, - unknown, - ThrowOnError - >({ +export const replaceConfigRoutes = (options: Options): RequestResult => (options.client ?? client).put({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/config-routes', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Remove a UMO configuration profile binding */ -export const deleteConfigRoute = ( - options: Options, -): RequestResult => - (options.client ?? client).delete< - DeleteConfigRouteResponses, - unknown, - ThrowOnError - >({ +export const deleteConfigRoute = (options: Options): RequestResult => (options.client ?? client).delete({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/config-routes/{umo}', - ...options, - }); + ...options +}); /** * Bind a UMO to a configuration profile */ -export const upsertConfigRoute = ( - options: Options, -): RequestResult => - (options.client ?? client).put< - UpsertConfigRouteResponses, - unknown, - ThrowOnError - >({ +export const upsertConfigRoute = (options: Options): RequestResult => (options.client ?? client).put({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/config-routes/{umo}', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * List configurable bot types and their schemas */ -export const listBotTypes = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get( - { - responseType: 'json', - security: [{ name: 'X-API-Key', type: 'apiKey' }], - url: '/api/v1/bot-types', - ...options, - }, - ); +export const listBotTypes = (options?: Options): RequestResult => (options?.client ?? client).get({ + responseType: 'json', + security: [{ name: 'X-API-Key', type: 'apiKey' }], + url: '/api/v1/bot-types', + ...options +}); /** * Run a bot type registration flow action */ -export const registerBotType = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - RegisterBotTypeResponses, - unknown, - ThrowOnError - >({ +export const registerBotType = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/bot-types/{bot_type}/registration', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * List created bots and their configurations */ -export const listBots = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get({ +export const listBots = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/bots', - ...options, - }); + ...options +}); /** * Create a bot from configuration */ -export const createBot = ( - options: Options, -): RequestResult => - (options.client ?? client).post({ +export const createBot = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/bots', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * List runtime status for all bots */ -export const listBotStats = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get( - { - responseType: 'json', - security: [{ name: 'X-API-Key', type: 'apiKey' }], - url: '/api/v1/bots/stats', - ...options, - }, - ); +export const listBotStats = (options?: Options): RequestResult => (options?.client ?? client).get({ + responseType: 'json', + security: [{ name: 'X-API-Key', type: 'apiKey' }], + url: '/api/v1/bots/stats', + ...options +}); /** * Delete a bot */ -export const deleteBot = ( - options: Options, -): RequestResult => - (options.client ?? client).delete({ +export const deleteBot = (options: Options): RequestResult => (options.client ?? client).delete({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/bots/{bot_id}', - ...options, - }); + ...options +}); /** * Get a bot configuration */ -export const getBot = ( - options: Options, -): RequestResult => - (options.client ?? client).get({ +export const getBot = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/bots/{bot_id}', - ...options, - }); + ...options +}); /** * Replace a bot configuration */ -export const updateBot = ( - options: Options, -): RequestResult => - (options.client ?? client).put({ +export const updateBot = (options: Options): RequestResult => (options.client ?? client).put({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/bots/{bot_id}', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Enable or disable a bot */ -export const setBotEnabled = ( - options: Options, -): RequestResult => - (options.client ?? client).patch< - SetBotEnabledResponses, - unknown, - ThrowOnError - >({ +export const setBotEnabled = (options: Options): RequestResult => (options.client ?? client).patch({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/bots/{bot_id}/enabled', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Test a bot registration or connection */ -export const testBot = ( - options: Options, -): RequestResult => - (options.client ?? client).post({ +export const testBot = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/bots/{bot_id}/test', - ...options, - }); + ...options +}); /** * Invoke a supported bot platform action */ -export const invokeBotAction = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - InvokeBotActionResponses, - unknown, - ThrowOnError - >({ +export const invokeBotAction = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/bots/{bot_id}/actions', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Get the overall provider configuration schema */ -export const getProviderSchema = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - GetProviderSchemaResponses, - unknown, - ThrowOnError - >({ +export const getProviderSchema = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/providers/schema', - ...options, - }); + ...options +}); /** * List provider sources */ -export const listProviderSources = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListProviderSourcesResponses, - unknown, - ThrowOnError - >({ +export const listProviderSources = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/provider-sources', - ...options, - }); + ...options +}); /** * Create a provider source */ -export const createProviderSource = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - CreateProviderSourceResponses, - unknown, - ThrowOnError - >({ +export const createProviderSource = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/provider-sources', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Delete a provider source and providers that reference it */ -export const deleteProviderSource = ( - options: Options, -): RequestResult => - (options.client ?? client).delete< - DeleteProviderSourceResponses, - unknown, - ThrowOnError - >({ +export const deleteProviderSource = (options: Options): RequestResult => (options.client ?? client).delete({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/provider-sources/{source_id}', - ...options, - }); + ...options +}); /** * Get a provider source */ -export const getProviderSource = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - GetProviderSourceResponses, - unknown, - ThrowOnError - >({ +export const getProviderSource = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/provider-sources/{source_id}', - ...options, - }); + ...options +}); /** * Update a provider source or create it if missing */ -export const upsertProviderSource = ( - options: Options, -): RequestResult => - (options.client ?? client).put< - UpsertProviderSourceResponses, - unknown, - ThrowOnError - >({ +export const upsertProviderSource = (options: Options): RequestResult => (options.client ?? client).put({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/provider-sources/{source_id}', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * List models available from a provider source */ -export const listProviderSourceModels = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - ListProviderSourceModelsResponses, - unknown, - ThrowOnError - >({ +export const listProviderSourceModels = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/provider-sources/{source_id}/models', - ...options, - }); + ...options +}); /** * List providers under a provider source */ -export const listProvidersBySource = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - ListProvidersBySourceResponses, - unknown, - ThrowOnError - >({ +export const listProvidersBySource = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/provider-sources/{source_id}/providers', - ...options, - }); + ...options +}); /** * Create a provider under a provider source */ -export const createProviderInSource = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - CreateProviderInSourceResponses, - unknown, - ThrowOnError - >({ +export const createProviderInSource = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/provider-sources/{source_id}/providers', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * List providers by provider type or source */ -export const listProviders = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListProvidersResponses, - unknown, - ThrowOnError - >({ +export const listProviders = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/providers', - ...options, - }); + ...options +}); /** * Create a standalone provider */ -export const createProvider = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - CreateProviderResponses, - unknown, - ThrowOnError - >({ +export const createProvider = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/providers', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Delete a provider */ -export const deleteProvider = ( - options: Options, -): RequestResult => - (options.client ?? client).delete< - DeleteProviderResponses, - unknown, - ThrowOnError - >({ +export const deleteProvider = (options: Options): RequestResult => (options.client ?? client).delete({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/providers/{provider_id}', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Get a provider configuration */ -export const getProvider = ( - options: Options, -): RequestResult => - (options.client ?? client).get({ +export const getProvider = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/providers/{provider_id}', - ...options, - }); + ...options +}); /** * Replace a provider configuration */ -export const updateProvider = ( - options: Options, -): RequestResult => - (options.client ?? client).put< - UpdateProviderResponses, - unknown, - ThrowOnError - >({ +export const updateProvider = (options: Options): RequestResult => (options.client ?? client).put({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/providers/{provider_id}', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Enable or disable a provider */ -export const setProviderEnabled = ( - options: Options, -): RequestResult => - (options.client ?? client).patch< - SetProviderEnabledResponses, - unknown, - ThrowOnError - >({ +export const setProviderEnabled = (options: Options): RequestResult => (options.client ?? client).patch({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/providers/{provider_id}/enabled', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Test a provider */ -export const testProvider = ( - options: Options, -): RequestResult => - (options.client ?? client).post( - { - responseType: 'json', - security: [{ name: 'X-API-Key', type: 'apiKey' }], - url: '/api/v1/providers/{provider_id}/test', - ...options, - }, - ); +export const testProvider = (options: Options): RequestResult => (options.client ?? client).post({ + responseType: 'json', + security: [{ name: 'X-API-Key', type: 'apiKey' }], + url: '/api/v1/providers/{provider_id}/test', + ...options +}); /** * Probe embedding dimension for a provider */ -export const getProviderEmbeddingDimension = < - ThrowOnError extends boolean = false, ->( - options: Options, -): RequestResult< - GetProviderEmbeddingDimensionResponses, - unknown, - ThrowOnError -> => - (options.client ?? client).post< - GetProviderEmbeddingDimensionResponses, - unknown, - ThrowOnError - >({ +export const getProviderEmbeddingDimension = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/providers/{provider_id}/embedding-dimension', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Send a webchat message */ -export const sendChatMessage = ( - options: Options, -): Promise> => - (options.client ?? client).sse.post< - SendChatMessageResponses, - unknown, - ThrowOnError - >({ +export const sendChatMessage = (options: Options): Promise> => (options.client ?? client).sse.post({ responseType: 'text', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/chat', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Open a streaming chat WebSocket */ -export const openChatWebSocket = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get({ +export const openChatWebSocket = (options?: Options): RequestResult => (options?.client ?? client).get({ security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/chat/ws', - ...options, - }); + ...options +}); /** * Open the unified chat WebSocket */ -export const openUnifiedChatWebSocket = ( - options: Options, -): RequestResult => - (options.client ?? client).get({ +export const openUnifiedChatWebSocket = (options: Options): RequestResult => (options.client ?? client).get({ security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/unified-chat/ws', - ...options, - }); + ...options +}); /** * List webchat sessions */ -export const listChatSessions = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListChatSessionsResponses, - unknown, - ThrowOnError - >({ +export const listChatSessions = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/chat/sessions', - ...options, - }); + ...options +}); /** * Create a webchat session */ -export const createChatSession = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - CreateChatSessionResponses, - unknown, - ThrowOnError - >({ +export const createChatSession = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/chat/sessions/new', - ...options, - }); + ...options +}); /** * Delete multiple webchat sessions */ -export const batchDeleteChatSessions = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - BatchDeleteChatSessionsResponses, - unknown, - ThrowOnError - >({ +export const batchDeleteChatSessions = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/chat/sessions/batch-delete', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Delete a webchat session */ -export const deleteChatSession = ( - options: Options, -): RequestResult => - (options.client ?? client).delete< - DeleteChatSessionResponses, - unknown, - ThrowOnError - >({ +export const deleteChatSession = (options: Options): RequestResult => (options.client ?? client).delete({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/chat/sessions/{session_id}', - ...options, - }); + ...options +}); /** * Get a webchat session and its messages */ -export const getChatSession = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - GetChatSessionResponses, - unknown, - ThrowOnError - >({ +export const getChatSession = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/chat/sessions/{session_id}', - ...options, - }); + ...options +}); /** * Update a webchat session */ -export const updateChatSession = ( - options: Options, -): RequestResult => - (options.client ?? client).patch< - UpdateChatSessionResponses, - unknown, - ThrowOnError - >({ +export const updateChatSession = (options: Options): RequestResult => (options.client ?? client).patch({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/chat/sessions/{session_id}', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Stop active webchat work for a session */ -export const stopChatSession = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - StopChatSessionResponses, - unknown, - ThrowOnError - >({ +export const stopChatSession = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/chat/sessions/{session_id}/stop', - ...options, - }); + ...options +}); /** * Resume an active webchat run as an SSE stream */ -export const resumeChatRun = ( - options: Options, -): Promise> => - (options.client ?? client).sse.get< - ResumeChatRunResponses, - unknown, - ThrowOnError - >({ +export const resumeChatRun = (options: Options): Promise> => (options.client ?? client).sse.get({ responseType: 'text', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/chat/runs/{run_id}/stream', - ...options, - }); + ...options +}); /** * Update the latest user message in a webchat session */ -export const updateChatMessage = ( - options: Options, -): RequestResult => - (options.client ?? client).patch< - UpdateChatMessageResponses, - unknown, - ThrowOnError - >({ +export const updateChatMessage = (options: Options): RequestResult => (options.client ?? client).patch({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/chat/sessions/{session_id}/messages/{message_id}', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Regenerate a bot message in a webchat session */ -export const regenerateChatMessage = ( - options: Options< - RegenerateChatMessageData, - ThrowOnError, - RegenerateChatMessageResponse - >, -): Promise> => - (options.client ?? client).sse.post< - RegenerateChatMessageResponses, - unknown, - ThrowOnError - >({ +export const regenerateChatMessage = (options: Options): Promise> => (options.client ?? client).sse.post({ responseType: 'text', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/chat/sessions/{session_id}/messages/{message_id}/regenerate', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * List chat-selectable configuration profiles */ -export const listChatConfigs = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListChatConfigsResponses, - unknown, - ThrowOnError - >({ +export const listChatConfigs = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/chat/configs', - ...options, - }); + ...options +}); /** * Create or reuse a side thread from a webchat message */ -export const createChatThread = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - CreateChatThreadResponses, - unknown, - ThrowOnError - >({ +export const createChatThread = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/chat/threads', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Delete a webchat side thread */ -export const deleteChatThread = ( - options: Options, -): RequestResult => - (options.client ?? client).delete< - DeleteChatThreadResponses, - unknown, - ThrowOnError - >({ +export const deleteChatThread = (options: Options): RequestResult => (options.client ?? client).delete({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/chat/threads/{thread_id}', - ...options, - }); + ...options +}); /** * Get a webchat side thread */ -export const getChatThread = ( - options: Options, -): RequestResult => - (options.client ?? client).get( - { - responseType: 'json', - security: [{ name: 'X-API-Key', type: 'apiKey' }], - url: '/api/v1/chat/threads/{thread_id}', - ...options, - }, - ); +export const getChatThread = (options: Options): RequestResult => (options.client ?? client).get({ + responseType: 'json', + security: [{ name: 'X-API-Key', type: 'apiKey' }], + url: '/api/v1/chat/threads/{thread_id}', + ...options +}); /** * Send a message inside a webchat side thread */ -export const sendChatThreadMessage = ( - options: Options< - SendChatThreadMessageData, - ThrowOnError, - SendChatThreadMessageResponse - >, -): Promise> => - (options.client ?? client).sse.post< - SendChatThreadMessageResponses, - unknown, - ThrowOnError - >({ +export const sendChatThreadMessage = (options: Options): Promise> => (options.client ?? client).sse.post({ responseType: 'text', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/chat/threads/{thread_id}/messages', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * List ChatUI projects */ -export const listChatProjects = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListChatProjectsResponses, - unknown, - ThrowOnError - >({ +export const listChatProjects = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/chat/projects', - ...options, - }); + ...options +}); /** * Create a ChatUI project */ -export const createChatProject = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - CreateChatProjectResponses, - unknown, - ThrowOnError - >({ +export const createChatProject = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/chat/projects', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Delete a ChatUI project */ -export const deleteChatProject = ( - options: Options, -): RequestResult => - (options.client ?? client).delete< - DeleteChatProjectResponses, - unknown, - ThrowOnError - >({ +export const deleteChatProject = (options: Options): RequestResult => (options.client ?? client).delete({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/chat/projects/{project_id}', - ...options, - }); + ...options +}); /** * Get a ChatUI project */ -export const getChatProject = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - GetChatProjectResponses, - unknown, - ThrowOnError - >({ +export const getChatProject = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/chat/projects/{project_id}', - ...options, - }); + ...options +}); /** * Update a ChatUI project */ -export const updateChatProject = ( - options: Options, -): RequestResult => - (options.client ?? client).patch< - UpdateChatProjectResponses, - unknown, - ThrowOnError - >({ +export const updateChatProject = (options: Options): RequestResult => (options.client ?? client).patch({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/chat/projects/{project_id}', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * List sessions in a ChatUI project */ -export const listChatProjectSessions = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - ListChatProjectSessionsResponses, - unknown, - ThrowOnError - >({ +export const listChatProjectSessions = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/chat/projects/{project_id}/sessions', - ...options, - }); + ...options +}); /** * Add a session to a ChatUI project */ -export const addChatProjectSession = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - AddChatProjectSessionResponses, - unknown, - ThrowOnError - >({ +export const addChatProjectSession = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/chat/projects/{project_id}/sessions/{session_id}', - ...options, - }); + ...options +}); /** * List files in a ChatUI project workspace directory */ -export const listChatProjectWorkspaceFiles = < - ThrowOnError extends boolean = false, ->( - options: Options, -): RequestResult< - ListChatProjectWorkspaceFilesResponses, - unknown, - ThrowOnError -> => - (options.client ?? client).get< - ListChatProjectWorkspaceFilesResponses, - unknown, - ThrowOnError - >({ +export const listChatProjectWorkspaceFiles = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/chat/projects/{project_id}/workspace/files', - ...options, - }); + ...options +}); /** * Preview a ChatUI project workspace file */ -export const getChatProjectWorkspaceFile = < - ThrowOnError extends boolean = false, ->( - options: Options, -): RequestResult => - (options.client ?? client).get< - GetChatProjectWorkspaceFileResponses, - unknown, - ThrowOnError - >({ +export const getChatProjectWorkspaceFile = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/chat/projects/{project_id}/workspace/file', - ...options, - }); + ...options +}); /** * Download a ChatUI project workspace file */ -export const downloadChatProjectWorkspaceFile = < - ThrowOnError extends boolean = false, ->( - options: Options, -): RequestResult< - DownloadChatProjectWorkspaceFileResponses, - unknown, - ThrowOnError -> => - (options.client ?? client).get< - DownloadChatProjectWorkspaceFileResponses, - unknown, - ThrowOnError - >({ +export const downloadChatProjectWorkspaceFile = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'blob', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/chat/projects/{project_id}/workspace/file/download', - ...options, - }); + ...options +}); /** * Remove a session from its ChatUI project */ -export const removeChatProjectSession = ( - options: Options, -): RequestResult => - (options.client ?? client).delete< - RemoveChatProjectSessionResponses, - unknown, - ThrowOnError - >({ +export const removeChatProjectSession = (options: Options): RequestResult => (options.client ?? client).delete({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/chat/projects/sessions/{session_id}', - ...options, - }); + ...options +}); /** * Send a message to a UMO */ -export const sendImMessage = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - SendImMessageResponses, - unknown, - ThrowOnError - >({ +export const sendImMessage = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/im/messages', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * List active IM bot IDs */ -export const listImBots = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get({ +export const listImBots = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/im/bots', - ...options, - }); + ...options +}); /** * Upload a file */ -export const uploadFile = ( - options: Options, -): RequestResult => - (options.client ?? client).post({ +export const uploadFile = (options: Options): RequestResult => (options.client ?? client).post({ ...formDataBodySerializer, responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/files', ...options, headers: { - 'Content-Type': null, - ...options.headers, - }, - }); + 'Content-Type': null, + ...options.headers + } +}); /** * List Dashboard wallpaper assets */ -export const listAppearanceWallpapers = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListAppearanceWallpapersResponses, - unknown, - ThrowOnError - >({ +export const listAppearanceWallpapers = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/appearance/wallpapers', - ...options, - }); + ...options +}); /** * Upload a Dashboard wallpaper asset */ -export const uploadAppearanceWallpaper = ( - options: Options, -): RequestResult< - UploadAppearanceWallpaperResponses, - UploadAppearanceWallpaperErrors, - ThrowOnError -> => - (options.client ?? client).post< - UploadAppearanceWallpaperResponses, - UploadAppearanceWallpaperErrors, - ThrowOnError - >({ +export const uploadAppearanceWallpaper = (options: Options): RequestResult => (options.client ?? client).post({ ...formDataBodySerializer, responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/appearance/wallpapers', ...options, headers: { - 'Content-Type': null, - ...options.headers, - }, - }); + 'Content-Type': null, + ...options.headers + } +}); /** * Delete a Dashboard wallpaper asset */ -export const deleteAppearanceWallpaper = ( - options: Options, -): RequestResult< - DeleteAppearanceWallpaperResponses, - DeleteAppearanceWallpaperErrors, - ThrowOnError -> => - (options.client ?? client).delete< - DeleteAppearanceWallpaperResponses, - DeleteAppearanceWallpaperErrors, - ThrowOnError - >({ +export const deleteAppearanceWallpaper = (options: Options): RequestResult => (options.client ?? client).delete({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/appearance/wallpapers/{wallpaper_id}', - ...options, - }); + ...options +}); /** * Get a Dashboard wallpaper image */ -export const getAppearanceWallpaper = ( - options: Options, -): RequestResult< - GetAppearanceWallpaperResponses, - GetAppearanceWallpaperErrors, - ThrowOnError -> => - (options.client ?? client).get< - GetAppearanceWallpaperResponses, - GetAppearanceWallpaperErrors, - ThrowOnError - >({ +export const getAppearanceWallpaper = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'blob', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/appearance/wallpapers/{wallpaper_id}', - ...options, - }); + ...options +}); /** * Get a Dashboard wallpaper thumbnail */ -export const getAppearanceWallpaperThumbnail = < - ThrowOnError extends boolean = false, ->( - options: Options, -): RequestResult< - GetAppearanceWallpaperThumbnailResponses, - GetAppearanceWallpaperThumbnailErrors, - ThrowOnError -> => - (options.client ?? client).get< - GetAppearanceWallpaperThumbnailResponses, - GetAppearanceWallpaperThumbnailErrors, - ThrowOnError - >({ +export const getAppearanceWallpaperThumbnail = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'blob', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/appearance/wallpapers/{wallpaper_id}/thumbnail', - ...options, - }); + ...options +}); /** * Download an uploaded file by attachment ID */ -export const downloadOpenApiFile = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - DownloadOpenApiFileResponses, - unknown, - ThrowOnError - >({ +export const downloadOpenApiFile = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'blob', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/file', - ...options, - }); + ...options +}); /** * Upload a file */ -export const uploadOpenApiFile = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - UploadOpenApiFileResponses, - unknown, - ThrowOnError - >({ +export const uploadOpenApiFile = (options: Options): RequestResult => (options.client ?? client).post({ ...formDataBodySerializer, responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/file', ...options, headers: { - 'Content-Type': null, - ...options.headers, - }, - }); + 'Content-Type': null, + ...options.headers + } +}); /** * Get an uploaded file by stored filename */ -export const getFileByName = ( - options: Options, -): RequestResult => - (options.client ?? client).get( - { - responseType: 'blob', - security: [{ name: 'X-API-Key', type: 'apiKey' }], - url: '/api/v1/files/content', - ...options, - }, - ); +export const getFileByName = (options: Options): RequestResult => (options.client ?? client).get({ + responseType: 'blob', + security: [{ name: 'X-API-Key', type: 'apiKey' }], + url: '/api/v1/files/content', + ...options +}); /** * Get a tokenized public file */ -export const getTokenFile = ( - options: Options, -): RequestResult => - (options.client ?? client).get({ +export const getTokenFile = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'blob', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/files/tokens/{file_token}', - ...options, - }); + ...options +}); /** * Delete an attachment */ -export const deleteAttachment = ( - options: Options, -): RequestResult => - (options.client ?? client).delete< - DeleteAttachmentResponses, - unknown, - ThrowOnError - >({ +export const deleteAttachment = (options: Options): RequestResult => (options.client ?? client).delete({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/files/{attachment_id}', - ...options, - }); + ...options +}); /** * Download attachment content */ -export const getAttachment = ( - options: Options, -): RequestResult => - (options.client ?? client).get( - { - responseType: 'blob', - security: [{ name: 'X-API-Key', type: 'apiKey' }], - url: '/api/v1/files/{attachment_id}', - ...options, - }, - ); +export const getAttachment = (options: Options): RequestResult => (options.client ?? client).get({ + responseType: 'blob', + security: [{ name: 'X-API-Key', type: 'apiKey' }], + url: '/api/v1/files/{attachment_id}', + ...options +}); /** * Download attachment content */ -export const downloadAttachment = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - DownloadAttachmentResponses, - unknown, - ThrowOnError - >({ +export const downloadAttachment = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'blob', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/files/{attachment_id}/content', - ...options, - }); + ...options +}); /** * Get the Dashboard extension Page and Action catalog */ -export const getPluginDashboardCatalog = ( - options: Options, -): RequestResult< - GetPluginDashboardCatalogResponses, - GetPluginDashboardCatalogErrors, - ThrowOnError -> => - (options.client ?? client).get< - GetPluginDashboardCatalogResponses, - GetPluginDashboardCatalogErrors, - ThrowOnError - >({ - responseType: 'json', - security: [ - { - key: 'DashboardBearerAuth', - scheme: 'bearer', - type: 'http', - }, - { - in: 'cookie', - name: 'astrbot_dashboard_jwt', - type: 'apiKey', - }, - ], +export const getPluginDashboardCatalog = (options: Options): RequestResult => (options.client ?? client).get({ + responseType: 'json', + security: [{ + key: 'DashboardBearerAuth', + scheme: 'bearer', + type: 'http' + }, { + in: 'cookie', + name: 'astrbot_dashboard_jwt', + type: 'apiKey' + }], url: '/api/v1/plugins/{extension_id}/dashboard', - ...options, - }); + ...options +}); /** * Create an authenticated Dashboard extension Page session */ -export const createPluginDashboardPageSession = < - ThrowOnError extends boolean = false, ->( - options: Options, -): RequestResult< - CreatePluginDashboardPageSessionResponses, - CreatePluginDashboardPageSessionErrors, - ThrowOnError -> => - (options.client ?? client).post< - CreatePluginDashboardPageSessionResponses, - CreatePluginDashboardPageSessionErrors, - ThrowOnError - >({ - responseType: 'json', - security: [ - { - key: 'DashboardBearerAuth', - scheme: 'bearer', - type: 'http', - }, - { - in: 'cookie', - name: 'astrbot_dashboard_jwt', - type: 'apiKey', - }, - ], +export const createPluginDashboardPageSession = (options: Options): RequestResult => (options.client ?? client).post({ + responseType: 'json', + security: [{ + key: 'DashboardBearerAuth', + scheme: 'bearer', + type: 'http' + }, { + in: 'cookie', + name: 'astrbot_dashboard_jwt', + type: 'apiKey' + }], url: '/api/v1/plugins/{extension_id}/dashboard/pages/{page_id}/session', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Invoke a Dashboard extension JSON Action */ -export const invokePluginDashboardAction = < - ThrowOnError extends boolean = false, ->( - options: Options, -): RequestResult< - InvokePluginDashboardActionResponses, - InvokePluginDashboardActionErrors, - ThrowOnError -> => - (options.client ?? client).post< - InvokePluginDashboardActionResponses, - InvokePluginDashboardActionErrors, - ThrowOnError - >({ - responseType: 'json', - security: [ - { - key: 'DashboardBearerAuth', - scheme: 'bearer', - type: 'http', - }, - { - in: 'cookie', - name: 'astrbot_dashboard_jwt', - type: 'apiKey', - }, - ], +export const invokePluginDashboardAction = (options: Options): RequestResult => (options.client ?? client).post({ + responseType: 'json', + security: [{ + key: 'DashboardBearerAuth', + scheme: 'bearer', + type: 'http' + }, { + in: 'cookie', + name: 'astrbot_dashboard_jwt', + type: 'apiKey' + }], url: '/api/v1/plugins/{extension_id}/dashboard/actions/{action_id}', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Invoke a Dashboard extension upload Action */ -export const invokePluginDashboardUpload = < - ThrowOnError extends boolean = false, ->( - options: Options, -): RequestResult< - InvokePluginDashboardUploadResponses, - InvokePluginDashboardUploadErrors, - ThrowOnError -> => - (options.client ?? client).post< - InvokePluginDashboardUploadResponses, - InvokePluginDashboardUploadErrors, - ThrowOnError - >({ +export const invokePluginDashboardUpload = (options: Options): RequestResult => (options.client ?? client).post({ ...formDataBodySerializer, responseType: 'json', - security: [ - { - key: 'DashboardBearerAuth', - scheme: 'bearer', - type: 'http', - }, - { - in: 'cookie', - name: 'astrbot_dashboard_jwt', - type: 'apiKey', - }, - ], + security: [{ + key: 'DashboardBearerAuth', + scheme: 'bearer', + type: 'http' + }, { + in: 'cookie', + name: 'astrbot_dashboard_jwt', + type: 'apiKey' + }], url: '/api/v1/plugins/{extension_id}/dashboard/uploads/{action_id}', ...options, headers: { - 'Content-Type': null, - ...options.headers, - }, - }); + 'Content-Type': null, + ...options.headers + } +}); /** * Invoke a Dashboard extension file Action and create a ticket */ -export const invokePluginDashboardFile = ( - options: Options, -): RequestResult< - InvokePluginDashboardFileResponses, - InvokePluginDashboardFileErrors, - ThrowOnError -> => - (options.client ?? client).post< - InvokePluginDashboardFileResponses, - InvokePluginDashboardFileErrors, - ThrowOnError - >({ - responseType: 'json', - security: [ - { - key: 'DashboardBearerAuth', - scheme: 'bearer', - type: 'http', - }, - { - in: 'cookie', - name: 'astrbot_dashboard_jwt', - type: 'apiKey', - }, - ], +export const invokePluginDashboardFile = (options: Options): RequestResult => (options.client ?? client).post({ + responseType: 'json', + security: [{ + key: 'DashboardBearerAuth', + scheme: 'bearer', + type: 'http' + }, { + in: 'cookie', + name: 'astrbot_dashboard_jwt', + type: 'apiKey' + }], url: '/api/v1/plugins/{extension_id}/dashboard/files/{action_id}', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * List installed plugins */ -export const listPlugins = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get({ +export const listPlugins = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/plugins', - ...options, - }); + ...options +}); /** * Uninstall a plugin */ -export const uninstallPlugin = ( - options: Options, -): RequestResult => - (options.client ?? client).delete< - UninstallPluginResponses, - unknown, - ThrowOnError - >({ +export const uninstallPlugin = (options: Options): RequestResult => (options.client ?? client).delete({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/plugins/{plugin_id}', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Get plugin details */ -export const getPlugin = ( - options: Options, -): RequestResult => - (options.client ?? client).get({ +export const getPlugin = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/plugins/{plugin_id}', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Get plugin configuration */ -export const getPluginConfig = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - GetPluginConfigResponses, - unknown, - ThrowOnError - >({ +export const getPluginConfig = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/plugins/{plugin_id}/config', - ...options, - }); + ...options +}); /** * Save plugin configuration */ -export const updatePluginConfig = ( - options: Options, -): RequestResult => - (options.client ?? client).put< - UpdatePluginConfigResponses, - unknown, - ThrowOnError - >({ +export const updatePluginConfig = (options: Options): RequestResult => (options.client ?? client).put({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/plugins/{plugin_id}/config', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Set plugin log level * * Set a live plugin's log level. Pass null to follow the global log level. */ -export const updatePluginLogLevel = ( - options: Options, -): RequestResult => - (options.client ?? client).put< - UpdatePluginLogLevelResponses, - unknown, - ThrowOnError - >({ +export const updatePluginLogLevel = (options: Options): RequestResult => (options.client ?? client).put({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/plugins/{plugin_id}/log-level', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Get plugin configuration schema */ -export const getPluginConfigSchema = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - GetPluginConfigSchemaResponses, - unknown, - ThrowOnError - >({ +export const getPluginConfigSchema = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/plugins/{plugin_id}/config/schema', - ...options, - }); + ...options +}); /** * List uploaded files for a plugin file configuration item */ -export const listPluginConfigFiles = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - ListPluginConfigFilesResponses, - unknown, - ThrowOnError - >({ +export const listPluginConfigFiles = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/plugins/{plugin_id}/config-files/{config_key}', - ...options, - }); + ...options +}); /** * Upload files for a plugin file configuration item */ -export const uploadPluginConfigFiles = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - UploadPluginConfigFilesResponses, - unknown, - ThrowOnError - >({ +export const uploadPluginConfigFiles = (options: Options): RequestResult => (options.client ?? client).post({ ...formDataBodySerializer, responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/plugins/{plugin_id}/config-files/{config_key}', ...options, headers: { - 'Content-Type': null, - ...options.headers, - }, - }); + 'Content-Type': null, + ...options.headers + } +}); /** * Delete a plugin file configuration upload */ -export const deletePluginConfigFile = ( - options: Options, -): RequestResult => - (options.client ?? client).delete< - DeletePluginConfigFileResponses, - unknown, - ThrowOnError - >({ +export const deletePluginConfigFile = (options: Options): RequestResult => (options.client ?? client).delete({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/plugins/{plugin_id}/config-files', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Get plugin README content */ -export const getPluginReadme = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - GetPluginReadmeResponses, - unknown, - ThrowOnError - >({ +export const getPluginReadme = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/plugins/{plugin_id}/readme', - ...options, - }); + ...options +}); /** * Get plugin CHANGELOG content */ -export const getPluginChangelog = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - GetPluginChangelogResponses, - unknown, - ThrowOnError - >({ +export const getPluginChangelog = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/plugins/{plugin_id}/changelog', - ...options, - }); + ...options +}); /** * Reload a plugin */ -export const reloadPlugin = ( - options: Options, -): RequestResult => - (options.client ?? client).post( - { - responseType: 'json', - security: [{ name: 'X-API-Key', type: 'apiKey' }], - url: '/api/v1/plugins/{plugin_id}/reload', - ...options, - }, - ); +export const reloadPlugin = (options: Options): RequestResult => (options.client ?? client).post({ + responseType: 'json', + security: [{ name: 'X-API-Key', type: 'apiKey' }], + url: '/api/v1/plugins/{plugin_id}/reload', + ...options +}); /** * Bind an installed plugin to a marketplace source */ -export const bindPluginSource = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - BindPluginSourceResponses, - unknown, - ThrowOnError - >({ +export const bindPluginSource = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/plugins/{plugin_id}/source', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Enable or disable a plugin */ -export const setPluginEnabled = ( - options: Options, -): RequestResult => - (options.client ?? client).patch< - SetPluginEnabledResponses, - unknown, - ThrowOnError - >({ +export const setPluginEnabled = (options: Options): RequestResult => (options.client ?? client).patch({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/plugins/{plugin_id}/enabled', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Update a plugin */ -export const updatePlugin = ( - options: Options, -): RequestResult => - (options.client ?? client).post( - { - responseType: 'json', - security: [{ name: 'X-API-Key', type: 'apiKey' }], - url: '/api/v1/plugins/{plugin_id}/update', - ...options, - headers: { +export const updatePlugin = (options: Options): RequestResult => (options.client ?? client).post({ + responseType: 'json', + security: [{ name: 'X-API-Key', type: 'apiKey' }], + url: '/api/v1/plugins/{plugin_id}/update', + ...options, + headers: { 'Content-Type': 'application/json', - ...options.headers, - }, - }, - ); + ...options.headers + } +}); /** * Update multiple plugins */ -export const updatePlugins = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - UpdatePluginsResponses, - unknown, - ThrowOnError - >({ +export const updatePlugins = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/plugins/update', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * List failed plugins and errors */ -export const listFailedPlugins = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListFailedPluginsResponses, - unknown, - ThrowOnError - >({ +export const listFailedPlugins = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/plugins/failed', - ...options, - }); + ...options +}); /** * Uninstall a failed plugin */ -export const uninstallFailedPlugin = ( - options: Options, -): RequestResult => - (options.client ?? client).delete< - UninstallFailedPluginResponses, - unknown, - ThrowOnError - >({ +export const uninstallFailedPlugin = (options: Options): RequestResult => (options.client ?? client).delete({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/plugins/failed/{plugin_id}', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Reload a failed plugin */ -export const reloadFailedPlugin = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - ReloadFailedPluginResponses, - unknown, - ThrowOnError - >({ +export const reloadFailedPlugin = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/plugins/failed/{plugin_id}/reload', - ...options, - }); + ...options +}); /** * Install a plugin from GitHub */ -export const installPluginFromGithub = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - InstallPluginFromGithubResponses, - unknown, - ThrowOnError - >({ +export const installPluginFromGithub = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/plugins/install/github', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Install a plugin from a downloadable ZIP URL */ -export const installPluginFromUrl = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - InstallPluginFromUrlResponses, - unknown, - ThrowOnError - >({ +export const installPluginFromUrl = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/plugins/install/url', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Install a plugin from an uploaded ZIP file */ -export const installPluginFromUpload = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - InstallPluginFromUploadResponses, - unknown, - ThrowOnError - >({ +export const installPluginFromUpload = (options: Options): RequestResult => (options.client ?? client).post({ ...formDataBodySerializer, responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/plugins/install/upload', ...options, headers: { - 'Content-Type': null, - ...options.headers, - }, - }); + 'Content-Type': null, + ...options.headers + } +}); /** * List plugin marketplace entries */ -export const listPluginMarket = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListPluginMarketResponses, - unknown, - ThrowOnError - >({ +export const listPluginMarket = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/plugins/market', - ...options, - }); + ...options +}); /** * List plugin marketplace categories */ -export const listPluginMarketCategories = < - ThrowOnError extends boolean = false, ->( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListPluginMarketCategoriesResponses, - unknown, - ThrowOnError - >({ +export const listPluginMarketCategories = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/plugins/market/categories', - ...options, - }); + ...options +}); /** * List plugin sources */ -export const listPluginSources = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListPluginSourcesResponses, - unknown, - ThrowOnError - >({ +export const listPluginSources = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/plugin-sources', - ...options, - }); + ...options +}); /** * Add a plugin source */ -export const createPluginSource = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - CreatePluginSourceResponses, - unknown, - ThrowOnError - >({ +export const createPluginSource = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/plugin-sources', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Replace plugin sources */ -export const replacePluginSources = ( - options: Options, -): RequestResult => - (options.client ?? client).put< - ReplacePluginSourcesResponses, - unknown, - ThrowOnError - >({ +export const replacePluginSources = (options: Options): RequestResult => (options.client ?? client).put({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/plugin-sources', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Delete a plugin source */ -export const deletePluginSource = ( - options: Options, -): RequestResult => - (options.client ?? client).delete< - DeletePluginSourceResponses, - unknown, - ThrowOnError - >({ +export const deletePluginSource = (options: Options): RequestResult => (options.client ?? client).delete({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/plugin-sources/{source_id}', - ...options, - }); + ...options +}); /** * List plugin commands */ -export const listCommands = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get( - { - responseType: 'json', - security: [{ name: 'X-API-Key', type: 'apiKey' }], - url: '/api/v1/commands', - ...options, - }, - ); +export const listCommands = (options?: Options): RequestResult => (options?.client ?? client).get({ + responseType: 'json', + security: [{ name: 'X-API-Key', type: 'apiKey' }], + url: '/api/v1/commands', + ...options +}); /** * Update command enabled state, alias, or authorization action */ -export const updateCommand = ( - options: Options, -): RequestResult => - (options.client ?? client).patch< - UpdateCommandResponses, - unknown, - ThrowOnError - >({ +export const updateCommand = (options: Options): RequestResult => (options.client ?? client).patch({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/commands/{command_id}', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Enable or disable all built-in commands */ -export const bulkToggleBuiltinCommands = ( - options: Options, -): RequestResult => - (options.client ?? client).patch< - BulkToggleBuiltinCommandsResponses, - unknown, - ThrowOnError - >({ +export const bulkToggleBuiltinCommands = (options: Options): RequestResult => (options.client ?? client).patch({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/commands/builtin', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * List command conflicts */ -export const listCommandConflicts = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListCommandConflictsResponses, - unknown, - ThrowOnError - >({ +export const listCommandConflicts = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/commands/conflicts', - ...options, - }); + ...options +}); /** * List LLM tools */ -export const listTools = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get({ +export const listTools = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/tools', - ...options, - }); + ...options +}); /** * Enable or disable an LLM tool */ -export const setToolEnabled = ( - options: Options, -): RequestResult => - (options.client ?? client).patch< - SetToolEnabledResponses, - unknown, - ThrowOnError - >({ +export const setToolEnabled = (options: Options): RequestResult => (options.client ?? client).patch({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/tools/{tool_id}/enabled', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Enable or disable native parallel tool execution */ -export const setParallelEnabled = ( - options: Options, -): RequestResult => - (options.client ?? client).patch< - SetParallelEnabledResponses, - unknown, - ThrowOnError - >({ +export const setParallelEnabled = (options: Options): RequestResult => (options.client ?? client).patch({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/tools/parallel/enabled', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Enable or disable parallel execution for one tool */ -export const setToolParallel = ( - options: Options, -): RequestResult => - (options.client ?? client).patch< - SetToolParallelResponses, - unknown, - ThrowOnError - >({ +export const setToolParallel = (options: Options): RequestResult => (options.client ?? client).patch({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/tools/{tool_id}/parallel', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * List MCP servers */ -export const listMcpServers = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListMcpServersResponses, - unknown, - ThrowOnError - >({ +export const listMcpServers = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/mcp/servers', - ...options, - }); + ...options +}); /** * Add an MCP server */ -export const createMcpServer = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - CreateMcpServerResponses, - unknown, - ThrowOnError - >({ +export const createMcpServer = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/mcp/servers', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Delete an MCP server */ -export const deleteMcpServer = ( - options: Options, -): RequestResult => - (options.client ?? client).delete< - DeleteMcpServerResponses, - unknown, - ThrowOnError - >({ +export const deleteMcpServer = (options: Options): RequestResult => (options.client ?? client).delete({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/mcp/servers/{server_name}', - ...options, - }); + ...options +}); /** * Update an MCP server */ -export const updateMcpServer = ( - options: Options, -): RequestResult => - (options.client ?? client).put< - UpdateMcpServerResponses, - unknown, - ThrowOnError - >({ +export const updateMcpServer = (options: Options): RequestResult => (options.client ?? client).put({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/mcp/servers/{server_name}', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Enable or disable an MCP server */ -export const setMcpServerEnabled = ( - options: Options, -): RequestResult => - (options.client ?? client).patch< - SetMcpServerEnabledResponses, - unknown, - ThrowOnError - >({ +export const setMcpServerEnabled = (options: Options): RequestResult => (options.client ?? client).patch({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/mcp/servers/{server_name}/enabled', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Test an MCP server connection */ -export const testMcpServer = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - TestMcpServerResponses, - unknown, - ThrowOnError - >({ +export const testMcpServer = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/mcp/servers/{server_name}/test', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Get a connected MCP server catalog and status */ -export const getMcpCatalog = ( - options: Options, -): RequestResult => - (options.client ?? client).get( - { - responseType: 'json', - security: [{ name: 'X-API-Key', type: 'apiKey' }], - url: '/api/v1/mcp/servers/{server_name}/catalog', - ...options, - }, - ); +export const getMcpCatalog = (options: Options): RequestResult => (options.client ?? client).get({ + responseType: 'json', + security: [{ name: 'X-API-Key', type: 'apiKey' }], + url: '/api/v1/mcp/servers/{server_name}/catalog', + ...options +}); /** * List explicitly browsable MCP resources */ -export const listMcpResources = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - ListMcpResourcesResponses, - unknown, - ThrowOnError - >({ +export const listMcpResources = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/mcp/servers/{server_name}/resources', - ...options, - }); + ...options +}); /** * List MCP resource templates */ -export const listMcpResourceTemplates = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - ListMcpResourceTemplatesResponses, - unknown, - ThrowOnError - >({ +export const listMcpResourceTemplates = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/mcp/servers/{server_name}/resources/templates', - ...options, - }); + ...options +}); /** * Read an explicitly selected MCP resource */ -export const readMcpResource = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - ReadMcpResourceResponses, - unknown, - ThrowOnError - >({ +export const readMcpResource = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/mcp/servers/{server_name}/resources/read', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * List explicitly selectable MCP prompts */ -export const listMcpPrompts = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - ListMcpPromptsResponses, - unknown, - ThrowOnError - >({ +export const listMcpPrompts = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/mcp/servers/{server_name}/prompts', - ...options, - }); + ...options +}); /** * Get an explicitly selected MCP prompt */ -export const getMcpPrompt = ( - options: Options, -): RequestResult => - (options.client ?? client).post( - { - responseType: 'json', - security: [{ name: 'X-API-Key', type: 'apiKey' }], - url: '/api/v1/mcp/servers/{server_name}/prompts/{prompt_name}/get', - ...options, - headers: { +export const getMcpPrompt = (options: Options): RequestResult => (options.client ?? client).post({ + responseType: 'json', + security: [{ name: 'X-API-Key', type: 'apiKey' }], + url: '/api/v1/mcp/servers/{server_name}/prompts/{prompt_name}/get', + ...options, + headers: { 'Content-Type': 'application/json', - ...options.headers, - }, - }, - ); + ...options.headers + } +}); /** * Complete an MCP prompt or resource argument */ -export const completeMcp = ( - options: Options, -): RequestResult => - (options.client ?? client).post({ +export const completeMcp = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/mcp/servers/{server_name}/completion', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Get safe MCP OAuth status */ -export const getMcpOAuthStatus = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - GetMcpOAuthStatusResponses, - unknown, - ThrowOnError - >({ +export const getMcpOAuthStatus = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/mcp/servers/{server_name}/oauth/status', - ...options, - }); + ...options +}); /** * Start MCP OAuth authorization with PKCE */ -export const startMcpOAuth = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - StartMcpOAuthResponses, - unknown, - ThrowOnError - >({ +export const startMcpOAuth = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/mcp/servers/{server_name}/oauth/start', - ...options, - }); + ...options +}); /** * Revoke locally stored MCP OAuth credentials */ -export const revokeMcpOAuth = ( - options: Options, -): RequestResult => - (options.client ?? client).delete< - RevokeMcpOAuthResponses, - unknown, - ThrowOnError - >({ +export const revokeMcpOAuth = (options: Options): RequestResult => (options.client ?? client).delete({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/mcp/servers/{server_name}/oauth', - ...options, - }); + ...options +}); /** * Complete MCP OAuth callback */ -export const completeMcpOAuthCallback = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get({ +export const completeMcpOAuthCallback = (options?: Options): RequestResult => (options?.client ?? client).get({ security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/mcp/oauth/callback', - ...options, - }); + ...options +}); /** * Sync MCP servers from ModelScope */ -export const syncModelScopeMcpServers = ( - options?: Options, -): RequestResult => - (options?.client ?? client).post< - SyncModelScopeMcpServersResponses, - unknown, - ThrowOnError - >({ +export const syncModelScopeMcpServers = (options?: Options): RequestResult => (options?.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/mcp/providers/modelscope/sync', ...options, headers: { - 'Content-Type': 'application/json', - ...options?.headers, - }, - }); + 'Content-Type': 'application/json', + ...options?.headers + } +}); /** * List skills */ -export const listSkills = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get({ +export const listSkills = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/skills', - ...options, - }); + ...options +}); /** * Upload or import a skill archive */ -export const uploadSkill = ( - options: Options, -): RequestResult => - (options.client ?? client).post({ +export const uploadSkill = (options: Options): RequestResult => (options.client ?? client).post({ ...formDataBodySerializer, responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/skills', ...options, headers: { - 'Content-Type': null, - ...options.headers, - }, - }); + 'Content-Type': null, + ...options.headers + } +}); /** * Upload multiple skill archives */ -export const uploadSkillsBatch = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - UploadSkillsBatchResponses, - unknown, - ThrowOnError - >({ +export const uploadSkillsBatch = (options: Options): RequestResult => (options.client ?? client).post({ ...formDataBodySerializer, responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/skills/batch', ...options, headers: { - 'Content-Type': null, - ...options.headers, - }, - }); + 'Content-Type': null, + ...options.headers + } +}); /** * Delete a skill */ -export const deleteSkill = ( - options: Options, -): RequestResult => - (options.client ?? client).delete< - DeleteSkillResponses, - unknown, - ThrowOnError - >({ +export const deleteSkill = (options: Options): RequestResult => (options.client ?? client).delete({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/skills/{skill_name}', - ...options, - }); + ...options +}); /** * Update skill active state */ -export const updateSkill = ( - options: Options, -): RequestResult => - (options.client ?? client).patch( - { - responseType: 'json', - security: [{ name: 'X-API-Key', type: 'apiKey' }], - url: '/api/v1/skills/{skill_name}', - ...options, - headers: { +export const updateSkill = (options: Options): RequestResult => (options.client ?? client).patch({ + responseType: 'json', + security: [{ name: 'X-API-Key', type: 'apiKey' }], + url: '/api/v1/skills/{skill_name}', + ...options, + headers: { 'Content-Type': 'application/json', - ...options.headers, - }, - }, - ); + ...options.headers + } +}); /** * Download a skill archive */ -export const downloadSkill = ( - options: Options, -): RequestResult => - (options.client ?? client).get( - { - responseType: 'blob', - security: [{ name: 'X-API-Key', type: 'apiKey' }], - url: '/api/v1/skills/{skill_name}/archive', - ...options, - }, - ); +export const downloadSkill = (options: Options): RequestResult => (options.client ?? client).get({ + responseType: 'blob', + security: [{ name: 'X-API-Key', type: 'apiKey' }], + url: '/api/v1/skills/{skill_name}/archive', + ...options +}); /** * List files in a skill */ -export const listSkillFiles = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - ListSkillFilesResponses, - unknown, - ThrowOnError - >({ +export const listSkillFiles = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/skills/{skill_name}/files', - ...options, - }); + ...options +}); /** * Get skill file content */ -export const getSkillFile = ( - options: Options, -): RequestResult => - (options.client ?? client).get({ +export const getSkillFile = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/skills/{skill_name}/files/{file_path}', - ...options, - }); + ...options +}); /** * Update skill file content */ -export const updateSkillFile = ( - options: Options, -): RequestResult => - (options.client ?? client).put< - UpdateSkillFileResponses, - unknown, - ThrowOnError - >({ +export const updateSkillFile = (options: Options): RequestResult => (options.client ?? client).put({ bodySerializer: null, responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/skills/{skill_name}/files/{file_path}', ...options, headers: { - 'Content-Type': 'text/plain', - ...options.headers, - }, - }); + 'Content-Type': 'text/plain', + ...options.headers + } +}); /** * List Shipyard Neo skill candidates */ -export const listNeoSkillCandidates = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListNeoSkillCandidatesResponses, - unknown, - ThrowOnError - >({ +export const listNeoSkillCandidates = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/skills/neo/candidates', - ...options, - }); + ...options +}); /** * List Shipyard Neo skill releases */ -export const listNeoSkillReleases = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListNeoSkillReleasesResponses, - unknown, - ThrowOnError - >({ +export const listNeoSkillReleases = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/skills/neo/releases', - ...options, - }); + ...options +}); /** * Get a Shipyard Neo skill payload */ -export const getNeoSkillPayload = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - GetNeoSkillPayloadResponses, - unknown, - ThrowOnError - >({ +export const getNeoSkillPayload = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/skills/neo/payload', - ...options, - }); + ...options +}); /** * Evaluate a Shipyard Neo skill candidate */ -export const evaluateNeoSkillCandidate = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - EvaluateNeoSkillCandidateResponses, - unknown, - ThrowOnError - >({ +export const evaluateNeoSkillCandidate = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/skills/neo/evaluate', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Promote a Shipyard Neo skill candidate */ -export const promoteNeoSkillCandidate = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - PromoteNeoSkillCandidateResponses, - unknown, - ThrowOnError - >({ +export const promoteNeoSkillCandidate = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/skills/neo/promote', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Roll back a Shipyard Neo skill release */ -export const rollbackNeoSkillRelease = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - RollbackNeoSkillReleaseResponses, - unknown, - ThrowOnError - >({ +export const rollbackNeoSkillRelease = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/skills/neo/rollback', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Sync a Shipyard Neo skill release */ -export const syncNeoSkillRelease = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - SyncNeoSkillReleaseResponses, - unknown, - ThrowOnError - >({ +export const syncNeoSkillRelease = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/skills/neo/sync', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Delete a Shipyard Neo skill candidate */ -export const deleteNeoSkillCandidate = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - DeleteNeoSkillCandidateResponses, - unknown, - ThrowOnError - >({ +export const deleteNeoSkillCandidate = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/skills/neo/candidates/delete', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Delete a Shipyard Neo skill release */ -export const deleteNeoSkillRelease = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - DeleteNeoSkillReleaseResponses, - unknown, - ThrowOnError - >({ +export const deleteNeoSkillRelease = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/skills/neo/releases/delete', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * List knowledge bases */ -export const listKnowledgeBases = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListKnowledgeBasesResponses, - unknown, - ThrowOnError - >({ +export const listKnowledgeBases = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/knowledge-bases', - ...options, - }); + ...options +}); /** * Create a knowledge base */ -export const createKnowledgeBase = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - CreateKnowledgeBaseResponses, - unknown, - ThrowOnError - >({ +export const createKnowledgeBase = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/knowledge-bases', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Delete a knowledge base */ -export const deleteKnowledgeBase = ( - options: Options, -): RequestResult => - (options.client ?? client).delete< - DeleteKnowledgeBaseResponses, - unknown, - ThrowOnError - >({ +export const deleteKnowledgeBase = (options: Options): RequestResult => (options.client ?? client).delete({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/knowledge-bases/{kb_id}', - ...options, - }); + ...options +}); /** * Get a knowledge base */ -export const getKnowledgeBase = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - GetKnowledgeBaseResponses, - unknown, - ThrowOnError - >({ +export const getKnowledgeBase = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/knowledge-bases/{kb_id}', - ...options, - }); + ...options +}); /** * Update a knowledge base */ -export const updateKnowledgeBase = ( - options: Options, -): RequestResult => - (options.client ?? client).put< - UpdateKnowledgeBaseResponses, - unknown, - ThrowOnError - >({ +export const updateKnowledgeBase = (options: Options): RequestResult => (options.client ?? client).put({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/knowledge-bases/{kb_id}', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Get knowledge base stats */ -export const getKnowledgeBaseStats = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - GetKnowledgeBaseStatsResponses, - unknown, - ThrowOnError - >({ +export const getKnowledgeBaseStats = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/knowledge-bases/{kb_id}/stats', - ...options, - }); + ...options +}); /** * List knowledge base documents */ -export const listKnowledgeDocuments = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - ListKnowledgeDocumentsResponses, - unknown, - ThrowOnError - >({ +export const listKnowledgeDocuments = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/knowledge-bases/{kb_id}/documents', - ...options, - }); + ...options +}); /** * Upload a document to a knowledge base */ -export const uploadKnowledgeDocument = ( - options: Options, -): RequestResult< - UploadKnowledgeDocumentResponses, - UploadKnowledgeDocumentErrors, - ThrowOnError -> => - (options.client ?? client).post< - UploadKnowledgeDocumentResponses, - UploadKnowledgeDocumentErrors, - ThrowOnError - >({ +export const uploadKnowledgeDocument = (options: Options): RequestResult => (options.client ?? client).post({ ...formDataBodySerializer, responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/knowledge-bases/{kb_id}/documents', ...options, headers: { - 'Content-Type': null, - ...options.headers, - }, - }); + 'Content-Type': null, + ...options.headers + } +}); /** * Import documents already available on the server */ -export const importKnowledgeDocuments = ( - options: Options, -): RequestResult< - ImportKnowledgeDocumentsResponses, - ImportKnowledgeDocumentsErrors, - ThrowOnError -> => - (options.client ?? client).post< - ImportKnowledgeDocumentsResponses, - ImportKnowledgeDocumentsErrors, - ThrowOnError - >({ +export const importKnowledgeDocuments = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/knowledge-bases/{kb_id}/documents/import', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Import a document from URL */ -export const importKnowledgeDocumentFromUrl = < - ThrowOnError extends boolean = false, ->( - options: Options, -): RequestResult< - ImportKnowledgeDocumentFromUrlResponses, - ImportKnowledgeDocumentFromUrlErrors, - ThrowOnError -> => - (options.client ?? client).post< - ImportKnowledgeDocumentFromUrlResponses, - ImportKnowledgeDocumentFromUrlErrors, - ThrowOnError - >({ +export const importKnowledgeDocumentFromUrl = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/knowledge-bases/{kb_id}/documents/import-url', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Delete a knowledge base document */ -export const deleteKnowledgeDocument = ( - options: Options, -): RequestResult => - (options.client ?? client).delete< - DeleteKnowledgeDocumentResponses, - unknown, - ThrowOnError - >({ +export const deleteKnowledgeDocument = (options: Options): RequestResult => (options.client ?? client).delete({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/knowledge-bases/{kb_id}/documents/{document_id}', - ...options, - }); + ...options +}); /** * Get a knowledge base document */ -export const getKnowledgeDocument = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - GetKnowledgeDocumentResponses, - unknown, - ThrowOnError - >({ +export const getKnowledgeDocument = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/knowledge-bases/{kb_id}/documents/{document_id}', - ...options, - }); + ...options +}); /** * Reindex a knowledge base document from stored source bytes */ -export const reindexKnowledgeDocument = ( - options: Options, -): RequestResult< - ReindexKnowledgeDocumentResponses, - ReindexKnowledgeDocumentErrors, - ThrowOnError -> => - (options.client ?? client).post< - ReindexKnowledgeDocumentResponses, - ReindexKnowledgeDocumentErrors, - ThrowOnError - >({ +export const reindexKnowledgeDocument = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/knowledge-bases/{kb_id}/documents/{document_id}/reindex', - ...options, - }); + ...options +}); /** * List document chunks */ -export const listKnowledgeChunks = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - ListKnowledgeChunksResponses, - unknown, - ThrowOnError - >({ +export const listKnowledgeChunks = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/knowledge-bases/{kb_id}/chunks', - ...options, - }); + ...options +}); /** * Delete a document chunk */ -export const deleteKnowledgeChunk = ( - options: Options, -): RequestResult => - (options.client ?? client).delete< - DeleteKnowledgeChunkResponses, - unknown, - ThrowOnError - >({ +export const deleteKnowledgeChunk = (options: Options): RequestResult => (options.client ?? client).delete({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/knowledge-bases/{kb_id}/chunks/{chunk_id}', - ...options, - }); + ...options +}); /** * Retrieve knowledge base chunks */ -export const retrieveKnowledgeBase = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - RetrieveKnowledgeBaseResponses, - unknown, - ThrowOnError - >({ +export const retrieveKnowledgeBase = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/knowledge-bases/{kb_id}/retrieve', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Get persisted knowledge base task state * * Returns pending, processing, completed, failed, or interrupted state. Active work from a prior process is reported as interrupted and is not resumed. */ -export const getKnowledgeTask = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - GetKnowledgeTaskResponses, - unknown, - ThrowOnError - >({ +export const getKnowledgeTask = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/knowledge-bases/tasks/{task_id}', - ...options, - }); + ...options +}); /** * List long-term memory facts */ -export const listMemoryFacts = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListMemoryFactsResponses, - unknown, - ThrowOnError - >({ +export const listMemoryFacts = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/memory/facts', - ...options, - }); + ...options +}); /** * Create a long-term memory fact */ -export const createMemoryFact = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - CreateMemoryFactResponses, - unknown, - ThrowOnError - >({ +export const createMemoryFact = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/memory/facts', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Get a memory fact with operation logs */ -export const getMemoryFact = ( - options: Options, -): RequestResult => - (options.client ?? client).get( - { - responseType: 'json', - security: [{ name: 'X-API-Key', type: 'apiKey' }], - url: '/api/v1/memory/facts/{fact_id}', - ...options, - }, - ); +export const getMemoryFact = (options: Options): RequestResult => (options.client ?? client).get({ + responseType: 'json', + security: [{ name: 'X-API-Key', type: 'apiKey' }], + url: '/api/v1/memory/facts/{fact_id}', + ...options +}); /** * Update editable memory fact fields */ -export const updateMemoryFact = ( - options: Options, -): RequestResult => - (options.client ?? client).patch< - UpdateMemoryFactResponses, - unknown, - ThrowOnError - >({ +export const updateMemoryFact = (options: Options): RequestResult => (options.client ?? client).patch({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/memory/facts/{fact_id}', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Soft-delete a memory fact */ -export const deleteMemoryFact = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - DeleteMemoryFactResponses, - unknown, - ThrowOnError - >({ +export const deleteMemoryFact = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/memory/facts/{fact_id}/delete', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Restore a soft-deleted memory fact */ -export const restoreMemoryFact = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - RestoreMemoryFactResponses, - unknown, - ThrowOnError - >({ +export const restoreMemoryFact = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/memory/facts/{fact_id}/restore', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * List aggregated memory profiles */ -export const listMemoryProfiles = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListMemoryProfilesResponses, - unknown, - ThrowOnError - >({ +export const listMemoryProfiles = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/memory/profiles', - ...options, - }); + ...options +}); /** * Refresh a memory profile asynchronously */ -export const refreshMemoryProfile = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - RefreshMemoryProfileResponses, - unknown, - ThrowOnError - >({ +export const refreshMemoryProfile = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/memory/profiles/{person_id}/refresh', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * List memory operation audit logs */ -export const listMemoryOperations = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListMemoryOperationsResponses, - unknown, - ThrowOnError - >({ +export const listMemoryOperations = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/memory/operations', - ...options, - }); + ...options +}); /** * Get memory subsystem stats */ -export const getMemoryStats = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - GetMemoryStatsResponses, - unknown, - ThrowOnError - >({ +export const getMemoryStats = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/memory/stats', - ...options, - }); + ...options +}); /** * Get persona folder tree */ -export const getPersonaTree = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - GetPersonaTreeResponses, - unknown, - ThrowOnError - >({ +export const getPersonaTree = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/personas/tree', - ...options, - }); + ...options +}); /** * List personas */ -export const listPersonas = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get( - { - responseType: 'json', - security: [{ name: 'X-API-Key', type: 'apiKey' }], - url: '/api/v1/personas', - ...options, - }, - ); +export const listPersonas = (options?: Options): RequestResult => (options?.client ?? client).get({ + responseType: 'json', + security: [{ name: 'X-API-Key', type: 'apiKey' }], + url: '/api/v1/personas', + ...options +}); /** * Create a persona */ -export const createPersona = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - CreatePersonaResponses, - unknown, - ThrowOnError - >({ +export const createPersona = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/personas', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Delete a persona */ -export const deletePersona = ( - options: Options, -): RequestResult => - (options.client ?? client).delete< - DeletePersonaResponses, - unknown, - ThrowOnError - >({ +export const deletePersona = (options: Options): RequestResult => (options.client ?? client).delete({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/personas/{persona_id}', - ...options, - }); + ...options +}); /** * Get a persona */ -export const getPersona = ( - options: Options, -): RequestResult => - (options.client ?? client).get({ +export const getPersona = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/personas/{persona_id}', - ...options, - }); + ...options +}); /** * Update a persona */ -export const updatePersona = ( - options: Options, -): RequestResult => - (options.client ?? client).put( - { - responseType: 'json', - security: [{ name: 'X-API-Key', type: 'apiKey' }], - url: '/api/v1/personas/{persona_id}', - ...options, - headers: { +export const updatePersona = (options: Options): RequestResult => (options.client ?? client).put({ + responseType: 'json', + security: [{ name: 'X-API-Key', type: 'apiKey' }], + url: '/api/v1/personas/{persona_id}', + ...options, + headers: { 'Content-Type': 'application/json', - ...options.headers, - }, - }, - ); + ...options.headers + } +}); /** * List persona folders */ -export const listPersonaFolders = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListPersonaFoldersResponses, - unknown, - ThrowOnError - >({ +export const listPersonaFolders = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/persona-folders', - ...options, - }); + ...options +}); /** * Create a persona folder */ -export const createPersonaFolder = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - CreatePersonaFolderResponses, - unknown, - ThrowOnError - >({ +export const createPersonaFolder = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/persona-folders', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Delete a persona folder */ -export const deletePersonaFolder = ( - options: Options, -): RequestResult => - (options.client ?? client).delete< - DeletePersonaFolderResponses, - unknown, - ThrowOnError - >({ +export const deletePersonaFolder = (options: Options): RequestResult => (options.client ?? client).delete({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/persona-folders/{folder_id}', - ...options, - }); + ...options +}); /** * Update a persona folder */ -export const updatePersonaFolder = ( - options: Options, -): RequestResult => - (options.client ?? client).put< - UpdatePersonaFolderResponses, - unknown, - ThrowOnError - >({ +export const updatePersonaFolder = (options: Options): RequestResult => (options.client ?? client).put({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/persona-folders/{folder_id}', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Move a persona or folder */ -export const movePersonaItem = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - MovePersonaItemResponses, - unknown, - ThrowOnError - >({ +export const movePersonaItem = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/personas/move', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Reorder personas or folders */ -export const reorderPersonaItems = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - ReorderPersonaItemsResponses, - unknown, - ThrowOnError - >({ +export const reorderPersonaItems = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/personas/reorder', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * List active UMOs and session status */ -export const listSessions = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get( - { - responseType: 'json', - security: [{ name: 'X-API-Key', type: 'apiKey' }], - url: '/api/v1/sessions', - ...options, - }, - ); +export const listSessions = (options?: Options): RequestResult => (options?.client ?? client).get({ + responseType: 'json', + security: [{ name: 'X-API-Key', type: 'apiKey' }], + url: '/api/v1/sessions', + ...options +}); /** * List active and known UMOs */ -export const listActiveUmos = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListActiveUmosResponses, - unknown, - ThrowOnError - >({ +export const listActiveUmos = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/sessions/active-umos', - ...options, - }); + ...options +}); /** * List session rules */ -export const listSessionRules = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListSessionRulesResponses, - unknown, - ThrowOnError - >({ +export const listSessionRules = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/sessions/rules', - ...options, - }); + ...options +}); /** * Update or create a session rule */ -export const upsertSessionRule = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - UpsertSessionRuleResponses, - unknown, - ThrowOnError - >({ +export const upsertSessionRule = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/sessions/rules', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Delete one or more session rules */ -export const deleteSessionRules = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - DeleteSessionRulesResponses, - unknown, - ThrowOnError - >({ +export const deleteSessionRules = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/sessions/rules/delete', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Batch update session provider selection */ -export const batchUpdateSessionProvider = < - ThrowOnError extends boolean = false, ->( - options: Options, -): RequestResult => - (options.client ?? client).patch< - BatchUpdateSessionProviderResponses, - unknown, - ThrowOnError - >({ +export const batchUpdateSessionProvider = (options: Options): RequestResult => (options.client ?? client).patch({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/sessions/provider', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Batch update session service settings */ -export const batchUpdateSessionService = ( - options: Options, -): RequestResult => - (options.client ?? client).patch< - BatchUpdateSessionServiceResponses, - unknown, - ThrowOnError - >({ +export const batchUpdateSessionService = (options: Options): RequestResult => (options.client ?? client).patch({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/sessions/service', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * List session groups */ -export const listSessionGroups = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListSessionGroupsResponses, - unknown, - ThrowOnError - >({ +export const listSessionGroups = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/session-groups', - ...options, - }); + ...options +}); /** * Create a session group */ -export const createSessionGroup = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - CreateSessionGroupResponses, - unknown, - ThrowOnError - >({ +export const createSessionGroup = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/session-groups', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Delete a session group */ -export const deleteSessionGroup = ( - options: Options, -): RequestResult => - (options.client ?? client).delete< - DeleteSessionGroupResponses, - unknown, - ThrowOnError - >({ +export const deleteSessionGroup = (options: Options): RequestResult => (options.client ?? client).delete({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/session-groups/{group_id}', - ...options, - }); + ...options +}); /** * Update a session group */ -export const updateSessionGroup = ( - options: Options, -): RequestResult => - (options.client ?? client).put< - UpdateSessionGroupResponses, - unknown, - ThrowOnError - >({ +export const updateSessionGroup = (options: Options): RequestResult => (options.client ?? client).put({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/session-groups/{group_id}', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * List conversation history data */ -export const listConversations = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListConversationsResponses, - unknown, - ThrowOnError - >({ +export const listConversations = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/conversations', - ...options, - }); + ...options +}); /** * List available conversation filters */ -export const getConversationFilterOptions = < - ThrowOnError extends boolean = false, ->( - options?: Options, -): RequestResult< - GetConversationFilterOptionsResponses, - unknown, - ThrowOnError -> => - (options?.client ?? client).get< - GetConversationFilterOptionsResponses, - unknown, - ThrowOnError - >({ +export const getConversationFilterOptions = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/conversations/filter-options', - ...options, - }); + ...options +}); /** * Delete multiple conversations */ -export const batchDeleteConversations = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - BatchDeleteConversationsResponses, - unknown, - ThrowOnError - >({ +export const batchDeleteConversations = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/conversations/batch-delete', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Delete a conversation */ -export const deleteConversation = ( - options: Options, -): RequestResult => - (options.client ?? client).delete< - DeleteConversationResponses, - unknown, - ThrowOnError - >({ +export const deleteConversation = (options: Options): RequestResult => (options.client ?? client).delete({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/conversations/{conversation_id}', - ...options, - }); + ...options +}); /** * Get conversation details and messages */ -export const getConversation = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - GetConversationResponses, - unknown, - ThrowOnError - >({ +export const getConversation = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/conversations/{conversation_id}', - ...options, - }); + ...options +}); /** * Update conversation metadata */ -export const updateConversation = ( - options: Options, -): RequestResult => - (options.client ?? client).patch< - UpdateConversationResponses, - unknown, - ThrowOnError - >({ +export const updateConversation = (options: Options): RequestResult => (options.client ?? client).patch({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/conversations/{conversation_id}', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Replace conversation message history */ -export const replaceConversationMessages = < - ThrowOnError extends boolean = false, ->( - options: Options, -): RequestResult => - (options.client ?? client).put< - ReplaceConversationMessagesResponses, - unknown, - ThrowOnError - >({ +export const replaceConversationMessages = (options: Options): RequestResult => (options.client ?? client).put({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/conversations/{conversation_id}/messages', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Export conversations */ -export const exportConversations = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - ExportConversationsResponses, - unknown, - ThrowOnError - >({ +export const exportConversations = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'blob', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/conversations/export', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Get runtime statistics */ -export const getStats = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get({ +export const getStats = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/stats', - ...options, - }); + ...options +}); /** * Get provider token usage statistics */ -export const getProviderTokenStats = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - GetProviderTokenStatsResponses, - unknown, - ThrowOnError - >({ +export const getProviderTokenStats = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/stats/provider-tokens', - ...options, - }); + ...options +}); /** * Get AstrBot version and runtime information * * Runtime information is detected once at application startup. Restart AstrBot after installing sandbox dependencies to refresh it. */ -export const getVersion = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get({ +export const getVersion = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/stats/version', - ...options, - }); + ...options +}); /** * Get public WebUI and AstrBot versions */ -export const getPublicVersions = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - GetPublicVersionsResponses, - unknown, - ThrowOnError - >({ +export const getPublicVersions = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', url: '/api/v1/stats/versions', - ...options, - }); + ...options +}); /** * Get first-run dashboard notice content */ -export const getFirstNotice = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - GetFirstNoticeResponses, - unknown, - ThrowOnError - >({ +export const getFirstNotice = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/stats/first-notice', - ...options, - }); + ...options +}); /** * Test a GitHub proxy endpoint */ -export const testGhproxyConnection = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - TestGhproxyConnectionResponses, - unknown, - ThrowOnError - >({ +export const testGhproxyConnection = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/stats/ghproxy/test', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * List available changelog versions */ -export const listChangelogVersions = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListChangelogVersionsResponses, - unknown, - ThrowOnError - >({ +export const listChangelogVersions = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/changelogs', - ...options, - }); + ...options +}); /** * Get changelog content for a version */ -export const getChangelog = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - GetChangelogResponses, - GetChangelogErrors, - ThrowOnError - >({ +export const getChangelog = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/changelogs/{version}', - ...options, - }); + ...options +}); /** * Get runtime start time */ -export const getStartTime = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get( - { - responseType: 'json', - url: '/api/v1/stats/start-time', - ...options, - }, - ); +export const getStartTime = (options?: Options): RequestResult => (options?.client ?? client).get({ + responseType: 'json', + url: '/api/v1/stats/start-time', + ...options +}); /** * Get local text-to-image renderer statistics */ -export const getT2iRuntimeStats = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - GetT2iRuntimeStatsResponses, - unknown, - ThrowOnError - >({ +export const getT2iRuntimeStats = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/stats/t2i', - ...options, - }); + ...options +}); /** * Get storage status */ -export const getStorageStatus = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - GetStorageStatusResponses, - unknown, - ThrowOnError - >({ +export const getStorageStatus = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/stats/storage', - ...options, - }); + ...options +}); /** * Clean storage */ -export const cleanupStorage = ( - options?: Options, -): RequestResult => - (options?.client ?? client).post< - CleanupStorageResponses, - unknown, - ThrowOnError - >({ +export const cleanupStorage = (options?: Options): RequestResult => (options?.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/stats/storage/cleanup', ...options, headers: { - 'Content-Type': 'application/json', - ...options?.headers, - }, - }); + 'Content-Type': 'application/json', + ...options?.headers + } +}); /** * Restart AstrBot core */ -export const restartCore = ( - options?: Options, -): RequestResult => - (options?.client ?? client).post( - { - responseType: 'json', - security: [{ name: 'X-API-Key', type: 'apiKey' }], - url: '/api/v1/system/restart', - ...options, - }, - ); +export const restartCore = (options?: Options): RequestResult => (options?.client ?? client).post({ + responseType: 'json', + security: [{ name: 'X-API-Key', type: 'apiKey' }], + url: '/api/v1/system/restart', + ...options +}); /** * List backups */ -export const listBackups = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get({ +export const listBackups = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/backups', - ...options, - }); + ...options +}); /** * Export a backup */ -export const createBackup = ( - options?: Options, -): RequestResult => - (options?.client ?? client).post< - CreateBackupResponses, - unknown, - ThrowOnError - >({ +export const createBackup = (options?: Options): RequestResult => (options?.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/backups', ...options, headers: { - 'Content-Type': 'application/json', - ...options?.headers, - }, - }); + 'Content-Type': 'application/json', + ...options?.headers + } +}); /** * Upload a backup file */ -export const uploadBackup = ( - options: Options, -): RequestResult => - (options.client ?? client).post( - { - ...formDataBodySerializer, - responseType: 'json', - security: [{ name: 'X-API-Key', type: 'apiKey' }], - url: '/api/v1/backups/upload', - ...options, - headers: { +export const uploadBackup = (options: Options): RequestResult => (options.client ?? client).post({ + ...formDataBodySerializer, + responseType: 'json', + security: [{ name: 'X-API-Key', type: 'apiKey' }], + url: '/api/v1/backups/upload', + ...options, + headers: { 'Content-Type': null, - ...options.headers, - }, - }, - ); + ...options.headers + } +}); /** * Initialize chunked backup upload */ -export const initBackupUpload = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - InitBackupUploadResponses, - unknown, - ThrowOnError - >({ +export const initBackupUpload = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/backups/upload/init', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Upload a backup chunk */ -export const uploadBackupChunk = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - UploadBackupChunkResponses, - unknown, - ThrowOnError - >({ +export const uploadBackupChunk = (options: Options): RequestResult => (options.client ?? client).post({ ...formDataBodySerializer, responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/backups/upload/chunk', ...options, headers: { - 'Content-Type': null, - ...options.headers, - }, - }); + 'Content-Type': null, + ...options.headers + } +}); /** * Complete chunked backup upload */ -export const completeBackupUpload = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - CompleteBackupUploadResponses, - unknown, - ThrowOnError - >({ +export const completeBackupUpload = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/backups/upload/complete', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Abort chunked backup upload */ -export const abortBackupUpload = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - AbortBackupUploadResponses, - unknown, - ThrowOnError - >({ +export const abortBackupUpload = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/backups/upload/abort', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Get backup task progress */ -export const getBackupProgress = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - GetBackupProgressResponses, - unknown, - ThrowOnError - >({ +export const getBackupProgress = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/backups/tasks/{task_id}', - ...options, - }); + ...options +}); /** * Delete a backup */ -export const deleteBackup = ( - options: Options, -): RequestResult => - (options.client ?? client).delete< - DeleteBackupResponses, - unknown, - ThrowOnError - >({ +export const deleteBackup = (options: Options): RequestResult => (options.client ?? client).delete({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/backups/{filename}', - ...options, - }); + ...options +}); /** * Download a backup */ -export const downloadBackup = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - DownloadBackupResponses, - unknown, - ThrowOnError - >({ +export const downloadBackup = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'blob', - security: [ - { - key: 'DashboardBearerAuth', - scheme: 'bearer', - type: 'http', - }, - { - in: 'cookie', - name: 'astrbot_dashboard_jwt', - type: 'apiKey', - }, - ], + security: [{ + key: 'DashboardBearerAuth', + scheme: 'bearer', + type: 'http' + }, { + in: 'cookie', + name: 'astrbot_dashboard_jwt', + type: 'apiKey' + }], url: '/api/v1/backups/{filename}', - ...options, - }); + ...options +}); /** * Rename a backup */ -export const renameBackup = ( - options: Options, -): RequestResult => - (options.client ?? client).patch< - RenameBackupResponses, - unknown, - ThrowOnError - >({ +export const renameBackup = (options: Options): RequestResult => (options.client ?? client).patch({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/backups/{filename}', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Check a backup before import */ -export const checkBackup = ( - options: Options, -): RequestResult => - (options.client ?? client).post({ +export const checkBackup = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/backups/{filename}/check', - ...options, - }); + ...options +}); /** * Import a backup */ -export const importBackup = ( - options: Options, -): RequestResult => - (options.client ?? client).post( - { - responseType: 'json', - security: [{ name: 'X-API-Key', type: 'apiKey' }], - url: '/api/v1/backups/{filename}/import', - ...options, - headers: { +export const importBackup = (options: Options): RequestResult => (options.client ?? client).post({ + responseType: 'json', + security: [{ name: 'X-API-Key', type: 'apiKey' }], + url: '/api/v1/backups/{filename}/import', + ...options, + headers: { 'Content-Type': 'application/json', - ...options.headers, - }, - }, - ); + ...options.headers + } +}); /** * Install a Python package */ -export const installPipPackage = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - InstallPipPackageResponses, - unknown, - ThrowOnError - >({ +export const installPipPackage = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/pip/install', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * List cron jobs */ -export const listCronJobs = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get( - { - responseType: 'json', - security: [{ name: 'X-API-Key', type: 'apiKey' }], - url: '/api/v1/cron/jobs', - ...options, - }, - ); +export const listCronJobs = (options?: Options): RequestResult => (options?.client ?? client).get({ + responseType: 'json', + security: [{ name: 'X-API-Key', type: 'apiKey' }], + url: '/api/v1/cron/jobs', + ...options +}); /** * Create a cron job */ -export const createCronJob = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - CreateCronJobResponses, - unknown, - ThrowOnError - >({ +export const createCronJob = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/cron/jobs', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Delete a cron job */ -export const deleteCronJob = ( - options: Options, -): RequestResult => - (options.client ?? client).delete< - DeleteCronJobResponses, - unknown, - ThrowOnError - >({ +export const deleteCronJob = (options: Options): RequestResult => (options.client ?? client).delete({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/cron/jobs/{job_id}', - ...options, - }); + ...options +}); /** * Update a cron job */ -export const updateCronJob = ( - options: Options, -): RequestResult => - (options.client ?? client).patch< - UpdateCronJobResponses, - unknown, - ThrowOnError - >({ +export const updateCronJob = (options: Options): RequestResult => (options.client ?? client).patch({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/cron/jobs/{job_id}', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Run a cron job immediately */ -export const runCronJob = ( - options: Options, -): RequestResult => - (options.client ?? client).post({ +export const runCronJob = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/cron/jobs/{job_id}/run', - ...options, - }); + ...options +}); /** * Stream live logs */ -export const streamLiveLogs = ( - options?: Options, -): Promise> => - (options?.client ?? client).sse.get< - StreamLiveLogsResponses, - unknown, - ThrowOnError - >({ +export const streamLiveLogs = (options?: Options): Promise> => (options?.client ?? client).sse.get({ responseType: 'text', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/logs/live', - ...options, - }); + ...options +}); /** * Get log history */ -export const getLogHistory = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - GetLogHistoryResponses, - unknown, - ThrowOnError - >({ +export const getLogHistory = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/logs/history', - ...options, - }); + ...options +}); /** * Get trace settings */ -export const getTraceSettings = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - GetTraceSettingsResponses, - unknown, - ThrowOnError - >({ +export const getTraceSettings = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/trace/settings', - ...options, - }); + ...options +}); /** * Update trace settings */ -export const updateTraceSettings = ( - options: Options, -): RequestResult => - (options.client ?? client).put< - UpdateTraceSettingsResponses, - unknown, - ThrowOnError - >({ +export const updateTraceSettings = (options: Options): RequestResult => (options.client ?? client).put({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/trace/settings', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * List text-to-image templates */ -export const listT2iTemplates = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListT2iTemplatesResponses, - unknown, - ThrowOnError - >({ +export const listT2iTemplates = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/t2i/templates', - ...options, - }); + ...options +}); /** * Create a text-to-image template */ -export const createT2iTemplate = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - CreateT2iTemplateResponses, - unknown, - ThrowOnError - >({ +export const createT2iTemplate = (options: Options): RequestResult => (options.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/t2i/templates', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Get active text-to-image template */ -export const getActiveT2iTemplate = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - GetActiveT2iTemplateResponses, - unknown, - ThrowOnError - >({ +export const getActiveT2iTemplate = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/t2i/templates/active', - ...options, - }); + ...options +}); /** * Set active text-to-image template */ -export const setActiveT2iTemplate = ( - options: Options, -): RequestResult => - (options.client ?? client).put< - SetActiveT2iTemplateResponses, - unknown, - ThrowOnError - >({ +export const setActiveT2iTemplate = (options: Options): RequestResult => (options.client ?? client).put({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/t2i/templates/active', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Reset the default text-to-image template */ -export const resetDefaultT2iTemplate = ( - options?: Options, -): RequestResult => - (options?.client ?? client).post< - ResetDefaultT2iTemplateResponses, - unknown, - ThrowOnError - >({ +export const resetDefaultT2iTemplate = (options?: Options): RequestResult => (options?.client ?? client).post({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/t2i/templates/default/reset', - ...options, - }); + ...options +}); /** * Delete a text-to-image template */ -export const deleteT2iTemplate = ( - options: Options, -): RequestResult => - (options.client ?? client).delete< - DeleteT2iTemplateResponses, - unknown, - ThrowOnError - >({ +export const deleteT2iTemplate = (options: Options): RequestResult => (options.client ?? client).delete({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/t2i/templates/{name}', - ...options, - }); + ...options +}); /** * Get a text-to-image template */ -export const getT2iTemplate = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - GetT2iTemplateResponses, - unknown, - ThrowOnError - >({ +export const getT2iTemplate = (options: Options): RequestResult => (options.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/t2i/templates/{name}', - ...options, - }); + ...options +}); /** * Update a text-to-image template */ -export const updateT2iTemplate = ( - options: Options, -): RequestResult => - (options.client ?? client).put< - UpdateT2iTemplateResponses, - unknown, - ThrowOnError - >({ +export const updateT2iTemplate = (options: Options): RequestResult => (options.client ?? client).put({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/t2i/templates/{name}', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * Get subagent orchestrator configuration */ -export const getSubagentConfig = ( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - GetSubagentConfigResponses, - unknown, - ThrowOnError - >({ +export const getSubagentConfig = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/subagents/config', - ...options, - }); + ...options +}); /** * Update subagent orchestrator configuration */ -export const updateSubagentConfig = ( - options: Options, -): RequestResult => - (options.client ?? client).put< - UpdateSubagentConfigResponses, - unknown, - ThrowOnError - >({ +export const updateSubagentConfig = (options: Options): RequestResult => (options.client ?? client).put({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/subagents/config', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); /** * List tools available to subagents */ -export const listSubagentAvailableTools = < - ThrowOnError extends boolean = false, ->( - options?: Options, -): RequestResult => - (options?.client ?? client).get< - ListSubagentAvailableToolsResponses, - unknown, - ThrowOnError - >({ +export const listSubagentAvailableTools = (options?: Options): RequestResult => (options?.client ?? client).get({ responseType: 'json', security: [{ name: 'X-API-Key', type: 'apiKey' }], url: '/api/v1/subagents/available-tools', - ...options, - }); + ...options +}); /** * Verify a platform webhook */ -export const verifyPlatformWebhook = ( - options: Options, -): RequestResult => - (options.client ?? client).get< - VerifyPlatformWebhookResponses, - unknown, - ThrowOnError - >({ url: '/api/v1/webhooks/platforms/{webhook_uuid}', ...options }); +export const verifyPlatformWebhook = (options: Options): RequestResult => (options.client ?? client).get({ url: '/api/v1/webhooks/platforms/{webhook_uuid}', ...options }); /** * Receive a platform webhook */ -export const receivePlatformWebhook = ( - options: Options, -): RequestResult => - (options.client ?? client).post< - ReceivePlatformWebhookResponses, - unknown, - ThrowOnError - >({ +export const receivePlatformWebhook = (options: Options): RequestResult => (options.client ?? client).post({ url: '/api/v1/webhooks/platforms/{webhook_uuid}', ...options, headers: { - 'Content-Type': 'application/json', - ...options.headers, - }, - }); + 'Content-Type': 'application/json', + ...options.headers + } +}); diff --git a/dashboard/src/api/generated/openapi-v1/types.gen.ts b/dashboard/src/api/generated/openapi-v1/types.gen.ts index e5272eab21..3d48ae4201 100644 --- a/dashboard/src/api/generated/openapi-v1/types.gen.ts +++ b/dashboard/src/api/generated/openapi-v1/types.gen.ts @@ -1,1095 +1,1069 @@ // This file is auto-generated by @hey-api/openapi-ts export type ClientOptions = { - baseURL: 'http://localhost:6185' | (string & {}); + baseURL: 'http://localhost:6185' | (string & {}); }; /** * The AstrBot backend runtime, including when running inside a container. Values are captured at application startup. */ export type RuntimeInfo = { - /** - * Lowercase platform.system() value, commonly linux, darwin, or windows. - */ - os: string; - /** - * Unmodified platform.machine() value, such as x86_64, AMD64, arm64, or aarch64. May be empty if unknown. - */ - arch: string; - /** - * Local process sandbox startup check, captured when AstrBot starts. It does not verify DNS resolution or every permitted operation. - */ - sandbox: { - backend: 'bubblewrap' | 'seatbelt' | null; /** - * detected means the executable was found and a minimal workspace sandbox launched successfully; missing means the corresponding executable was not found; unavailable means it was found but sandbox startup failed; unsupported means this platform has no Local process sandbox backend. These identifiers are independent of the UI language. + * Lowercase platform.system() value, commonly linux, darwin, or windows. */ - status: 'detected' | 'missing' | 'unavailable' | 'unsupported'; + os: string; /** - * Bounded startup error detail, included when status is unavailable. Restart AstrBot after fixing the environment to refresh the check. + * Unmodified platform.machine() value, such as x86_64, AMD64, arm64, or aarch64. May be empty if unknown. */ - error?: string; - }; + arch: string; + /** + * Local process sandbox startup check, captured when AstrBot starts. It does not verify DNS resolution or every permitted operation. + */ + sandbox: { + backend: 'bubblewrap' | 'seatbelt' | null; + /** + * detected means the executable was found and a minimal workspace sandbox launched successfully; missing means the corresponding executable was not found; unavailable means it was found but sandbox startup failed; unsupported means this platform has no Local process sandbox backend. These identifiers are independent of the UI language. + */ + status: 'detected' | 'missing' | 'unavailable' | 'unsupported'; + /** + * Bounded startup error detail, included when status is unavailable. Restart AstrBot after fixing the environment to refresh the check. + */ + error?: string; + }; }; export type DataFileContentRequest = { - content: string; - expected_etag?: string; - encoding?: 'utf-8'; + content: string; + expected_etag?: string; + encoding?: 'utf-8'; }; export type DataFileEntryRequest = { - path: string; - type?: 'file' | 'directory'; - content?: string; + path: string; + type?: 'file' | 'directory'; + content?: string; }; export type DataFileMoveRequest = { - source_path: string; - target_path: string; + source_path: string; + target_path: string; }; export type DataFileDeleteRequest = { - path: string; - recursive?: boolean; + path: string; + recursive?: boolean; }; export type SuccessEnvelope = { - status: 'ok' | 'warning'; - message?: string; - data: unknown; + status: 'ok' | 'warning'; + message?: string; + data: unknown; }; export type SkillInventoryItem = { - name: string; - description: string; - path: string; - active: boolean; - source_type?: string; - source_label?: string; - plugin_name?: string; - /** - * Whether the owning plugin is active in the runtime catalog. - */ - plugin_active?: boolean; - /** - * Display name of the owning runtime plugin, when known. - */ - plugin_display_name?: string; - readonly?: boolean; - [key: string]: unknown; + name: string; + description: string; + path: string; + active: boolean; + source_type?: string; + source_label?: string; + plugin_name?: string; + /** + * Whether the owning plugin is active in the runtime catalog. + */ + plugin_active?: boolean; + /** + * Display name of the owning runtime plugin, when known. + */ + plugin_display_name?: string; + readonly?: boolean; + [key: string]: unknown; }; export type SkillInventoryData = { - skills: Array; - runtime: string; - sandbox_cache: { - [key: string]: unknown; - }; + skills: Array; + runtime: string; + sandbox_cache: { + [key: string]: unknown; + }; }; export type SkillInventoryResponse = { - status: 'ok' | 'warning'; - message?: string; - data: SkillInventoryData; + status: 'ok' | 'warning'; + message?: string; + data: SkillInventoryData; }; export type ErrorEnvelope = { - status: 'error'; - message: string; - data?: unknown; + status: 'error'; + message: string; + data?: unknown; }; export type DynamicConfig = { - [key: string]: unknown; + [key: string]: unknown; }; export type JsonSchema = { - [key: string]: unknown; + [key: string]: unknown; }; export type PluginDashboardSessionRequest = { - protocol_version: 1; - expected_generation: string; + protocol_version: 1; + expected_generation: string; }; export type PluginDashboardActionRequest = { - protocol_version: 1; - instance_id: string; - expected_generation: string; - payload: unknown; + protocol_version: 1; + instance_id: string; + expected_generation: string; + payload: unknown; }; export type PluginDashboardFileRequest = { - protocol_version: 1; - instance_id: string; - expected_generation: string; - expected_disposition: 'inline' | 'attachment'; - payload: unknown; + protocol_version: 1; + instance_id: string; + expected_generation: string; + expected_disposition: 'inline' | 'attachment'; + payload: unknown; }; export type PluginDashboardUploadMetadata = { - protocol_version: 1; - instance_id: string; - expected_generation: string; - fields: unknown; + protocol_version: 1; + instance_id: string; + expected_generation: string; + fields: unknown; }; export type PluginDashboardUploadRequest = { - metadata: PluginDashboardUploadMetadata; - file: Blob | File; + metadata: PluginDashboardUploadMetadata; + file: Blob | File; }; export type PluginDashboardPage = { - id: string; - title: string; - icon: string | null; - actions: Array; + id: string; + title: string; + icon: string | null; + actions: Array; }; export type PluginDashboardAction = { - id: string; - kind: 'json' | 'upload' | 'file'; - required_scope: string; - description: string; - input_schema: JsonSchema; - output_schema?: JsonSchema; - disposition?: 'inline' | 'attachment'; - max_file_bytes?: number; - allowed_content_types?: Array; - allowed_extensions?: Array; + id: string; + kind: 'json' | 'upload' | 'file'; + required_scope: string; + description: string; + input_schema: JsonSchema; + output_schema?: JsonSchema; + disposition?: 'inline' | 'attachment'; + max_file_bytes?: number; + allowed_content_types?: Array; + allowed_extensions?: Array; }; export type PluginDashboardCatalog = { - protocol_version: 1; - extension_id: string; - plugin_name: string; - plugin_generation: string; - pages: Array; - actions: Array; + protocol_version: 1; + extension_id: string; + plugin_name: string; + plugin_generation: string; + pages: Array; + actions: Array; }; export type PluginDashboardCatalogResponse = { - status: 'ok'; - message?: string | null; - data: PluginDashboardCatalog; + status: 'ok'; + message?: string | null; + data: PluginDashboardCatalog; }; export type PluginDashboardSession = { - protocol_version: 1; - instance_id: string; - plugin_generation: string; - iframe_url: string; - handshake_nonce: string; - expires_at: string; + protocol_version: 1; + instance_id: string; + plugin_generation: string; + iframe_url: string; + handshake_nonce: string; + expires_at: string; }; export type PluginDashboardSessionResponse = { - status: 'ok'; - message?: string | null; - data: PluginDashboardSession; + status: 'ok'; + message?: string | null; + data: PluginDashboardSession; }; export type PluginDashboardFileTicket = { - ticket_url: string; - filename: string; - content_type: string; - size: number; - disposition: 'inline' | 'attachment'; - expires_at: string; + ticket_url: string; + filename: string; + content_type: string; + size: number; + disposition: 'inline' | 'attachment'; + expires_at: string; }; export type PluginDashboardFileResponse = { - status: 'ok'; - message?: string | null; - data: PluginDashboardFileTicket; + status: 'ok'; + message?: string | null; + data: PluginDashboardFileTicket; }; export type LoginRequest = { - username: string; - password: string; - /** - * TOTP code or recovery code when two-factor authentication is required. - */ - code?: string; - trust_device_flag?: boolean; + username: string; + password: string; + /** + * TOTP code or recovery code when two-factor authentication is required. + */ + code?: string; + trust_device_flag?: boolean; }; export type SetupAuthRequest = { - username: string; - password: string; - confirm_password: string; + username: string; + password: string; + confirm_password: string; }; export type UpdateAccountRequest = { - password: string; - new_password?: string; - confirm_password?: string; - new_username?: string; + password: string; + new_password?: string; + confirm_password?: string; + new_username?: string; }; export type TotpSetupRequest = { - code?: string; - secret?: string; + code?: string; + secret?: string; }; export type CreateApiKeyRequest = { - name: string; - scopes?: Array< - | 'bot' - | 'provider' - | 'persona' - | 'im' - | 'config' - | 'chat' - | 'kb' - | 'memory' - | 'data' - | 'file' - | 'plugin' - | 'mcp' - | 'skill' - >; - expires_at?: string; - expires_in_days?: number; + name: string; + scopes?: Array<'bot' | 'provider' | 'persona' | 'im' | 'config' | 'chat' | 'kb' | 'memory' | 'data' | 'file' | 'plugin' | 'mcp' | 'skill'>; + expires_at?: string; + expires_in_days?: number; +}; + +export type CodingCliSwitchRequest = { + cli: 'claude_code' | 'codex'; + provider_id: string; }; export type CreateConfigProfileRequest = { - name?: string; - config?: DynamicConfig; + name?: string; + config?: DynamicConfig; }; export type RenameRequest = { - name: string; + name: string; }; export type NameRequest = { - name: string; + name: string; }; export type ConfigRoutesReplaceRequest = { - routing: { - [key: string]: string; - }; + routing: { + [key: string]: string; + }; }; export type ConfigRouteUpsertRequest = { - /** - * Use "default" to remove a custom route and fall back. - */ - config_id: string; + /** + * Use "default" to remove a custom route and fall back. + */ + config_id: string; }; export type BotConfigRequest = { - config: DynamicConfig; + config: DynamicConfig; }; export type BotActionRequest = { - action_name: string; - payload?: DynamicConfig; + action_name: string; + payload?: DynamicConfig; }; export type BotRegistrationRequest = { - action: 'start' | 'poll'; - platform_config?: DynamicConfig; - registration_code?: string; - device_code?: string; - qrcode?: string; - [key: string]: unknown; + action: 'start' | 'poll'; + platform_config?: DynamicConfig; + registration_code?: string; + device_code?: string; + qrcode?: string; + [key: string]: unknown; }; export type EnabledPatch = { - enabled: boolean; + enabled: boolean; }; export type ProviderSourceConfigRequest = { - config: DynamicConfig; + config: DynamicConfig; }; export type ProviderConfigRequest = { - config: DynamicConfig; + config: DynamicConfig; }; export type ProviderEmbeddingDimensionRequest = { - config?: DynamicConfig; + config?: DynamicConfig; }; export type ChatRequest = { - /** - * Caller-declared WebChat sender/session owner. - */ - username?: string; - session_id?: string; - message: string | Array; - config_id?: string; - config_name?: string; - selected_provider?: string; - selected_model?: string; - enable_streaming?: boolean; - /** - * Internal WebUI flag for edit/regenerate flows. - */ - _skip_user_history?: boolean; - /** - * Internal WebUI checkpoint override. - */ - _llm_checkpoint_id?: string; - /** - * Internal WebUI platform history override. - */ - _platform_history_id?: string; - /** - * Internal WebUI side-thread context. - */ - _thread_selected_text?: string; + /** + * Caller-declared WebChat sender/session owner. + */ + username?: string; + session_id?: string; + message: string | Array; + config_id?: string; + config_name?: string; + selected_provider?: string; + selected_model?: string; + enable_streaming?: boolean; + /** + * Internal WebUI flag for edit/regenerate flows. + */ + _skip_user_history?: boolean; + /** + * Internal WebUI checkpoint override. + */ + _llm_checkpoint_id?: string; + /** + * Internal WebUI platform history override. + */ + _platform_history_id?: string; + /** + * Internal WebUI side-thread context. + */ + _thread_selected_text?: string; }; export type ChatSessionBatchDeleteRequest = { - session_ids: Array; + session_ids: Array; }; export type ChatSessionPatchRequest = { - display_name?: string; + display_name?: string; }; export type ChatMessagePatchRequest = { - content: { - [key: string]: unknown; - }; + content: { + [key: string]: unknown; + }; }; export type ChatMessageRegenerateRequest = { - selected_provider?: string; - selected_model?: string; - enable_streaming?: boolean; + selected_provider?: string; + selected_model?: string; + enable_streaming?: boolean; }; export type ChatThreadCreateRequest = { - session_id: string; - parent_message_id: string | number; - selected_text: string; + session_id: string; + parent_message_id: string | number; + selected_text: string; }; export type ChatThreadMessageRequest = { - message: string | Array; - selected_provider?: string; - selected_model?: string; - enable_streaming?: boolean; + message: string | Array; + selected_provider?: string; + selected_model?: string; + enable_streaming?: boolean; }; export type ChatProjectRequest = { - title?: string; - emoji?: string; - description?: string; + title?: string; + emoji?: string; + description?: string; }; export type MessagePart = { - type: - | 'text' - | 'plain' - | 'image' - | 'file' - | 'audio' - | 'record' - | 'video' - | 'reply'; - text?: string; - attachment_id?: string; - url?: string; - filename?: string; - stored_filename?: string; - mime_type?: string; - [key: string]: unknown; + type: 'text' | 'plain' | 'image' | 'file' | 'audio' | 'record' | 'video' | 'reply'; + text?: string; + attachment_id?: string; + url?: string; + filename?: string; + stored_filename?: string; + mime_type?: string; + [key: string]: unknown; }; export type ImMessageRequest = { - umo: string; - message: string | Array; + umo: string; + message: string | Array; }; export type FileUploadRequest = { - file: Blob | File; + file: Blob | File; }; export type AppearanceWallpaperUploadRequest = { - file: Blob | File; + file: Blob | File; }; export type AppearanceWallpaper = { - id: string; - content_type: 'image/jpeg' | 'image/png' | 'image/webp' | 'image/gif'; - width: number; - height: number; - image_url: string; - thumbnail_url: string; + id: string; + content_type: 'image/jpeg' | 'image/png' | 'image/webp' | 'image/gif'; + width: number; + height: number; + image_url: string; + thumbnail_url: string; }; export type AppearanceWallpaperResponse = { - status: 'ok'; - message?: string; - data: AppearanceWallpaper; + status: 'ok'; + message?: string; + data: AppearanceWallpaper; }; export type AppearanceWallpaperListResponse = { - status: 'ok'; - message?: string; - data: { - items: Array; - }; + status: 'ok'; + message?: string; + data: { + items: Array; + }; }; export type PluginUpdateRequest = { - proxy?: string; + proxy?: string; }; export type PluginSourceBindRequest = { - install_method?: string; - registry_url?: string; - market_plugin_id?: string; + install_method?: string; + registry_url?: string; + market_plugin_id?: string; }; export type PluginBatchUpdateRequest = { - names: Array; - proxy?: string; + names: Array; + proxy?: string; }; export type PluginGithubInstallRequest = { - /** - * GitHub URL or owner/repository slug. - */ - repository: string; - /** - * Optional downloadable ZIP URL to use instead of GitHub archive resolution. - */ - download_url?: string; - proxy?: string; - ignore_version_check?: boolean; - install_method?: string; - registry_url?: string; - market_plugin_id?: string; + /** + * GitHub URL or owner/repository slug. + */ + repository: string; + /** + * Optional downloadable ZIP URL to use instead of GitHub archive resolution. + */ + download_url?: string; + proxy?: string; + ignore_version_check?: boolean; + install_method?: string; + registry_url?: string; + market_plugin_id?: string; }; export type PluginUrlInstallRequest = { - url: string; - /** - * Optional downloadable ZIP URL when url is the plugin source page or repository. - */ - download_url?: string; - proxy?: string; - ignore_version_check?: boolean; - install_method?: string; - registry_url?: string; - market_plugin_id?: string; + url: string; + /** + * Optional downloadable ZIP URL when url is the plugin source page or repository. + */ + download_url?: string; + proxy?: string; + ignore_version_check?: boolean; + install_method?: string; + registry_url?: string; + market_plugin_id?: string; }; export type PluginUploadInstallRequest = { - file: Blob | File; + file: Blob | File; }; export type PluginConfigFileDeleteRequest = { - path: string; + path: string; }; export type PluginSourceRequest = { - id?: string; - name?: string; - url: string; + id?: string; + name?: string; + url: string; }; export type CommandPatchRequest = { - enabled?: boolean; - alias?: string; - aliases?: Array; - action?: string; - takeover?: boolean; - config_id?: string; + enabled?: boolean; + alias?: string; + aliases?: Array; + action?: string; + takeover?: boolean; + config_id?: string; }; export type AuthorizationBindingRequest = { - subject_id: string; - role: - | 'root' - | 'operator' - | 'instance_operator' - | 'session_owner' - | 'session_admin' - | 'member'; - scope_type: 'global' | 'instance' | 'session' | 'resource'; - scope_id: string; - config_id?: string; - expires_at?: string; + subject_id: string; + role: 'root' | 'operator' | 'instance_operator' | 'session_owner' | 'session_admin' | 'member'; + scope_type: 'global' | 'instance' | 'session' | 'resource'; + scope_id: string; + config_id?: string; + expires_at?: string; }; export type AuthorizationStepUpRequest = { - action: string; - resource_type: string; - resource_id: string; - config_id?: string; + action: string; + resource_type: string; + resource_id: string; + config_id?: string; }; export type WebChatStepUpRequest = { - session_id: string; + session_id: string; }; export type AuthorizationBindingBatchRevokeRequest = { - binding_ids: Array; + binding_ids: Array; }; export type DashboardAccountCreateRequest = { - username: string; - role?: 'operator' | 'root'; + username: string; + role?: 'operator' | 'root'; }; export type DashboardAccountUpdateRequest = { - username?: string; - is_active?: boolean; + username?: string; + is_active?: boolean; }; export type BuiltinCommandBulkToggleRequest = { - enabled: boolean; + enabled: boolean; }; export type CommandSummary = { - total?: number; - disabled?: number; - conflicts?: number; - [key: string]: unknown; + total?: number; + disabled?: number; + conflicts?: number; + [key: string]: unknown; }; export type CommandItem = { - /** - * Stable command identifier `{plugin_name}:{original_command}` with spaces replaced by dots. - */ - command_id: string; - /** - * Runtime handler locator. Read-only. - */ - handler_full_name?: string; - handler_name?: string; - plugin?: string; - plugin_display_name?: string; - module_path?: string; - description?: string; - type?: 'command' | 'group' | 'sub_command'; - parent_signature?: string; - parent_group_handler?: string; - original_command?: string; - current_fragment?: string; - effective_command?: string; - signature?: string; - display_signature?: string; - aliases?: Array; - action?: string; - enabled?: boolean; - /** - * Whether the owning plugin is currently activated. - */ - plugin_activated?: boolean; - is_group?: boolean; - has_conflict?: boolean; - reserved?: boolean; - sub_commands?: Array; - [key: string]: unknown; + /** + * Stable command identifier `{plugin_name}:{original_command}` with spaces replaced by dots. + */ + command_id: string; + /** + * Runtime handler locator. Read-only. + */ + handler_full_name?: string; + handler_name?: string; + plugin?: string; + plugin_display_name?: string; + module_path?: string; + description?: string; + type?: 'command' | 'group' | 'sub_command'; + parent_signature?: string; + parent_group_handler?: string; + original_command?: string; + current_fragment?: string; + effective_command?: string; + signature?: string; + display_signature?: string; + aliases?: Array; + action?: string; + enabled?: boolean; + /** + * Whether the owning plugin is currently activated. + */ + plugin_activated?: boolean; + is_group?: boolean; + has_conflict?: boolean; + reserved?: boolean; + sub_commands?: Array; + [key: string]: unknown; }; export type CommandListData = { - items?: Array; - command_prefixes?: Array; - llm_access?: { - prefixes?: Array; + items?: Array; + command_prefixes?: Array; + llm_access?: { + prefixes?: Array; + [key: string]: unknown; + }; + summary?: CommandSummary; [key: string]: unknown; - }; - summary?: CommandSummary; - [key: string]: unknown; }; export type CommandListEnvelope = { - status: 'ok'; - message?: string; - data: CommandListData; - [key: string]: unknown; + status: 'ok'; + message?: string; + data: CommandListData; + [key: string]: unknown; }; export type CommandItemEnvelope = { - status: 'ok'; - message?: string; - data: CommandItem; - [key: string]: unknown; -}; - -export type McpServerConfig = ( - | unknown - | { - transport: 'streamable_http'; - } -) & { - name: string; - active?: boolean; - transport?: 'stdio' | 'streamable_http'; - command?: string; - args?: Array; - url?: string; - headers?: { - [key: string]: string; - }; - env?: { - [key: string]: string; - }; - allow_private_network?: boolean; - connect_timeout_seconds?: number; - read_timeout_seconds?: number; - terminate_on_close?: boolean; - auth_ref?: string; + status: 'ok'; + message?: string; + data: CommandItem; + [key: string]: unknown; +}; + +export type McpServerConfig = (unknown | { + transport: 'streamable_http'; +}) & { + name: string; + active?: boolean; + transport?: 'stdio' | 'streamable_http'; + command?: string; + args?: Array; + url?: string; + headers?: { + [key: string]: string; + }; + env?: { + [key: string]: string; + }; + allow_private_network?: boolean; + connect_timeout_seconds?: number; + read_timeout_seconds?: number; + terminate_on_close?: boolean; + auth_ref?: string; }; export type McpResourceReadRequest = { - uri: string; + uri: string; }; export type McpPromptGetRequest = { - arguments?: { - [key: string]: string; - }; + arguments?: { + [key: string]: string; + }; }; export type McpCompletionRequest = { - reference: { - [key: string]: unknown; - }; - argument: { - [key: string]: string; - }; - context_arguments?: { - [key: string]: string; - }; + reference: { + [key: string]: unknown; + }; + argument: { + [key: string]: string; + }; + context_arguments?: { + [key: string]: string; + }; }; export type ModelScopeSyncRequest = { - access_token?: string; + access_token?: string; }; export type SkillUploadRequest = { - file: Blob | File; - overwrite?: boolean; + file: Blob | File; + overwrite?: boolean; }; export type SkillPatchRequest = { - active: boolean; + active: boolean; }; export type NeoCandidateActionRequest = { - candidate_id: string; - [key: string]: unknown; + candidate_id: string; + [key: string]: unknown; }; export type NeoReleaseActionRequest = { - release_id: string; - [key: string]: unknown; + release_id: string; + [key: string]: unknown; }; export type NeoSyncRequest = unknown & { - release_id?: string; - skill_key?: string; - [key: string]: unknown; + release_id?: string; + skill_key?: string; + [key: string]: unknown; }; export type KnowledgeBaseRequest = { - kb_name?: string; - description?: string; - emoji?: string; - embedding_provider_id?: string | null; - rerank_provider_id?: string | null; - chunk_size?: number; - chunk_overlap?: number; - top_k_dense?: number; - top_k_sparse?: number; - top_m_final?: number; + kb_name?: string; + description?: string; + emoji?: string; + embedding_provider_id?: string | null; + rerank_provider_id?: string | null; + chunk_size?: number; + chunk_overlap?: number; + top_k_dense?: number; + top_k_sparse?: number; + top_m_final?: number; }; export type KnowledgeBaseCreateRequest = KnowledgeBaseRequest & { - kb_name: string; - embedding_provider_id: string; + kb_name: string; + embedding_provider_id: string; }; export type KnowledgeDocumentUploadRequest = { - /** - * A document file. Repeat this field, or use file-prefixed field names, for a batch of at most 100 files. - */ - file: Blob | File; - chunk_size?: number; - /** - * Must be smaller than chunk_size. - */ - chunk_overlap?: number; - batch_size?: number; - tasks_limit?: number; - max_retries?: number; + /** + * A document file. Repeat this field, or use file-prefixed field names, for a batch of at most 100 files. + */ + file: Blob | File; + chunk_size?: number; + /** + * Must be smaller than chunk_size. + */ + chunk_overlap?: number; + batch_size?: number; + tasks_limit?: number; + max_retries?: number; }; export type KnowledgeDocumentImportRequest = { - documents: Array<{ - file_name: string; - file_type?: string; - chunks: Array; + documents: Array<{ + file_name: string; + file_type?: string; + chunks: Array; + [key: string]: unknown; + }>; + batch_size?: number; + tasks_limit?: number; + max_retries?: number; [key: string]: unknown; - }>; - batch_size?: number; - tasks_limit?: number; - max_retries?: number; - [key: string]: unknown; }; export type KnowledgeDocumentUrlImportRequest = { - url: string; - chunk_size?: number; - /** - * Must be smaller than chunk_size. - */ - chunk_overlap?: number; - batch_size?: number; - tasks_limit?: number; - max_retries?: number; - enable_cleaning?: boolean; - cleaning_provider_id?: string; - [key: string]: unknown; + url: string; + chunk_size?: number; + /** + * Must be smaller than chunk_size. + */ + chunk_overlap?: number; + batch_size?: number; + tasks_limit?: number; + max_retries?: number; + enable_cleaning?: boolean; + cleaning_provider_id?: string; + [key: string]: unknown; }; export type KnowledgeDocument = { - doc_id: string; - kb_id: string; - doc_name: string; - file_type?: string; - file_size?: number; - chunk_count?: number; - media_count?: number; - identity_key?: string; - content_hash?: string; - source_kind?: 'file' | 'url' | 'import'; - source_url?: string; - source_stored?: boolean; - created_at?: string; - updated_at?: string; - /** - * Present on background task item results only. - */ - ingest_status?: 'created' | 'replaced' | 'unchanged'; + doc_id: string; + kb_id: string; + doc_name: string; + file_type?: string; + file_size?: number; + chunk_count?: number; + media_count?: number; + identity_key?: string; + content_hash?: string; + source_kind?: 'file' | 'url' | 'import'; + source_url?: string; + source_stored?: boolean; + created_at?: string; + updated_at?: string; + /** + * Present on background task item results only. + */ + ingest_status?: 'created' | 'replaced' | 'unchanged'; }; export type KnowledgeRetrieveRequest = { - query: string; - top_k?: number; - score_threshold?: number; + query: string; + top_k?: number; + score_threshold?: number; }; export type MemoryFactCreateRequest = { - person_id: string; - chat_id: string; - scope_id?: string; - fact_text: string; - fact_type?: string; - source_message_id?: string; - evidence_message_ids?: Array; - confidence?: number; - reason?: string; - [key: string]: unknown; + person_id: string; + chat_id: string; + scope_id?: string; + fact_text: string; + fact_type?: string; + source_message_id?: string; + evidence_message_ids?: Array; + confidence?: number; + reason?: string; + [key: string]: unknown; }; export type MemoryFactPatchRequest = { - fact_text?: string; - fact_type?: string; - confidence?: number; - reason?: string; - [key: string]: unknown; + fact_text?: string; + fact_type?: string; + confidence?: number; + reason?: string; + [key: string]: unknown; }; export type MemoryFactActionRequest = { - reason?: string; - [key: string]: unknown; + reason?: string; + [key: string]: unknown; }; export type MemoryProfileRefreshRequest = { - chat_scope?: string; - scope_id?: string; - chat_id?: string; - [key: string]: unknown; + chat_scope?: string; + scope_id?: string; + chat_id?: string; + [key: string]: unknown; }; export type PersonaRequest = { - persona_id: string; - system_prompt: string; - begin_dialogs?: Array; - folder_id?: string; - tools?: Array; - skills?: Array; - custom_error_message?: string; - [key: string]: unknown; + persona_id: string; + system_prompt: string; + begin_dialogs?: Array; + folder_id?: string; + tools?: Array; + skills?: Array; + custom_error_message?: string; + [key: string]: unknown; }; export type PersonaFolderRequest = { - name?: string; - parent_id?: string; - description?: string; - [key: string]: unknown; + name?: string; + parent_id?: string; + description?: string; + [key: string]: unknown; }; export type PersonaMoveRequest = { - persona_id: string; - folder_id?: string; - [key: string]: unknown; + persona_id: string; + folder_id?: string; + [key: string]: unknown; }; export type ReorderRequest = { - items: Array<{ - id: string; - type: 'persona' | 'folder'; - sort_order: number; - }>; + items: Array<{ + id: string; + type: 'persona' | 'folder'; + sort_order: number; + }>; }; export type SessionRuleRequest = { - umo: string; - rule_key: string; - rule_value?: DynamicConfig; - [key: string]: unknown; + umo: string; + rule_key: string; + rule_value?: DynamicConfig; + [key: string]: unknown; }; export type UmoListRequest = { - umo?: string; - umos?: Array; - scope?: 'all' | 'group' | 'private' | 'custom_group'; - group_id?: string; - rule_key?: string; + umo?: string; + umos?: Array; + scope?: 'all' | 'group' | 'private' | 'custom_group'; + group_id?: string; + rule_key?: string; }; export type BatchSessionProviderRequest = UmoListRequest & { - provider_id: string; - provider_type: 'chat_completion' | 'speech_to_text' | 'text_to_speech'; + provider_id: string; + provider_type: 'chat_completion' | 'speech_to_text' | 'text_to_speech'; }; export type BatchSessionServiceRequest = UmoListRequest & { - session_enabled?: boolean; - llm_enabled?: boolean; - tts_enabled?: boolean; - session_blocked?: boolean; + session_enabled?: boolean; + llm_enabled?: boolean; + tts_enabled?: boolean; + session_blocked?: boolean; }; export type SessionGroupRequest = { - name?: string; - umos?: Array; - add_umos?: Array; - remove_umos?: Array; + name?: string; + umos?: Array; + add_umos?: Array; + remove_umos?: Array; }; export type ConversationPatchRequest = { - title?: string; - persona_id?: string; + title?: string; + persona_id?: string; }; export type ConversationMessagesReplaceRequest = { - user_id?: string; - messages?: Array<{ - [key: string]: unknown; - }>; - history?: Array<{ - [key: string]: unknown; - }>; + user_id?: string; + messages?: Array<{ + [key: string]: unknown; + }>; + history?: Array<{ + [key: string]: unknown; + }>; }; export type ConversationRef = { - user_id: string; - cid: string; + user_id: string; + cid: string; }; export type ConversationBatchDeleteRequest = { - conversations: Array; + conversations: Array; }; export type ConversationExportRequest = { - conversations?: Array; - conversation_ids?: Array; - format?: 'json' | 'markdown'; + conversations?: Array; + conversation_ids?: Array; + format?: 'json' | 'markdown'; }; export type CronJobRequest = { - name?: string; - cron_expression?: string; - timezone?: string; - session?: string; - note?: string; - description?: string; - persona_id?: string; - provider_id?: string; - enabled?: boolean; - run_once?: boolean; - run_at?: string; - payload?: { + name?: string; + cron_expression?: string; + timezone?: string; + session?: string; + note?: string; + description?: string; + persona_id?: string; + provider_id?: string; + enabled?: boolean; + run_once?: boolean; + run_at?: string; + payload?: { + [key: string]: unknown; + }; [key: string]: unknown; - }; - [key: string]: unknown; }; export type CronJobPatchRequest = CronJobRequest; export type BackupExportRequest = { - include?: Array; - exclude?: Array; + include?: Array; + exclude?: Array; }; export type BackupUploadRequest = { - file: Blob | File; + file: Blob | File; }; export type BackupUploadInitRequest = { - filename: string; - total_size: number; + filename: string; + total_size: number; }; export type BackupUploadSessionRequest = { - upload_id: string; + upload_id: string; }; export type BackupChunkUploadRequest = { - upload_id: string; - chunk_index: number; - chunk: Blob | File; + upload_id: string; + chunk_index: number; + chunk: Blob | File; }; export type BackupRenameRequest = { - new_name: string; + new_name: string; }; export type BackupImportRequest = { - confirmed?: boolean; + confirmed?: boolean; }; export type PipInstallRequest = { - package: string; - mirror?: string; + package: string; + mirror?: string; }; export type GhproxyTestRequest = { - proxy_url: string; + proxy_url: string; }; export type StorageCleanupRequest = { - target?: string; + target?: string; }; export type TraceSettingsRequest = { - enabled: boolean; + enabled: boolean; }; export type T2iTemplateRequest = { - name: string; - content: string; - [key: string]: unknown; + name: string; + content: string; + [key: string]: unknown; }; export type T2iTemplateContentRequest = { - content: string; - [key: string]: unknown; + content: string; + [key: string]: unknown; }; export type SubAgentConfigRequest = { - main_enable?: boolean; - remove_main_duplicate_tools?: boolean; - agents?: Array<{ - [key: string]: unknown; - }>; + main_enable?: boolean; + remove_main_duplicate_tools?: boolean; + agents?: Array<{ + [key: string]: unknown; + }>; }; export type ChatRequestWritable = { - /** - * Caller-declared WebChat sender/session owner. - */ - username?: string; - session_id?: string; - message: string | Array; - config_id?: string; - config_name?: string; - selected_provider?: string; - selected_model?: string; - enable_streaming?: boolean; - /** - * Internal WebUI flag for edit/regenerate flows. - */ - _skip_user_history?: boolean; - /** - * Internal WebUI checkpoint override. - */ - _llm_checkpoint_id?: string; - /** - * Internal WebUI platform history override. - */ - _platform_history_id?: string; - /** - * Internal WebUI side-thread context. - */ - _thread_selected_text?: string; - /** - * Internal WebUI in-memory WebChat step-up proofs. - */ - _webchat_step_up_tokens?: { - [key: string]: string; - }; + /** + * Caller-declared WebChat sender/session owner. + */ + username?: string; + session_id?: string; + message: string | Array; + config_id?: string; + config_name?: string; + selected_provider?: string; + selected_model?: string; + enable_streaming?: boolean; + /** + * Internal WebUI flag for edit/regenerate flows. + */ + _skip_user_history?: boolean; + /** + * Internal WebUI checkpoint override. + */ + _llm_checkpoint_id?: string; + /** + * Internal WebUI platform history override. + */ + _platform_history_id?: string; + /** + * Internal WebUI side-thread context. + */ + _thread_selected_text?: string; + /** + * Internal WebUI in-memory WebChat step-up proofs. + */ + _webchat_step_up_tokens?: { + [key: string]: string; + }; }; export type ChatMessageRegenerateRequestWritable = { - selected_provider?: string; - selected_model?: string; - enable_streaming?: boolean; - /** - * Internal WebUI in-memory WebChat step-up proofs. - */ - _webchat_step_up_tokens?: { - [key: string]: string; - }; + selected_provider?: string; + selected_model?: string; + enable_streaming?: boolean; + /** + * Internal WebUI in-memory WebChat step-up proofs. + */ + _webchat_step_up_tokens?: { + [key: string]: string; + }; }; export type ChatThreadMessageRequestWritable = { - message: string | Array; - selected_provider?: string; - selected_model?: string; - enable_streaming?: boolean; - /** - * Internal WebUI in-memory WebChat step-up proofs. - */ - _webchat_step_up_tokens?: { - [key: string]: string; - }; + message: string | Array; + selected_provider?: string; + selected_model?: string; + enable_streaming?: boolean; + /** + * Internal WebUI in-memory WebChat step-up proofs. + */ + _webchat_step_up_tokens?: { + [key: string]: string; + }; }; export type AuthorizationStepUpRequestWritable = { - action: string; - resource_type: string; - resource_id: string; - config_id?: string; - password?: string; - code?: string; + action: string; + resource_type: string; + resource_id: string; + config_id?: string; + password?: string; + code?: string; }; export type WebChatStepUpRequestWritable = { - session_id: string; - password?: string; - code?: string; + session_id: string; + password?: string; + code?: string; }; export type AuthorizationBindingBatchRevokeRequestWritable = { - binding_ids: Array; - password?: string; - code?: string; + binding_ids: Array; + password?: string; + code?: string; }; export type DashboardAccountCreateRequestWritable = { - username: string; - password: string; - role?: 'operator' | 'root'; + username: string; + password: string; + role?: 'operator' | 'root'; }; export type DashboardAccountUpdateRequestWritable = { - username?: string; - password?: string; - is_active?: boolean; + username?: string; + password?: string; + is_active?: boolean; }; export type DataFilePath = string; @@ -1115,6 +1089,8 @@ export type ChunkId = string; */ export type CommandId = string; +export type CodingCli = 'claude_code' | 'codex'; + export type ConfigId = string; export type ConversationId = string; @@ -1170,5994 +1146,5750 @@ export type Umo = string; export type WebhookUuid = string; export type ListDataFileTreeData = { - body?: never; - path?: never; - query?: { - path?: string; - }; - url: '/api/v1/data-files/tree'; + body?: never; + path?: never; + query?: { + path?: string; + }; + url: '/api/v1/data-files/tree'; }; export type ListDataFileTreeResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListDataFileTreeResponse = - ListDataFileTreeResponses[keyof ListDataFileTreeResponses]; +export type ListDataFileTreeResponse = ListDataFileTreeResponses[keyof ListDataFileTreeResponses]; export type GetDataFileMetadataData = { - body?: never; - path?: never; - query: { - path: string; - }; - url: '/api/v1/data-files/metadata'; + body?: never; + path?: never; + query: { + path: string; + }; + url: '/api/v1/data-files/metadata'; }; export type GetDataFileMetadataResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetDataFileMetadataResponse = - GetDataFileMetadataResponses[keyof GetDataFileMetadataResponses]; +export type GetDataFileMetadataResponse = GetDataFileMetadataResponses[keyof GetDataFileMetadataResponses]; export type GetDataFileContentData = { - body?: never; - path: { - path: string; - }; - query?: never; - url: '/api/v1/data-files/content/{path}'; + body?: never; + path: { + path: string; + }; + query?: never; + url: '/api/v1/data-files/content/{path}'; }; export type GetDataFileContentResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetDataFileContentResponse = - GetDataFileContentResponses[keyof GetDataFileContentResponses]; +export type GetDataFileContentResponse = GetDataFileContentResponses[keyof GetDataFileContentResponses]; export type UpdateDataFileContentData = { - body: DataFileContentRequest; - headers?: { - 'If-Match'?: string; - }; - path: { - path: string; - }; - query?: never; - url: '/api/v1/data-files/content/{path}'; + body: DataFileContentRequest; + headers?: { + 'If-Match'?: string; + }; + path: { + path: string; + }; + query?: never; + url: '/api/v1/data-files/content/{path}'; }; export type UpdateDataFileContentErrors = { - /** - * Standard AstrBot error response - */ - 409: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 409: ErrorEnvelope; }; -export type UpdateDataFileContentError = - UpdateDataFileContentErrors[keyof UpdateDataFileContentErrors]; +export type UpdateDataFileContentError = UpdateDataFileContentErrors[keyof UpdateDataFileContentErrors]; export type UpdateDataFileContentResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UpdateDataFileContentResponse = - UpdateDataFileContentResponses[keyof UpdateDataFileContentResponses]; +export type UpdateDataFileContentResponse = UpdateDataFileContentResponses[keyof UpdateDataFileContentResponses]; export type DownloadDataFileData = { - body?: never; - path: { - path: string; - }; - query?: never; - url: '/api/v1/data-files/download/{path}'; + body?: never; + path: { + path: string; + }; + query?: never; + url: '/api/v1/data-files/download/{path}'; }; export type DownloadDataFileResponses = { - /** - * Raw file download - */ - 200: Blob | File; + /** + * Raw file download + */ + 200: Blob | File; }; -export type DownloadDataFileResponse = - DownloadDataFileResponses[keyof DownloadDataFileResponses]; +export type DownloadDataFileResponse = DownloadDataFileResponses[keyof DownloadDataFileResponses]; export type MoveDataFileEntryData = { - body: DataFileMoveRequest; - path?: never; - query?: never; - url: '/api/v1/data-files/entries'; + body: DataFileMoveRequest; + path?: never; + query?: never; + url: '/api/v1/data-files/entries'; }; export type MoveDataFileEntryResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type MoveDataFileEntryResponse = - MoveDataFileEntryResponses[keyof MoveDataFileEntryResponses]; +export type MoveDataFileEntryResponse = MoveDataFileEntryResponses[keyof MoveDataFileEntryResponses]; export type CreateDataFileEntryData = { - body: DataFileEntryRequest; - path?: never; - query?: never; - url: '/api/v1/data-files/entries'; + body: DataFileEntryRequest; + path?: never; + query?: never; + url: '/api/v1/data-files/entries'; }; export type CreateDataFileEntryResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type CreateDataFileEntryResponse = - CreateDataFileEntryResponses[keyof CreateDataFileEntryResponses]; +export type CreateDataFileEntryResponse = CreateDataFileEntryResponses[keyof CreateDataFileEntryResponses]; export type DeleteDataFileEntryData = { - body?: DataFileDeleteRequest; - path: { - path: string; - }; - query?: never; - url: '/api/v1/data-files/entries/{path}'; + body?: DataFileDeleteRequest; + path: { + path: string; + }; + query?: never; + url: '/api/v1/data-files/entries/{path}'; }; export type DeleteDataFileEntryResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type DeleteDataFileEntryResponse = - DeleteDataFileEntryResponses[keyof DeleteDataFileEntryResponses]; +export type DeleteDataFileEntryResponse = DeleteDataFileEntryResponses[keyof DeleteDataFileEntryResponses]; export type UploadDataFileData = { - body: { - path: string; - file: Blob | File; - }; - path?: never; - query?: never; - url: '/api/v1/data-files/upload'; + body: { + path: string; + file: Blob | File; + }; + path?: never; + query?: never; + url: '/api/v1/data-files/upload'; }; export type UploadDataFileResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UploadDataFileResponse = - UploadDataFileResponses[keyof UploadDataFileResponses]; +export type UploadDataFileResponse = UploadDataFileResponses[keyof UploadDataFileResponses]; export type SearchDataFilesData = { - body?: never; - path?: never; - query: { - q: string; - path?: string; - }; - url: '/api/v1/data-files/search'; + body?: never; + path?: never; + query: { + q: string; + path?: string; + }; + url: '/api/v1/data-files/search'; }; export type SearchDataFilesResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type SearchDataFilesResponse = - SearchDataFilesResponses[keyof SearchDataFilesResponses]; +export type SearchDataFilesResponse = SearchDataFilesResponses[keyof SearchDataFilesResponses]; export type LoginData = { - body: LoginRequest; - path?: never; - query?: never; - url: '/api/v1/auth/login'; + body: LoginRequest; + path?: never; + query?: never; + url: '/api/v1/auth/login'; }; export type LoginErrors = { - /** - * Standard AstrBot error response - */ - 401: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 401: ErrorEnvelope; }; export type LoginError = LoginErrors[keyof LoginErrors]; export type LoginResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; export type LoginResponse = LoginResponses[keyof LoginResponses]; export type LogoutData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/auth/logout'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/auth/logout'; }; export type LogoutResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; export type LogoutResponse = LogoutResponses[keyof LogoutResponses]; export type GetAuthSetupStatusData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/auth/setup-status'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/auth/setup-status'; }; export type GetAuthSetupStatusResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetAuthSetupStatusResponse = - GetAuthSetupStatusResponses[keyof GetAuthSetupStatusResponses]; +export type GetAuthSetupStatusResponse = GetAuthSetupStatusResponses[keyof GetAuthSetupStatusResponses]; export type SetupAuthData = { - body: SetupAuthRequest; - path?: never; - query?: never; - url: '/api/v1/auth/setup'; + body: SetupAuthRequest; + path?: never; + query?: never; + url: '/api/v1/auth/setup'; }; export type SetupAuthResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; export type SetupAuthResponse = SetupAuthResponses[keyof SetupAuthResponses]; export type SetupTotpData = { - body?: TotpSetupRequest; - path?: never; - query?: never; - url: '/api/v1/auth/totp/setup'; + body?: TotpSetupRequest; + path?: never; + query?: never; + url: '/api/v1/auth/totp/setup'; }; export type SetupTotpResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; export type SetupTotpResponse = SetupTotpResponses[keyof SetupTotpResponses]; export type RecoverTotpData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/auth/totp/recovery'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/auth/totp/recovery'; }; export type RecoverTotpResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type RecoverTotpResponse = - RecoverTotpResponses[keyof RecoverTotpResponses]; +export type RecoverTotpResponse = RecoverTotpResponses[keyof RecoverTotpResponses]; export type UpdateAuthAccountData = { - body: UpdateAccountRequest; - path?: never; - query?: never; - url: '/api/v1/auth/account'; + body: UpdateAccountRequest; + path?: never; + query?: never; + url: '/api/v1/auth/account'; }; export type UpdateAuthAccountResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UpdateAuthAccountResponse = - UpdateAuthAccountResponses[keyof UpdateAuthAccountResponses]; +export type UpdateAuthAccountResponse = UpdateAuthAccountResponses[keyof UpdateAuthAccountResponses]; export type ListApiKeysData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/api-keys'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/api-keys'; }; export type ListApiKeysResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListApiKeysResponse = - ListApiKeysResponses[keyof ListApiKeysResponses]; +export type ListApiKeysResponse = ListApiKeysResponses[keyof ListApiKeysResponses]; export type CreateApiKeyData = { - body: CreateApiKeyRequest; - path?: never; - query?: never; - url: '/api/v1/api-keys'; + body: CreateApiKeyRequest; + path?: never; + query?: never; + url: '/api/v1/api-keys'; }; export type CreateApiKeyResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type CreateApiKeyResponse = - CreateApiKeyResponses[keyof CreateApiKeyResponses]; +export type CreateApiKeyResponse = CreateApiKeyResponses[keyof CreateApiKeyResponses]; export type RevokeApiKeyData = { - body?: never; - path: { - key_id: string; - }; - query?: never; - url: '/api/v1/api-keys/{key_id}/revoke'; + body?: never; + path: { + key_id: string; + }; + query?: never; + url: '/api/v1/api-keys/{key_id}/revoke'; }; export type RevokeApiKeyResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type RevokeApiKeyResponse = - RevokeApiKeyResponses[keyof RevokeApiKeyResponses]; +export type RevokeApiKeyResponse = RevokeApiKeyResponses[keyof RevokeApiKeyResponses]; export type DeleteApiKeyData = { - body?: never; - path: { - key_id: string; - }; - query?: never; - url: '/api/v1/api-keys/{key_id}'; + body?: never; + path: { + key_id: string; + }; + query?: never; + url: '/api/v1/api-keys/{key_id}'; }; export type DeleteApiKeyResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type DeleteApiKeyResponse = - DeleteApiKeyResponses[keyof DeleteApiKeyResponses]; +export type DeleteApiKeyResponse = DeleteApiKeyResponses[keyof DeleteApiKeyResponses]; export type ListAuthorizationRoleBindingsData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/authorization/role-bindings'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/authorization/role-bindings'; }; export type ListAuthorizationRoleBindingsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListAuthorizationRoleBindingsResponse = - ListAuthorizationRoleBindingsResponses[keyof ListAuthorizationRoleBindingsResponses]; +export type ListAuthorizationRoleBindingsResponse = ListAuthorizationRoleBindingsResponses[keyof ListAuthorizationRoleBindingsResponses]; export type GrantAuthorizationRoleBindingData = { - body: AuthorizationBindingRequest; - path?: never; - query?: never; - url: '/api/v1/authorization/role-bindings'; + body: AuthorizationBindingRequest; + path?: never; + query?: never; + url: '/api/v1/authorization/role-bindings'; }; export type GrantAuthorizationRoleBindingResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GrantAuthorizationRoleBindingResponse = - GrantAuthorizationRoleBindingResponses[keyof GrantAuthorizationRoleBindingResponses]; +export type GrantAuthorizationRoleBindingResponse = GrantAuthorizationRoleBindingResponses[keyof GrantAuthorizationRoleBindingResponses]; export type RevokeAuthorizationRoleBindingData = { - body?: never; - path: { - binding_id: string; - }; - query?: never; - url: '/api/v1/authorization/role-bindings/{binding_id}/revoke'; + body?: never; + path: { + binding_id: string; + }; + query?: never; + url: '/api/v1/authorization/role-bindings/{binding_id}/revoke'; }; export type RevokeAuthorizationRoleBindingResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type RevokeAuthorizationRoleBindingResponse = - RevokeAuthorizationRoleBindingResponses[keyof RevokeAuthorizationRoleBindingResponses]; +export type RevokeAuthorizationRoleBindingResponse = RevokeAuthorizationRoleBindingResponses[keyof RevokeAuthorizationRoleBindingResponses]; export type IssueAuthorizationBatchRevokeStepUpData = { - body: AuthorizationBindingBatchRevokeRequestWritable; - path?: never; - query?: never; - url: '/api/v1/authorization/role-bindings/batch-revoke/step-up'; + body: AuthorizationBindingBatchRevokeRequestWritable; + path?: never; + query?: never; + url: '/api/v1/authorization/role-bindings/batch-revoke/step-up'; }; export type IssueAuthorizationBatchRevokeStepUpResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type IssueAuthorizationBatchRevokeStepUpResponse = - IssueAuthorizationBatchRevokeStepUpResponses[keyof IssueAuthorizationBatchRevokeStepUpResponses]; +export type IssueAuthorizationBatchRevokeStepUpResponse = IssueAuthorizationBatchRevokeStepUpResponses[keyof IssueAuthorizationBatchRevokeStepUpResponses]; export type RevokeAuthorizationRoleBindingsData = { - body: AuthorizationBindingBatchRevokeRequestWritable; - path?: never; - query?: never; - url: '/api/v1/authorization/role-bindings/batch-revoke'; + body: AuthorizationBindingBatchRevokeRequestWritable; + path?: never; + query?: never; + url: '/api/v1/authorization/role-bindings/batch-revoke'; }; export type RevokeAuthorizationRoleBindingsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type RevokeAuthorizationRoleBindingsResponse = - RevokeAuthorizationRoleBindingsResponses[keyof RevokeAuthorizationRoleBindingsResponses]; +export type RevokeAuthorizationRoleBindingsResponse = RevokeAuthorizationRoleBindingsResponses[keyof RevokeAuthorizationRoleBindingsResponses]; export type IssueAuthorizationStepUpData = { - body: AuthorizationStepUpRequestWritable; - path?: never; - query?: never; - url: '/api/v1/authorization/step-up'; + body: AuthorizationStepUpRequestWritable; + path?: never; + query?: never; + url: '/api/v1/authorization/step-up'; }; export type IssueAuthorizationStepUpResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type IssueAuthorizationStepUpResponse = - IssueAuthorizationStepUpResponses[keyof IssueAuthorizationStepUpResponses]; +export type IssueAuthorizationStepUpResponse = IssueAuthorizationStepUpResponses[keyof IssueAuthorizationStepUpResponses]; export type IssueWebChatAuthorizationStepUpData = { - body: WebChatStepUpRequestWritable; - path?: never; - query?: never; - url: '/api/v1/authorization/webchat-step-up'; + body: WebChatStepUpRequestWritable; + path?: never; + query?: never; + url: '/api/v1/authorization/webchat-step-up'; }; export type IssueWebChatAuthorizationStepUpResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type IssueWebChatAuthorizationStepUpResponse = - IssueWebChatAuthorizationStepUpResponses[keyof IssueWebChatAuthorizationStepUpResponses]; +export type IssueWebChatAuthorizationStepUpResponse = IssueWebChatAuthorizationStepUpResponses[keyof IssueWebChatAuthorizationStepUpResponses]; export type ListAuthorizationAuditData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/authorization/audit'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/authorization/audit'; }; export type ListAuthorizationAuditResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListAuthorizationAuditResponse = - ListAuthorizationAuditResponses[keyof ListAuthorizationAuditResponses]; +export type ListAuthorizationAuditResponse = ListAuthorizationAuditResponses[keyof ListAuthorizationAuditResponses]; export type ListAuthorizationAccountsData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/authorization/accounts'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/authorization/accounts'; }; export type ListAuthorizationAccountsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListAuthorizationAccountsResponse = - ListAuthorizationAccountsResponses[keyof ListAuthorizationAccountsResponses]; +export type ListAuthorizationAccountsResponse = ListAuthorizationAccountsResponses[keyof ListAuthorizationAccountsResponses]; export type CreateAuthorizationAccountData = { - body: DashboardAccountCreateRequestWritable; - path?: never; - query?: never; - url: '/api/v1/authorization/accounts'; + body: DashboardAccountCreateRequestWritable; + path?: never; + query?: never; + url: '/api/v1/authorization/accounts'; }; export type CreateAuthorizationAccountResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type CreateAuthorizationAccountResponse = - CreateAuthorizationAccountResponses[keyof CreateAuthorizationAccountResponses]; +export type CreateAuthorizationAccountResponse = CreateAuthorizationAccountResponses[keyof CreateAuthorizationAccountResponses]; export type UpdateAuthorizationAccountData = { - body: DashboardAccountUpdateRequestWritable; - path: { - account_id: string; - }; - query?: never; - url: '/api/v1/authorization/accounts/{account_id}'; + body: DashboardAccountUpdateRequestWritable; + path: { + account_id: string; + }; + query?: never; + url: '/api/v1/authorization/accounts/{account_id}'; }; export type UpdateAuthorizationAccountResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UpdateAuthorizationAccountResponse = - UpdateAuthorizationAccountResponses[keyof UpdateAuthorizationAccountResponses]; +export type UpdateAuthorizationAccountResponse = UpdateAuthorizationAccountResponses[keyof UpdateAuthorizationAccountResponses]; export type GetSystemConfigSchemaData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/system-config/schema'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/system-config/schema'; }; export type GetSystemConfigSchemaResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetSystemConfigSchemaResponse = - GetSystemConfigSchemaResponses[keyof GetSystemConfigSchemaResponses]; +export type GetSystemConfigSchemaResponse = GetSystemConfigSchemaResponses[keyof GetSystemConfigSchemaResponses]; export type GetSystemConfigData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/system-config'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/system-config'; }; export type GetSystemConfigResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetSystemConfigResponse = - GetSystemConfigResponses[keyof GetSystemConfigResponses]; +export type GetSystemConfigResponse = GetSystemConfigResponses[keyof GetSystemConfigResponses]; export type UpdateSystemConfigData = { - body: DynamicConfig; - path?: never; - query?: never; - url: '/api/v1/system-config'; + body: DynamicConfig; + path?: never; + query?: never; + url: '/api/v1/system-config'; }; export type UpdateSystemConfigResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UpdateSystemConfigResponse = - UpdateSystemConfigResponses[keyof UpdateSystemConfigResponses]; +export type UpdateSystemConfigResponse = UpdateSystemConfigResponses[keyof UpdateSystemConfigResponses]; export type GetSystemConfigRuntimeData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/system-config/runtime'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/system-config/runtime'; }; export type GetSystemConfigRuntimeResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetSystemConfigRuntimeResponse = - GetSystemConfigRuntimeResponses[keyof GetSystemConfigRuntimeResponses]; +export type GetSystemConfigRuntimeResponse = GetSystemConfigRuntimeResponses[keyof GetSystemConfigRuntimeResponses]; export type GetConfigProfileSchemaData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/config-profiles/schema'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/config-profiles/schema'; }; export type GetConfigProfileSchemaResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetConfigProfileSchemaResponse = - GetConfigProfileSchemaResponses[keyof GetConfigProfileSchemaResponses]; +export type GetConfigProfileSchemaResponse = GetConfigProfileSchemaResponses[keyof GetConfigProfileSchemaResponses]; export type ListConfigProfilesData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/config-profiles'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/config-profiles'; }; export type ListConfigProfilesResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListConfigProfilesResponse = - ListConfigProfilesResponses[keyof ListConfigProfilesResponses]; +export type ListConfigProfilesResponse = ListConfigProfilesResponses[keyof ListConfigProfilesResponses]; export type CreateConfigProfileData = { - body: CreateConfigProfileRequest; - path?: never; - query?: never; - url: '/api/v1/config-profiles'; + body: CreateConfigProfileRequest; + path?: never; + query?: never; + url: '/api/v1/config-profiles'; }; export type CreateConfigProfileResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type CreateConfigProfileResponse = - CreateConfigProfileResponses[keyof CreateConfigProfileResponses]; +export type CreateConfigProfileResponse = CreateConfigProfileResponses[keyof CreateConfigProfileResponses]; export type DeleteConfigProfileData = { - body?: never; - path: { - config_id: string; - }; - query?: never; - url: '/api/v1/config-profiles/{config_id}'; + body?: never; + path: { + config_id: string; + }; + query?: never; + url: '/api/v1/config-profiles/{config_id}'; }; export type DeleteConfigProfileResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type DeleteConfigProfileResponse = - DeleteConfigProfileResponses[keyof DeleteConfigProfileResponses]; +export type DeleteConfigProfileResponse = DeleteConfigProfileResponses[keyof DeleteConfigProfileResponses]; export type GetConfigProfileData = { - body?: never; - path: { - config_id: string; - }; - query?: never; - url: '/api/v1/config-profiles/{config_id}'; + body?: never; + path: { + config_id: string; + }; + query?: never; + url: '/api/v1/config-profiles/{config_id}'; }; export type GetConfigProfileResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetConfigProfileResponse = - GetConfigProfileResponses[keyof GetConfigProfileResponses]; +export type GetConfigProfileResponse = GetConfigProfileResponses[keyof GetConfigProfileResponses]; export type RenameConfigProfileData = { - body: RenameRequest; - path: { - config_id: string; - }; - query?: never; - url: '/api/v1/config-profiles/{config_id}'; + body: RenameRequest; + path: { + config_id: string; + }; + query?: never; + url: '/api/v1/config-profiles/{config_id}'; }; export type RenameConfigProfileResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type RenameConfigProfileResponse = - RenameConfigProfileResponses[keyof RenameConfigProfileResponses]; +export type RenameConfigProfileResponse = RenameConfigProfileResponses[keyof RenameConfigProfileResponses]; export type UpdateConfigProfileContentData = { - body: DynamicConfig; - path: { - config_id: string; - }; - query?: never; - url: '/api/v1/config-profiles/{config_id}'; + body: DynamicConfig; + path: { + config_id: string; + }; + query?: never; + url: '/api/v1/config-profiles/{config_id}'; }; export type UpdateConfigProfileContentResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; +}; + +export type UpdateConfigProfileContentResponse = UpdateConfigProfileContentResponses[keyof UpdateConfigProfileContentResponses]; + +export type GetCodingCliGlobalConfigData = { + body?: never; + path?: never; + query?: never; + url: '/api/v1/coding-cli/global-config'; +}; + +export type GetCodingCliGlobalConfigResponses = { + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; +}; + +export type GetCodingCliGlobalConfigResponse = GetCodingCliGlobalConfigResponses[keyof GetCodingCliGlobalConfigResponses]; + +export type SwitchCodingCliProviderData = { + body: CodingCliSwitchRequest; + path?: never; + query?: never; + url: '/api/v1/coding-cli/global-config'; +}; + +export type SwitchCodingCliProviderResponses = { + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UpdateConfigProfileContentResponse = - UpdateConfigProfileContentResponses[keyof UpdateConfigProfileContentResponses]; +export type SwitchCodingCliProviderResponse = SwitchCodingCliProviderResponses[keyof SwitchCodingCliProviderResponses]; + +export type RemoveCodingCliGlobalConfigData = { + body?: never; + path: { + cli: 'claude_code' | 'codex'; + }; + query?: never; + url: '/api/v1/coding-cli/global-config/{cli}'; +}; + +export type RemoveCodingCliGlobalConfigResponses = { + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; +}; + +export type RemoveCodingCliGlobalConfigResponse = RemoveCodingCliGlobalConfigResponses[keyof RemoveCodingCliGlobalConfigResponses]; export type ListConfigRoutesData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/config-routes'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/config-routes'; }; export type ListConfigRoutesResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListConfigRoutesResponse = - ListConfigRoutesResponses[keyof ListConfigRoutesResponses]; +export type ListConfigRoutesResponse = ListConfigRoutesResponses[keyof ListConfigRoutesResponses]; export type ReplaceConfigRoutesData = { - body: ConfigRoutesReplaceRequest; - path?: never; - query?: never; - url: '/api/v1/config-routes'; + body: ConfigRoutesReplaceRequest; + path?: never; + query?: never; + url: '/api/v1/config-routes'; }; export type ReplaceConfigRoutesResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ReplaceConfigRoutesResponse = - ReplaceConfigRoutesResponses[keyof ReplaceConfigRoutesResponses]; +export type ReplaceConfigRoutesResponse = ReplaceConfigRoutesResponses[keyof ReplaceConfigRoutesResponses]; export type DeleteConfigRouteData = { - body?: never; - path: { - /** - * URL-encoded unified message origin. - */ - umo: string; - }; - query?: never; - url: '/api/v1/config-routes/{umo}'; + body?: never; + path: { + /** + * URL-encoded unified message origin. + */ + umo: string; + }; + query?: never; + url: '/api/v1/config-routes/{umo}'; }; export type DeleteConfigRouteResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type DeleteConfigRouteResponse = - DeleteConfigRouteResponses[keyof DeleteConfigRouteResponses]; +export type DeleteConfigRouteResponse = DeleteConfigRouteResponses[keyof DeleteConfigRouteResponses]; export type UpsertConfigRouteData = { - body: ConfigRouteUpsertRequest; - path: { - /** - * URL-encoded unified message origin. - */ - umo: string; - }; - query?: never; - url: '/api/v1/config-routes/{umo}'; + body: ConfigRouteUpsertRequest; + path: { + /** + * URL-encoded unified message origin. + */ + umo: string; + }; + query?: never; + url: '/api/v1/config-routes/{umo}'; }; export type UpsertConfigRouteResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UpsertConfigRouteResponse = - UpsertConfigRouteResponses[keyof UpsertConfigRouteResponses]; +export type UpsertConfigRouteResponse = UpsertConfigRouteResponses[keyof UpsertConfigRouteResponses]; export type ListBotTypesData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/bot-types'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/bot-types'; }; export type ListBotTypesResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListBotTypesResponse = - ListBotTypesResponses[keyof ListBotTypesResponses]; +export type ListBotTypesResponse = ListBotTypesResponses[keyof ListBotTypesResponses]; export type RegisterBotTypeData = { - body: BotRegistrationRequest; - path: { - bot_type: string; - }; - query?: never; - url: '/api/v1/bot-types/{bot_type}/registration'; + body: BotRegistrationRequest; + path: { + bot_type: string; + }; + query?: never; + url: '/api/v1/bot-types/{bot_type}/registration'; }; export type RegisterBotTypeResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type RegisterBotTypeResponse = - RegisterBotTypeResponses[keyof RegisterBotTypeResponses]; +export type RegisterBotTypeResponse = RegisterBotTypeResponses[keyof RegisterBotTypeResponses]; export type ListBotsData = { - body?: never; - path?: never; - query?: { - enabled?: boolean; - type?: string; - }; - url: '/api/v1/bots'; + body?: never; + path?: never; + query?: { + enabled?: boolean; + type?: string; + }; + url: '/api/v1/bots'; }; export type ListBotsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; export type ListBotsResponse = ListBotsResponses[keyof ListBotsResponses]; export type CreateBotData = { - body: BotConfigRequest; - path?: never; - query?: never; - url: '/api/v1/bots'; + body: BotConfigRequest; + path?: never; + query?: never; + url: '/api/v1/bots'; }; export type CreateBotResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; export type CreateBotResponse = CreateBotResponses[keyof CreateBotResponses]; export type ListBotStatsData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/bots/stats'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/bots/stats'; }; export type ListBotStatsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListBotStatsResponse = - ListBotStatsResponses[keyof ListBotStatsResponses]; +export type ListBotStatsResponse = ListBotStatsResponses[keyof ListBotStatsResponses]; export type DeleteBotData = { - body?: never; - path: { - bot_id: string; - }; - query?: never; - url: '/api/v1/bots/{bot_id}'; + body?: never; + path: { + bot_id: string; + }; + query?: never; + url: '/api/v1/bots/{bot_id}'; }; export type DeleteBotResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; export type DeleteBotResponse = DeleteBotResponses[keyof DeleteBotResponses]; export type GetBotData = { - body?: never; - path: { - bot_id: string; - }; - query?: never; - url: '/api/v1/bots/{bot_id}'; + body?: never; + path: { + bot_id: string; + }; + query?: never; + url: '/api/v1/bots/{bot_id}'; }; export type GetBotResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; export type GetBotResponse = GetBotResponses[keyof GetBotResponses]; export type UpdateBotData = { - body: BotConfigRequest; - path: { - bot_id: string; - }; - query?: never; - url: '/api/v1/bots/{bot_id}'; + body: BotConfigRequest; + path: { + bot_id: string; + }; + query?: never; + url: '/api/v1/bots/{bot_id}'; }; export type UpdateBotResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; export type UpdateBotResponse = UpdateBotResponses[keyof UpdateBotResponses]; export type SetBotEnabledData = { - body: EnabledPatch; - path: { - bot_id: string; - }; - query?: never; - url: '/api/v1/bots/{bot_id}/enabled'; + body: EnabledPatch; + path: { + bot_id: string; + }; + query?: never; + url: '/api/v1/bots/{bot_id}/enabled'; }; export type SetBotEnabledResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type SetBotEnabledResponse = - SetBotEnabledResponses[keyof SetBotEnabledResponses]; +export type SetBotEnabledResponse = SetBotEnabledResponses[keyof SetBotEnabledResponses]; export type TestBotData = { - body?: never; - path: { - bot_id: string; - }; - query?: never; - url: '/api/v1/bots/{bot_id}/test'; + body?: never; + path: { + bot_id: string; + }; + query?: never; + url: '/api/v1/bots/{bot_id}/test'; }; export type TestBotResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; export type TestBotResponse = TestBotResponses[keyof TestBotResponses]; export type InvokeBotActionData = { - body: BotActionRequest; - path: { - bot_id: string; - }; - query?: never; - url: '/api/v1/bots/{bot_id}/actions'; + body: BotActionRequest; + path: { + bot_id: string; + }; + query?: never; + url: '/api/v1/bots/{bot_id}/actions'; }; export type InvokeBotActionResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type InvokeBotActionResponse = - InvokeBotActionResponses[keyof InvokeBotActionResponses]; +export type InvokeBotActionResponse = InvokeBotActionResponses[keyof InvokeBotActionResponses]; export type GetProviderSchemaData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/providers/schema'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/providers/schema'; }; export type GetProviderSchemaResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetProviderSchemaResponse = - GetProviderSchemaResponses[keyof GetProviderSchemaResponses]; +export type GetProviderSchemaResponse = GetProviderSchemaResponses[keyof GetProviderSchemaResponses]; export type ListProviderSourcesData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/provider-sources'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/provider-sources'; }; export type ListProviderSourcesResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListProviderSourcesResponse = - ListProviderSourcesResponses[keyof ListProviderSourcesResponses]; +export type ListProviderSourcesResponse = ListProviderSourcesResponses[keyof ListProviderSourcesResponses]; export type CreateProviderSourceData = { - body: ProviderSourceConfigRequest; - path?: never; - query?: never; - url: '/api/v1/provider-sources'; + body: ProviderSourceConfigRequest; + path?: never; + query?: never; + url: '/api/v1/provider-sources'; }; export type CreateProviderSourceResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type CreateProviderSourceResponse = - CreateProviderSourceResponses[keyof CreateProviderSourceResponses]; +export type CreateProviderSourceResponse = CreateProviderSourceResponses[keyof CreateProviderSourceResponses]; export type DeleteProviderSourceData = { - body?: never; - path: { - source_id: string; - }; - query?: never; - url: '/api/v1/provider-sources/{source_id}'; + body?: never; + path: { + source_id: string; + }; + query?: never; + url: '/api/v1/provider-sources/{source_id}'; }; export type DeleteProviderSourceResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type DeleteProviderSourceResponse = - DeleteProviderSourceResponses[keyof DeleteProviderSourceResponses]; +export type DeleteProviderSourceResponse = DeleteProviderSourceResponses[keyof DeleteProviderSourceResponses]; export type GetProviderSourceData = { - body?: never; - path: { - source_id: string; - }; - query?: never; - url: '/api/v1/provider-sources/{source_id}'; + body?: never; + path: { + source_id: string; + }; + query?: never; + url: '/api/v1/provider-sources/{source_id}'; }; export type GetProviderSourceResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetProviderSourceResponse = - GetProviderSourceResponses[keyof GetProviderSourceResponses]; +export type GetProviderSourceResponse = GetProviderSourceResponses[keyof GetProviderSourceResponses]; export type UpsertProviderSourceData = { - body: ProviderSourceConfigRequest; - path: { - source_id: string; - }; - query?: never; - url: '/api/v1/provider-sources/{source_id}'; + body: ProviderSourceConfigRequest; + path: { + source_id: string; + }; + query?: never; + url: '/api/v1/provider-sources/{source_id}'; }; export type UpsertProviderSourceResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UpsertProviderSourceResponse = - UpsertProviderSourceResponses[keyof UpsertProviderSourceResponses]; +export type UpsertProviderSourceResponse = UpsertProviderSourceResponses[keyof UpsertProviderSourceResponses]; export type ListProviderSourceModelsData = { - body?: never; - path: { - source_id: string; - }; - query?: never; - url: '/api/v1/provider-sources/{source_id}/models'; + body?: never; + path: { + source_id: string; + }; + query?: never; + url: '/api/v1/provider-sources/{source_id}/models'; }; export type ListProviderSourceModelsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListProviderSourceModelsResponse = - ListProviderSourceModelsResponses[keyof ListProviderSourceModelsResponses]; +export type ListProviderSourceModelsResponse = ListProviderSourceModelsResponses[keyof ListProviderSourceModelsResponses]; export type ListProvidersBySourceData = { - body?: never; - path: { - source_id: string; - }; - query?: { - provider_type?: string; - }; - url: '/api/v1/provider-sources/{source_id}/providers'; + body?: never; + path: { + source_id: string; + }; + query?: { + provider_type?: string; + }; + url: '/api/v1/provider-sources/{source_id}/providers'; }; export type ListProvidersBySourceResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListProvidersBySourceResponse = - ListProvidersBySourceResponses[keyof ListProvidersBySourceResponses]; +export type ListProvidersBySourceResponse = ListProvidersBySourceResponses[keyof ListProvidersBySourceResponses]; export type CreateProviderInSourceData = { - body: ProviderConfigRequest; - path: { - source_id: string; - }; - query?: never; - url: '/api/v1/provider-sources/{source_id}/providers'; + body: ProviderConfigRequest; + path: { + source_id: string; + }; + query?: never; + url: '/api/v1/provider-sources/{source_id}/providers'; }; export type CreateProviderInSourceResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type CreateProviderInSourceResponse = - CreateProviderInSourceResponses[keyof CreateProviderInSourceResponses]; +export type CreateProviderInSourceResponse = CreateProviderInSourceResponses[keyof CreateProviderInSourceResponses]; export type ListProvidersData = { - body?: never; - path?: never; - query?: { - provider_type?: string; - provider_source_id?: string; - enabled?: boolean; - }; - url: '/api/v1/providers'; + body?: never; + path?: never; + query?: { + provider_type?: string; + provider_source_id?: string; + enabled?: boolean; + }; + url: '/api/v1/providers'; }; export type ListProvidersResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListProvidersResponse = - ListProvidersResponses[keyof ListProvidersResponses]; +export type ListProvidersResponse = ListProvidersResponses[keyof ListProvidersResponses]; export type CreateProviderData = { - body: ProviderConfigRequest; - path?: never; - query?: never; - url: '/api/v1/providers'; + body: ProviderConfigRequest; + path?: never; + query?: never; + url: '/api/v1/providers'; }; export type CreateProviderResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type CreateProviderResponse = - CreateProviderResponses[keyof CreateProviderResponses]; +export type CreateProviderResponse = CreateProviderResponses[keyof CreateProviderResponses]; export type DeleteProviderData = { - body?: ProviderEmbeddingDimensionRequest; - path: { - provider_id: string; - }; - query?: never; - url: '/api/v1/providers/{provider_id}'; + body?: ProviderEmbeddingDimensionRequest; + path: { + provider_id: string; + }; + query?: never; + url: '/api/v1/providers/{provider_id}'; }; export type DeleteProviderResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type DeleteProviderResponse = - DeleteProviderResponses[keyof DeleteProviderResponses]; +export type DeleteProviderResponse = DeleteProviderResponses[keyof DeleteProviderResponses]; export type GetProviderData = { - body?: never; - path: { - provider_id: string; - }; - query?: { - merged?: boolean; - }; - url: '/api/v1/providers/{provider_id}'; + body?: never; + path: { + provider_id: string; + }; + query?: { + merged?: boolean; + }; + url: '/api/v1/providers/{provider_id}'; }; export type GetProviderResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetProviderResponse = - GetProviderResponses[keyof GetProviderResponses]; +export type GetProviderResponse = GetProviderResponses[keyof GetProviderResponses]; export type UpdateProviderData = { - body: ProviderConfigRequest; - path: { - provider_id: string; - }; - query?: never; - url: '/api/v1/providers/{provider_id}'; + body: ProviderConfigRequest; + path: { + provider_id: string; + }; + query?: never; + url: '/api/v1/providers/{provider_id}'; }; export type UpdateProviderResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UpdateProviderResponse = - UpdateProviderResponses[keyof UpdateProviderResponses]; +export type UpdateProviderResponse = UpdateProviderResponses[keyof UpdateProviderResponses]; export type SetProviderEnabledData = { - body: EnabledPatch; - path: { - provider_id: string; - }; - query?: never; - url: '/api/v1/providers/{provider_id}/enabled'; + body: EnabledPatch; + path: { + provider_id: string; + }; + query?: never; + url: '/api/v1/providers/{provider_id}/enabled'; }; export type SetProviderEnabledResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type SetProviderEnabledResponse = - SetProviderEnabledResponses[keyof SetProviderEnabledResponses]; +export type SetProviderEnabledResponse = SetProviderEnabledResponses[keyof SetProviderEnabledResponses]; export type TestProviderData = { - body?: never; - path: { - provider_id: string; - }; - query?: never; - url: '/api/v1/providers/{provider_id}/test'; + body?: never; + path: { + provider_id: string; + }; + query?: never; + url: '/api/v1/providers/{provider_id}/test'; }; export type TestProviderResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type TestProviderResponse = - TestProviderResponses[keyof TestProviderResponses]; +export type TestProviderResponse = TestProviderResponses[keyof TestProviderResponses]; export type GetProviderEmbeddingDimensionData = { - body?: DynamicConfig; - path: { - provider_id: string; - }; - query?: never; - url: '/api/v1/providers/{provider_id}/embedding-dimension'; + body?: DynamicConfig; + path: { + provider_id: string; + }; + query?: never; + url: '/api/v1/providers/{provider_id}/embedding-dimension'; }; export type GetProviderEmbeddingDimensionResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetProviderEmbeddingDimensionResponse = - GetProviderEmbeddingDimensionResponses[keyof GetProviderEmbeddingDimensionResponses]; +export type GetProviderEmbeddingDimensionResponse = GetProviderEmbeddingDimensionResponses[keyof GetProviderEmbeddingDimensionResponses]; export type SendChatMessageData = { - body: ChatRequestWritable; - path?: never; - query?: never; - url: '/api/v1/chat'; + body: ChatRequestWritable; + path?: never; + query?: never; + url: '/api/v1/chat'; }; export type SendChatMessageResponses = { - /** - * Server-sent chat stream or an error envelope - */ - 200: string; + /** + * Server-sent chat stream or an error envelope + */ + 200: string; }; -export type SendChatMessageResponse = - SendChatMessageResponses[keyof SendChatMessageResponses]; +export type SendChatMessageResponse = SendChatMessageResponses[keyof SendChatMessageResponses]; export type OpenChatWebSocketData = { - body?: never; - path?: never; - query?: { - api_key?: string; - key?: string; - }; - url: '/api/v1/chat/ws'; + body?: never; + path?: never; + query?: { + api_key?: string; + key?: string; + }; + url: '/api/v1/chat/ws'; }; export type OpenUnifiedChatWebSocketData = { - body?: never; - path?: never; - query: { - token: string; - }; - url: '/api/v1/unified-chat/ws'; + body?: never; + path?: never; + query: { + token: string; + }; + url: '/api/v1/unified-chat/ws'; }; export type ListChatSessionsData = { - body?: never; - path?: never; - query?: { - page?: number; - page_size?: number; - username?: string; - }; - url: '/api/v1/chat/sessions'; + body?: never; + path?: never; + query?: { + page?: number; + page_size?: number; + username?: string; + }; + url: '/api/v1/chat/sessions'; }; export type ListChatSessionsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListChatSessionsResponse = - ListChatSessionsResponses[keyof ListChatSessionsResponses]; +export type ListChatSessionsResponse = ListChatSessionsResponses[keyof ListChatSessionsResponses]; export type CreateChatSessionData = { - body?: never; - path?: never; - query?: { - platform_id?: string; - }; - url: '/api/v1/chat/sessions/new'; + body?: never; + path?: never; + query?: { + platform_id?: string; + }; + url: '/api/v1/chat/sessions/new'; }; export type CreateChatSessionResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type CreateChatSessionResponse = - CreateChatSessionResponses[keyof CreateChatSessionResponses]; +export type CreateChatSessionResponse = CreateChatSessionResponses[keyof CreateChatSessionResponses]; export type BatchDeleteChatSessionsData = { - body: ChatSessionBatchDeleteRequest; - path?: never; - query?: never; - url: '/api/v1/chat/sessions/batch-delete'; + body: ChatSessionBatchDeleteRequest; + path?: never; + query?: never; + url: '/api/v1/chat/sessions/batch-delete'; }; export type BatchDeleteChatSessionsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type BatchDeleteChatSessionsResponse = - BatchDeleteChatSessionsResponses[keyof BatchDeleteChatSessionsResponses]; +export type BatchDeleteChatSessionsResponse = BatchDeleteChatSessionsResponses[keyof BatchDeleteChatSessionsResponses]; export type DeleteChatSessionData = { - body?: never; - path: { - session_id: string; - }; - query?: never; - url: '/api/v1/chat/sessions/{session_id}'; + body?: never; + path: { + session_id: string; + }; + query?: never; + url: '/api/v1/chat/sessions/{session_id}'; }; export type DeleteChatSessionResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type DeleteChatSessionResponse = - DeleteChatSessionResponses[keyof DeleteChatSessionResponses]; +export type DeleteChatSessionResponse = DeleteChatSessionResponses[keyof DeleteChatSessionResponses]; export type GetChatSessionData = { - body?: never; - path: { - session_id: string; - }; - query?: { - page?: number; - page_size?: number; - }; - url: '/api/v1/chat/sessions/{session_id}'; + body?: never; + path: { + session_id: string; + }; + query?: { + page?: number; + page_size?: number; + }; + url: '/api/v1/chat/sessions/{session_id}'; }; export type GetChatSessionResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetChatSessionResponse = - GetChatSessionResponses[keyof GetChatSessionResponses]; +export type GetChatSessionResponse = GetChatSessionResponses[keyof GetChatSessionResponses]; export type UpdateChatSessionData = { - body: ChatSessionPatchRequest; - path: { - session_id: string; - }; - query?: never; - url: '/api/v1/chat/sessions/{session_id}'; + body: ChatSessionPatchRequest; + path: { + session_id: string; + }; + query?: never; + url: '/api/v1/chat/sessions/{session_id}'; }; export type UpdateChatSessionResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UpdateChatSessionResponse = - UpdateChatSessionResponses[keyof UpdateChatSessionResponses]; +export type UpdateChatSessionResponse = UpdateChatSessionResponses[keyof UpdateChatSessionResponses]; export type StopChatSessionData = { - body?: never; - path: { - session_id: string; - }; - query?: never; - url: '/api/v1/chat/sessions/{session_id}/stop'; + body?: never; + path: { + session_id: string; + }; + query?: never; + url: '/api/v1/chat/sessions/{session_id}/stop'; }; export type StopChatSessionResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type StopChatSessionResponse = - StopChatSessionResponses[keyof StopChatSessionResponses]; +export type StopChatSessionResponse = StopChatSessionResponses[keyof StopChatSessionResponses]; export type ResumeChatRunData = { - body?: never; - path: { - run_id: string; - }; - query?: never; - url: '/api/v1/chat/runs/{run_id}/stream'; + body?: never; + path: { + run_id: string; + }; + query?: never; + url: '/api/v1/chat/runs/{run_id}/stream'; }; export type ResumeChatRunResponses = { - /** - * Resumed server-sent chat stream or an error envelope - */ - 200: string; + /** + * Resumed server-sent chat stream or an error envelope + */ + 200: string; }; -export type ResumeChatRunResponse = - ResumeChatRunResponses[keyof ResumeChatRunResponses]; +export type ResumeChatRunResponse = ResumeChatRunResponses[keyof ResumeChatRunResponses]; export type UpdateChatMessageData = { - body: ChatMessagePatchRequest; - path: { - session_id: string; - message_id: string; - }; - query?: never; - url: '/api/v1/chat/sessions/{session_id}/messages/{message_id}'; + body: ChatMessagePatchRequest; + path: { + session_id: string; + message_id: string; + }; + query?: never; + url: '/api/v1/chat/sessions/{session_id}/messages/{message_id}'; }; export type UpdateChatMessageResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UpdateChatMessageResponse = - UpdateChatMessageResponses[keyof UpdateChatMessageResponses]; +export type UpdateChatMessageResponse = UpdateChatMessageResponses[keyof UpdateChatMessageResponses]; export type RegenerateChatMessageData = { - body?: ChatMessageRegenerateRequestWritable; - path: { - session_id: string; - message_id: string; - }; - query?: never; - url: '/api/v1/chat/sessions/{session_id}/messages/{message_id}/regenerate'; + body?: ChatMessageRegenerateRequestWritable; + path: { + session_id: string; + message_id: string; + }; + query?: never; + url: '/api/v1/chat/sessions/{session_id}/messages/{message_id}/regenerate'; }; export type RegenerateChatMessageResponses = { - /** - * Server-sent chat stream or an error envelope - */ - 200: string; + /** + * Server-sent chat stream or an error envelope + */ + 200: string; }; -export type RegenerateChatMessageResponse = - RegenerateChatMessageResponses[keyof RegenerateChatMessageResponses]; +export type RegenerateChatMessageResponse = RegenerateChatMessageResponses[keyof RegenerateChatMessageResponses]; export type ListChatConfigsData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/chat/configs'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/chat/configs'; }; export type ListChatConfigsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListChatConfigsResponse = - ListChatConfigsResponses[keyof ListChatConfigsResponses]; +export type ListChatConfigsResponse = ListChatConfigsResponses[keyof ListChatConfigsResponses]; export type CreateChatThreadData = { - body: ChatThreadCreateRequest; - path?: never; - query?: never; - url: '/api/v1/chat/threads'; + body: ChatThreadCreateRequest; + path?: never; + query?: never; + url: '/api/v1/chat/threads'; }; export type CreateChatThreadResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type CreateChatThreadResponse = - CreateChatThreadResponses[keyof CreateChatThreadResponses]; +export type CreateChatThreadResponse = CreateChatThreadResponses[keyof CreateChatThreadResponses]; export type DeleteChatThreadData = { - body?: never; - path: { - thread_id: string; - }; - query?: never; - url: '/api/v1/chat/threads/{thread_id}'; + body?: never; + path: { + thread_id: string; + }; + query?: never; + url: '/api/v1/chat/threads/{thread_id}'; }; export type DeleteChatThreadResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type DeleteChatThreadResponse = - DeleteChatThreadResponses[keyof DeleteChatThreadResponses]; +export type DeleteChatThreadResponse = DeleteChatThreadResponses[keyof DeleteChatThreadResponses]; export type GetChatThreadData = { - body?: never; - path: { - thread_id: string; - }; - query?: never; - url: '/api/v1/chat/threads/{thread_id}'; + body?: never; + path: { + thread_id: string; + }; + query?: never; + url: '/api/v1/chat/threads/{thread_id}'; }; export type GetChatThreadResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetChatThreadResponse = - GetChatThreadResponses[keyof GetChatThreadResponses]; +export type GetChatThreadResponse = GetChatThreadResponses[keyof GetChatThreadResponses]; export type SendChatThreadMessageData = { - body: ChatThreadMessageRequestWritable; - path: { - thread_id: string; - }; - query?: never; - url: '/api/v1/chat/threads/{thread_id}/messages'; + body: ChatThreadMessageRequestWritable; + path: { + thread_id: string; + }; + query?: never; + url: '/api/v1/chat/threads/{thread_id}/messages'; }; export type SendChatThreadMessageResponses = { - /** - * Server-sent chat stream or an error envelope - */ - 200: string; + /** + * Server-sent chat stream or an error envelope + */ + 200: string; }; -export type SendChatThreadMessageResponse = - SendChatThreadMessageResponses[keyof SendChatThreadMessageResponses]; +export type SendChatThreadMessageResponse = SendChatThreadMessageResponses[keyof SendChatThreadMessageResponses]; export type ListChatProjectsData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/chat/projects'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/chat/projects'; }; export type ListChatProjectsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListChatProjectsResponse = - ListChatProjectsResponses[keyof ListChatProjectsResponses]; +export type ListChatProjectsResponse = ListChatProjectsResponses[keyof ListChatProjectsResponses]; export type CreateChatProjectData = { - body: ChatProjectRequest; - path?: never; - query?: never; - url: '/api/v1/chat/projects'; + body: ChatProjectRequest; + path?: never; + query?: never; + url: '/api/v1/chat/projects'; }; export type CreateChatProjectResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type CreateChatProjectResponse = - CreateChatProjectResponses[keyof CreateChatProjectResponses]; +export type CreateChatProjectResponse = CreateChatProjectResponses[keyof CreateChatProjectResponses]; export type DeleteChatProjectData = { - body?: never; - path: { - project_id: string; - }; - query?: never; - url: '/api/v1/chat/projects/{project_id}'; + body?: never; + path: { + project_id: string; + }; + query?: never; + url: '/api/v1/chat/projects/{project_id}'; }; export type DeleteChatProjectResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type DeleteChatProjectResponse = - DeleteChatProjectResponses[keyof DeleteChatProjectResponses]; +export type DeleteChatProjectResponse = DeleteChatProjectResponses[keyof DeleteChatProjectResponses]; export type GetChatProjectData = { - body?: never; - path: { - project_id: string; - }; - query?: never; - url: '/api/v1/chat/projects/{project_id}'; + body?: never; + path: { + project_id: string; + }; + query?: never; + url: '/api/v1/chat/projects/{project_id}'; }; export type GetChatProjectResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetChatProjectResponse = - GetChatProjectResponses[keyof GetChatProjectResponses]; +export type GetChatProjectResponse = GetChatProjectResponses[keyof GetChatProjectResponses]; export type UpdateChatProjectData = { - body: ChatProjectRequest; - path: { - project_id: string; - }; - query?: never; - url: '/api/v1/chat/projects/{project_id}'; + body: ChatProjectRequest; + path: { + project_id: string; + }; + query?: never; + url: '/api/v1/chat/projects/{project_id}'; }; export type UpdateChatProjectResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UpdateChatProjectResponse = - UpdateChatProjectResponses[keyof UpdateChatProjectResponses]; +export type UpdateChatProjectResponse = UpdateChatProjectResponses[keyof UpdateChatProjectResponses]; export type ListChatProjectSessionsData = { - body?: never; - path: { - project_id: string; - }; - query?: never; - url: '/api/v1/chat/projects/{project_id}/sessions'; + body?: never; + path: { + project_id: string; + }; + query?: never; + url: '/api/v1/chat/projects/{project_id}/sessions'; }; export type ListChatProjectSessionsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListChatProjectSessionsResponse = - ListChatProjectSessionsResponses[keyof ListChatProjectSessionsResponses]; +export type ListChatProjectSessionsResponse = ListChatProjectSessionsResponses[keyof ListChatProjectSessionsResponses]; export type AddChatProjectSessionData = { - body?: never; - path: { - project_id: string; - session_id: string; - }; - query?: never; - url: '/api/v1/chat/projects/{project_id}/sessions/{session_id}'; + body?: never; + path: { + project_id: string; + session_id: string; + }; + query?: never; + url: '/api/v1/chat/projects/{project_id}/sessions/{session_id}'; }; export type AddChatProjectSessionResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type AddChatProjectSessionResponse = - AddChatProjectSessionResponses[keyof AddChatProjectSessionResponses]; +export type AddChatProjectSessionResponse = AddChatProjectSessionResponses[keyof AddChatProjectSessionResponses]; export type ListChatProjectWorkspaceFilesData = { - body?: never; - path: { - project_id: string; - }; - query?: { - path?: string; - }; - url: '/api/v1/chat/projects/{project_id}/workspace/files'; + body?: never; + path: { + project_id: string; + }; + query?: { + path?: string; + }; + url: '/api/v1/chat/projects/{project_id}/workspace/files'; }; export type ListChatProjectWorkspaceFilesResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListChatProjectWorkspaceFilesResponse = - ListChatProjectWorkspaceFilesResponses[keyof ListChatProjectWorkspaceFilesResponses]; +export type ListChatProjectWorkspaceFilesResponse = ListChatProjectWorkspaceFilesResponses[keyof ListChatProjectWorkspaceFilesResponses]; export type GetChatProjectWorkspaceFileData = { - body?: never; - path: { - project_id: string; - }; - query: { - path: string; - }; - url: '/api/v1/chat/projects/{project_id}/workspace/file'; + body?: never; + path: { + project_id: string; + }; + query: { + path: string; + }; + url: '/api/v1/chat/projects/{project_id}/workspace/file'; }; export type GetChatProjectWorkspaceFileResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetChatProjectWorkspaceFileResponse = - GetChatProjectWorkspaceFileResponses[keyof GetChatProjectWorkspaceFileResponses]; +export type GetChatProjectWorkspaceFileResponse = GetChatProjectWorkspaceFileResponses[keyof GetChatProjectWorkspaceFileResponses]; export type DownloadChatProjectWorkspaceFileData = { - body?: never; - path: { - project_id: string; - }; - query: { - path: string; - }; - url: '/api/v1/chat/projects/{project_id}/workspace/file/download'; + body?: never; + path: { + project_id: string; + }; + query: { + path: string; + }; + url: '/api/v1/chat/projects/{project_id}/workspace/file/download'; }; export type DownloadChatProjectWorkspaceFileResponses = { - /** - * Workspace file bytes - */ - 200: Blob | File; + /** + * Workspace file bytes + */ + 200: Blob | File; }; -export type DownloadChatProjectWorkspaceFileResponse = - DownloadChatProjectWorkspaceFileResponses[keyof DownloadChatProjectWorkspaceFileResponses]; +export type DownloadChatProjectWorkspaceFileResponse = DownloadChatProjectWorkspaceFileResponses[keyof DownloadChatProjectWorkspaceFileResponses]; export type RemoveChatProjectSessionData = { - body?: never; - path: { - session_id: string; - }; - query?: never; - url: '/api/v1/chat/projects/sessions/{session_id}'; + body?: never; + path: { + session_id: string; + }; + query?: never; + url: '/api/v1/chat/projects/sessions/{session_id}'; }; export type RemoveChatProjectSessionResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type RemoveChatProjectSessionResponse = - RemoveChatProjectSessionResponses[keyof RemoveChatProjectSessionResponses]; +export type RemoveChatProjectSessionResponse = RemoveChatProjectSessionResponses[keyof RemoveChatProjectSessionResponses]; export type SendImMessageData = { - body: ImMessageRequest; - path?: never; - query?: never; - url: '/api/v1/im/messages'; + body: ImMessageRequest; + path?: never; + query?: never; + url: '/api/v1/im/messages'; }; export type SendImMessageResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type SendImMessageResponse = - SendImMessageResponses[keyof SendImMessageResponses]; +export type SendImMessageResponse = SendImMessageResponses[keyof SendImMessageResponses]; export type ListImBotsData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/im/bots'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/im/bots'; }; export type ListImBotsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; export type ListImBotsResponse = ListImBotsResponses[keyof ListImBotsResponses]; export type UploadFileData = { - body: FileUploadRequest; - path?: never; - query?: never; - url: '/api/v1/files'; + body: FileUploadRequest; + path?: never; + query?: never; + url: '/api/v1/files'; }; export type UploadFileResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; export type UploadFileResponse = UploadFileResponses[keyof UploadFileResponses]; export type ListAppearanceWallpapersData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/appearance/wallpapers'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/appearance/wallpapers'; }; export type ListAppearanceWallpapersResponses = { - /** - * Dashboard wallpaper library - */ - 200: AppearanceWallpaperListResponse; + /** + * Dashboard wallpaper library + */ + 200: AppearanceWallpaperListResponse; }; -export type ListAppearanceWallpapersResponse = - ListAppearanceWallpapersResponses[keyof ListAppearanceWallpapersResponses]; +export type ListAppearanceWallpapersResponse = ListAppearanceWallpapersResponses[keyof ListAppearanceWallpapersResponses]; export type UploadAppearanceWallpaperData = { - body: AppearanceWallpaperUploadRequest; - path?: never; - query?: never; - url: '/api/v1/appearance/wallpapers'; + body: AppearanceWallpaperUploadRequest; + path?: never; + query?: never; + url: '/api/v1/appearance/wallpapers'; }; export type UploadAppearanceWallpaperErrors = { - /** - * Standard AstrBot error response - */ - 422: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 422: ErrorEnvelope; }; -export type UploadAppearanceWallpaperError = - UploadAppearanceWallpaperErrors[keyof UploadAppearanceWallpaperErrors]; +export type UploadAppearanceWallpaperError = UploadAppearanceWallpaperErrors[keyof UploadAppearanceWallpaperErrors]; export type UploadAppearanceWallpaperResponses = { - /** - * Uploaded Dashboard wallpaper - */ - 200: AppearanceWallpaperResponse; + /** + * Uploaded Dashboard wallpaper + */ + 200: AppearanceWallpaperResponse; }; -export type UploadAppearanceWallpaperResponse = - UploadAppearanceWallpaperResponses[keyof UploadAppearanceWallpaperResponses]; +export type UploadAppearanceWallpaperResponse = UploadAppearanceWallpaperResponses[keyof UploadAppearanceWallpaperResponses]; export type DeleteAppearanceWallpaperData = { - body?: never; - path: { - wallpaper_id: string; - }; - query?: never; - url: '/api/v1/appearance/wallpapers/{wallpaper_id}'; + body?: never; + path: { + wallpaper_id: string; + }; + query?: never; + url: '/api/v1/appearance/wallpapers/{wallpaper_id}'; }; export type DeleteAppearanceWallpaperErrors = { - /** - * Standard AstrBot error response - */ - 404: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 404: ErrorEnvelope; }; -export type DeleteAppearanceWallpaperError = - DeleteAppearanceWallpaperErrors[keyof DeleteAppearanceWallpaperErrors]; +export type DeleteAppearanceWallpaperError = DeleteAppearanceWallpaperErrors[keyof DeleteAppearanceWallpaperErrors]; export type DeleteAppearanceWallpaperResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type DeleteAppearanceWallpaperResponse = - DeleteAppearanceWallpaperResponses[keyof DeleteAppearanceWallpaperResponses]; +export type DeleteAppearanceWallpaperResponse = DeleteAppearanceWallpaperResponses[keyof DeleteAppearanceWallpaperResponses]; export type GetAppearanceWallpaperData = { - body?: never; - path: { - wallpaper_id: string; - }; - query?: never; - url: '/api/v1/appearance/wallpapers/{wallpaper_id}'; + body?: never; + path: { + wallpaper_id: string; + }; + query?: never; + url: '/api/v1/appearance/wallpapers/{wallpaper_id}'; }; export type GetAppearanceWallpaperErrors = { - /** - * Standard AstrBot error response - */ - 404: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 404: ErrorEnvelope; }; -export type GetAppearanceWallpaperError = - GetAppearanceWallpaperErrors[keyof GetAppearanceWallpaperErrors]; +export type GetAppearanceWallpaperError = GetAppearanceWallpaperErrors[keyof GetAppearanceWallpaperErrors]; export type GetAppearanceWallpaperResponses = { - /** - * Wallpaper image bytes - */ - 200: Blob | File; + /** + * Wallpaper image bytes + */ + 200: Blob | File; }; -export type GetAppearanceWallpaperResponse = - GetAppearanceWallpaperResponses[keyof GetAppearanceWallpaperResponses]; +export type GetAppearanceWallpaperResponse = GetAppearanceWallpaperResponses[keyof GetAppearanceWallpaperResponses]; export type GetAppearanceWallpaperThumbnailData = { - body?: never; - path: { - wallpaper_id: string; - }; - query?: never; - url: '/api/v1/appearance/wallpapers/{wallpaper_id}/thumbnail'; + body?: never; + path: { + wallpaper_id: string; + }; + query?: never; + url: '/api/v1/appearance/wallpapers/{wallpaper_id}/thumbnail'; }; export type GetAppearanceWallpaperThumbnailErrors = { - /** - * Standard AstrBot error response - */ - 404: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 404: ErrorEnvelope; }; -export type GetAppearanceWallpaperThumbnailError = - GetAppearanceWallpaperThumbnailErrors[keyof GetAppearanceWallpaperThumbnailErrors]; +export type GetAppearanceWallpaperThumbnailError = GetAppearanceWallpaperThumbnailErrors[keyof GetAppearanceWallpaperThumbnailErrors]; export type GetAppearanceWallpaperThumbnailResponses = { - /** - * WebP wallpaper thumbnail bytes - */ - 200: Blob | File; + /** + * WebP wallpaper thumbnail bytes + */ + 200: Blob | File; }; -export type GetAppearanceWallpaperThumbnailResponse = - GetAppearanceWallpaperThumbnailResponses[keyof GetAppearanceWallpaperThumbnailResponses]; +export type GetAppearanceWallpaperThumbnailResponse = GetAppearanceWallpaperThumbnailResponses[keyof GetAppearanceWallpaperThumbnailResponses]; export type DownloadOpenApiFileData = { - body?: never; - path?: never; - query: { - attachment_id: string; - }; - url: '/api/v1/file'; + body?: never; + path?: never; + query: { + attachment_id: string; + }; + url: '/api/v1/file'; }; export type DownloadOpenApiFileResponses = { - /** - * File content or an error envelope - */ - 200: Blob | File; + /** + * File content or an error envelope + */ + 200: Blob | File; }; -export type DownloadOpenApiFileResponse = - DownloadOpenApiFileResponses[keyof DownloadOpenApiFileResponses]; +export type DownloadOpenApiFileResponse = DownloadOpenApiFileResponses[keyof DownloadOpenApiFileResponses]; export type UploadOpenApiFileData = { - body: FileUploadRequest; - path?: never; - query?: never; - url: '/api/v1/file'; + body: FileUploadRequest; + path?: never; + query?: never; + url: '/api/v1/file'; }; export type UploadOpenApiFileResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UploadOpenApiFileResponse = - UploadOpenApiFileResponses[keyof UploadOpenApiFileResponses]; +export type UploadOpenApiFileResponse = UploadOpenApiFileResponses[keyof UploadOpenApiFileResponses]; export type GetFileByNameData = { - body?: never; - path?: never; - query: { - filename: string; - }; - url: '/api/v1/files/content'; + body?: never; + path?: never; + query: { + filename: string; + }; + url: '/api/v1/files/content'; }; export type GetFileByNameResponses = { - /** - * File bytes or an error envelope - */ - 200: Blob | File; + /** + * File bytes or an error envelope + */ + 200: Blob | File; }; -export type GetFileByNameResponse = - GetFileByNameResponses[keyof GetFileByNameResponses]; +export type GetFileByNameResponse = GetFileByNameResponses[keyof GetFileByNameResponses]; export type GetTokenFileData = { - body?: never; - path: { - file_token: string; - }; - query?: never; - url: '/api/v1/files/tokens/{file_token}'; + body?: never; + path: { + file_token: string; + }; + query?: never; + url: '/api/v1/files/tokens/{file_token}'; }; export type GetTokenFileResponses = { - /** - * Tokenized file bytes or an error envelope - */ - 200: Blob | File; + /** + * Tokenized file bytes or an error envelope + */ + 200: Blob | File; }; -export type GetTokenFileResponse = - GetTokenFileResponses[keyof GetTokenFileResponses]; +export type GetTokenFileResponse = GetTokenFileResponses[keyof GetTokenFileResponses]; export type DeleteAttachmentData = { - body?: never; - path: { - attachment_id: string; - }; - query?: never; - url: '/api/v1/files/{attachment_id}'; + body?: never; + path: { + attachment_id: string; + }; + query?: never; + url: '/api/v1/files/{attachment_id}'; }; export type DeleteAttachmentResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type DeleteAttachmentResponse = - DeleteAttachmentResponses[keyof DeleteAttachmentResponses]; +export type DeleteAttachmentResponse = DeleteAttachmentResponses[keyof DeleteAttachmentResponses]; export type GetAttachmentData = { - body?: never; - path: { - attachment_id: string; - }; - query?: never; - url: '/api/v1/files/{attachment_id}'; + body?: never; + path: { + attachment_id: string; + }; + query?: never; + url: '/api/v1/files/{attachment_id}'; }; export type GetAttachmentResponses = { - /** - * File content - */ - 200: Blob | File; + /** + * File content + */ + 200: Blob | File; }; -export type GetAttachmentResponse = - GetAttachmentResponses[keyof GetAttachmentResponses]; +export type GetAttachmentResponse = GetAttachmentResponses[keyof GetAttachmentResponses]; export type DownloadAttachmentData = { - body?: never; - path: { - attachment_id: string; - }; - query?: never; - url: '/api/v1/files/{attachment_id}/content'; + body?: never; + path: { + attachment_id: string; + }; + query?: never; + url: '/api/v1/files/{attachment_id}/content'; }; export type DownloadAttachmentResponses = { - /** - * File content - */ - 200: Blob | File; + /** + * File content + */ + 200: Blob | File; }; -export type DownloadAttachmentResponse = - DownloadAttachmentResponses[keyof DownloadAttachmentResponses]; +export type DownloadAttachmentResponse = DownloadAttachmentResponses[keyof DownloadAttachmentResponses]; export type GetPluginDashboardCatalogData = { - body?: never; - path: { - extension_id: string; - }; - query?: never; - url: '/api/v1/plugins/{extension_id}/dashboard'; + body?: never; + path: { + extension_id: string; + }; + query?: never; + url: '/api/v1/plugins/{extension_id}/dashboard'; }; export type GetPluginDashboardCatalogErrors = { - /** - * Standard AstrBot error response - */ - 401: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 404: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 503: ErrorEnvelope; -}; - -export type GetPluginDashboardCatalogError = - GetPluginDashboardCatalogErrors[keyof GetPluginDashboardCatalogErrors]; + /** + * Standard AstrBot error response + */ + 401: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 404: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 503: ErrorEnvelope; +}; + +export type GetPluginDashboardCatalogError = GetPluginDashboardCatalogErrors[keyof GetPluginDashboardCatalogErrors]; export type GetPluginDashboardCatalogResponses = { - /** - * Current Dashboard extension catalog - */ - 200: PluginDashboardCatalogResponse; + /** + * Current Dashboard extension catalog + */ + 200: PluginDashboardCatalogResponse; }; -export type GetPluginDashboardCatalogResponse = - GetPluginDashboardCatalogResponses[keyof GetPluginDashboardCatalogResponses]; +export type GetPluginDashboardCatalogResponse = GetPluginDashboardCatalogResponses[keyof GetPluginDashboardCatalogResponses]; export type CreatePluginDashboardPageSessionData = { - body: PluginDashboardSessionRequest; - path: { - extension_id: string; - page_id: string; - }; - query?: never; - url: '/api/v1/plugins/{extension_id}/dashboard/pages/{page_id}/session'; + body: PluginDashboardSessionRequest; + path: { + extension_id: string; + page_id: string; + }; + query?: never; + url: '/api/v1/plugins/{extension_id}/dashboard/pages/{page_id}/session'; }; export type CreatePluginDashboardPageSessionErrors = { - /** - * Standard AstrBot error response - */ - 401: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 404: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 409: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 429: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 503: ErrorEnvelope; -}; - -export type CreatePluginDashboardPageSessionError = - CreatePluginDashboardPageSessionErrors[keyof CreatePluginDashboardPageSessionErrors]; + /** + * Standard AstrBot error response + */ + 401: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 404: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 409: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 429: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 503: ErrorEnvelope; +}; + +export type CreatePluginDashboardPageSessionError = CreatePluginDashboardPageSessionErrors[keyof CreatePluginDashboardPageSessionErrors]; export type CreatePluginDashboardPageSessionResponses = { - /** - * Page session created - */ - 200: PluginDashboardSessionResponse; + /** + * Page session created + */ + 200: PluginDashboardSessionResponse; }; -export type CreatePluginDashboardPageSessionResponse = - CreatePluginDashboardPageSessionResponses[keyof CreatePluginDashboardPageSessionResponses]; +export type CreatePluginDashboardPageSessionResponse = CreatePluginDashboardPageSessionResponses[keyof CreatePluginDashboardPageSessionResponses]; export type InvokePluginDashboardActionData = { - body: PluginDashboardActionRequest; - path: { - extension_id: string; - action_id: string; - }; - query?: never; - url: '/api/v1/plugins/{extension_id}/dashboard/actions/{action_id}'; + body: PluginDashboardActionRequest; + path: { + extension_id: string; + action_id: string; + }; + query?: never; + url: '/api/v1/plugins/{extension_id}/dashboard/actions/{action_id}'; }; export type InvokePluginDashboardActionErrors = { - /** - * Standard AstrBot error response - */ - 400: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 401: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 403: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 404: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 409: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 413: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 422: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 429: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 500: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 503: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 504: ErrorEnvelope; -}; - -export type InvokePluginDashboardActionError = - InvokePluginDashboardActionErrors[keyof InvokePluginDashboardActionErrors]; + /** + * Standard AstrBot error response + */ + 400: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 401: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 403: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 404: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 409: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 413: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 422: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 429: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 500: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 503: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 504: ErrorEnvelope; +}; + +export type InvokePluginDashboardActionError = InvokePluginDashboardActionErrors[keyof InvokePluginDashboardActionErrors]; export type InvokePluginDashboardActionResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type InvokePluginDashboardActionResponse = - InvokePluginDashboardActionResponses[keyof InvokePluginDashboardActionResponses]; +export type InvokePluginDashboardActionResponse = InvokePluginDashboardActionResponses[keyof InvokePluginDashboardActionResponses]; export type InvokePluginDashboardUploadData = { - body: PluginDashboardUploadRequest; - path: { - extension_id: string; - action_id: string; - }; - query?: never; - url: '/api/v1/plugins/{extension_id}/dashboard/uploads/{action_id}'; + body: PluginDashboardUploadRequest; + path: { + extension_id: string; + action_id: string; + }; + query?: never; + url: '/api/v1/plugins/{extension_id}/dashboard/uploads/{action_id}'; }; export type InvokePluginDashboardUploadErrors = { - /** - * Standard AstrBot error response - */ - 400: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 401: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 403: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 404: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 409: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 413: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 415: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 422: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 429: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 500: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 503: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 504: ErrorEnvelope; -}; - -export type InvokePluginDashboardUploadError = - InvokePluginDashboardUploadErrors[keyof InvokePluginDashboardUploadErrors]; + /** + * Standard AstrBot error response + */ + 400: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 401: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 403: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 404: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 409: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 413: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 415: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 422: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 429: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 500: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 503: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 504: ErrorEnvelope; +}; + +export type InvokePluginDashboardUploadError = InvokePluginDashboardUploadErrors[keyof InvokePluginDashboardUploadErrors]; export type InvokePluginDashboardUploadResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type InvokePluginDashboardUploadResponse = - InvokePluginDashboardUploadResponses[keyof InvokePluginDashboardUploadResponses]; +export type InvokePluginDashboardUploadResponse = InvokePluginDashboardUploadResponses[keyof InvokePluginDashboardUploadResponses]; export type InvokePluginDashboardFileData = { - body: PluginDashboardFileRequest; - path: { - extension_id: string; - action_id: string; - }; - query?: never; - url: '/api/v1/plugins/{extension_id}/dashboard/files/{action_id}'; + body: PluginDashboardFileRequest; + path: { + extension_id: string; + action_id: string; + }; + query?: never; + url: '/api/v1/plugins/{extension_id}/dashboard/files/{action_id}'; }; export type InvokePluginDashboardFileErrors = { - /** - * Standard AstrBot error response - */ - 400: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 401: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 403: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 404: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 409: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 413: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 415: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 422: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 429: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 500: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 503: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 504: ErrorEnvelope; -}; - -export type InvokePluginDashboardFileError = - InvokePluginDashboardFileErrors[keyof InvokePluginDashboardFileErrors]; + /** + * Standard AstrBot error response + */ + 400: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 401: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 403: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 404: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 409: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 413: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 415: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 422: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 429: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 500: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 503: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 504: ErrorEnvelope; +}; + +export type InvokePluginDashboardFileError = InvokePluginDashboardFileErrors[keyof InvokePluginDashboardFileErrors]; export type InvokePluginDashboardFileResponses = { - /** - * File ticket created - */ - 200: PluginDashboardFileResponse; + /** + * File ticket created + */ + 200: PluginDashboardFileResponse; }; -export type InvokePluginDashboardFileResponse = - InvokePluginDashboardFileResponses[keyof InvokePluginDashboardFileResponses]; +export type InvokePluginDashboardFileResponse = InvokePluginDashboardFileResponses[keyof InvokePluginDashboardFileResponses]; export type ListPluginsData = { - body?: never; - path?: never; - query?: { - include_reserved?: boolean; - enabled?: boolean; - }; - url: '/api/v1/plugins'; + body?: never; + path?: never; + query?: { + include_reserved?: boolean; + enabled?: boolean; + }; + url: '/api/v1/plugins'; }; export type ListPluginsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListPluginsResponse = - ListPluginsResponses[keyof ListPluginsResponses]; +export type ListPluginsResponse = ListPluginsResponses[keyof ListPluginsResponses]; export type UninstallPluginData = { - body?: { - delete_config?: boolean; - delete_data?: boolean; - [key: string]: unknown; - }; - path: { - plugin_id: string; - }; - query?: never; - url: '/api/v1/plugins/{plugin_id}'; + body?: { + delete_config?: boolean; + delete_data?: boolean; + [key: string]: unknown; + }; + path: { + plugin_id: string; + }; + query?: never; + url: '/api/v1/plugins/{plugin_id}'; }; export type UninstallPluginResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UninstallPluginResponse = - UninstallPluginResponses[keyof UninstallPluginResponses]; +export type UninstallPluginResponse = UninstallPluginResponses[keyof UninstallPluginResponses]; export type GetPluginData = { - body?: { - delete_config?: boolean; - delete_data?: boolean; - [key: string]: unknown; - }; - path: { - plugin_id: string; - }; - query?: never; - url: '/api/v1/plugins/{plugin_id}'; + body?: { + delete_config?: boolean; + delete_data?: boolean; + [key: string]: unknown; + }; + path: { + plugin_id: string; + }; + query?: never; + url: '/api/v1/plugins/{plugin_id}'; }; export type GetPluginResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; export type GetPluginResponse = GetPluginResponses[keyof GetPluginResponses]; export type GetPluginConfigData = { - body?: never; - path: { - plugin_id: string; - }; - query?: never; - url: '/api/v1/plugins/{plugin_id}/config'; + body?: never; + path: { + plugin_id: string; + }; + query?: never; + url: '/api/v1/plugins/{plugin_id}/config'; }; export type GetPluginConfigResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetPluginConfigResponse = - GetPluginConfigResponses[keyof GetPluginConfigResponses]; +export type GetPluginConfigResponse = GetPluginConfigResponses[keyof GetPluginConfigResponses]; export type UpdatePluginConfigData = { - body: DynamicConfig; - path: { - plugin_id: string; - }; - query?: never; - url: '/api/v1/plugins/{plugin_id}/config'; + body: DynamicConfig; + path: { + plugin_id: string; + }; + query?: never; + url: '/api/v1/plugins/{plugin_id}/config'; }; export type UpdatePluginConfigResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UpdatePluginConfigResponse = - UpdatePluginConfigResponses[keyof UpdatePluginConfigResponses]; +export type UpdatePluginConfigResponse = UpdatePluginConfigResponses[keyof UpdatePluginConfigResponses]; export type UpdatePluginLogLevelData = { - body: { - /** - * Log level name, or null to follow the global level. - */ - level?: 'DEBUG' | 'INFO' | 'WARNING' | 'ERROR' | 'CRITICAL' | null; - [key: string]: unknown; - }; - path: { - plugin_id: string; - }; - query?: never; - url: '/api/v1/plugins/{plugin_id}/log-level'; + body: { + /** + * Log level name, or null to follow the global level. + */ + level?: 'DEBUG' | 'INFO' | 'WARNING' | 'ERROR' | 'CRITICAL' | null; + [key: string]: unknown; + }; + path: { + plugin_id: string; + }; + query?: never; + url: '/api/v1/plugins/{plugin_id}/log-level'; }; export type UpdatePluginLogLevelResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UpdatePluginLogLevelResponse = - UpdatePluginLogLevelResponses[keyof UpdatePluginLogLevelResponses]; +export type UpdatePluginLogLevelResponse = UpdatePluginLogLevelResponses[keyof UpdatePluginLogLevelResponses]; export type GetPluginConfigSchemaData = { - body?: never; - path: { - plugin_id: string; - }; - query?: never; - url: '/api/v1/plugins/{plugin_id}/config/schema'; + body?: never; + path: { + plugin_id: string; + }; + query?: never; + url: '/api/v1/plugins/{plugin_id}/config/schema'; }; export type GetPluginConfigSchemaResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetPluginConfigSchemaResponse = - GetPluginConfigSchemaResponses[keyof GetPluginConfigSchemaResponses]; +export type GetPluginConfigSchemaResponse = GetPluginConfigSchemaResponses[keyof GetPluginConfigSchemaResponses]; export type ListPluginConfigFilesData = { - body?: never; - path: { - plugin_id: string; - /** - * URL-encoded configuration key path. - */ - config_key: string; - }; - query?: never; - url: '/api/v1/plugins/{plugin_id}/config-files/{config_key}'; + body?: never; + path: { + plugin_id: string; + /** + * URL-encoded configuration key path. + */ + config_key: string; + }; + query?: never; + url: '/api/v1/plugins/{plugin_id}/config-files/{config_key}'; }; export type ListPluginConfigFilesResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListPluginConfigFilesResponse = - ListPluginConfigFilesResponses[keyof ListPluginConfigFilesResponses]; +export type ListPluginConfigFilesResponse = ListPluginConfigFilesResponses[keyof ListPluginConfigFilesResponses]; export type UploadPluginConfigFilesData = { - body: { - [key: string]: unknown; - }; - path: { - plugin_id: string; - /** - * URL-encoded configuration key path. - */ - config_key: string; - }; - query?: never; - url: '/api/v1/plugins/{plugin_id}/config-files/{config_key}'; + body: { + [key: string]: unknown; + }; + path: { + plugin_id: string; + /** + * URL-encoded configuration key path. + */ + config_key: string; + }; + query?: never; + url: '/api/v1/plugins/{plugin_id}/config-files/{config_key}'; }; export type UploadPluginConfigFilesResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UploadPluginConfigFilesResponse = - UploadPluginConfigFilesResponses[keyof UploadPluginConfigFilesResponses]; +export type UploadPluginConfigFilesResponse = UploadPluginConfigFilesResponses[keyof UploadPluginConfigFilesResponses]; export type DeletePluginConfigFileData = { - body: PluginConfigFileDeleteRequest; - path: { - plugin_id: string; - }; - query?: never; - url: '/api/v1/plugins/{plugin_id}/config-files'; + body: PluginConfigFileDeleteRequest; + path: { + plugin_id: string; + }; + query?: never; + url: '/api/v1/plugins/{plugin_id}/config-files'; }; export type DeletePluginConfigFileResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type DeletePluginConfigFileResponse = - DeletePluginConfigFileResponses[keyof DeletePluginConfigFileResponses]; +export type DeletePluginConfigFileResponse = DeletePluginConfigFileResponses[keyof DeletePluginConfigFileResponses]; export type GetPluginReadmeData = { - body?: never; - path: { - plugin_id: string; - }; - query?: never; - url: '/api/v1/plugins/{plugin_id}/readme'; + body?: never; + path: { + plugin_id: string; + }; + query?: never; + url: '/api/v1/plugins/{plugin_id}/readme'; }; export type GetPluginReadmeResponses = { - /** - * Text response - */ - 200: SuccessEnvelope; + /** + * Text response + */ + 200: SuccessEnvelope; }; -export type GetPluginReadmeResponse = - GetPluginReadmeResponses[keyof GetPluginReadmeResponses]; +export type GetPluginReadmeResponse = GetPluginReadmeResponses[keyof GetPluginReadmeResponses]; export type GetPluginChangelogData = { - body?: never; - path: { - plugin_id: string; - }; - query?: never; - url: '/api/v1/plugins/{plugin_id}/changelog'; + body?: never; + path: { + plugin_id: string; + }; + query?: never; + url: '/api/v1/plugins/{plugin_id}/changelog'; }; export type GetPluginChangelogResponses = { - /** - * Text response - */ - 200: SuccessEnvelope; + /** + * Text response + */ + 200: SuccessEnvelope; }; -export type GetPluginChangelogResponse = - GetPluginChangelogResponses[keyof GetPluginChangelogResponses]; +export type GetPluginChangelogResponse = GetPluginChangelogResponses[keyof GetPluginChangelogResponses]; export type ReloadPluginData = { - body?: never; - path: { - plugin_id: string; - }; - query?: never; - url: '/api/v1/plugins/{plugin_id}/reload'; + body?: never; + path: { + plugin_id: string; + }; + query?: never; + url: '/api/v1/plugins/{plugin_id}/reload'; }; export type ReloadPluginResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ReloadPluginResponse = - ReloadPluginResponses[keyof ReloadPluginResponses]; +export type ReloadPluginResponse = ReloadPluginResponses[keyof ReloadPluginResponses]; export type BindPluginSourceData = { - body: PluginSourceBindRequest; - path: { - plugin_id: string; - }; - query?: never; - url: '/api/v1/plugins/{plugin_id}/source'; + body: PluginSourceBindRequest; + path: { + plugin_id: string; + }; + query?: never; + url: '/api/v1/plugins/{plugin_id}/source'; }; export type BindPluginSourceResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type BindPluginSourceResponse = - BindPluginSourceResponses[keyof BindPluginSourceResponses]; +export type BindPluginSourceResponse = BindPluginSourceResponses[keyof BindPluginSourceResponses]; export type SetPluginEnabledData = { - body: EnabledPatch; - path: { - plugin_id: string; - }; - query?: never; - url: '/api/v1/plugins/{plugin_id}/enabled'; + body: EnabledPatch; + path: { + plugin_id: string; + }; + query?: never; + url: '/api/v1/plugins/{plugin_id}/enabled'; }; export type SetPluginEnabledResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type SetPluginEnabledResponse = - SetPluginEnabledResponses[keyof SetPluginEnabledResponses]; +export type SetPluginEnabledResponse = SetPluginEnabledResponses[keyof SetPluginEnabledResponses]; export type UpdatePluginData = { - body?: PluginUpdateRequest; - path: { - plugin_id: string; - }; - query?: never; - url: '/api/v1/plugins/{plugin_id}/update'; + body?: PluginUpdateRequest; + path: { + plugin_id: string; + }; + query?: never; + url: '/api/v1/plugins/{plugin_id}/update'; }; export type UpdatePluginResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UpdatePluginResponse = - UpdatePluginResponses[keyof UpdatePluginResponses]; +export type UpdatePluginResponse = UpdatePluginResponses[keyof UpdatePluginResponses]; export type UpdatePluginsData = { - body: PluginBatchUpdateRequest; - path?: never; - query?: never; - url: '/api/v1/plugins/update'; + body: PluginBatchUpdateRequest; + path?: never; + query?: never; + url: '/api/v1/plugins/update'; }; export type UpdatePluginsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UpdatePluginsResponse = - UpdatePluginsResponses[keyof UpdatePluginsResponses]; +export type UpdatePluginsResponse = UpdatePluginsResponses[keyof UpdatePluginsResponses]; export type ListFailedPluginsData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/plugins/failed'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/plugins/failed'; }; export type ListFailedPluginsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListFailedPluginsResponse = - ListFailedPluginsResponses[keyof ListFailedPluginsResponses]; +export type ListFailedPluginsResponse = ListFailedPluginsResponses[keyof ListFailedPluginsResponses]; export type UninstallFailedPluginData = { - body?: { - delete_config?: boolean; - delete_data?: boolean; - [key: string]: unknown; - }; - path: { - plugin_id: string; - }; - query?: never; - url: '/api/v1/plugins/failed/{plugin_id}'; + body?: { + delete_config?: boolean; + delete_data?: boolean; + [key: string]: unknown; + }; + path: { + plugin_id: string; + }; + query?: never; + url: '/api/v1/plugins/failed/{plugin_id}'; }; export type UninstallFailedPluginResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UninstallFailedPluginResponse = - UninstallFailedPluginResponses[keyof UninstallFailedPluginResponses]; +export type UninstallFailedPluginResponse = UninstallFailedPluginResponses[keyof UninstallFailedPluginResponses]; export type ReloadFailedPluginData = { - body?: never; - path: { - plugin_id: string; - }; - query?: never; - url: '/api/v1/plugins/failed/{plugin_id}/reload'; + body?: never; + path: { + plugin_id: string; + }; + query?: never; + url: '/api/v1/plugins/failed/{plugin_id}/reload'; }; export type ReloadFailedPluginResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ReloadFailedPluginResponse = - ReloadFailedPluginResponses[keyof ReloadFailedPluginResponses]; +export type ReloadFailedPluginResponse = ReloadFailedPluginResponses[keyof ReloadFailedPluginResponses]; export type InstallPluginFromGithubData = { - body: PluginGithubInstallRequest; - path?: never; - query?: never; - url: '/api/v1/plugins/install/github'; + body: PluginGithubInstallRequest; + path?: never; + query?: never; + url: '/api/v1/plugins/install/github'; }; export type InstallPluginFromGithubResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type InstallPluginFromGithubResponse = - InstallPluginFromGithubResponses[keyof InstallPluginFromGithubResponses]; +export type InstallPluginFromGithubResponse = InstallPluginFromGithubResponses[keyof InstallPluginFromGithubResponses]; export type InstallPluginFromUrlData = { - body: PluginUrlInstallRequest; - path?: never; - query?: never; - url: '/api/v1/plugins/install/url'; + body: PluginUrlInstallRequest; + path?: never; + query?: never; + url: '/api/v1/plugins/install/url'; }; export type InstallPluginFromUrlResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type InstallPluginFromUrlResponse = - InstallPluginFromUrlResponses[keyof InstallPluginFromUrlResponses]; +export type InstallPluginFromUrlResponse = InstallPluginFromUrlResponses[keyof InstallPluginFromUrlResponses]; export type InstallPluginFromUploadData = { - body: PluginUploadInstallRequest; - path?: never; - query?: never; - url: '/api/v1/plugins/install/upload'; + body: PluginUploadInstallRequest; + path?: never; + query?: never; + url: '/api/v1/plugins/install/upload'; }; export type InstallPluginFromUploadResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type InstallPluginFromUploadResponse = - InstallPluginFromUploadResponses[keyof InstallPluginFromUploadResponses]; +export type InstallPluginFromUploadResponse = InstallPluginFromUploadResponses[keyof InstallPluginFromUploadResponses]; export type ListPluginMarketData = { - body?: never; - path?: never; - query?: { - page?: number; - page_size?: number; - category?: string; - sort?: 'recommended' | 'downloads' | 'updated' | 'name'; - keyword?: string; - force_refresh?: boolean; - custom_registry?: string; - }; - url: '/api/v1/plugins/market'; + body?: never; + path?: never; + query?: { + page?: number; + page_size?: number; + category?: string; + sort?: 'recommended' | 'downloads' | 'updated' | 'name'; + keyword?: string; + force_refresh?: boolean; + custom_registry?: string; + }; + url: '/api/v1/plugins/market'; }; export type ListPluginMarketResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListPluginMarketResponse = - ListPluginMarketResponses[keyof ListPluginMarketResponses]; +export type ListPluginMarketResponse = ListPluginMarketResponses[keyof ListPluginMarketResponses]; export type ListPluginMarketCategoriesData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/plugins/market/categories'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/plugins/market/categories'; }; export type ListPluginMarketCategoriesResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListPluginMarketCategoriesResponse = - ListPluginMarketCategoriesResponses[keyof ListPluginMarketCategoriesResponses]; +export type ListPluginMarketCategoriesResponse = ListPluginMarketCategoriesResponses[keyof ListPluginMarketCategoriesResponses]; export type ListPluginSourcesData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/plugin-sources'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/plugin-sources'; }; export type ListPluginSourcesResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListPluginSourcesResponse = - ListPluginSourcesResponses[keyof ListPluginSourcesResponses]; +export type ListPluginSourcesResponse = ListPluginSourcesResponses[keyof ListPluginSourcesResponses]; export type CreatePluginSourceData = { - body: PluginSourceRequest; - path?: never; - query?: never; - url: '/api/v1/plugin-sources'; + body: PluginSourceRequest; + path?: never; + query?: never; + url: '/api/v1/plugin-sources'; }; export type CreatePluginSourceResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type CreatePluginSourceResponse = - CreatePluginSourceResponses[keyof CreatePluginSourceResponses]; +export type CreatePluginSourceResponse = CreatePluginSourceResponses[keyof CreatePluginSourceResponses]; export type ReplacePluginSourcesData = { - body: { - sources: Array; - }; - path?: never; - query?: never; - url: '/api/v1/plugin-sources'; + body: { + sources: Array; + }; + path?: never; + query?: never; + url: '/api/v1/plugin-sources'; }; export type ReplacePluginSourcesResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ReplacePluginSourcesResponse = - ReplacePluginSourcesResponses[keyof ReplacePluginSourcesResponses]; +export type ReplacePluginSourcesResponse = ReplacePluginSourcesResponses[keyof ReplacePluginSourcesResponses]; export type DeletePluginSourceData = { - body?: never; - path: { - source_id: string; - }; - query?: never; - url: '/api/v1/plugin-sources/{source_id}'; + body?: never; + path: { + source_id: string; + }; + query?: never; + url: '/api/v1/plugin-sources/{source_id}'; }; export type DeletePluginSourceResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type DeletePluginSourceResponse = - DeletePluginSourceResponses[keyof DeletePluginSourceResponses]; +export type DeletePluginSourceResponse = DeletePluginSourceResponses[keyof DeletePluginSourceResponses]; export type ListCommandsData = { - body?: never; - path?: never; - query?: { - config_id?: string; - }; - url: '/api/v1/commands'; + body?: never; + path?: never; + query?: { + config_id?: string; + }; + url: '/api/v1/commands'; }; export type ListCommandsResponses = { - /** - * Command list - */ - 200: CommandListEnvelope; + /** + * Command list + */ + 200: CommandListEnvelope; }; -export type ListCommandsResponse = - ListCommandsResponses[keyof ListCommandsResponses]; +export type ListCommandsResponse = ListCommandsResponses[keyof ListCommandsResponses]; export type UpdateCommandData = { - body: CommandPatchRequest; - path: { - /** - * Stable command identifier `{plugin_name}:{original_command}` with spaces replaced by dots. - */ - command_id: string; - }; - query?: never; - url: '/api/v1/commands/{command_id}'; + body: CommandPatchRequest; + path: { + /** + * Stable command identifier `{plugin_name}:{original_command}` with spaces replaced by dots. + */ + command_id: string; + }; + query?: never; + url: '/api/v1/commands/{command_id}'; }; export type UpdateCommandResponses = { - /** - * Updated command - */ - 200: CommandItemEnvelope; + /** + * Updated command + */ + 200: CommandItemEnvelope; }; -export type UpdateCommandResponse = - UpdateCommandResponses[keyof UpdateCommandResponses]; +export type UpdateCommandResponse = UpdateCommandResponses[keyof UpdateCommandResponses]; export type BulkToggleBuiltinCommandsData = { - body: BuiltinCommandBulkToggleRequest; - path?: never; - query?: never; - url: '/api/v1/commands/builtin'; + body: BuiltinCommandBulkToggleRequest; + path?: never; + query?: never; + url: '/api/v1/commands/builtin'; }; export type BulkToggleBuiltinCommandsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type BulkToggleBuiltinCommandsResponse = - BulkToggleBuiltinCommandsResponses[keyof BulkToggleBuiltinCommandsResponses]; +export type BulkToggleBuiltinCommandsResponse = BulkToggleBuiltinCommandsResponses[keyof BulkToggleBuiltinCommandsResponses]; export type ListCommandConflictsData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/commands/conflicts'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/commands/conflicts'; }; export type ListCommandConflictsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListCommandConflictsResponse = - ListCommandConflictsResponses[keyof ListCommandConflictsResponses]; +export type ListCommandConflictsResponse = ListCommandConflictsResponses[keyof ListCommandConflictsResponses]; export type ListToolsData = { - body?: never; - path?: never; - query?: { - origin?: 'builtin' | 'plugin' | 'mcp'; - enabled?: boolean; - }; - url: '/api/v1/tools'; + body?: never; + path?: never; + query?: { + origin?: 'builtin' | 'plugin' | 'mcp'; + enabled?: boolean; + }; + url: '/api/v1/tools'; }; export type ListToolsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; export type ListToolsResponse = ListToolsResponses[keyof ListToolsResponses]; export type SetToolEnabledData = { - body: EnabledPatch; - path: { - tool_id: string; - }; - query?: never; - url: '/api/v1/tools/{tool_id}/enabled'; + body: EnabledPatch; + path: { + tool_id: string; + }; + query?: never; + url: '/api/v1/tools/{tool_id}/enabled'; }; export type SetToolEnabledResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type SetToolEnabledResponse = - SetToolEnabledResponses[keyof SetToolEnabledResponses]; +export type SetToolEnabledResponse = SetToolEnabledResponses[keyof SetToolEnabledResponses]; export type SetParallelEnabledData = { - body: EnabledPatch; - path?: never; - query?: never; - url: '/api/v1/tools/parallel/enabled'; + body: EnabledPatch; + path?: never; + query?: never; + url: '/api/v1/tools/parallel/enabled'; }; export type SetParallelEnabledResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type SetParallelEnabledResponse = - SetParallelEnabledResponses[keyof SetParallelEnabledResponses]; +export type SetParallelEnabledResponse = SetParallelEnabledResponses[keyof SetParallelEnabledResponses]; export type SetToolParallelData = { - body: EnabledPatch; - path: { - tool_id: string; - }; - query?: never; - url: '/api/v1/tools/{tool_id}/parallel'; + body: EnabledPatch; + path: { + tool_id: string; + }; + query?: never; + url: '/api/v1/tools/{tool_id}/parallel'; }; export type SetToolParallelResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type SetToolParallelResponse = - SetToolParallelResponses[keyof SetToolParallelResponses]; +export type SetToolParallelResponse = SetToolParallelResponses[keyof SetToolParallelResponses]; export type ListMcpServersData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/mcp/servers'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/mcp/servers'; }; export type ListMcpServersResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListMcpServersResponse = - ListMcpServersResponses[keyof ListMcpServersResponses]; +export type ListMcpServersResponse = ListMcpServersResponses[keyof ListMcpServersResponses]; export type CreateMcpServerData = { - body: McpServerConfig; - path?: never; - query?: never; - url: '/api/v1/mcp/servers'; + body: McpServerConfig; + path?: never; + query?: never; + url: '/api/v1/mcp/servers'; }; export type CreateMcpServerResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type CreateMcpServerResponse = - CreateMcpServerResponses[keyof CreateMcpServerResponses]; +export type CreateMcpServerResponse = CreateMcpServerResponses[keyof CreateMcpServerResponses]; export type DeleteMcpServerData = { - body?: never; - path: { - server_name: string; - }; - query?: never; - url: '/api/v1/mcp/servers/{server_name}'; + body?: never; + path: { + server_name: string; + }; + query?: never; + url: '/api/v1/mcp/servers/{server_name}'; }; export type DeleteMcpServerResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type DeleteMcpServerResponse = - DeleteMcpServerResponses[keyof DeleteMcpServerResponses]; +export type DeleteMcpServerResponse = DeleteMcpServerResponses[keyof DeleteMcpServerResponses]; export type UpdateMcpServerData = { - body: McpServerConfig; - path: { - server_name: string; - }; - query?: never; - url: '/api/v1/mcp/servers/{server_name}'; + body: McpServerConfig; + path: { + server_name: string; + }; + query?: never; + url: '/api/v1/mcp/servers/{server_name}'; }; export type UpdateMcpServerResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UpdateMcpServerResponse = - UpdateMcpServerResponses[keyof UpdateMcpServerResponses]; +export type UpdateMcpServerResponse = UpdateMcpServerResponses[keyof UpdateMcpServerResponses]; export type SetMcpServerEnabledData = { - body: EnabledPatch; - path: { - server_name: string; - }; - query?: never; - url: '/api/v1/mcp/servers/{server_name}/enabled'; + body: EnabledPatch; + path: { + server_name: string; + }; + query?: never; + url: '/api/v1/mcp/servers/{server_name}/enabled'; }; export type SetMcpServerEnabledResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type SetMcpServerEnabledResponse = - SetMcpServerEnabledResponses[keyof SetMcpServerEnabledResponses]; +export type SetMcpServerEnabledResponse = SetMcpServerEnabledResponses[keyof SetMcpServerEnabledResponses]; export type TestMcpServerData = { - body?: McpServerConfig; - path: { - server_name: string; - }; - query?: never; - url: '/api/v1/mcp/servers/{server_name}/test'; + body?: McpServerConfig; + path: { + server_name: string; + }; + query?: never; + url: '/api/v1/mcp/servers/{server_name}/test'; }; export type TestMcpServerResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type TestMcpServerResponse = - TestMcpServerResponses[keyof TestMcpServerResponses]; +export type TestMcpServerResponse = TestMcpServerResponses[keyof TestMcpServerResponses]; export type GetMcpCatalogData = { - body?: never; - path: { - server_name: string; - }; - query?: never; - url: '/api/v1/mcp/servers/{server_name}/catalog'; + body?: never; + path: { + server_name: string; + }; + query?: never; + url: '/api/v1/mcp/servers/{server_name}/catalog'; }; export type GetMcpCatalogResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetMcpCatalogResponse = - GetMcpCatalogResponses[keyof GetMcpCatalogResponses]; +export type GetMcpCatalogResponse = GetMcpCatalogResponses[keyof GetMcpCatalogResponses]; export type ListMcpResourcesData = { - body?: never; - path: { - server_name: string; - }; - query?: never; - url: '/api/v1/mcp/servers/{server_name}/resources'; + body?: never; + path: { + server_name: string; + }; + query?: never; + url: '/api/v1/mcp/servers/{server_name}/resources'; }; export type ListMcpResourcesResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListMcpResourcesResponse = - ListMcpResourcesResponses[keyof ListMcpResourcesResponses]; +export type ListMcpResourcesResponse = ListMcpResourcesResponses[keyof ListMcpResourcesResponses]; export type ListMcpResourceTemplatesData = { - body?: never; - path: { - server_name: string; - }; - query?: never; - url: '/api/v1/mcp/servers/{server_name}/resources/templates'; + body?: never; + path: { + server_name: string; + }; + query?: never; + url: '/api/v1/mcp/servers/{server_name}/resources/templates'; }; export type ListMcpResourceTemplatesResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListMcpResourceTemplatesResponse = - ListMcpResourceTemplatesResponses[keyof ListMcpResourceTemplatesResponses]; +export type ListMcpResourceTemplatesResponse = ListMcpResourceTemplatesResponses[keyof ListMcpResourceTemplatesResponses]; export type ReadMcpResourceData = { - body: McpResourceReadRequest; - path: { - server_name: string; - }; - query?: never; - url: '/api/v1/mcp/servers/{server_name}/resources/read'; + body: McpResourceReadRequest; + path: { + server_name: string; + }; + query?: never; + url: '/api/v1/mcp/servers/{server_name}/resources/read'; }; export type ReadMcpResourceResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ReadMcpResourceResponse = - ReadMcpResourceResponses[keyof ReadMcpResourceResponses]; +export type ReadMcpResourceResponse = ReadMcpResourceResponses[keyof ReadMcpResourceResponses]; export type ListMcpPromptsData = { - body?: never; - path: { - server_name: string; - }; - query?: never; - url: '/api/v1/mcp/servers/{server_name}/prompts'; + body?: never; + path: { + server_name: string; + }; + query?: never; + url: '/api/v1/mcp/servers/{server_name}/prompts'; }; export type ListMcpPromptsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListMcpPromptsResponse = - ListMcpPromptsResponses[keyof ListMcpPromptsResponses]; +export type ListMcpPromptsResponse = ListMcpPromptsResponses[keyof ListMcpPromptsResponses]; export type GetMcpPromptData = { - body?: McpPromptGetRequest; - path: { - server_name: string; - prompt_name: string; - }; - query?: never; - url: '/api/v1/mcp/servers/{server_name}/prompts/{prompt_name}/get'; + body?: McpPromptGetRequest; + path: { + server_name: string; + prompt_name: string; + }; + query?: never; + url: '/api/v1/mcp/servers/{server_name}/prompts/{prompt_name}/get'; }; export type GetMcpPromptResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetMcpPromptResponse = - GetMcpPromptResponses[keyof GetMcpPromptResponses]; +export type GetMcpPromptResponse = GetMcpPromptResponses[keyof GetMcpPromptResponses]; export type CompleteMcpData = { - body: McpCompletionRequest; - path: { - server_name: string; - }; - query?: never; - url: '/api/v1/mcp/servers/{server_name}/completion'; + body: McpCompletionRequest; + path: { + server_name: string; + }; + query?: never; + url: '/api/v1/mcp/servers/{server_name}/completion'; }; export type CompleteMcpResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type CompleteMcpResponse = - CompleteMcpResponses[keyof CompleteMcpResponses]; +export type CompleteMcpResponse = CompleteMcpResponses[keyof CompleteMcpResponses]; export type GetMcpOAuthStatusData = { - body?: never; - path: { - server_name: string; - }; - query?: never; - url: '/api/v1/mcp/servers/{server_name}/oauth/status'; + body?: never; + path: { + server_name: string; + }; + query?: never; + url: '/api/v1/mcp/servers/{server_name}/oauth/status'; }; export type GetMcpOAuthStatusResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetMcpOAuthStatusResponse = - GetMcpOAuthStatusResponses[keyof GetMcpOAuthStatusResponses]; +export type GetMcpOAuthStatusResponse = GetMcpOAuthStatusResponses[keyof GetMcpOAuthStatusResponses]; export type StartMcpOAuthData = { - body?: never; - path: { - server_name: string; - }; - query?: never; - url: '/api/v1/mcp/servers/{server_name}/oauth/start'; + body?: never; + path: { + server_name: string; + }; + query?: never; + url: '/api/v1/mcp/servers/{server_name}/oauth/start'; }; export type StartMcpOAuthResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type StartMcpOAuthResponse = - StartMcpOAuthResponses[keyof StartMcpOAuthResponses]; +export type StartMcpOAuthResponse = StartMcpOAuthResponses[keyof StartMcpOAuthResponses]; export type RevokeMcpOAuthData = { - body?: never; - path: { - server_name: string; - }; - query?: never; - url: '/api/v1/mcp/servers/{server_name}/oauth'; + body?: never; + path: { + server_name: string; + }; + query?: never; + url: '/api/v1/mcp/servers/{server_name}/oauth'; }; export type RevokeMcpOAuthResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type RevokeMcpOAuthResponse = - RevokeMcpOAuthResponses[keyof RevokeMcpOAuthResponses]; +export type RevokeMcpOAuthResponse = RevokeMcpOAuthResponses[keyof RevokeMcpOAuthResponses]; export type CompleteMcpOAuthCallbackData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/mcp/oauth/callback'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/mcp/oauth/callback'; }; export type SyncModelScopeMcpServersData = { - body?: ModelScopeSyncRequest; - path?: never; - query?: never; - url: '/api/v1/mcp/providers/modelscope/sync'; + body?: ModelScopeSyncRequest; + path?: never; + query?: never; + url: '/api/v1/mcp/providers/modelscope/sync'; }; export type SyncModelScopeMcpServersResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type SyncModelScopeMcpServersResponse = - SyncModelScopeMcpServersResponses[keyof SyncModelScopeMcpServersResponses]; +export type SyncModelScopeMcpServersResponse = SyncModelScopeMcpServersResponses[keyof SyncModelScopeMcpServersResponses]; export type ListSkillsData = { - body?: never; - path?: never; - query?: { - enabled?: boolean; - source?: string; - }; - url: '/api/v1/skills'; + body?: never; + path?: never; + query?: { + enabled?: boolean; + source?: string; + }; + url: '/api/v1/skills'; }; export type ListSkillsResponses = { - /** - * Skills inventory - */ - 200: SkillInventoryResponse; + /** + * Skills inventory + */ + 200: SkillInventoryResponse; }; export type ListSkillsResponse = ListSkillsResponses[keyof ListSkillsResponses]; export type UploadSkillData = { - body: SkillUploadRequest; - path?: never; - query?: never; - url: '/api/v1/skills'; + body: SkillUploadRequest; + path?: never; + query?: never; + url: '/api/v1/skills'; }; export type UploadSkillResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UploadSkillResponse = - UploadSkillResponses[keyof UploadSkillResponses]; +export type UploadSkillResponse = UploadSkillResponses[keyof UploadSkillResponses]; export type UploadSkillsBatchData = { - body: { - files: Array; - }; - path?: never; - query?: never; - url: '/api/v1/skills/batch'; + body: { + files: Array; + }; + path?: never; + query?: never; + url: '/api/v1/skills/batch'; }; export type UploadSkillsBatchResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UploadSkillsBatchResponse = - UploadSkillsBatchResponses[keyof UploadSkillsBatchResponses]; +export type UploadSkillsBatchResponse = UploadSkillsBatchResponses[keyof UploadSkillsBatchResponses]; export type DeleteSkillData = { - body?: never; - path: { - skill_name: string; - }; - query?: never; - url: '/api/v1/skills/{skill_name}'; + body?: never; + path: { + skill_name: string; + }; + query?: never; + url: '/api/v1/skills/{skill_name}'; }; export type DeleteSkillResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type DeleteSkillResponse = - DeleteSkillResponses[keyof DeleteSkillResponses]; +export type DeleteSkillResponse = DeleteSkillResponses[keyof DeleteSkillResponses]; export type UpdateSkillData = { - body: SkillPatchRequest; - path: { - skill_name: string; - }; - query?: never; - url: '/api/v1/skills/{skill_name}'; + body: SkillPatchRequest; + path: { + skill_name: string; + }; + query?: never; + url: '/api/v1/skills/{skill_name}'; }; export type UpdateSkillResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UpdateSkillResponse = - UpdateSkillResponses[keyof UpdateSkillResponses]; +export type UpdateSkillResponse = UpdateSkillResponses[keyof UpdateSkillResponses]; export type DownloadSkillData = { - body?: never; - path: { - skill_name: string; - }; - query?: never; - url: '/api/v1/skills/{skill_name}/archive'; + body?: never; + path: { + skill_name: string; + }; + query?: never; + url: '/api/v1/skills/{skill_name}/archive'; }; export type DownloadSkillResponses = { - /** - * Skill archive - */ - 200: Blob | File; + /** + * Skill archive + */ + 200: Blob | File; }; -export type DownloadSkillResponse = - DownloadSkillResponses[keyof DownloadSkillResponses]; +export type DownloadSkillResponse = DownloadSkillResponses[keyof DownloadSkillResponses]; export type ListSkillFilesData = { - body?: never; - path: { - skill_name: string; - }; - query?: { - path?: string; - }; - url: '/api/v1/skills/{skill_name}/files'; + body?: never; + path: { + skill_name: string; + }; + query?: { + path?: string; + }; + url: '/api/v1/skills/{skill_name}/files'; }; export type ListSkillFilesResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListSkillFilesResponse = - ListSkillFilesResponses[keyof ListSkillFilesResponses]; +export type ListSkillFilesResponse = ListSkillFilesResponses[keyof ListSkillFilesResponses]; export type GetSkillFileData = { - body?: never; - path: { - skill_name: string; - /** - * URL-encoded relative file path. - */ - file_path: string; - }; - query?: never; - url: '/api/v1/skills/{skill_name}/files/{file_path}'; + body?: never; + path: { + skill_name: string; + /** + * URL-encoded relative file path. + */ + file_path: string; + }; + query?: never; + url: '/api/v1/skills/{skill_name}/files/{file_path}'; }; export type GetSkillFileResponses = { - /** - * Text response - */ - 200: SuccessEnvelope; + /** + * Text response + */ + 200: SuccessEnvelope; }; -export type GetSkillFileResponse = - GetSkillFileResponses[keyof GetSkillFileResponses]; +export type GetSkillFileResponse = GetSkillFileResponses[keyof GetSkillFileResponses]; export type UpdateSkillFileData = { - body: string; - path: { - skill_name: string; - /** - * URL-encoded relative file path. - */ - file_path: string; - }; - query?: never; - url: '/api/v1/skills/{skill_name}/files/{file_path}'; + body: string; + path: { + skill_name: string; + /** + * URL-encoded relative file path. + */ + file_path: string; + }; + query?: never; + url: '/api/v1/skills/{skill_name}/files/{file_path}'; }; export type UpdateSkillFileResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UpdateSkillFileResponse = - UpdateSkillFileResponses[keyof UpdateSkillFileResponses]; +export type UpdateSkillFileResponse = UpdateSkillFileResponses[keyof UpdateSkillFileResponses]; export type ListNeoSkillCandidatesData = { - body?: never; - path?: never; - query?: { - skill_key?: string; - status?: string; - }; - url: '/api/v1/skills/neo/candidates'; + body?: never; + path?: never; + query?: { + skill_key?: string; + status?: string; + }; + url: '/api/v1/skills/neo/candidates'; }; export type ListNeoSkillCandidatesResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListNeoSkillCandidatesResponse = - ListNeoSkillCandidatesResponses[keyof ListNeoSkillCandidatesResponses]; +export type ListNeoSkillCandidatesResponse = ListNeoSkillCandidatesResponses[keyof ListNeoSkillCandidatesResponses]; export type ListNeoSkillReleasesData = { - body?: never; - path?: never; - query?: { - skill_key?: string; - stage?: string; - }; - url: '/api/v1/skills/neo/releases'; + body?: never; + path?: never; + query?: { + skill_key?: string; + stage?: string; + }; + url: '/api/v1/skills/neo/releases'; }; export type ListNeoSkillReleasesResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListNeoSkillReleasesResponse = - ListNeoSkillReleasesResponses[keyof ListNeoSkillReleasesResponses]; +export type ListNeoSkillReleasesResponse = ListNeoSkillReleasesResponses[keyof ListNeoSkillReleasesResponses]; export type GetNeoSkillPayloadData = { - body?: never; - path?: never; - query: { - payload_ref: string; - }; - url: '/api/v1/skills/neo/payload'; + body?: never; + path?: never; + query: { + payload_ref: string; + }; + url: '/api/v1/skills/neo/payload'; }; export type GetNeoSkillPayloadResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetNeoSkillPayloadResponse = - GetNeoSkillPayloadResponses[keyof GetNeoSkillPayloadResponses]; +export type GetNeoSkillPayloadResponse = GetNeoSkillPayloadResponses[keyof GetNeoSkillPayloadResponses]; export type EvaluateNeoSkillCandidateData = { - body: NeoCandidateActionRequest; - path?: never; - query?: never; - url: '/api/v1/skills/neo/evaluate'; + body: NeoCandidateActionRequest; + path?: never; + query?: never; + url: '/api/v1/skills/neo/evaluate'; }; export type EvaluateNeoSkillCandidateResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type EvaluateNeoSkillCandidateResponse = - EvaluateNeoSkillCandidateResponses[keyof EvaluateNeoSkillCandidateResponses]; +export type EvaluateNeoSkillCandidateResponse = EvaluateNeoSkillCandidateResponses[keyof EvaluateNeoSkillCandidateResponses]; export type PromoteNeoSkillCandidateData = { - body: NeoCandidateActionRequest; - path?: never; - query?: never; - url: '/api/v1/skills/neo/promote'; + body: NeoCandidateActionRequest; + path?: never; + query?: never; + url: '/api/v1/skills/neo/promote'; }; export type PromoteNeoSkillCandidateResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type PromoteNeoSkillCandidateResponse = - PromoteNeoSkillCandidateResponses[keyof PromoteNeoSkillCandidateResponses]; +export type PromoteNeoSkillCandidateResponse = PromoteNeoSkillCandidateResponses[keyof PromoteNeoSkillCandidateResponses]; export type RollbackNeoSkillReleaseData = { - body: NeoReleaseActionRequest; - path?: never; - query?: never; - url: '/api/v1/skills/neo/rollback'; + body: NeoReleaseActionRequest; + path?: never; + query?: never; + url: '/api/v1/skills/neo/rollback'; }; export type RollbackNeoSkillReleaseResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type RollbackNeoSkillReleaseResponse = - RollbackNeoSkillReleaseResponses[keyof RollbackNeoSkillReleaseResponses]; +export type RollbackNeoSkillReleaseResponse = RollbackNeoSkillReleaseResponses[keyof RollbackNeoSkillReleaseResponses]; export type SyncNeoSkillReleaseData = { - body: NeoSyncRequest; - path?: never; - query?: never; - url: '/api/v1/skills/neo/sync'; + body: NeoSyncRequest; + path?: never; + query?: never; + url: '/api/v1/skills/neo/sync'; }; export type SyncNeoSkillReleaseResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type SyncNeoSkillReleaseResponse = - SyncNeoSkillReleaseResponses[keyof SyncNeoSkillReleaseResponses]; +export type SyncNeoSkillReleaseResponse = SyncNeoSkillReleaseResponses[keyof SyncNeoSkillReleaseResponses]; export type DeleteNeoSkillCandidateData = { - body: NeoCandidateActionRequest; - path?: never; - query?: never; - url: '/api/v1/skills/neo/candidates/delete'; + body: NeoCandidateActionRequest; + path?: never; + query?: never; + url: '/api/v1/skills/neo/candidates/delete'; }; export type DeleteNeoSkillCandidateResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type DeleteNeoSkillCandidateResponse = - DeleteNeoSkillCandidateResponses[keyof DeleteNeoSkillCandidateResponses]; +export type DeleteNeoSkillCandidateResponse = DeleteNeoSkillCandidateResponses[keyof DeleteNeoSkillCandidateResponses]; export type DeleteNeoSkillReleaseData = { - body: NeoReleaseActionRequest; - path?: never; - query?: never; - url: '/api/v1/skills/neo/releases/delete'; + body: NeoReleaseActionRequest; + path?: never; + query?: never; + url: '/api/v1/skills/neo/releases/delete'; }; export type DeleteNeoSkillReleaseResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type DeleteNeoSkillReleaseResponse = - DeleteNeoSkillReleaseResponses[keyof DeleteNeoSkillReleaseResponses]; +export type DeleteNeoSkillReleaseResponse = DeleteNeoSkillReleaseResponses[keyof DeleteNeoSkillReleaseResponses]; export type ListKnowledgeBasesData = { - body?: never; - path?: never; - query?: { - page?: number; - page_size?: number; - refresh_stats?: boolean; - }; - url: '/api/v1/knowledge-bases'; + body?: never; + path?: never; + query?: { + page?: number; + page_size?: number; + refresh_stats?: boolean; + }; + url: '/api/v1/knowledge-bases'; }; export type ListKnowledgeBasesResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListKnowledgeBasesResponse = - ListKnowledgeBasesResponses[keyof ListKnowledgeBasesResponses]; +export type ListKnowledgeBasesResponse = ListKnowledgeBasesResponses[keyof ListKnowledgeBasesResponses]; export type CreateKnowledgeBaseData = { - body: KnowledgeBaseCreateRequest; - path?: never; - query?: never; - url: '/api/v1/knowledge-bases'; + body: KnowledgeBaseCreateRequest; + path?: never; + query?: never; + url: '/api/v1/knowledge-bases'; }; export type CreateKnowledgeBaseResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type CreateKnowledgeBaseResponse = - CreateKnowledgeBaseResponses[keyof CreateKnowledgeBaseResponses]; +export type CreateKnowledgeBaseResponse = CreateKnowledgeBaseResponses[keyof CreateKnowledgeBaseResponses]; export type DeleteKnowledgeBaseData = { - body?: never; - path: { - kb_id: string; - }; - query?: never; - url: '/api/v1/knowledge-bases/{kb_id}'; + body?: never; + path: { + kb_id: string; + }; + query?: never; + url: '/api/v1/knowledge-bases/{kb_id}'; }; export type DeleteKnowledgeBaseResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type DeleteKnowledgeBaseResponse = - DeleteKnowledgeBaseResponses[keyof DeleteKnowledgeBaseResponses]; +export type DeleteKnowledgeBaseResponse = DeleteKnowledgeBaseResponses[keyof DeleteKnowledgeBaseResponses]; export type GetKnowledgeBaseData = { - body?: never; - path: { - kb_id: string; - }; - query?: never; - url: '/api/v1/knowledge-bases/{kb_id}'; + body?: never; + path: { + kb_id: string; + }; + query?: never; + url: '/api/v1/knowledge-bases/{kb_id}'; }; export type GetKnowledgeBaseResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetKnowledgeBaseResponse = - GetKnowledgeBaseResponses[keyof GetKnowledgeBaseResponses]; +export type GetKnowledgeBaseResponse = GetKnowledgeBaseResponses[keyof GetKnowledgeBaseResponses]; export type UpdateKnowledgeBaseData = { - body: KnowledgeBaseRequest; - path: { - kb_id: string; - }; - query?: never; - url: '/api/v1/knowledge-bases/{kb_id}'; + body: KnowledgeBaseRequest; + path: { + kb_id: string; + }; + query?: never; + url: '/api/v1/knowledge-bases/{kb_id}'; }; export type UpdateKnowledgeBaseResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UpdateKnowledgeBaseResponse = - UpdateKnowledgeBaseResponses[keyof UpdateKnowledgeBaseResponses]; +export type UpdateKnowledgeBaseResponse = UpdateKnowledgeBaseResponses[keyof UpdateKnowledgeBaseResponses]; export type GetKnowledgeBaseStatsData = { - body?: never; - path: { - kb_id: string; - }; - query?: never; - url: '/api/v1/knowledge-bases/{kb_id}/stats'; + body?: never; + path: { + kb_id: string; + }; + query?: never; + url: '/api/v1/knowledge-bases/{kb_id}/stats'; }; export type GetKnowledgeBaseStatsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetKnowledgeBaseStatsResponse = - GetKnowledgeBaseStatsResponses[keyof GetKnowledgeBaseStatsResponses]; +export type GetKnowledgeBaseStatsResponse = GetKnowledgeBaseStatsResponses[keyof GetKnowledgeBaseStatsResponses]; export type ListKnowledgeDocumentsData = { - body?: never; - path: { - kb_id: string; - }; - query?: { - page?: number; - page_size?: number; - /** - * Filter documents by name (case-insensitive partial match). - */ - search?: string; - }; - url: '/api/v1/knowledge-bases/{kb_id}/documents'; + body?: never; + path: { + kb_id: string; + }; + query?: { + page?: number; + page_size?: number; + /** + * Filter documents by name (case-insensitive partial match). + */ + search?: string; + }; + url: '/api/v1/knowledge-bases/{kb_id}/documents'; }; export type ListKnowledgeDocumentsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListKnowledgeDocumentsResponse = - ListKnowledgeDocumentsResponses[keyof ListKnowledgeDocumentsResponses]; +export type ListKnowledgeDocumentsResponse = ListKnowledgeDocumentsResponses[keyof ListKnowledgeDocumentsResponses]; export type UploadKnowledgeDocumentData = { - body: KnowledgeDocumentUploadRequest; - path: { - kb_id: string; - }; - query?: never; - url: '/api/v1/knowledge-bases/{kb_id}/documents'; + body: KnowledgeDocumentUploadRequest; + path: { + kb_id: string; + }; + query?: never; + url: '/api/v1/knowledge-bases/{kb_id}/documents'; }; export type UploadKnowledgeDocumentErrors = { - /** - * Standard AstrBot error response - */ - 422: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 503: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 422: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 503: ErrorEnvelope; }; -export type UploadKnowledgeDocumentError = - UploadKnowledgeDocumentErrors[keyof UploadKnowledgeDocumentErrors]; +export type UploadKnowledgeDocumentError = UploadKnowledgeDocumentErrors[keyof UploadKnowledgeDocumentErrors]; export type UploadKnowledgeDocumentResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UploadKnowledgeDocumentResponse = - UploadKnowledgeDocumentResponses[keyof UploadKnowledgeDocumentResponses]; +export type UploadKnowledgeDocumentResponse = UploadKnowledgeDocumentResponses[keyof UploadKnowledgeDocumentResponses]; export type ImportKnowledgeDocumentsData = { - body: KnowledgeDocumentImportRequest; - path: { - kb_id: string; - }; - query?: never; - url: '/api/v1/knowledge-bases/{kb_id}/documents/import'; + body: KnowledgeDocumentImportRequest; + path: { + kb_id: string; + }; + query?: never; + url: '/api/v1/knowledge-bases/{kb_id}/documents/import'; }; export type ImportKnowledgeDocumentsErrors = { - /** - * Standard AstrBot error response - */ - 422: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 503: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 422: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 503: ErrorEnvelope; }; -export type ImportKnowledgeDocumentsError = - ImportKnowledgeDocumentsErrors[keyof ImportKnowledgeDocumentsErrors]; +export type ImportKnowledgeDocumentsError = ImportKnowledgeDocumentsErrors[keyof ImportKnowledgeDocumentsErrors]; export type ImportKnowledgeDocumentsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ImportKnowledgeDocumentsResponse = - ImportKnowledgeDocumentsResponses[keyof ImportKnowledgeDocumentsResponses]; +export type ImportKnowledgeDocumentsResponse = ImportKnowledgeDocumentsResponses[keyof ImportKnowledgeDocumentsResponses]; export type ImportKnowledgeDocumentFromUrlData = { - body: KnowledgeDocumentUrlImportRequest; - path: { - kb_id: string; - }; - query?: never; - url: '/api/v1/knowledge-bases/{kb_id}/documents/import-url'; + body: KnowledgeDocumentUrlImportRequest; + path: { + kb_id: string; + }; + query?: never; + url: '/api/v1/knowledge-bases/{kb_id}/documents/import-url'; }; export type ImportKnowledgeDocumentFromUrlErrors = { - /** - * Standard AstrBot error response - */ - 422: ErrorEnvelope; - /** - * Standard AstrBot error response - */ - 503: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 422: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 503: ErrorEnvelope; }; -export type ImportKnowledgeDocumentFromUrlError = - ImportKnowledgeDocumentFromUrlErrors[keyof ImportKnowledgeDocumentFromUrlErrors]; +export type ImportKnowledgeDocumentFromUrlError = ImportKnowledgeDocumentFromUrlErrors[keyof ImportKnowledgeDocumentFromUrlErrors]; export type ImportKnowledgeDocumentFromUrlResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ImportKnowledgeDocumentFromUrlResponse = - ImportKnowledgeDocumentFromUrlResponses[keyof ImportKnowledgeDocumentFromUrlResponses]; +export type ImportKnowledgeDocumentFromUrlResponse = ImportKnowledgeDocumentFromUrlResponses[keyof ImportKnowledgeDocumentFromUrlResponses]; export type DeleteKnowledgeDocumentData = { - body?: never; - path: { - kb_id: string; - document_id: string; - }; - query?: never; - url: '/api/v1/knowledge-bases/{kb_id}/documents/{document_id}'; + body?: never; + path: { + kb_id: string; + document_id: string; + }; + query?: never; + url: '/api/v1/knowledge-bases/{kb_id}/documents/{document_id}'; }; export type DeleteKnowledgeDocumentResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type DeleteKnowledgeDocumentResponse = - DeleteKnowledgeDocumentResponses[keyof DeleteKnowledgeDocumentResponses]; +export type DeleteKnowledgeDocumentResponse = DeleteKnowledgeDocumentResponses[keyof DeleteKnowledgeDocumentResponses]; export type GetKnowledgeDocumentData = { - body?: never; - path: { - kb_id: string; - document_id: string; - }; - query?: never; - url: '/api/v1/knowledge-bases/{kb_id}/documents/{document_id}'; + body?: never; + path: { + kb_id: string; + document_id: string; + }; + query?: never; + url: '/api/v1/knowledge-bases/{kb_id}/documents/{document_id}'; }; export type GetKnowledgeDocumentResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetKnowledgeDocumentResponse = - GetKnowledgeDocumentResponses[keyof GetKnowledgeDocumentResponses]; +export type GetKnowledgeDocumentResponse = GetKnowledgeDocumentResponses[keyof GetKnowledgeDocumentResponses]; export type ReindexKnowledgeDocumentData = { - body?: never; - path: { - kb_id: string; - document_id: string; - }; - query?: never; - url: '/api/v1/knowledge-bases/{kb_id}/documents/{document_id}/reindex'; + body?: never; + path: { + kb_id: string; + document_id: string; + }; + query?: never; + url: '/api/v1/knowledge-bases/{kb_id}/documents/{document_id}/reindex'; }; export type ReindexKnowledgeDocumentErrors = { - /** - * Standard AstrBot error response - */ - 400: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 400: ErrorEnvelope; }; -export type ReindexKnowledgeDocumentError = - ReindexKnowledgeDocumentErrors[keyof ReindexKnowledgeDocumentErrors]; +export type ReindexKnowledgeDocumentError = ReindexKnowledgeDocumentErrors[keyof ReindexKnowledgeDocumentErrors]; export type ReindexKnowledgeDocumentResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ReindexKnowledgeDocumentResponse = - ReindexKnowledgeDocumentResponses[keyof ReindexKnowledgeDocumentResponses]; +export type ReindexKnowledgeDocumentResponse = ReindexKnowledgeDocumentResponses[keyof ReindexKnowledgeDocumentResponses]; export type ListKnowledgeChunksData = { - body?: never; - path: { - kb_id: string; - }; - query?: { - document_id?: string; - page?: number; - page_size?: number; - }; - url: '/api/v1/knowledge-bases/{kb_id}/chunks'; + body?: never; + path: { + kb_id: string; + }; + query?: { + document_id?: string; + page?: number; + page_size?: number; + }; + url: '/api/v1/knowledge-bases/{kb_id}/chunks'; }; export type ListKnowledgeChunksResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListKnowledgeChunksResponse = - ListKnowledgeChunksResponses[keyof ListKnowledgeChunksResponses]; +export type ListKnowledgeChunksResponse = ListKnowledgeChunksResponses[keyof ListKnowledgeChunksResponses]; export type DeleteKnowledgeChunkData = { - body?: never; - path: { - kb_id: string; - chunk_id: string; - }; - query: { - document_id: string; - }; - url: '/api/v1/knowledge-bases/{kb_id}/chunks/{chunk_id}'; + body?: never; + path: { + kb_id: string; + chunk_id: string; + }; + query: { + document_id: string; + }; + url: '/api/v1/knowledge-bases/{kb_id}/chunks/{chunk_id}'; }; export type DeleteKnowledgeChunkResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type DeleteKnowledgeChunkResponse = - DeleteKnowledgeChunkResponses[keyof DeleteKnowledgeChunkResponses]; +export type DeleteKnowledgeChunkResponse = DeleteKnowledgeChunkResponses[keyof DeleteKnowledgeChunkResponses]; export type RetrieveKnowledgeBaseData = { - body: KnowledgeRetrieveRequest; - path: { - kb_id: string; - }; - query?: never; - url: '/api/v1/knowledge-bases/{kb_id}/retrieve'; + body: KnowledgeRetrieveRequest; + path: { + kb_id: string; + }; + query?: never; + url: '/api/v1/knowledge-bases/{kb_id}/retrieve'; }; export type RetrieveKnowledgeBaseResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type RetrieveKnowledgeBaseResponse = - RetrieveKnowledgeBaseResponses[keyof RetrieveKnowledgeBaseResponses]; +export type RetrieveKnowledgeBaseResponse = RetrieveKnowledgeBaseResponses[keyof RetrieveKnowledgeBaseResponses]; export type GetKnowledgeTaskData = { - body?: never; - path: { - task_id: string; - }; - query?: never; - url: '/api/v1/knowledge-bases/tasks/{task_id}'; + body?: never; + path: { + task_id: string; + }; + query?: never; + url: '/api/v1/knowledge-bases/tasks/{task_id}'; }; export type GetKnowledgeTaskResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetKnowledgeTaskResponse = - GetKnowledgeTaskResponses[keyof GetKnowledgeTaskResponses]; +export type GetKnowledgeTaskResponse = GetKnowledgeTaskResponses[keyof GetKnowledgeTaskResponses]; export type ListMemoryFactsData = { - body?: never; - path?: never; - query?: { - page?: number; - page_size?: number; - person_id?: string; - chat_id?: string; - scope_id?: string; - status?: 'active' | 'deleted' | 'all'; - query?: string; - }; - url: '/api/v1/memory/facts'; + body?: never; + path?: never; + query?: { + page?: number; + page_size?: number; + person_id?: string; + chat_id?: string; + scope_id?: string; + status?: 'active' | 'deleted' | 'all'; + query?: string; + }; + url: '/api/v1/memory/facts'; }; export type ListMemoryFactsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListMemoryFactsResponse = - ListMemoryFactsResponses[keyof ListMemoryFactsResponses]; +export type ListMemoryFactsResponse = ListMemoryFactsResponses[keyof ListMemoryFactsResponses]; export type CreateMemoryFactData = { - body: MemoryFactCreateRequest; - path?: never; - query?: never; - url: '/api/v1/memory/facts'; + body: MemoryFactCreateRequest; + path?: never; + query?: never; + url: '/api/v1/memory/facts'; }; export type CreateMemoryFactResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type CreateMemoryFactResponse = - CreateMemoryFactResponses[keyof CreateMemoryFactResponses]; +export type CreateMemoryFactResponse = CreateMemoryFactResponses[keyof CreateMemoryFactResponses]; export type GetMemoryFactData = { - body?: never; - path: { - fact_id: number; - }; - query?: never; - url: '/api/v1/memory/facts/{fact_id}'; + body?: never; + path: { + fact_id: number; + }; + query?: never; + url: '/api/v1/memory/facts/{fact_id}'; }; export type GetMemoryFactResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetMemoryFactResponse = - GetMemoryFactResponses[keyof GetMemoryFactResponses]; +export type GetMemoryFactResponse = GetMemoryFactResponses[keyof GetMemoryFactResponses]; export type UpdateMemoryFactData = { - body: MemoryFactPatchRequest; - path: { - fact_id: number; - }; - query?: never; - url: '/api/v1/memory/facts/{fact_id}'; + body: MemoryFactPatchRequest; + path: { + fact_id: number; + }; + query?: never; + url: '/api/v1/memory/facts/{fact_id}'; }; export type UpdateMemoryFactResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UpdateMemoryFactResponse = - UpdateMemoryFactResponses[keyof UpdateMemoryFactResponses]; +export type UpdateMemoryFactResponse = UpdateMemoryFactResponses[keyof UpdateMemoryFactResponses]; export type DeleteMemoryFactData = { - body?: MemoryFactActionRequest; - path: { - fact_id: number; - }; - query?: never; - url: '/api/v1/memory/facts/{fact_id}/delete'; + body?: MemoryFactActionRequest; + path: { + fact_id: number; + }; + query?: never; + url: '/api/v1/memory/facts/{fact_id}/delete'; }; export type DeleteMemoryFactResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type DeleteMemoryFactResponse = - DeleteMemoryFactResponses[keyof DeleteMemoryFactResponses]; +export type DeleteMemoryFactResponse = DeleteMemoryFactResponses[keyof DeleteMemoryFactResponses]; export type RestoreMemoryFactData = { - body?: MemoryFactActionRequest; - path: { - fact_id: number; - }; - query?: never; - url: '/api/v1/memory/facts/{fact_id}/restore'; + body?: MemoryFactActionRequest; + path: { + fact_id: number; + }; + query?: never; + url: '/api/v1/memory/facts/{fact_id}/restore'; }; export type RestoreMemoryFactResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type RestoreMemoryFactResponse = - RestoreMemoryFactResponses[keyof RestoreMemoryFactResponses]; +export type RestoreMemoryFactResponse = RestoreMemoryFactResponses[keyof RestoreMemoryFactResponses]; export type ListMemoryProfilesData = { - body?: never; - path?: never; - query?: { - page?: number; - page_size?: number; - person_id?: string; - chat_scope?: string; - }; - url: '/api/v1/memory/profiles'; + body?: never; + path?: never; + query?: { + page?: number; + page_size?: number; + person_id?: string; + chat_scope?: string; + }; + url: '/api/v1/memory/profiles'; }; export type ListMemoryProfilesResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListMemoryProfilesResponse = - ListMemoryProfilesResponses[keyof ListMemoryProfilesResponses]; +export type ListMemoryProfilesResponse = ListMemoryProfilesResponses[keyof ListMemoryProfilesResponses]; export type RefreshMemoryProfileData = { - body?: MemoryProfileRefreshRequest; - path: { - person_id: string; - }; - query?: never; - url: '/api/v1/memory/profiles/{person_id}/refresh'; + body?: MemoryProfileRefreshRequest; + path: { + person_id: string; + }; + query?: never; + url: '/api/v1/memory/profiles/{person_id}/refresh'; }; export type RefreshMemoryProfileResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type RefreshMemoryProfileResponse = - RefreshMemoryProfileResponses[keyof RefreshMemoryProfileResponses]; +export type RefreshMemoryProfileResponse = RefreshMemoryProfileResponses[keyof RefreshMemoryProfileResponses]; export type ListMemoryOperationsData = { - body?: never; - path?: never; - query?: { - page?: number; - page_size?: number; - target_type?: string; - target_id?: string; - }; - url: '/api/v1/memory/operations'; + body?: never; + path?: never; + query?: { + page?: number; + page_size?: number; + target_type?: string; + target_id?: string; + }; + url: '/api/v1/memory/operations'; }; export type ListMemoryOperationsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListMemoryOperationsResponse = - ListMemoryOperationsResponses[keyof ListMemoryOperationsResponses]; +export type ListMemoryOperationsResponse = ListMemoryOperationsResponses[keyof ListMemoryOperationsResponses]; export type GetMemoryStatsData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/memory/stats'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/memory/stats'; }; export type GetMemoryStatsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetMemoryStatsResponse = - GetMemoryStatsResponses[keyof GetMemoryStatsResponses]; +export type GetMemoryStatsResponse = GetMemoryStatsResponses[keyof GetMemoryStatsResponses]; export type GetPersonaTreeData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/personas/tree'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/personas/tree'; }; export type GetPersonaTreeResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetPersonaTreeResponse = - GetPersonaTreeResponses[keyof GetPersonaTreeResponses]; +export type GetPersonaTreeResponse = GetPersonaTreeResponses[keyof GetPersonaTreeResponses]; export type ListPersonasData = { - body?: never; - path?: never; - query?: { - folder_id?: string; - }; - url: '/api/v1/personas'; + body?: never; + path?: never; + query?: { + folder_id?: string; + }; + url: '/api/v1/personas'; }; export type ListPersonasResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListPersonasResponse = - ListPersonasResponses[keyof ListPersonasResponses]; +export type ListPersonasResponse = ListPersonasResponses[keyof ListPersonasResponses]; export type CreatePersonaData = { - body: PersonaRequest; - path?: never; - query?: never; - url: '/api/v1/personas'; + body: PersonaRequest; + path?: never; + query?: never; + url: '/api/v1/personas'; }; export type CreatePersonaResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type CreatePersonaResponse = - CreatePersonaResponses[keyof CreatePersonaResponses]; +export type CreatePersonaResponse = CreatePersonaResponses[keyof CreatePersonaResponses]; export type DeletePersonaData = { - body?: never; - path: { - persona_id: string; - }; - query?: never; - url: '/api/v1/personas/{persona_id}'; + body?: never; + path: { + persona_id: string; + }; + query?: never; + url: '/api/v1/personas/{persona_id}'; }; export type DeletePersonaResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type DeletePersonaResponse = - DeletePersonaResponses[keyof DeletePersonaResponses]; +export type DeletePersonaResponse = DeletePersonaResponses[keyof DeletePersonaResponses]; export type GetPersonaData = { - body?: never; - path: { - persona_id: string; - }; - query?: never; - url: '/api/v1/personas/{persona_id}'; + body?: never; + path: { + persona_id: string; + }; + query?: never; + url: '/api/v1/personas/{persona_id}'; }; export type GetPersonaResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; export type GetPersonaResponse = GetPersonaResponses[keyof GetPersonaResponses]; export type UpdatePersonaData = { - body: PersonaRequest; - path: { - persona_id: string; - }; - query?: never; - url: '/api/v1/personas/{persona_id}'; + body: PersonaRequest; + path: { + persona_id: string; + }; + query?: never; + url: '/api/v1/personas/{persona_id}'; }; export type UpdatePersonaResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UpdatePersonaResponse = - UpdatePersonaResponses[keyof UpdatePersonaResponses]; +export type UpdatePersonaResponse = UpdatePersonaResponses[keyof UpdatePersonaResponses]; export type ListPersonaFoldersData = { - body?: never; - path?: never; - query?: { - parent_id?: string; - }; - url: '/api/v1/persona-folders'; + body?: never; + path?: never; + query?: { + parent_id?: string; + }; + url: '/api/v1/persona-folders'; }; export type ListPersonaFoldersResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListPersonaFoldersResponse = - ListPersonaFoldersResponses[keyof ListPersonaFoldersResponses]; +export type ListPersonaFoldersResponse = ListPersonaFoldersResponses[keyof ListPersonaFoldersResponses]; export type CreatePersonaFolderData = { - body: PersonaFolderRequest; - path?: never; - query?: never; - url: '/api/v1/persona-folders'; + body: PersonaFolderRequest; + path?: never; + query?: never; + url: '/api/v1/persona-folders'; }; export type CreatePersonaFolderResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type CreatePersonaFolderResponse = - CreatePersonaFolderResponses[keyof CreatePersonaFolderResponses]; +export type CreatePersonaFolderResponse = CreatePersonaFolderResponses[keyof CreatePersonaFolderResponses]; export type DeletePersonaFolderData = { - body?: never; - path: { - folder_id: string; - }; - query?: never; - url: '/api/v1/persona-folders/{folder_id}'; + body?: never; + path: { + folder_id: string; + }; + query?: never; + url: '/api/v1/persona-folders/{folder_id}'; }; export type DeletePersonaFolderResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type DeletePersonaFolderResponse = - DeletePersonaFolderResponses[keyof DeletePersonaFolderResponses]; +export type DeletePersonaFolderResponse = DeletePersonaFolderResponses[keyof DeletePersonaFolderResponses]; export type UpdatePersonaFolderData = { - body: PersonaFolderRequest; - path: { - folder_id: string; - }; - query?: never; - url: '/api/v1/persona-folders/{folder_id}'; + body: PersonaFolderRequest; + path: { + folder_id: string; + }; + query?: never; + url: '/api/v1/persona-folders/{folder_id}'; }; export type UpdatePersonaFolderResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UpdatePersonaFolderResponse = - UpdatePersonaFolderResponses[keyof UpdatePersonaFolderResponses]; +export type UpdatePersonaFolderResponse = UpdatePersonaFolderResponses[keyof UpdatePersonaFolderResponses]; export type MovePersonaItemData = { - body: PersonaMoveRequest; - path?: never; - query?: never; - url: '/api/v1/personas/move'; + body: PersonaMoveRequest; + path?: never; + query?: never; + url: '/api/v1/personas/move'; }; export type MovePersonaItemResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type MovePersonaItemResponse = - MovePersonaItemResponses[keyof MovePersonaItemResponses]; +export type MovePersonaItemResponse = MovePersonaItemResponses[keyof MovePersonaItemResponses]; export type ReorderPersonaItemsData = { - body: ReorderRequest; - path?: never; - query?: never; - url: '/api/v1/personas/reorder'; + body: ReorderRequest; + path?: never; + query?: never; + url: '/api/v1/personas/reorder'; }; export type ReorderPersonaItemsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ReorderPersonaItemsResponse = - ReorderPersonaItemsResponses[keyof ReorderPersonaItemsResponses]; +export type ReorderPersonaItemsResponse = ReorderPersonaItemsResponses[keyof ReorderPersonaItemsResponses]; export type ListSessionsData = { - body?: never; - path?: never; - query?: { - page?: number; - page_size?: number; - search?: string; - platform?: string; - message_type?: 'all' | 'group' | 'private'; - }; - url: '/api/v1/sessions'; + body?: never; + path?: never; + query?: { + page?: number; + page_size?: number; + search?: string; + platform?: string; + message_type?: 'all' | 'group' | 'private'; + }; + url: '/api/v1/sessions'; }; export type ListSessionsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListSessionsResponse = - ListSessionsResponses[keyof ListSessionsResponses]; +export type ListSessionsResponse = ListSessionsResponses[keyof ListSessionsResponses]; export type ListActiveUmosData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/sessions/active-umos'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/sessions/active-umos'; }; export type ListActiveUmosResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListActiveUmosResponse = - ListActiveUmosResponses[keyof ListActiveUmosResponses]; +export type ListActiveUmosResponse = ListActiveUmosResponses[keyof ListActiveUmosResponses]; export type ListSessionRulesData = { - body?: never; - path?: never; - query?: { - page?: number; - page_size?: number; - search?: string; - }; - url: '/api/v1/sessions/rules'; + body?: never; + path?: never; + query?: { + page?: number; + page_size?: number; + search?: string; + }; + url: '/api/v1/sessions/rules'; }; export type ListSessionRulesResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListSessionRulesResponse = - ListSessionRulesResponses[keyof ListSessionRulesResponses]; +export type ListSessionRulesResponse = ListSessionRulesResponses[keyof ListSessionRulesResponses]; export type UpsertSessionRuleData = { - body: SessionRuleRequest; - path?: never; - query?: never; - url: '/api/v1/sessions/rules'; + body: SessionRuleRequest; + path?: never; + query?: never; + url: '/api/v1/sessions/rules'; }; export type UpsertSessionRuleResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UpsertSessionRuleResponse = - UpsertSessionRuleResponses[keyof UpsertSessionRuleResponses]; +export type UpsertSessionRuleResponse = UpsertSessionRuleResponses[keyof UpsertSessionRuleResponses]; export type DeleteSessionRulesData = { - body: UmoListRequest; - path?: never; - query?: never; - url: '/api/v1/sessions/rules/delete'; + body: UmoListRequest; + path?: never; + query?: never; + url: '/api/v1/sessions/rules/delete'; }; export type DeleteSessionRulesResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type DeleteSessionRulesResponse = - DeleteSessionRulesResponses[keyof DeleteSessionRulesResponses]; +export type DeleteSessionRulesResponse = DeleteSessionRulesResponses[keyof DeleteSessionRulesResponses]; export type BatchUpdateSessionProviderData = { - body: BatchSessionProviderRequest; - path?: never; - query?: never; - url: '/api/v1/sessions/provider'; + body: BatchSessionProviderRequest; + path?: never; + query?: never; + url: '/api/v1/sessions/provider'; }; export type BatchUpdateSessionProviderResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type BatchUpdateSessionProviderResponse = - BatchUpdateSessionProviderResponses[keyof BatchUpdateSessionProviderResponses]; +export type BatchUpdateSessionProviderResponse = BatchUpdateSessionProviderResponses[keyof BatchUpdateSessionProviderResponses]; export type BatchUpdateSessionServiceData = { - body: BatchSessionServiceRequest; - path?: never; - query?: never; - url: '/api/v1/sessions/service'; + body: BatchSessionServiceRequest; + path?: never; + query?: never; + url: '/api/v1/sessions/service'; }; export type BatchUpdateSessionServiceResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type BatchUpdateSessionServiceResponse = - BatchUpdateSessionServiceResponses[keyof BatchUpdateSessionServiceResponses]; +export type BatchUpdateSessionServiceResponse = BatchUpdateSessionServiceResponses[keyof BatchUpdateSessionServiceResponses]; export type ListSessionGroupsData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/session-groups'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/session-groups'; }; export type ListSessionGroupsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListSessionGroupsResponse = - ListSessionGroupsResponses[keyof ListSessionGroupsResponses]; +export type ListSessionGroupsResponse = ListSessionGroupsResponses[keyof ListSessionGroupsResponses]; export type CreateSessionGroupData = { - body: SessionGroupRequest; - path?: never; - query?: never; - url: '/api/v1/session-groups'; + body: SessionGroupRequest; + path?: never; + query?: never; + url: '/api/v1/session-groups'; }; export type CreateSessionGroupResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type CreateSessionGroupResponse = - CreateSessionGroupResponses[keyof CreateSessionGroupResponses]; +export type CreateSessionGroupResponse = CreateSessionGroupResponses[keyof CreateSessionGroupResponses]; export type DeleteSessionGroupData = { - body?: never; - path: { - group_id: string; - }; - query?: never; - url: '/api/v1/session-groups/{group_id}'; + body?: never; + path: { + group_id: string; + }; + query?: never; + url: '/api/v1/session-groups/{group_id}'; }; export type DeleteSessionGroupResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type DeleteSessionGroupResponse = - DeleteSessionGroupResponses[keyof DeleteSessionGroupResponses]; +export type DeleteSessionGroupResponse = DeleteSessionGroupResponses[keyof DeleteSessionGroupResponses]; export type UpdateSessionGroupData = { - body: SessionGroupRequest; - path: { - group_id: string; - }; - query?: never; - url: '/api/v1/session-groups/{group_id}'; + body: SessionGroupRequest; + path: { + group_id: string; + }; + query?: never; + url: '/api/v1/session-groups/{group_id}'; }; export type UpdateSessionGroupResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UpdateSessionGroupResponse = - UpdateSessionGroupResponses[keyof UpdateSessionGroupResponses]; +export type UpdateSessionGroupResponse = UpdateSessionGroupResponses[keyof UpdateSessionGroupResponses]; export type ListConversationsData = { - body?: never; - path?: never; - query?: { - page?: number; - page_size?: number; - platform_id?: string; - user_id?: string; - search?: string; - /** - * Comma-separated platform IDs. - */ - platforms?: string; - /** - * Comma-separated message types. - */ - message_types?: string; - /** - * Comma-separated user IDs to exclude. - */ - exclude_ids?: string; - /** - * Comma-separated platforms to exclude. - */ - exclude_platforms?: string; - /** - * Match conversation titles or message content. - */ - keyword?: string; - /** - * Match the unified message origin. - */ - umo?: string; - sort_by?: 'created_at' | 'updated_at'; - sort_order?: 'asc' | 'desc'; - /** - * Paginate by UMO and return all conversation summaries for each selected session. - */ - group_by_session?: boolean; - /** - * Include serialized message history in list results. - */ - include_history?: boolean; - }; - url: '/api/v1/conversations'; + body?: never; + path?: never; + query?: { + page?: number; + page_size?: number; + platform_id?: string; + user_id?: string; + search?: string; + /** + * Comma-separated platform IDs. + */ + platforms?: string; + /** + * Comma-separated message types. + */ + message_types?: string; + /** + * Comma-separated user IDs to exclude. + */ + exclude_ids?: string; + /** + * Comma-separated platforms to exclude. + */ + exclude_platforms?: string; + /** + * Match conversation titles or message content. + */ + keyword?: string; + /** + * Match the unified message origin. + */ + umo?: string; + sort_by?: 'created_at' | 'updated_at'; + sort_order?: 'asc' | 'desc'; + /** + * Paginate by UMO and return all conversation summaries for each selected session. + */ + group_by_session?: boolean; + /** + * Include serialized message history in list results. + */ + include_history?: boolean; + }; + url: '/api/v1/conversations'; }; export type ListConversationsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListConversationsResponse = - ListConversationsResponses[keyof ListConversationsResponses]; +export type ListConversationsResponse = ListConversationsResponses[keyof ListConversationsResponses]; export type GetConversationFilterOptionsData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/conversations/filter-options'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/conversations/filter-options'; }; export type GetConversationFilterOptionsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetConversationFilterOptionsResponse = - GetConversationFilterOptionsResponses[keyof GetConversationFilterOptionsResponses]; +export type GetConversationFilterOptionsResponse = GetConversationFilterOptionsResponses[keyof GetConversationFilterOptionsResponses]; export type BatchDeleteConversationsData = { - body: ConversationBatchDeleteRequest; - path?: never; - query?: never; - url: '/api/v1/conversations/batch-delete'; + body: ConversationBatchDeleteRequest; + path?: never; + query?: never; + url: '/api/v1/conversations/batch-delete'; }; export type BatchDeleteConversationsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type BatchDeleteConversationsResponse = - BatchDeleteConversationsResponses[keyof BatchDeleteConversationsResponses]; +export type BatchDeleteConversationsResponse = BatchDeleteConversationsResponses[keyof BatchDeleteConversationsResponses]; export type DeleteConversationData = { - body?: never; - path: { - conversation_id: string; - }; - query: { - user_id: string; - }; - url: '/api/v1/conversations/{conversation_id}'; + body?: never; + path: { + conversation_id: string; + }; + query: { + user_id: string; + }; + url: '/api/v1/conversations/{conversation_id}'; }; export type DeleteConversationResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type DeleteConversationResponse = - DeleteConversationResponses[keyof DeleteConversationResponses]; +export type DeleteConversationResponse = DeleteConversationResponses[keyof DeleteConversationResponses]; export type GetConversationData = { - body?: never; - path: { - conversation_id: string; - }; - query: { - user_id: string; - }; - url: '/api/v1/conversations/{conversation_id}'; + body?: never; + path: { + conversation_id: string; + }; + query: { + user_id: string; + }; + url: '/api/v1/conversations/{conversation_id}'; }; export type GetConversationResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetConversationResponse = - GetConversationResponses[keyof GetConversationResponses]; +export type GetConversationResponse = GetConversationResponses[keyof GetConversationResponses]; export type UpdateConversationData = { - body: ConversationPatchRequest; - path: { - conversation_id: string; - }; - query: { - user_id: string; - }; - url: '/api/v1/conversations/{conversation_id}'; + body: ConversationPatchRequest; + path: { + conversation_id: string; + }; + query: { + user_id: string; + }; + url: '/api/v1/conversations/{conversation_id}'; }; export type UpdateConversationResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UpdateConversationResponse = - UpdateConversationResponses[keyof UpdateConversationResponses]; +export type UpdateConversationResponse = UpdateConversationResponses[keyof UpdateConversationResponses]; export type ReplaceConversationMessagesData = { - body: ConversationMessagesReplaceRequest; - path: { - conversation_id: string; - }; - query: { - user_id: string; - }; - url: '/api/v1/conversations/{conversation_id}/messages'; + body: ConversationMessagesReplaceRequest; + path: { + conversation_id: string; + }; + query: { + user_id: string; + }; + url: '/api/v1/conversations/{conversation_id}/messages'; }; export type ReplaceConversationMessagesResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ReplaceConversationMessagesResponse = - ReplaceConversationMessagesResponses[keyof ReplaceConversationMessagesResponses]; +export type ReplaceConversationMessagesResponse = ReplaceConversationMessagesResponses[keyof ReplaceConversationMessagesResponses]; export type ExportConversationsData = { - body: ConversationExportRequest; - path?: never; - query?: never; - url: '/api/v1/conversations/export'; + body: ConversationExportRequest; + path?: never; + query?: never; + url: '/api/v1/conversations/export'; }; export type ExportConversationsResponses = { - /** - * Exported conversation data - */ - 200: Blob | File; + /** + * Exported conversation data + */ + 200: Blob | File; }; -export type ExportConversationsResponse = - ExportConversationsResponses[keyof ExportConversationsResponses]; +export type ExportConversationsResponse = ExportConversationsResponses[keyof ExportConversationsResponses]; export type GetStatsData = { - body?: never; - path?: never; - query?: { - offset_sec?: number; - }; - url: '/api/v1/stats'; + body?: never; + path?: never; + query?: { + offset_sec?: number; + }; + url: '/api/v1/stats'; }; export type GetStatsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; export type GetStatsResponse = GetStatsResponses[keyof GetStatsResponses]; export type GetProviderTokenStatsData = { - body?: never; - path?: never; - query?: { - days?: number; - }; - url: '/api/v1/stats/provider-tokens'; + body?: never; + path?: never; + query?: { + days?: number; + }; + url: '/api/v1/stats/provider-tokens'; }; export type GetProviderTokenStatsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetProviderTokenStatsResponse = - GetProviderTokenStatsResponses[keyof GetProviderTokenStatsResponses]; +export type GetProviderTokenStatsResponse = GetProviderTokenStatsResponses[keyof GetProviderTokenStatsResponses]; export type GetVersionData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/stats/version'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/stats/version'; }; export type GetVersionResponses = { - /** - * Version information with a backend runtime snapshot - */ - 200: SuccessEnvelope & { - data?: { - runtime: RuntimeInfo; + /** + * Version information with a backend runtime snapshot + */ + 200: SuccessEnvelope & { + data?: { + runtime: RuntimeInfo; + }; }; - }; }; export type GetVersionResponse = GetVersionResponses[keyof GetVersionResponses]; export type GetPublicVersionsData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/stats/versions'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/stats/versions'; }; export type GetPublicVersionsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetPublicVersionsResponse = - GetPublicVersionsResponses[keyof GetPublicVersionsResponses]; +export type GetPublicVersionsResponse = GetPublicVersionsResponses[keyof GetPublicVersionsResponses]; export type GetFirstNoticeData = { - body?: never; - path?: never; - query?: { - locale?: 'zh-CN' | 'en-US'; - }; - url: '/api/v1/stats/first-notice'; + body?: never; + path?: never; + query?: { + locale?: 'zh-CN' | 'en-US'; + }; + url: '/api/v1/stats/first-notice'; }; export type GetFirstNoticeResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetFirstNoticeResponse = - GetFirstNoticeResponses[keyof GetFirstNoticeResponses]; +export type GetFirstNoticeResponse = GetFirstNoticeResponses[keyof GetFirstNoticeResponses]; export type TestGhproxyConnectionData = { - body: GhproxyTestRequest; - path?: never; - query?: never; - url: '/api/v1/stats/ghproxy/test'; + body: GhproxyTestRequest; + path?: never; + query?: never; + url: '/api/v1/stats/ghproxy/test'; }; export type TestGhproxyConnectionResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type TestGhproxyConnectionResponse = - TestGhproxyConnectionResponses[keyof TestGhproxyConnectionResponses]; +export type TestGhproxyConnectionResponse = TestGhproxyConnectionResponses[keyof TestGhproxyConnectionResponses]; export type ListChangelogVersionsData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/changelogs'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/changelogs'; }; export type ListChangelogVersionsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListChangelogVersionsResponse = - ListChangelogVersionsResponses[keyof ListChangelogVersionsResponses]; +export type ListChangelogVersionsResponse = ListChangelogVersionsResponses[keyof ListChangelogVersionsResponses]; export type GetChangelogData = { - body?: never; - path: { - version: string; - }; - query?: never; - url: '/api/v1/changelogs/{version}'; + body?: never; + path: { + version: string; + }; + query?: never; + url: '/api/v1/changelogs/{version}'; }; export type GetChangelogErrors = { - /** - * Standard AstrBot error response - */ - 404: ErrorEnvelope; + /** + * Standard AstrBot error response + */ + 404: ErrorEnvelope; }; export type GetChangelogError = GetChangelogErrors[keyof GetChangelogErrors]; export type GetChangelogResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetChangelogResponse = - GetChangelogResponses[keyof GetChangelogResponses]; +export type GetChangelogResponse = GetChangelogResponses[keyof GetChangelogResponses]; export type GetStartTimeData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/stats/start-time'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/stats/start-time'; }; export type GetStartTimeResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetStartTimeResponse = - GetStartTimeResponses[keyof GetStartTimeResponses]; +export type GetStartTimeResponse = GetStartTimeResponses[keyof GetStartTimeResponses]; export type GetT2iRuntimeStatsData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/stats/t2i'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/stats/t2i'; }; export type GetT2iRuntimeStatsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetT2iRuntimeStatsResponse = - GetT2iRuntimeStatsResponses[keyof GetT2iRuntimeStatsResponses]; +export type GetT2iRuntimeStatsResponse = GetT2iRuntimeStatsResponses[keyof GetT2iRuntimeStatsResponses]; export type GetStorageStatusData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/stats/storage'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/stats/storage'; }; export type GetStorageStatusResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetStorageStatusResponse = - GetStorageStatusResponses[keyof GetStorageStatusResponses]; +export type GetStorageStatusResponse = GetStorageStatusResponses[keyof GetStorageStatusResponses]; export type CleanupStorageData = { - body?: StorageCleanupRequest; - path?: never; - query?: never; - url: '/api/v1/stats/storage/cleanup'; + body?: StorageCleanupRequest; + path?: never; + query?: never; + url: '/api/v1/stats/storage/cleanup'; }; export type CleanupStorageResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type CleanupStorageResponse = - CleanupStorageResponses[keyof CleanupStorageResponses]; +export type CleanupStorageResponse = CleanupStorageResponses[keyof CleanupStorageResponses]; export type RestartCoreData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/system/restart'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/system/restart'; }; export type RestartCoreResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type RestartCoreResponse = - RestartCoreResponses[keyof RestartCoreResponses]; +export type RestartCoreResponse = RestartCoreResponses[keyof RestartCoreResponses]; export type ListBackupsData = { - body?: never; - path?: never; - query?: { - page?: number; - page_size?: number; - }; - url: '/api/v1/backups'; + body?: never; + path?: never; + query?: { + page?: number; + page_size?: number; + }; + url: '/api/v1/backups'; }; export type ListBackupsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListBackupsResponse = - ListBackupsResponses[keyof ListBackupsResponses]; +export type ListBackupsResponse = ListBackupsResponses[keyof ListBackupsResponses]; export type CreateBackupData = { - body?: BackupExportRequest; - path?: never; - query?: never; - url: '/api/v1/backups'; + body?: BackupExportRequest; + path?: never; + query?: never; + url: '/api/v1/backups'; }; export type CreateBackupResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type CreateBackupResponse = - CreateBackupResponses[keyof CreateBackupResponses]; +export type CreateBackupResponse = CreateBackupResponses[keyof CreateBackupResponses]; export type UploadBackupData = { - body: BackupUploadRequest; - path?: never; - query?: never; - url: '/api/v1/backups/upload'; + body: BackupUploadRequest; + path?: never; + query?: never; + url: '/api/v1/backups/upload'; }; export type UploadBackupResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UploadBackupResponse = - UploadBackupResponses[keyof UploadBackupResponses]; +export type UploadBackupResponse = UploadBackupResponses[keyof UploadBackupResponses]; export type InitBackupUploadData = { - body: BackupUploadInitRequest; - path?: never; - query?: never; - url: '/api/v1/backups/upload/init'; + body: BackupUploadInitRequest; + path?: never; + query?: never; + url: '/api/v1/backups/upload/init'; }; export type InitBackupUploadResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type InitBackupUploadResponse = - InitBackupUploadResponses[keyof InitBackupUploadResponses]; +export type InitBackupUploadResponse = InitBackupUploadResponses[keyof InitBackupUploadResponses]; export type UploadBackupChunkData = { - body: BackupChunkUploadRequest; - path?: never; - query?: never; - url: '/api/v1/backups/upload/chunk'; + body: BackupChunkUploadRequest; + path?: never; + query?: never; + url: '/api/v1/backups/upload/chunk'; }; export type UploadBackupChunkResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UploadBackupChunkResponse = - UploadBackupChunkResponses[keyof UploadBackupChunkResponses]; +export type UploadBackupChunkResponse = UploadBackupChunkResponses[keyof UploadBackupChunkResponses]; export type CompleteBackupUploadData = { - body: BackupUploadSessionRequest; - path?: never; - query?: never; - url: '/api/v1/backups/upload/complete'; + body: BackupUploadSessionRequest; + path?: never; + query?: never; + url: '/api/v1/backups/upload/complete'; }; export type CompleteBackupUploadResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type CompleteBackupUploadResponse = - CompleteBackupUploadResponses[keyof CompleteBackupUploadResponses]; +export type CompleteBackupUploadResponse = CompleteBackupUploadResponses[keyof CompleteBackupUploadResponses]; export type AbortBackupUploadData = { - body: BackupUploadSessionRequest; - path?: never; - query?: never; - url: '/api/v1/backups/upload/abort'; + body: BackupUploadSessionRequest; + path?: never; + query?: never; + url: '/api/v1/backups/upload/abort'; }; export type AbortBackupUploadResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type AbortBackupUploadResponse = - AbortBackupUploadResponses[keyof AbortBackupUploadResponses]; +export type AbortBackupUploadResponse = AbortBackupUploadResponses[keyof AbortBackupUploadResponses]; export type GetBackupProgressData = { - body?: never; - path: { - task_id: string; - }; - query?: never; - url: '/api/v1/backups/tasks/{task_id}'; + body?: never; + path: { + task_id: string; + }; + query?: never; + url: '/api/v1/backups/tasks/{task_id}'; }; export type GetBackupProgressResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetBackupProgressResponse = - GetBackupProgressResponses[keyof GetBackupProgressResponses]; +export type GetBackupProgressResponse = GetBackupProgressResponses[keyof GetBackupProgressResponses]; export type DeleteBackupData = { - body?: never; - path: { - filename: string; - }; - query?: never; - url: '/api/v1/backups/{filename}'; + body?: never; + path: { + filename: string; + }; + query?: never; + url: '/api/v1/backups/{filename}'; }; export type DeleteBackupResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type DeleteBackupResponse = - DeleteBackupResponses[keyof DeleteBackupResponses]; +export type DeleteBackupResponse = DeleteBackupResponses[keyof DeleteBackupResponses]; export type DownloadBackupData = { - body?: never; - path: { - filename: string; - }; - query?: never; - url: '/api/v1/backups/{filename}'; + body?: never; + path: { + filename: string; + }; + query?: never; + url: '/api/v1/backups/{filename}'; }; export type DownloadBackupResponses = { - /** - * Backup archive - */ - 200: Blob | File; + /** + * Backup archive + */ + 200: Blob | File; }; -export type DownloadBackupResponse = - DownloadBackupResponses[keyof DownloadBackupResponses]; +export type DownloadBackupResponse = DownloadBackupResponses[keyof DownloadBackupResponses]; export type RenameBackupData = { - body: BackupRenameRequest; - path: { - filename: string; - }; - query?: never; - url: '/api/v1/backups/{filename}'; + body: BackupRenameRequest; + path: { + filename: string; + }; + query?: never; + url: '/api/v1/backups/{filename}'; }; export type RenameBackupResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type RenameBackupResponse = - RenameBackupResponses[keyof RenameBackupResponses]; +export type RenameBackupResponse = RenameBackupResponses[keyof RenameBackupResponses]; export type CheckBackupData = { - body?: never; - path: { - filename: string; - }; - query?: never; - url: '/api/v1/backups/{filename}/check'; + body?: never; + path: { + filename: string; + }; + query?: never; + url: '/api/v1/backups/{filename}/check'; }; export type CheckBackupResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type CheckBackupResponse = - CheckBackupResponses[keyof CheckBackupResponses]; +export type CheckBackupResponse = CheckBackupResponses[keyof CheckBackupResponses]; export type ImportBackupData = { - body?: BackupImportRequest; - path: { - filename: string; - }; - query?: never; - url: '/api/v1/backups/{filename}/import'; + body?: BackupImportRequest; + path: { + filename: string; + }; + query?: never; + url: '/api/v1/backups/{filename}/import'; }; export type ImportBackupResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ImportBackupResponse = - ImportBackupResponses[keyof ImportBackupResponses]; +export type ImportBackupResponse = ImportBackupResponses[keyof ImportBackupResponses]; export type InstallPipPackageData = { - body: PipInstallRequest; - path?: never; - query?: never; - url: '/api/v1/pip/install'; + body: PipInstallRequest; + path?: never; + query?: never; + url: '/api/v1/pip/install'; }; export type InstallPipPackageResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type InstallPipPackageResponse = - InstallPipPackageResponses[keyof InstallPipPackageResponses]; +export type InstallPipPackageResponse = InstallPipPackageResponses[keyof InstallPipPackageResponses]; export type ListCronJobsData = { - body?: never; - path?: never; - query?: { - type?: string; - }; - url: '/api/v1/cron/jobs'; + body?: never; + path?: never; + query?: { + type?: string; + }; + url: '/api/v1/cron/jobs'; }; export type ListCronJobsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListCronJobsResponse = - ListCronJobsResponses[keyof ListCronJobsResponses]; +export type ListCronJobsResponse = ListCronJobsResponses[keyof ListCronJobsResponses]; export type CreateCronJobData = { - body: CronJobRequest; - path?: never; - query?: never; - url: '/api/v1/cron/jobs'; + body: CronJobRequest; + path?: never; + query?: never; + url: '/api/v1/cron/jobs'; }; export type CreateCronJobResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type CreateCronJobResponse = - CreateCronJobResponses[keyof CreateCronJobResponses]; +export type CreateCronJobResponse = CreateCronJobResponses[keyof CreateCronJobResponses]; export type DeleteCronJobData = { - body?: never; - path: { - job_id: string; - }; - query?: never; - url: '/api/v1/cron/jobs/{job_id}'; + body?: never; + path: { + job_id: string; + }; + query?: never; + url: '/api/v1/cron/jobs/{job_id}'; }; export type DeleteCronJobResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type DeleteCronJobResponse = - DeleteCronJobResponses[keyof DeleteCronJobResponses]; +export type DeleteCronJobResponse = DeleteCronJobResponses[keyof DeleteCronJobResponses]; export type UpdateCronJobData = { - body: CronJobPatchRequest; - path: { - job_id: string; - }; - query?: never; - url: '/api/v1/cron/jobs/{job_id}'; + body: CronJobPatchRequest; + path: { + job_id: string; + }; + query?: never; + url: '/api/v1/cron/jobs/{job_id}'; }; export type UpdateCronJobResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UpdateCronJobResponse = - UpdateCronJobResponses[keyof UpdateCronJobResponses]; +export type UpdateCronJobResponse = UpdateCronJobResponses[keyof UpdateCronJobResponses]; export type RunCronJobData = { - body?: never; - path: { - job_id: string; - }; - query?: never; - url: '/api/v1/cron/jobs/{job_id}/run'; + body?: never; + path: { + job_id: string; + }; + query?: never; + url: '/api/v1/cron/jobs/{job_id}/run'; }; export type RunCronJobResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; export type RunCronJobResponse = RunCronJobResponses[keyof RunCronJobResponses]; export type StreamLiveLogsData = { - body?: never; - path?: never; - query?: { - category?: Array; - privacy?: Array; - }; - url: '/api/v1/logs/live'; + body?: never; + path?: never; + query?: { + category?: Array; + privacy?: Array; + }; + url: '/api/v1/logs/live'; }; export type StreamLiveLogsResponses = { - /** - * Server-sent log stream - */ - 200: string; + /** + * Server-sent log stream + */ + 200: string; }; -export type StreamLiveLogsResponse = - StreamLiveLogsResponses[keyof StreamLiveLogsResponses]; +export type StreamLiveLogsResponse = StreamLiveLogsResponses[keyof StreamLiveLogsResponses]; export type GetLogHistoryData = { - body?: never; - path?: never; - query?: { - category?: Array; - privacy?: Array; - }; - url: '/api/v1/logs/history'; + body?: never; + path?: never; + query?: { + category?: Array; + privacy?: Array; + }; + url: '/api/v1/logs/history'; }; export type GetLogHistoryResponses = { - /** - * Text response - */ - 200: SuccessEnvelope; + /** + * Text response + */ + 200: SuccessEnvelope; }; -export type GetLogHistoryResponse = - GetLogHistoryResponses[keyof GetLogHistoryResponses]; +export type GetLogHistoryResponse = GetLogHistoryResponses[keyof GetLogHistoryResponses]; export type GetTraceSettingsData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/trace/settings'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/trace/settings'; }; export type GetTraceSettingsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetTraceSettingsResponse = - GetTraceSettingsResponses[keyof GetTraceSettingsResponses]; +export type GetTraceSettingsResponse = GetTraceSettingsResponses[keyof GetTraceSettingsResponses]; export type UpdateTraceSettingsData = { - body: TraceSettingsRequest; - path?: never; - query?: never; - url: '/api/v1/trace/settings'; + body: TraceSettingsRequest; + path?: never; + query?: never; + url: '/api/v1/trace/settings'; }; export type UpdateTraceSettingsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UpdateTraceSettingsResponse = - UpdateTraceSettingsResponses[keyof UpdateTraceSettingsResponses]; +export type UpdateTraceSettingsResponse = UpdateTraceSettingsResponses[keyof UpdateTraceSettingsResponses]; export type ListT2iTemplatesData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/t2i/templates'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/t2i/templates'; }; export type ListT2iTemplatesResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListT2iTemplatesResponse = - ListT2iTemplatesResponses[keyof ListT2iTemplatesResponses]; +export type ListT2iTemplatesResponse = ListT2iTemplatesResponses[keyof ListT2iTemplatesResponses]; export type CreateT2iTemplateData = { - body: T2iTemplateRequest; - path?: never; - query?: never; - url: '/api/v1/t2i/templates'; + body: T2iTemplateRequest; + path?: never; + query?: never; + url: '/api/v1/t2i/templates'; }; export type CreateT2iTemplateResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type CreateT2iTemplateResponse = - CreateT2iTemplateResponses[keyof CreateT2iTemplateResponses]; +export type CreateT2iTemplateResponse = CreateT2iTemplateResponses[keyof CreateT2iTemplateResponses]; export type GetActiveT2iTemplateData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/t2i/templates/active'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/t2i/templates/active'; }; export type GetActiveT2iTemplateResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetActiveT2iTemplateResponse = - GetActiveT2iTemplateResponses[keyof GetActiveT2iTemplateResponses]; +export type GetActiveT2iTemplateResponse = GetActiveT2iTemplateResponses[keyof GetActiveT2iTemplateResponses]; export type SetActiveT2iTemplateData = { - body: NameRequest; - path?: never; - query?: never; - url: '/api/v1/t2i/templates/active'; + body: NameRequest; + path?: never; + query?: never; + url: '/api/v1/t2i/templates/active'; }; export type SetActiveT2iTemplateResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type SetActiveT2iTemplateResponse = - SetActiveT2iTemplateResponses[keyof SetActiveT2iTemplateResponses]; +export type SetActiveT2iTemplateResponse = SetActiveT2iTemplateResponses[keyof SetActiveT2iTemplateResponses]; export type ResetDefaultT2iTemplateData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/t2i/templates/default/reset'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/t2i/templates/default/reset'; }; export type ResetDefaultT2iTemplateResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ResetDefaultT2iTemplateResponse = - ResetDefaultT2iTemplateResponses[keyof ResetDefaultT2iTemplateResponses]; +export type ResetDefaultT2iTemplateResponse = ResetDefaultT2iTemplateResponses[keyof ResetDefaultT2iTemplateResponses]; export type DeleteT2iTemplateData = { - body?: never; - path: { - name: string; - }; - query?: never; - url: '/api/v1/t2i/templates/{name}'; + body?: never; + path: { + name: string; + }; + query?: never; + url: '/api/v1/t2i/templates/{name}'; }; export type DeleteT2iTemplateResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type DeleteT2iTemplateResponse = - DeleteT2iTemplateResponses[keyof DeleteT2iTemplateResponses]; +export type DeleteT2iTemplateResponse = DeleteT2iTemplateResponses[keyof DeleteT2iTemplateResponses]; export type GetT2iTemplateData = { - body?: never; - path: { - name: string; - }; - query?: never; - url: '/api/v1/t2i/templates/{name}'; + body?: never; + path: { + name: string; + }; + query?: never; + url: '/api/v1/t2i/templates/{name}'; }; export type GetT2iTemplateResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetT2iTemplateResponse = - GetT2iTemplateResponses[keyof GetT2iTemplateResponses]; +export type GetT2iTemplateResponse = GetT2iTemplateResponses[keyof GetT2iTemplateResponses]; export type UpdateT2iTemplateData = { - body: T2iTemplateContentRequest; - path: { - name: string; - }; - query?: never; - url: '/api/v1/t2i/templates/{name}'; + body: T2iTemplateContentRequest; + path: { + name: string; + }; + query?: never; + url: '/api/v1/t2i/templates/{name}'; }; export type UpdateT2iTemplateResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UpdateT2iTemplateResponse = - UpdateT2iTemplateResponses[keyof UpdateT2iTemplateResponses]; +export type UpdateT2iTemplateResponse = UpdateT2iTemplateResponses[keyof UpdateT2iTemplateResponses]; export type GetSubagentConfigData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/subagents/config'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/subagents/config'; }; export type GetSubagentConfigResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type GetSubagentConfigResponse = - GetSubagentConfigResponses[keyof GetSubagentConfigResponses]; +export type GetSubagentConfigResponse = GetSubagentConfigResponses[keyof GetSubagentConfigResponses]; export type UpdateSubagentConfigData = { - body: SubAgentConfigRequest; - path?: never; - query?: never; - url: '/api/v1/subagents/config'; + body: SubAgentConfigRequest; + path?: never; + query?: never; + url: '/api/v1/subagents/config'; }; export type UpdateSubagentConfigResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type UpdateSubagentConfigResponse = - UpdateSubagentConfigResponses[keyof UpdateSubagentConfigResponses]; +export type UpdateSubagentConfigResponse = UpdateSubagentConfigResponses[keyof UpdateSubagentConfigResponses]; export type ListSubagentAvailableToolsData = { - body?: never; - path?: never; - query?: never; - url: '/api/v1/subagents/available-tools'; + body?: never; + path?: never; + query?: never; + url: '/api/v1/subagents/available-tools'; }; export type ListSubagentAvailableToolsResponses = { - /** - * Standard AstrBot success response - */ - 200: SuccessEnvelope; + /** + * Standard AstrBot success response + */ + 200: SuccessEnvelope; }; -export type ListSubagentAvailableToolsResponse = - ListSubagentAvailableToolsResponses[keyof ListSubagentAvailableToolsResponses]; +export type ListSubagentAvailableToolsResponse = ListSubagentAvailableToolsResponses[keyof ListSubagentAvailableToolsResponses]; export type VerifyPlatformWebhookData = { - body?: never; - path: { - webhook_uuid: string; - }; - query?: never; - url: '/api/v1/webhooks/platforms/{webhook_uuid}'; + body?: never; + path: { + webhook_uuid: string; + }; + query?: never; + url: '/api/v1/webhooks/platforms/{webhook_uuid}'; }; export type VerifyPlatformWebhookResponses = { - /** - * Webhook verification response - */ - 200: unknown; + /** + * Webhook verification response + */ + 200: unknown; }; export type ReceivePlatformWebhookData = { - body?: DynamicConfig; - path: { - webhook_uuid: string; - }; - query?: never; - url: '/api/v1/webhooks/platforms/{webhook_uuid}'; + body?: DynamicConfig; + path: { + webhook_uuid: string; + }; + query?: never; + url: '/api/v1/webhooks/platforms/{webhook_uuid}'; }; export type ReceivePlatformWebhookResponses = { - /** - * Webhook accepted - */ - 200: unknown; + /** + * Webhook accepted + */ + 200: unknown; }; diff --git a/dashboard/src/api/v1/codingCli.ts b/dashboard/src/api/v1/codingCli.ts new file mode 100644 index 0000000000..3aa181e06d --- /dev/null +++ b/dashboard/src/api/v1/codingCli.ts @@ -0,0 +1,63 @@ +import { generatedOptions, openApiV1, typed } from './shared'; +import type { AxiosRequestConfig } from './shared'; + +/** The CLIs AstrBot knows how to write a global configuration for. */ +export type CodingCliKind = 'claude_code' | 'codex'; + +/** One provider the operator configured for a CLI. */ +export interface CodingCliProvider { + id: string; + name: string; + base_url: string; + model: string; + note: string; + /** A key is reported as present, never as its value. */ + has_api_key: boolean; + /** Whether the CLI's own file currently holds this provider. */ + current: boolean; +} + +/** One CLI's own configuration file, plus what it can be switched to. */ +export interface CodingCliState { + cli: CodingCliKind; + path: string; + exists: boolean; + managed: boolean; + backed_up: boolean; + base_url: string; + model: string; + has_credential: boolean; + providers: CodingCliProvider[]; +} + +export interface CodingCliStatePayload { + clis: CodingCliState[]; +} + +export const codingCliApi = { + state() { + return typed(openApiV1.getCodingCliGlobalConfig()); + }, + switchProvider( + payload: { cli: CodingCliKind; provider_id: string }, + requestConfig?: AxiosRequestConfig, + ) { + return typed( + openApiV1.switchCodingCliProvider( + generatedOptions( + { + body: { cli: payload.cli, provider_id: payload.provider_id }, + }, + requestConfig, + ), + ), + ); + }, + remove(cli: CodingCliKind, requestConfig?: AxiosRequestConfig) { + return typed( + openApiV1.removeCodingCliGlobalConfig( + generatedOptions({ path: { cli } }, requestConfig), + ), + ); + }, +}; diff --git a/dashboard/src/api/v1/index.ts b/dashboard/src/api/v1/index.ts index b0321675e1..b06a5b36a8 100644 --- a/dashboard/src/api/v1/index.ts +++ b/dashboard/src/api/v1/index.ts @@ -2,6 +2,7 @@ export * from './appearance'; export * from './auth'; export * from './automation'; export * from './chat'; +export * from './codingCli'; export * from './config'; export * from './conversations'; export * from './files'; diff --git a/dashboard/src/i18n/locales/en-US/core/navigation.json b/dashboard/src/i18n/locales/en-US/core/navigation.json index 356ff77548..7067b2954e 100644 --- a/dashboard/src/i18n/locales/en-US/core/navigation.json +++ b/dashboard/src/i18n/locales/en-US/core/navigation.json @@ -50,5 +50,6 @@ "current": "Current" }, "pluginWebui": "Plugin Pages", - "btw": "BTW Dual Loop" + "btw": "BTW Dual Loop", + "cliConfig": "CLI Global Config" } diff --git a/dashboard/src/i18n/locales/zh-CN/core/navigation.json b/dashboard/src/i18n/locales/zh-CN/core/navigation.json index f0a95d0b0a..4a79b3c60f 100644 --- a/dashboard/src/i18n/locales/zh-CN/core/navigation.json +++ b/dashboard/src/i18n/locales/zh-CN/core/navigation.json @@ -50,5 +50,6 @@ "current": "当前" }, "pluginWebui": "插件页面", - "btw": "BTW 双循环" + "btw": "BTW 双循环", + "cliConfig": "CLI 全局配置" } diff --git a/dashboard/src/layouts/full/vertical-sidebar/sidebarItem.ts b/dashboard/src/layouts/full/vertical-sidebar/sidebarItem.ts index 378aaa94b3..7801f601cf 100644 --- a/dashboard/src/layouts/full/vertical-sidebar/sidebarItem.ts +++ b/dashboard/src/layouts/full/vertical-sidebar/sidebarItem.ts @@ -117,6 +117,11 @@ const sidebarItem: menu[] = [ icon: 'mdi-swap-horizontal', to: '/btw', }, + { + title: 'core.navigation.cliConfig', + icon: 'mdi-pencil-ruler', + to: '/cli-config', + }, { title: 'core.navigation.data', icon: 'mdi-database', diff --git a/dashboard/src/router/MainRoutes.ts b/dashboard/src/router/MainRoutes.ts index b603f9c7f2..a28ab0a3b6 100644 --- a/dashboard/src/router/MainRoutes.ts +++ b/dashboard/src/router/MainRoutes.ts @@ -119,6 +119,11 @@ const MainRoutes = { path: '/btw', component: () => import('@/views/BtwPage.vue'), }, + { + name: 'CliConfig', + path: '/cli-config', + component: () => import('@/views/CliConfigPage.vue'), + }, { name: 'CronJobs', path: '/cron', diff --git a/dashboard/src/views/CliConfigPage.vue b/dashboard/src/views/CliConfigPage.vue new file mode 100644 index 0000000000..4b4c04271f --- /dev/null +++ b/dashboard/src/views/CliConfigPage.vue @@ -0,0 +1,841 @@ + + + + + + diff --git a/dashboard/tests/cliConfigPage.vitest.ts b/dashboard/tests/cliConfigPage.vitest.ts new file mode 100644 index 0000000000..f293ab77c9 --- /dev/null +++ b/dashboard/tests/cliConfigPage.vitest.ts @@ -0,0 +1,335 @@ +import { flushPromises } from '@vue/test-utils'; +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import CliConfigPage from '@/views/CliConfigPage.vue'; +import { mountWithVuetify } from './utils/mountWithVuetify'; + +const testState = vi.hoisted(() => ({ + stateMock: vi.fn(), + switchMock: vi.fn(), + removeMock: vi.fn(), + getProfileMock: vi.fn(), + updateProfileMock: vi.fn(), +})); + +vi.mock('@/api/v1', () => ({ + codingCliApi: { + state: testState.stateMock, + switchProvider: testState.switchMock, + remove: testState.removeMock, + }, + configProfileApi: { + get: testState.getProfileMock, + update: testState.updateProfileMock, + }, +})); + +vi.mock('@/api/v1/authorization', () => ({ + STEP_UP_TTL_SECONDS: 300, + authorizationApi: { stepUp: vi.fn(), webChatStepUp: vi.fn() }, +})); + +const STATE = { + clis: [ + { + cli: 'claude_code', + path: 'C:/Users/x/.claude/settings.json', + exists: true, + managed: true, + backed_up: true, + // What the CLI's own file currently holds, which is what "in use" means. + base_url: 'https://gw.example', + model: 'opus', + has_credential: true, + }, + { + cli: 'codex', + path: 'C:/Users/x/.codex/config.toml', + exists: false, + managed: false, + backed_up: false, + base_url: '', + model: '', + has_credential: false, + }, + ], +}; + +/** The operator's own list, which is what the cards render from. */ +const CONFIG = { + btw: { + cli_providers: [ + { + id: 'gw', + name: 'Gateway', + base_url: 'https://gw.example', + api_key: 'sk-secret', + model: 'opus', + note: 'primary', + }, + { + id: 'local', + name: 'Local', + base_url: 'http://127.0.0.1:8080', + model: '', + note: '', + }, + ], + }, +}; + +function mountPage(confirm = true) { + return mountWithVuetify(CliConfigPage, { + global: { + provide: { + // The app supplies this through a plugin; a mount supplies it here so + // the confirmation never falls through to `window.confirm`. + $confirm: vi.fn(async () => confirm), + }, + stubs: { + // Vuetify only mounts a dialog's content once it is open, so the stub + // renders it straight away and the form can be driven without waiting. + VDialog: { + props: ['modelValue'], + template: '
', + }, + }, + }, + }); +} + +/** The provider list as it was sent to the config profile endpoint. */ +function savedProviders() { + const body = testState.updateProfileMock.mock.calls[0][1] as { + btw: { cli_providers: Record[] }; + }; + return body.btw.cli_providers; +} + +/** The card for one provider inside one CLI's section. */ +function cardFor( + wrapper: ReturnType, + cli: string, + providerId: string, +) { + const sections = wrapper.findAll('.cli-config-page__cli'); + const section = sections.find((node) => + node.text().includes(cli === 'codex' ? 'Codex' : 'Claude Code'), + ); + if (!section) throw new Error(`no section for ${cli}`); + const card = section + .findAll('.cli-config-page__provider') + .find((node) => node.text().includes(providerId)); + if (!card) throw new Error(`no card for ${providerId} in ${cli}`); + return card; +} + +async function openFormAndFill( + wrapper: ReturnType, + values: { id: string; base_url?: string; api_key?: string }, +) { + await wrapper.findAll('.cli-config-page__add')[0].trigger('click'); + await wrapper.vm.$nextTick(); + await wrapper.find('.cli-config-page__form-id input').setValue(values.id); + if (values.base_url !== undefined) { + await wrapper + .find('.cli-config-page__form-base-url input') + .setValue(values.base_url); + } + if (values.api_key !== undefined) { + await wrapper + .find('.cli-config-page__form-api-key input') + .setValue(values.api_key); + } + await wrapper.find('.cli-config-page__form-confirm').trigger('click'); + await wrapper.vm.$nextTick(); +} + +describe('CliConfigPage', () => { + beforeEach(() => { + testState.stateMock.mockResolvedValue({ + data: { status: 'ok', data: STATE }, + }); + testState.switchMock.mockResolvedValue({ + data: { status: 'ok', data: STATE.clis[0] }, + }); + testState.removeMock.mockResolvedValue({ + data: { status: 'ok', data: STATE.clis[0] }, + }); + testState.getProfileMock.mockResolvedValue({ + data: { status: 'ok', data: { config: CONFIG, metadata: {} } }, + }); + testState.updateProfileMock.mockResolvedValue({ + data: { status: 'ok', message: 'saved' }, + }); + }); + + it('lists both CLIs with their own config path', async () => { + const wrapper = mountPage(); + await flushPromises(); + + expect(wrapper.text()).toContain('Claude Code'); + expect(wrapper.text()).toContain('Codex'); + expect(wrapper.text()).toContain('C:/Users/x/.claude/settings.json'); + expect(wrapper.text()).toContain('C:/Users/x/.codex/config.toml'); + wrapper.unmount(); + }); + + it('shows each provider card with its endpoint and state', async () => { + const wrapper = mountPage(); + await flushPromises(); + + const cards = wrapper + .findAll('.cli-config-page__cli')[0] + .findAll('.cli-config-page__provider'); + expect(cards).toHaveLength(2); + expect(cards[0].text()).toContain('Gateway'); + expect(cards[0].text()).toContain('https://gw.example'); + expect(cards[0].find('.cli-config-page__current').exists()).toBe(true); + // The second card is not the one in use, so it has no marker. + expect(cards[1].find('.cli-config-page__current').exists()).toBe(false); + wrapper.unmount(); + }); + + it('switches the CLI to the provider whose card was clicked', async () => { + const wrapper = mountPage(); + await flushPromises(); + + const sections = wrapper.findAll('.cli-config-page__cli'); + const claude = sections[0]; + const cards = claude.findAll('.cli-config-page__provider'); + // The second card in the Claude section is the one not in use. + await cards[1].find('.cli-config-page__switch').trigger('click'); + await flushPromises(); + + expect(testState.switchMock).toHaveBeenCalledWith( + { cli: 'claude_code', provider_id: 'local' }, + { headers: {} }, + ); + wrapper.unmount(); + }); + + it('does not offer a switch for the provider already in use', async () => { + const wrapper = mountPage(); + await flushPromises(); + + const buttons = wrapper + .findAll('.cli-config-page__cli')[0] + .findAll('.cli-config-page__switch'); + expect(buttons[0].classes().some((name) => name.includes('disabled'))).toBe( + true, + ); + expect(buttons[1].classes().some((name) => name.includes('disabled'))).toBe( + false, + ); + wrapper.unmount(); + }); + + it('adds a provider through the form and saves the list', async () => { + const wrapper = mountPage(); + await flushPromises(); + + await openFormAndFill(wrapper, { + id: 'mine', + base_url: 'https://mine.example', + api_key: 'sk-2', + }); + await wrapper.find('.cli-config-page__save').trigger('click'); + await flushPromises(); + + const added = savedProviders().find((entry) => entry.id === 'mine'); + expect(added?.base_url).toBe('https://mine.example'); + expect(added?.api_key).toBe('sk-2'); + wrapper.unmount(); + }); + + it('leaves a stored key alone when the field is left empty', async () => { + const wrapper = mountPage(); + await flushPromises(); + + await cardFor(wrapper, 'claude_code', 'gw') + .find('.cli-config-page__edit') + .trigger('click'); + await wrapper.vm.$nextTick(); + const keyInput = wrapper.find('.cli-config-page__form-api-key input') + .element as HTMLInputElement; + // The API never sends a key back, so the field starts empty, and empty has + // to mean "unchanged" rather than "erase it". + expect(keyInput.value).toBe(''); + + // Something has to change for there to be anything to save. + await wrapper + .find('.cli-config-page__form-note input') + .setValue('updated note'); + await wrapper.find('.cli-config-page__form-confirm').trigger('click'); + await wrapper.vm.$nextTick(); + await wrapper.find('.cli-config-page__save').trigger('click'); + await flushPromises(); + + const entry = savedProviders().find((item) => item.id === 'gw'); + expect(entry?.api_key).toBe('sk-secret'); + expect(entry?.note).toBe('updated note'); + wrapper.unmount(); + }); + + it('refuses a provider with no endpoint and no key', async () => { + const wrapper = mountPage(); + await flushPromises(); + + await openFormAndFill(wrapper, { id: 'bare' }); + + expect(wrapper.find('.cli-config-page__form-error').exists()).toBe(true); + await wrapper.find('.cli-config-page__save').trigger('click'); + await flushPromises(); + expect(testState.updateProfileMock).not.toHaveBeenCalled(); + wrapper.unmount(); + }); + + it('mounts without Vue warnings when a class is injected from above', async () => { + // The page is mounted through an injected slot, which passes a class down. + // A fragment root would warn about extraneous attributes instead of + // rendering, and that warning is what the smoke suites fail on. + const warn = vi.spyOn(console, 'warn').mockImplementation(() => {}); + const error = vi.spyOn(console, 'error').mockImplementation(() => {}); + + const wrapper = mountWithVuetify(CliConfigPage, { + attrs: { class: 'cli-config-page-test' }, + attachTo: document.body, + }); + await flushPromises(); + + expect(wrapper.classes()).toContain('cli-config-page-test'); + const noisy = [...warn.mock.calls, ...error.mock.calls].filter((args) => + args.some((arg) => + String(arg).includes('Extraneous non-props attributes'), + ), + ); + expect(noisy).toHaveLength(0); + + warn.mockRestore(); + error.mockRestore(); + wrapper.unmount(); + }); + + it('reports a load failure instead of an empty page', async () => { + testState.stateMock.mockRejectedValue(new Error('nope')); + + const wrapper = mountPage(); + await flushPromises(); + + expect(wrapper.text()).toContain('Could not read the CLI configuration'); + wrapper.unmount(); + }); + + it('restores from the backup', async () => { + const wrapper = mountPage(); + await flushPromises(); + + await wrapper.find('.cli-config-page__restore').trigger('click'); + await flushPromises(); + + expect(testState.removeMock).toHaveBeenCalledWith('claude_code', { + headers: {}, + }); + wrapper.unmount(); + }); +}); diff --git a/docs/public/openapi.json b/docs/public/openapi.json index 439eff2c28..b64c2aae41 100644 --- a/docs/public/openapi.json +++ b/docs/public/openapi.json @@ -81,6 +81,9 @@ { "name": "Config Profiles" }, + { + "name": "Coding CLI" + }, { "name": "Bot Config Routes" }, @@ -330,6 +333,58 @@ } } }, + "/api/v1/coding-cli/global-config": { + "get": { + "tags": ["Coding CLI"], + "summary": "Read each coding CLI's own configuration and its providers", + "operationId": "getCodingCliGlobalConfig", + "x-astrbot-scope": "config", + "responses": { + "200": { + "$ref": "#/components/responses/Ok" + } + } + }, + "put": { + "tags": ["Coding CLI"], + "summary": "Switch a coding CLI to one of its configured providers", + "operationId": "switchCodingCliProvider", + "x-astrbot-scope": "config", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CodingCliSwitchRequest" + } + } + } + }, + "responses": { + "200": { + "$ref": "#/components/responses/Ok" + } + } + } + }, + "/api/v1/coding-cli/global-config/{cli}": { + "delete": { + "tags": ["Coding CLI"], + "summary": "Remove AstrBot's configuration from a coding CLI's global config", + "operationId": "removeCodingCliGlobalConfig", + "x-astrbot-scope": "config", + "parameters": [ + { + "$ref": "#/components/parameters/CodingCli" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/Ok" + } + } + } + }, "/api/v1/config-routes": { "get": { "tags": ["Bot Config Routes"], @@ -5437,6 +5492,15 @@ "type": "string" } }, + "CodingCli": { + "name": "cli", + "in": "path", + "required": true, + "schema": { + "type": "string", + "enum": ["claude_code", "codex"] + } + }, "ConfigId": { "name": "config_id", "in": "path", @@ -5714,6 +5778,20 @@ "type": "object", "additionalProperties": true }, + "CodingCliSwitchRequest": { + "type": "object", + "required": ["cli", "provider_id"], + "properties": { + "cli": { + "type": "string", + "enum": ["claude_code", "codex"] + }, + "provider_id": { + "type": "string" + } + }, + "additionalProperties": false + }, "CreateConfigProfileRequest": { "type": "object", "properties": { diff --git a/docs/scripts/update_openapi_json.py b/docs/scripts/update_openapi_json.py index ada68019bf..ac9393bd8e 100644 --- a/docs/scripts/update_openapi_json.py +++ b/docs/scripts/update_openapi_json.py @@ -14,6 +14,7 @@ "Open API", "System Config", "Config Profiles", + "Coding CLI", "Bot Config Routes", "Bots", "Provider Sources", diff --git a/openspec/openapi-v1.yaml b/openspec/openapi-v1.yaml index 8cbd7d6aa5..2feed4f0d9 100644 --- a/openspec/openapi-v1.yaml +++ b/openspec/openapi-v1.yaml @@ -65,6 +65,7 @@ tags: - name: Authorization - name: System Config - name: Config Profiles + - name: Coding CLI - name: Bot Config Routes - name: Bots - name: Provider Sources @@ -677,6 +678,42 @@ paths: '200': $ref: '#/components/responses/Ok' + /api/v1/coding-cli/global-config: + get: + tags: [Coding CLI] + summary: Read each coding CLI's own configuration and its providers + operationId: getCodingCliGlobalConfig + x-astrbot-scope: config + responses: + '200': + $ref: '#/components/responses/Ok' + put: + tags: [Coding CLI] + summary: Switch a coding CLI to one of its configured providers + operationId: switchCodingCliProvider + x-astrbot-scope: config + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CodingCliSwitchRequest' + responses: + '200': + $ref: '#/components/responses/Ok' + + /api/v1/coding-cli/global-config/{cli}: + delete: + tags: [Coding CLI] + summary: Remove AstrBot's configuration from a coding CLI's global config + operationId: removeCodingCliGlobalConfig + x-astrbot-scope: config + parameters: + - $ref: '#/components/parameters/CodingCli' + responses: + '200': + $ref: '#/components/responses/Ok' + /api/v1/config-routes: get: tags: [Bot Config Routes] @@ -5150,6 +5187,13 @@ components: description: Stable command identifier `{plugin_name}:{original_command}` with spaces replaced by dots. schema: type: string + CodingCli: + name: cli + in: path + required: true + schema: + type: string + enum: [claude_code, codex] ConfigId: name: config_id in: path @@ -5803,6 +5847,17 @@ components: minimum: 1 additionalProperties: false + CodingCliSwitchRequest: + type: object + required: [cli, provider_id] + properties: + cli: + type: string + enum: [claude_code, codex] + provider_id: + type: string + additionalProperties: false + CreateConfigProfileRequest: type: object properties: diff --git a/tests/unit/test_btw_cli_global_config.py b/tests/unit/test_btw_cli_global_config.py new file mode 100644 index 0000000000..d19e07889d --- /dev/null +++ b/tests/unit/test_btw_cli_global_config.py @@ -0,0 +1,235 @@ +"""Tests for writing a provider preset into a CLI's own global config.""" + +import json +import os + +import pytest + +from astrbot.core.agent.btw import cli_global_config as cg + + +@pytest.fixture +def homes(tmp_path, monkeypatch): + """Point both CLIs at directories of the test's own.""" + monkeypatch.setenv("CLAUDE_CONFIG_DIR", str(tmp_path / "claude")) + monkeypatch.setenv("CODEX_HOME", str(tmp_path / "codex")) + return tmp_path + + +PROVIDER = { + "id": "gw", + "name": "Gateway", + "base_url": "https://gw.example", + "api_key": "sk-secret", + "model": "opus", + "wire_api": "responses", +} + + +def test_an_unknown_cli_is_refused(homes): + with pytest.raises(ValueError): + cg.target_path("nope") + with pytest.raises(ValueError): + cg.apply_provider("nope", {**PROVIDER, "api_key": ""}) + + +def test_a_provider_without_an_endpoint_or_key_is_refused(homes): + with pytest.raises(ValueError): + cg.apply_provider("claude_code", {"id": "a", "base_url": "", "api_key": ""}) + with pytest.raises(ValueError): + cg.apply_provider("claude_code", {"id": "", "base_url": "https://x"}) + + +def test_claude_writes_the_endpoint_and_keeps_every_other_key(homes): + path = cg.target_path("claude_code") + path.parent.mkdir(parents=True) + path.write_text( + json.dumps( + { + "env": {"ANTHROPIC_BASE_URL": "https://mine.example", "KEEP": "1"}, + "permissions": {"allow": ["Bash"]}, + "model": "sonnet", + } + ), + encoding="utf-8", + ) + + state = cg.apply_provider("claude_code", {**PROVIDER, "api_key": ""}) + + payload = json.loads(path.read_text(encoding="utf-8")) + # The endpoint AstrBot manages is replaced... + assert payload["env"]["ANTHROPIC_BASE_URL"] == "https://gw.example" + assert payload["env"]["ANTHROPIC_MODEL"] == "opus" + # ...and everything else is exactly as the user left it. + assert payload["env"]["KEEP"] == "1" + assert payload["permissions"] == {"allow": ["Bash"]} + assert payload["model"] == "sonnet" + assert state.managed is True + assert state.base_url == "https://gw.example" + assert state.model == "opus" + + +def test_a_credential_is_written_only_when_asked_for(homes): + path = cg.target_path("claude_code") + + cg.apply_provider("claude_code", {**PROVIDER, "api_key": ""}) + assert ( + "ANTHROPIC_AUTH_TOKEN" + not in json.loads(path.read_text(encoding="utf-8"))["env"] + ) + + state = cg.apply_provider("claude_code", PROVIDER) + env = json.loads(path.read_text(encoding="utf-8"))["env"] + assert env["ANTHROPIC_AUTH_TOKEN"] == "sk-secret" + assert state.has_credential is True + if os.name != "nt": + # A file holding a key is readable by its owner alone. Windows does not + # model the POSIX bits, so the check only means something elsewhere. + assert path.stat().st_mode & 0o077 == 0 + + +def test_a_state_never_carries_the_credential(homes): + cg.apply_provider("claude_code", PROVIDER) + state = cg.read_state("claude_code") + assert "sk-secret" not in repr(state) + + +def test_an_unasked_credential_is_removed_rather_than_left_behind(homes): + cg.apply_provider("claude_code", PROVIDER) + cg.apply_provider("claude_code", {**PROVIDER, "api_key": ""}) + env = json.loads(cg.target_path("claude_code").read_text(encoding="utf-8"))["env"] + assert "ANTHROPIC_AUTH_TOKEN" not in env + + +def test_the_first_write_backs_the_file_up_once(homes): + path = cg.target_path("claude_code") + path.parent.mkdir(parents=True) + original = json.dumps({"env": {"KEEP": "1"}}) + path.write_text(original, encoding="utf-8") + + cg.apply_provider("claude_code", {**PROVIDER, "api_key": ""}) + backup = path.with_name(path.name + cg.BACKUP_SUFFIX) + assert backup.read_text(encoding="utf-8") == original + + # A second write does not clobber the original with AstrBot's own output. + cg.apply_provider("claude_code", {**PROVIDER, "base_url": "https://other.example"}) + assert backup.read_text(encoding="utf-8") == original + + +def test_codex_keeps_the_users_comments_and_keys(homes): + path = cg.target_path("codex") + path.parent.mkdir(parents=True) + path.write_text( + '# my own settings\nmodel = "gpt-5"\n\n[mcp_servers.mine]\ncommand = "npx"\n', + encoding="utf-8", + ) + + state = cg.apply_provider("codex", PROVIDER) + + text = path.read_text(encoding="utf-8") + # The user's file survives, byte for byte, with AstrBot's section above it. + assert "# my own settings" in text + assert 'model = "gpt-5"' in text + assert "[mcp_servers.mine]" in text + assert text.index(cg.CODEX_MANAGED_BEGIN) < text.index("# my own settings") + assert cg.CODEX_MANAGED_BEGIN in text and cg.CODEX_MANAGED_END in text + assert 'base_url = "https://gw.example"' in text + assert state.managed is True + assert state.base_url == "https://gw.example" + + # The credential goes in auth.json under the name the section points at. + auth = json.loads( + (cg.codex_home() / cg.CODEX_AUTH_FILE).read_text(encoding="utf-8") + ) + assert auth[cg.credential_env_name("gw")] == "sk-secret" + assert "sk-secret" not in text + + +def test_rewriting_replaces_the_section_instead_of_stacking_it(homes): + path = cg.target_path("codex") + cg.apply_provider("codex", {**PROVIDER, "api_key": ""}) + cg.apply_provider("codex", {**PROVIDER, "base_url": "https://second.example"}) + text = path.read_text(encoding="utf-8") + assert text.count(cg.CODEX_MANAGED_BEGIN) == 1 + second = "https://second.example" + first = "https://gw.example" + assert f'base_url = "{second}"' in text + assert f'"{first}"' not in text + + +def test_a_truncated_section_is_left_alone(homes): + path = cg.target_path("codex") + path.parent.mkdir(parents=True) + # No closing marker: AstrBot cannot know where the section ended, so it must + # not guess and swallow the rest of the file. + path.write_text( + f'{cg.CODEX_MANAGED_BEGIN}\nbase_url = "https://x.example"\n[user]\n', + encoding="utf-8", + ) + state = cg.read_state("codex") + assert state.managed is False + + +def test_an_unparseable_json_file_is_not_replaced_with_astrbots(homes): + path = cg.target_path("claude_code") + path.parent.mkdir(parents=True) + path.write_text("{ this is not json", encoding="utf-8") + + # A backup is taken, so the damaged file is recoverable... + cg.apply_provider("claude_code", {**PROVIDER, "api_key": ""}) + backup = path.with_name(path.name + cg.BACKUP_SUFFIX) + assert backup.read_text(encoding="utf-8") == "{ this is not json" + + +def test_removing_restores_what_the_user_had(homes): + path = cg.target_path("claude_code") + path.parent.mkdir(parents=True) + original = json.dumps({"env": {"KEEP": "1"}, "permissions": {}}, indent=2) + "\n" + path.write_text(original, encoding="utf-8") + + cg.apply_provider("claude_code", PROVIDER) + assert cg.read_state("claude_code").managed is True + + state = cg.remove_provider("claude_code") + assert path.read_text(encoding="utf-8") == original + assert state.managed is False + assert not path.with_name(path.name + cg.BACKUP_SUFFIX).exists() + + +def test_removing_without_a_backup_takes_only_astrbots_keys(homes): + path = cg.target_path("claude_code") + path.parent.mkdir(parents=True) + path.write_text( + json.dumps({"env": {"KEEP": "1", "ANTHROPIC_BASE_URL": "https://gw.example"}}), + encoding="utf-8", + ) + path.with_name(path.name + cg.BACKUP_SUFFIX).unlink(missing_ok=True) + + cg.remove_provider("claude_code") + + payload = json.loads(path.read_text(encoding="utf-8")) + assert payload["env"] == {"KEEP": "1"} + + +def test_removing_a_codex_preset_drops_the_section_and_the_credential(homes): + path = cg.target_path("codex") + path.parent.mkdir(parents=True) + path.write_text('# mine\nmodel = "gpt-5"\n', encoding="utf-8") + + cg.apply_provider("codex", PROVIDER) + cg.remove_provider("codex") + + text = path.read_text(encoding="utf-8") + assert cg.CODEX_MANAGED_BEGIN not in text + assert "# mine" in text + auth = json.loads( + (cg.codex_home() / cg.CODEX_AUTH_FILE).read_text(encoding="utf-8") + ) + assert cg.credential_env_name(PROVIDER["id"]) not in auth + + +def test_a_missing_file_reports_absent_rather_than_raising(homes): + state = cg.read_state("claude_code") + assert state.exists is False + assert state.managed is False + assert state.has_credential is False diff --git a/tests/unit/test_config_metadata_i18n.py b/tests/unit/test_config_metadata_i18n.py index 700074e41c..ed752312a7 100644 --- a/tests/unit/test_config_metadata_i18n.py +++ b/tests/unit/test_config_metadata_i18n.py @@ -133,13 +133,28 @@ def test_config_metadata_locale_trees_match() -> None: assert sorted(en_keys - zh_keys) == [] +# Fields the generic config renderer must not offer a control for, because the +# generic control would corrupt them. ``cli_providers`` is a list of objects +# edited by the CLI config page and written through the same profile, so a +# string-list Control here would flatten every entry to "[object Object]". +BTW_FIELDS_WITHOUT_CONTROLS = frozenset({"btw.cli_providers"}) + + def test_every_btw_profile_field_reaches_dashboard_controls() -> None: converted = ConfigMetadataI18n.convert_to_i18n_keys(CONFIG_METADATA_3) items = converted["ai_group"]["metadata"]["btw"]["items"] - expected_fields = {f"btw.{field}" for field in _flatten(DEFAULT_CONFIG["btw"])} + expected_fields = { + f"btw.{field}" for field in _flatten(DEFAULT_CONFIG["btw"]) + } - BTW_FIELDS_WITHOUT_CONTROLS assert set(items) == expected_fields +def test_the_fields_without_controls_are_still_real_settings() -> None: + """A field skipped above must exist, so the exemption cannot outlive it.""" + present = {f"btw.{field}" for field in _flatten(DEFAULT_CONFIG["btw"])} + assert BTW_FIELDS_WITHOUT_CONTROLS <= present + + def test_btw_controls_survive_dashboard_metadata_conversion() -> None: converted = ConfigMetadataI18n.convert_to_i18n_keys(CONFIG_METADATA_3) section = converted["ai_group"]["metadata"]["btw"] diff --git a/tests/unit/test_dashboard_coding_cli.py b/tests/unit/test_dashboard_coding_cli.py new file mode 100644 index 0000000000..3137c50ea5 --- /dev/null +++ b/tests/unit/test_dashboard_coding_cli.py @@ -0,0 +1,105 @@ +"""Tests for the routes that switch a coding CLI's provider.""" + +import json + +import pytest + +from astrbot.dashboard.api import coding_cli +from astrbot.dashboard.responses import ApiError + +PROFILE = { + "btw": { + "cli_providers": [ + { + "id": "gw", + "name": "Gateway", + "base_url": "https://gw.example", + "api_key": "sk-secret", + "model": "opus", + "note": "primary", + }, + {"id": "scoped", "name": "Codex only", "cli": "codex"}, + "not a mapping", + {"id": "", "name": "no id"}, + ] + } +} + + +@pytest.fixture +def homes(tmp_path, monkeypatch): + """Point both CLIs at directories of the test's own.""" + monkeypatch.setenv("CLAUDE_CONFIG_DIR", str(tmp_path / "claude")) + monkeypatch.setenv("CODEX_HOME", str(tmp_path / "codex")) + return tmp_path + + +def test_only_usable_entries_are_kept(): + providers = coding_cli.cli_global_config.normalize_cli_providers( + PROFILE["btw"]["cli_providers"] + ) + assert [provider["id"] for provider in providers] == ["gw", "scoped"] + + +def test_a_provider_must_exist(homes): + with pytest.raises(ApiError): + coding_cli._provider_for("claude_code", PROFILE, "nope") + + +def test_a_provider_scoped_to_another_cli_is_refused(homes): + with pytest.raises(ApiError): + coding_cli._provider_for("claude_code", PROFILE, "scoped") + # ...but is usable by the one it names. + assert coding_cli._provider_for("codex", PROFILE, "scoped")["id"] == "scoped" + + +def test_an_unscoped_provider_applies_to_every_cli(homes): + for cli in ("claude_code", "codex"): + assert coding_cli._provider_for(cli, PROFILE, "gw")["id"] == "gw" + + +def test_the_list_is_grouped_by_cli(homes): + raw = PROFILE["btw"]["cli_providers"] + assert [ + p["id"] + for p in coding_cli.cli_global_config.providers_for_cli(raw, "claude_code") + ] == ["gw"] + assert [ + p["id"] for p in coding_cli.cli_global_config.providers_for_cli(raw, "codex") + ] == ["gw", "scoped"] + + +def test_a_state_never_carries_a_credential(homes): + cli_global_config = coding_cli.cli_global_config + cli_global_config.apply_provider( + "claude_code", + {"id": "gw", "base_url": "https://gw.example", "api_key": "sk-secret"}, + ) + state = coding_cli._state("claude_code") + assert state["has_credential"] is True + assert "sk-secret" not in json.dumps(state) + + +def test_current_is_decided_by_the_endpoint_not_the_key(homes): + cli_global_config = coding_cli.cli_global_config + cli_global_config.apply_provider( + "claude_code", {"id": "gw", "base_url": "https://gw.example", "api_key": "sk"} + ) + state = cli_global_config.read_state("claude_code") + assert coding_cli._is_current( + {"base_url": "https://gw.example", "model": ""}, state + ) + assert not coding_cli._is_current( + {"base_url": "https://other.example", "model": ""}, state + ) + + +def test_the_switch_action_is_high_risk(): + """The whole point of the route: a global CLI write needs step-up.""" + from astrbot.core.auth.models import HIGH_RISK_ACTIONS + from astrbot.core.auth.registry import ACTION_POLICIES + + assert coding_cli.WRITE_ACTION in HIGH_RISK_ACTIONS + policy = ACTION_POLICIES[coding_cli.WRITE_ACTION] + assert policy.risk == "high" + assert policy.requires_step_up is True From 117685e286d2eee297736e371726212ae4e5baa0 Mon Sep 17 00:00:00 2001 From: YUZHEthefool <2804776511@qq.com> Date: Fri, 18 Sep 2026 16:55:28 +0800 Subject: [PATCH 2/7] fix(btw): let the coding CLI page read what it needs The provider list could never be shown. Two faults sat under one symptom, and the first hid the second. The state route asked for `coding_cli.config.write`, which is high-risk. The Dashboard answers a high-risk action with a step-up challenge until the operator proves themself, and a plain GET has no way to answer one, so every load of the page was denied -- the audit log holds nothing but `step_up_required` for that action. Reading a path and whether a key is stored is not the write that action guards, so the read now asks for `platform.read` and the switch keeps the high-risk action to itself. That also puts the route back inside the `config` API scope the OpenAPI document declares for it, which the write action was never part of. Behind that denial, `_config_of` looked for the config profile service on the core runtime's services, where it does not exist: it is on the Dashboard's own `app.state.services`. The route therefore answered "Configuration is unavailable" with a 503 even once it was authorized, which is why fixing the action alone changed nothing visible. The editor now answers a challenge instead of dead-ending on it: the state call travels the step-up path, so a session that still has to prove itself gets the dialog and the request is retried with the token. The tests go through the ASGI app rather than calling the route functions directly, because the fault was in which action a route asks for and nothing below the app can see that. AI-Generated: true Generated-At: 2026-09-18T08:53:00Z --- astrbot/dashboard/api/coding_cli.py | 35 ++++- dashboard/src/api/v1/codingCli.ts | 14 +- dashboard/src/views/CliConfigPage.vue | 23 ++- .../dashboard/test_fastapi_v1_coding_cli.py | 148 ++++++++++++++++++ 4 files changed, 210 insertions(+), 10 deletions(-) create mode 100644 tests/unit/dashboard/test_fastapi_v1_coding_cli.py diff --git a/astrbot/dashboard/api/coding_cli.py b/astrbot/dashboard/api/coding_cli.py index 3f84432eb7..04e1a38baa 100644 --- a/astrbot/dashboard/api/coding_cli.py +++ b/astrbot/dashboard/api/coding_cli.py @@ -31,6 +31,11 @@ # Every write into a CLI's own global config asks for this one action. WRITE_ACTION = "coding_cli.config.write" +# Reading what a switch would do asks only for the ordinary config read. The +# state names a file path and what the CLI currently holds, never a credential, +# and the read route cannot answer a step-up challenge: gating it behind the +# high-risk action above meant the page could not be filled in at all. +READ_ACTION = "platform.read" async def require_coding_cli_scope(request: Request) -> AuthContext: @@ -38,7 +43,17 @@ async def require_coding_cli_scope(request: Request) -> AuthContext: return await require_scope(request, "config", authorize_action=False) -async def authorize_coding_cli(request: Request, auth: AuthContext) -> None: +async def authorize_coding_cli_read(request: Request, auth: AuthContext) -> None: + """Require the ordinary read that viewing the CLI state needs.""" + await require_resource_action( + request, + auth, + action=READ_ACTION, + resource=Resource.instance("default"), + ) + + +async def authorize_coding_cli_write(request: Request, auth: AuthContext) -> None: """Require the high-risk action that switching a CLI's provider needs.""" await require_resource_action( request, @@ -117,9 +132,15 @@ def _provider_for(cli: str, config: Any, provider_id: str) -> dict: def _config_of(request: Request) -> Any: - """Return the running profile, which holds the operator's provider list.""" - runtime = getattr(request.app.state, "runtime", None) - services = getattr(runtime, "services", None) + """Return the running profile, which holds the operator's provider list. + + The Dashboard keeps its own services namespace on the app state, and that is + where the config profile service is: the core runtime's services carry the + authorization service and the other core-owned pieces, but nothing that + reads configuration. Reading the wrong one made every route here answer + "Configuration is unavailable" and the page could never fill in its list. + """ + services = getattr(request.app.state, "services", None) profiles = getattr(services, "config_profiles", None) acm = getattr(profiles, "acm", None) configs = getattr(acm, "confs", None) @@ -134,7 +155,7 @@ async def get_global_config( auth: AuthContext = Depends(require_coding_cli_scope), ): """Report each CLI's own configuration and the providers it can use.""" - await authorize_coding_cli(request, auth) + await authorize_coding_cli_read(request, auth) btw = _config_of(request).get("btw", {}) raw = btw.get("cli_providers") if isinstance(btw, dict) else None return ok( @@ -154,7 +175,7 @@ async def switch_provider( auth: AuthContext = Depends(require_coding_cli_scope), ): """Make one configured provider the CLI's default on this host.""" - await authorize_coding_cli(request, auth) + await authorize_coding_cli_write(request, auth) provider = _provider_for(payload.cli, _config_of(request), payload.provider_id) try: cli_global_config.apply_provider(payload.cli, provider) @@ -170,7 +191,7 @@ async def remove_global_config( auth: AuthContext = Depends(require_coding_cli_scope), ): """Take AstrBot's configuration back out of the CLI's own file.""" - await authorize_coding_cli(request, auth) + await authorize_coding_cli_write(request, auth) if cli not in cli_global_config.CODING_GLOBAL_AGENT_TYPES: raise ApiError(f"Unknown coding agent type: {cli!r}") try: diff --git a/dashboard/src/api/v1/codingCli.ts b/dashboard/src/api/v1/codingCli.ts index 3aa181e06d..60dd79acad 100644 --- a/dashboard/src/api/v1/codingCli.ts +++ b/dashboard/src/api/v1/codingCli.ts @@ -35,8 +35,18 @@ export interface CodingCliStatePayload { } export const codingCliApi = { - state() { - return typed(openApiV1.getCodingCliGlobalConfig()); + /** + * Read each CLI's own configuration. + * + * A request config is optional and carries the step-up credential when the + * backend asks for one: the read is an ordinary permission, but an operator + * whose session has not proved itself yet still has to answer the challenge + * before the list can be filled in. + */ + state(requestConfig?: AxiosRequestConfig) { + return typed( + openApiV1.getCodingCliGlobalConfig(generatedOptions({}, requestConfig)), + ); }, switchProvider( payload: { cli: CodingCliKind; provider_id: string }, diff --git a/dashboard/src/views/CliConfigPage.vue b/dashboard/src/views/CliConfigPage.vue index 4b4c04271f..f0f7b03508 100644 --- a/dashboard/src/views/CliConfigPage.vue +++ b/dashboard/src/views/CliConfigPage.vue @@ -411,6 +411,8 @@ defineOptions({ name: 'CliConfigPage' }); /** The action the switch route asks for; step-up is issued against it. */ const WRITE_ACTION = 'coding_cli.config.write'; +/** The action the state route asks for: a read, which is rarely challenged. */ +const READ_ACTION = 'platform.read'; /** The id the backend uses for the profile that is the running configuration. */ const SYSTEM_SCOPE = 'default'; @@ -549,10 +551,29 @@ function rawProviders(config: OpenConfig): Record[] { async function load() { loadFailed.value = false; try { + // The state call travels the step-up path even though a read is an ordinary + // permission: a session that has not proved itself yet is answered with a + // challenge, and without this the page would dead-end on a load error with + // no way to answer it. const [stateResponse, profileResponse] = await Promise.all([ - codingCliApi.state(), + runMutationWithStepUp( + (stepUp) => + codingCliApi.state({ headers: stepUp ? stepUpHeaders(stepUp) : {} }), + { + action: READ_ACTION, + resourceType: 'instance', + resourceId: SYSTEM_SCOPE, + }, + requestStepUp, + ), configProfileApi.get(SYSTEM_SCOPE), ]); + if (!stateResponse) { + // The challenge was withdrawn, so there is nothing to show yet. + loaded.value = false; + loadFailed.value = true; + return; + } clis.value = stateResponse.data?.data?.clis ?? []; const payload = profileResponse.data?.data as Record | undefined; diff --git a/tests/unit/dashboard/test_fastapi_v1_coding_cli.py b/tests/unit/dashboard/test_fastapi_v1_coding_cli.py new file mode 100644 index 0000000000..4a846448e8 --- /dev/null +++ b/tests/unit/dashboard/test_fastapi_v1_coding_cli.py @@ -0,0 +1,148 @@ +"""Route-level tests for switching a coding CLI's provider. + +These go through the real ASGI app and its authorization call, which is what the +helper-only tests could not do: the whole bug was in which action each route +asked for, and nothing that called the functions directly could see it. +""" + +from __future__ import annotations + +from types import SimpleNamespace + +import pytest +import pytest_asyncio + +from astrbot.core.auth.models import HIGH_RISK_ACTIONS +from tests.unit.dashboard.fastapi_v1_support import * # noqa: F403 +from tests.unit.dashboard.fastapi_v1_support import ( + asgi_app, # noqa: F401 - the fixture this file reuses +) + +PROVIDERS = [ + { + "id": "gw", + "name": "Gateway", + "base_url": "https://gw.example", + "api_key": "sk-secret", + "model": "opus", + }, +] + +GLOBAL_CONFIG = "/api/v1/coding-cli/global-config" + + +class _StepUpAuthorization: + """The Dashboard's rule, reduced to the part these routes depend on. + + A high-risk action is denied until the request carries a step-up token. + That is what the plain GET could never answer, and what a route asking for + the wrong action is denied by -- which is the failure these tests exist to + catch. + """ + + async def authorize(self, subject, action, resource, context): + if action in HIGH_RISK_ACTIONS: + stepped_up = bool(context.step_up_token) + return SimpleNamespace( + allowed=stepped_up, + requires_step_up=not stepped_up, + ) + return SimpleNamespace(allowed=True, requires_step_up=False) + + +@pytest.fixture +def cli_homes(tmp_path, monkeypatch): + """Point both CLIs at directories of the test's own.""" + monkeypatch.setenv("CLAUDE_CONFIG_DIR", str(tmp_path / "claude")) + monkeypatch.setenv("CODEX_HOME", str(tmp_path / "codex")) + return tmp_path + + +@pytest.fixture +def coding_cli_app(asgi_app, cli_homes, fake_core_lifecycle): # noqa: F811 + asgi_app.state.runtime.services.authorization = _StepUpAuthorization() + fake_core_lifecycle.astrbot_config_mgr.confs["default"]["btw"] = { + "cli_providers": PROVIDERS + } + return asgi_app + + +@pytest_asyncio.fixture +async def coding_cli_client(coding_cli_app): + transport = httpx.ASGITransport(app=coding_cli_app) + async with httpx.AsyncClient( + transport=transport, + base_url="http://testserver", + ) as client: + yield client + + +@pytest.mark.asyncio +async def test_the_state_route_answers_without_a_step_up(coding_cli_client): + """Reading the page's data must not demand a credential it cannot send. + + The route used to ask for `coding_cli.config.write`, which is high-risk, so + every load was answered with a challenge a plain GET has no way to answer. + """ + response = await coding_cli_client.get(GLOBAL_CONFIG, headers=_jwt_headers()) + + assert response.status_code == 200 + assert [entry["cli"] for entry in response.json()["data"]["clis"]] == [ + "claude_code", + "codex", + ] + + +@pytest.mark.asyncio +async def test_the_state_never_carries_the_stored_key(coding_cli_client): + response = await coding_cli_client.get(GLOBAL_CONFIG, headers=_jwt_headers()) + + assert response.status_code == 200 + body = response.text + assert "sk-secret" not in body + providers = response.json()["data"]["clis"][0]["providers"] + # Present, not named: the operator still has to be able to tell. + assert providers[0]["has_api_key"] is True + + +@pytest.mark.asyncio +async def test_switching_a_provider_asks_for_a_step_up(coding_cli_client): + response = await coding_cli_client.put( + GLOBAL_CONFIG, + headers=_jwt_headers(), + json={"cli": "claude_code", "provider_id": "gw"}, + ) + + assert response.status_code == 403 + assert response.json()["data"]["requires_step_up"] is True + + +@pytest.mark.asyncio +async def test_taking_the_configuration_back_asks_for_a_step_up(coding_cli_client): + response = await coding_cli_client.delete( + f"{GLOBAL_CONFIG}/claude_code", + headers=_jwt_headers(), + ) + + assert response.status_code == 403 + assert response.json()["data"]["requires_step_up"] is True + + +@pytest.mark.asyncio +async def test_a_switch_with_a_step_up_writes_the_cli_own_file( + coding_cli_client, + cli_homes, +): + response = await coding_cli_client.put( + GLOBAL_CONFIG, + headers={**_jwt_headers(), "X-AstrBot-Step-Up": "issued"}, + json={"cli": "claude_code", "provider_id": "gw"}, + ) + + assert response.status_code == 200 + settings = (cli_homes / "claude" / "settings.json").read_text(encoding="utf-8") + assert "https://gw.example" in settings + assert "sk-secret" in settings + # The write that replaced the file can be undone, and nothing else about + # the response names the key it just wrote. + assert "sk-secret" not in response.text From 34f2517c9b1b2c3c0d56edfc2f595979600f792e Mon Sep 17 00:00:00 2001 From: YUZHEthefool <2804776511@qq.com> Date: Fri, 18 Sep 2026 16:55:29 +0800 Subject: [PATCH 3/7] fix(dashboard): keep a stored key with the provider it belongs to The profile reports a stored key as `__ASTRBOT_REDACTED__`, and the page read that marker into the field as if it were the key. Saving then carried it whichever way the entry moved: a rename put it in front of a different provider's key, a copy under a new id kept the marker itself, and an added provider was given no scope at all, so it appeared under both CLIs while the profile -- which keys its list by id -- would drop one of the two on the next load. The marker now means what it says: a key is stored, the field is empty, and empty means "leave it alone". The marker goes back only for the entry it came from, whose id the save still carries; a copy is metadata only and starts with no key. An entry added from a section is scoped to that section, and an id another entry already uses is refused across the whole list rather than per CLI. The copy that only this page reads comes back with it. The branch below drops it because nothing there renders it; the page that needs it is here. AI-Generated: true Generated-At: 2026-09-18T08:53:30Z --- .../i18n/locales/en-US/features/config.json | 57 +++++++++ .../i18n/locales/zh-CN/features/config.json | 57 +++++++++ dashboard/src/views/CliConfigPage.vue | 109 +++++++++++++----- dashboard/tests/cliConfigPage.vitest.ts | 80 ++++++++++++- 4 files changed, 266 insertions(+), 37 deletions(-) diff --git a/dashboard/src/i18n/locales/en-US/features/config.json b/dashboard/src/i18n/locales/en-US/features/config.json index a5f687df30..11d2377571 100644 --- a/dashboard/src/i18n/locales/en-US/features/config.json +++ b/dashboard/src/i18n/locales/en-US/features/config.json @@ -288,5 +288,62 @@ "twoFactorRejected": "That code was not accepted. Enter the current one.", "unsavedTitle": "Unsaved BTW settings", "unsavedMessage": "Leaving now discards them. The work loop's boundary is among what would be lost." + }, + "cliConfigPage": { + "title": "CLI Provider Switching", + "subtitle": "Keep a list of providers for Claude Code and Codex, and switch a CLI to one of them. Switching writes that provider into the CLI's own configuration, so the CLI uses it everywhere -- including the sessions you start by hand.", + "untouchedHint": "A delegated coding task is not affected: it layers its own configuration over these files instead of reading them, so switching a provider here never changes how a task runs.", + "loadError": "Could not read the CLI configuration.", + "retry": "Retry", + "claudeCode": "Claude Code", + "codex": "Codex", + "managed": "Written by AstrBot", + "credentialStored": "A key is stored", + "fileExists": "The file exists.", + "fileAbsent": "The file does not exist yet and will be created on the first switch.", + "noProviders": "No provider yet. Add one to be able to switch this CLI.", + "noBaseUrl": "no endpoint", + "current": "In use", + "enable": "Switch", + "edit": "Edit", + "duplicate": "Duplicate", + "delete": "Delete", + "restore": "Take back", + "addProvider": "Add provider", + "editProvider": "Edit provider", + "providerId": "ID", + "providerIdHint": "A unique name for this provider. It names the stored credential, so prefer letters, digits, dots, dashes and underscores.", + "providerName": "Display name", + "baseUrl": "Endpoint", + "baseUrlHintClaude": "For example https://api.example.com -- written as ANTHROPIC_BASE_URL.", + "baseUrlHintCodex": "For example https://api.example.com/v1 -- written as the Codex provider's base_url.", + "apiKey": "API key", + "apiKeyHint": "Stored in the CLI's own configuration file on this host, readable only by you. Leave empty when editing to keep the stored key.", + "model": "Model", + "modelHint": "Optional. Written as the CLI's default model.", + "note": "Note", + "keyPresent": "Key stored", + "keyAbsent": "No key stored", + "cancel": "Cancel", + "confirm": "Save", + "save": "Save list", + "saved": "Provider list saved", + "saveError": "Could not save the provider list", + "idRequired": "A provider needs an ID.", + "endpointOrKeyRequired": "A provider needs an endpoint or an API key.", + "idTaken": "Another provider already uses this ID.", + "switchTitle": "Replace the CLI's own configuration?", + "switchMessage": "This rewrites the file the CLI reads on this host, including the stored key. Your previous file is kept once as a backup, and “Take back” restores it.", + "deleteTitle": "Remove this provider?", + "deleteMessage": "It is removed from the list. If the CLI is currently using it, the file it wrote is left as it is until you switch or take it back.", + "restoreTitle": "Take AstrBot's configuration back out?", + "restoreMessage": "The file is restored from the backup taken before the first switch, if there is one.", + "switched": "Switched. The CLI now uses this provider.", + "switchError": "Could not switch the CLI's provider.", + "restored": "Restored.", + "restoreError": "Could not restore the CLI configuration.", + "unsavedTitle": "Unsaved provider list", + "unsavedMessage": "Leaving now discards the changes to the list.", + "actions": "Provider list actions" } } diff --git a/dashboard/src/i18n/locales/zh-CN/features/config.json b/dashboard/src/i18n/locales/zh-CN/features/config.json index 9fc87784b3..fc2fcb849a 100644 --- a/dashboard/src/i18n/locales/zh-CN/features/config.json +++ b/dashboard/src/i18n/locales/zh-CN/features/config.json @@ -288,5 +288,62 @@ "twoFactorRejected": "验证码未被接受,请输入当前验证码。", "unsavedTitle": "BTW 设置尚未保存", "unsavedMessage": "现在离开会丢弃这些改动,其中包含工作循环的边界设置。" + }, + "cliConfigPage": { + "title": "CLI 供应商切换", + "subtitle": "为 Claude Code 与 Codex 各维护一份 provider 列表,把某个 CLI 切换到其中之一。切换会把该 provider 写进这个 CLI 自己的配置文件,让它在所有场合生效——包括你手动启动的会话。", + "untouchedHint": "委派任务不受影响:它使用独立的配置层,不读取这些文件,因此这里切换 provider 不会改变任务的运行方式。", + "loadError": "无法读取 CLI 配置。", + "retry": "重试", + "claudeCode": "Claude Code", + "codex": "Codex", + "managed": "由 AstrBot 写入", + "credentialStored": "已存有密钥", + "fileExists": "文件已存在。", + "fileAbsent": "文件尚不存在,首次切换时会创建。", + "noProviders": "尚无 provider。添加一个后即可切换该 CLI。", + "noBaseUrl": "无端点", + "current": "使用中", + "enable": "启用", + "edit": "编辑", + "duplicate": "复制", + "delete": "删除", + "restore": "取回", + "addProvider": "添加 provider", + "editProvider": "编辑 provider", + "providerId": "ID", + "providerIdHint": "该 provider 的唯一名称。它会作为所存密钥的变量名,建议只用字母、数字、点、短横线和下划线。", + "providerName": "显示名称", + "baseUrl": "端点地址", + "baseUrlHintClaude": "例如 https://api.example.com —— 写入 ANTHROPIC_BASE_URL。", + "baseUrlHintCodex": "例如 https://api.example.com/v1 —— 写入 Codex provider 的 base_url。", + "apiKey": "API Key", + "apiKeyHint": "保存在本机该 CLI 自己的配置文件里,仅本机用户可读。编辑时留空表示保留已存的密钥。", + "model": "模型", + "modelHint": "可选。会写成该 CLI 的默认模型。", + "note": "备注", + "keyPresent": "已存密钥", + "keyAbsent": "无密钥", + "cancel": "取消", + "confirm": "保存", + "save": "保存列表", + "saved": "provider 列表已保存", + "saveError": "provider 列表保存失败", + "idRequired": "provider 需要一个 ID。", + "endpointOrKeyRequired": "provider 至少需要端点或 API Key 之一。", + "idTaken": "已有其他 provider 使用该 ID。", + "switchTitle": "要覆盖该 CLI 自己的配置吗?", + "switchMessage": "这会改写该 CLI 在本机读取的配置文件,包括所存的密钥。原文件会在首次切换前备份一次,「取回」可以还原。", + "deleteTitle": "要删除这个 provider 吗?", + "deleteMessage": "它只会从列表中移除。如果该 CLI 正在使用它,已写入的文件会保持原样,直到你切换或取回。", + "restoreTitle": "要取回 AstrBot 的配置吗?", + "restoreMessage": "如果存在首次切换前的备份,会用它还原该文件。", + "switched": "已切换,该 CLI 现在使用这个 provider。", + "switchError": "切换 CLI 的 provider 失败。", + "restored": "已还原。", + "restoreError": "还原 CLI 配置失败。", + "unsavedTitle": "provider 列表尚未保存", + "unsavedMessage": "现在离开会丢弃列表的改动。", + "actions": "provider 列表操作" } } diff --git a/dashboard/src/views/CliConfigPage.vue b/dashboard/src/views/CliConfigPage.vue index f0f7b03508..751bda75fc 100644 --- a/dashboard/src/views/CliConfigPage.vue +++ b/dashboard/src/views/CliConfigPage.vue @@ -193,7 +193,7 @@ size="small" prepend-icon="mdi-content-copy" :aria-label="`${tm('cliConfigPage.duplicate')}: ${provider.name}`" - @click="duplicate(state.cli, provider)" + @click="duplicate(provider)" > {{ tm('cliConfigPage.duplicate') }} @@ -419,15 +419,20 @@ const SYSTEM_SCOPE = 'default'; /** * One stored provider. * - * `api_key` is only ever what this page put there: the API reports whether a - * key is stored, never the key itself, so a reload leaves this empty and an - * empty field has to mean "leave the stored key alone". + * `api_key` is what the operator typed here and nothing else. The profile + * reports a stored key as `__ASTRBOT_REDACTED__` rather than as itself, so the + * marker is not a key: `has_api_key` says one is stored, and saving puts the + * marker back only for the entry it came from. An empty field means "leave the + * stored key alone", never "erase it". */ interface StoredProvider extends CodingCliProvider { cli: string; api_key: string; } +/** What a config response writes where a stored secret would be. */ +const REDACTED_SECRET_PLACEHOLDER = '__ASTRBOT_REDACTED__'; + const { tm } = useModuleI18n('features/config'); const confirmDialog = useConfirmDialog(); @@ -453,6 +458,8 @@ const snackColor = ref<'success' | 'error'>('success'); const formOpen = ref(false); const formEditing = ref(false); +/** The id the open form started from, which a rename changes. */ +const formOriginalId = ref(''); const formError = ref(''); const showKey = ref(false); const form = ref({ @@ -475,6 +482,17 @@ function text(value: unknown): string { return typeof value === 'string' ? value : ''; } +/** + * The operator's own key, never the marker a response puts in its place. + * + * Treating the marker as a key is how it ends up stored as one: it is what the + * field would show, and what the next save would write back. + */ +function typedKey(value: unknown): string { + const key = text(value); + return key === REDACTED_SECRET_PLACEHOLDER ? '' : key; +} + /** A short, safe reason for a failed request, for the operator to act on. */ function describeError(error: unknown): string { const response = (error as { response?: { data?: unknown } } | null) @@ -529,8 +547,14 @@ function find(id: string) { return providers.value.find((provider) => provider.id === id); } -function nextId(base: string, cli: CodingCliKind): string { - const taken = providersFor(cli).map((provider) => provider.id); +/** + * A free id, over the whole list rather than over one CLI. + * + * The profile's list is keyed by id alone, so two entries sharing one are two + * entries where the profile will only keep the first. + */ +function nextId(base: string): string { + const taken = providers.value.map((provider) => provider.id); if (!taken.includes(base)) return base; let suffix = 2; while (taken.includes(`${base}-${suffix}`)) suffix += 1; @@ -588,7 +612,7 @@ async function load() { has_api_key: Boolean(text(entry.api_key).trim()), current: false, cli: text(entry.cli).trim(), - api_key: text(entry.api_key), + api_key: typedKey(entry.api_key), })); savedProviders.value = JSON.stringify(providers.value); loaded.value = true; @@ -631,8 +655,17 @@ async function save() { }; if (provider.cli) entry.cli = provider.cli; else delete entry.cli; - if (provider.api_key) entry.api_key = provider.api_key; - else delete entry.api_key; + if (provider.api_key) { + entry.api_key = provider.api_key; + } else if (provider.has_api_key) { + // The profile still holds a key for this entry and the operator did not + // type a new one, so the marker is what says "keep it". It is posted + // only where it came from: the restore resolves it by the entry's id, + // and a copy of this entry has an id the profile has never seen. + entry.api_key = REDACTED_SECRET_PLACEHOLDER; + } else { + delete entry.api_key; + } return entry; }); config.btw = btw; @@ -665,9 +698,12 @@ function openForm(cli: CodingCliKind, provider?: CodingCliProvider) { formEditing.value = Boolean(provider); formError.value = ''; showKey.value = false; + // The id the form opened on, so a rename can still find the entry it is + // renaming: the stored key belongs to that entry, not to the new name. + formOriginalId.value = provider?.id ?? ''; form.value = { cli, - id: provider?.id ?? nextId('provider', cli), + id: provider?.id ?? nextId('provider'), name: provider?.name ?? '', base_url: provider?.base_url ?? '', api_key: '', @@ -687,21 +723,19 @@ function confirmForm() { formError.value = tm('cliConfigPage.endpointOrKeyRequired'); return; } - const scope = form.value.cli === 'claude_code' ? '' : form.value.cli; - const clash = providers.value.some( - (provider) => provider.id === id && (provider.cli ?? '') === scope, - ); - const editingSelf = - formEditing.value && - find(id) !== undefined && - (find(id)?.cli ?? '') === scope; - if (clash && !editingSelf) { + // The id names the entry and the profile keeps one entry per id, so the whole + // list is checked rather than the CLI the form was opened from. + const occupant = find(id); + const editingSelf = formEditing.value && formOriginalId.value === id; + if (occupant !== undefined && !editingSelf) { formError.value = tm('cliConfigPage.idTaken'); return; } const apiKey = form.value.api_key.trim(); - const previous = find(id); + const previous = + providers.value.find((entry) => entry.id === formOriginalId.value) ?? + find(id); const entry: StoredProvider = { id, name: form.value.name.trim() || id, @@ -710,21 +744,29 @@ function confirmForm() { note: form.value.note.trim(), has_api_key: Boolean(apiKey) || Boolean(previous?.has_api_key), current: false, - cli: scope, - api_key: apiKey || (previous?.api_key ?? ''), + // The section the form was opened from, always: an entry that names no CLI + // would be shown under every CLI, which is not what adding one here means. + cli: form.value.cli, + api_key: apiKey, }; - const index = providers.value.findIndex((provider) => provider.id === id); - const next = [...providers.value]; - if (index === -1) next.push(entry); - else next[index] = entry; - providers.value = next; + // A rename replaces the entry it was opened on; anything else is a new id. + const replaced = providers.value.findIndex( + (provider) => provider.id === formOriginalId.value, + ); + const target = replaced === -1 ? find(id) : providers.value[replaced]; + if (target === undefined) { + providers.value = [...providers.value, entry]; + } else { + providers.value = providers.value.map((provider) => + provider === target ? entry : provider, + ); + } formOpen.value = false; } -function duplicate(cli: CodingCliKind, provider: CodingCliProvider) { - const id = nextId(`${provider.id}-copy`, cli); - const source = find(provider.id); +function duplicate(provider: StoredProvider) { + const id = nextId(`${provider.id}-copy`); providers.value = [ ...providers.value, { @@ -732,8 +774,11 @@ function duplicate(cli: CodingCliKind, provider: CodingCliProvider) { id, name: `${provider.name} (copy)`, current: false, - cli: source?.cli ?? '', - api_key: source?.api_key ?? '', + // Metadata only: the source's key is a marker that names the source's + // stored secret, and this entry has an id the profile has never seen, so + // there is nothing there to keep. + api_key: '', + has_api_key: false, }, ]; } diff --git a/dashboard/tests/cliConfigPage.vitest.ts b/dashboard/tests/cliConfigPage.vitest.ts index f293ab77c9..af584cfa16 100644 --- a/dashboard/tests/cliConfigPage.vitest.ts +++ b/dashboard/tests/cliConfigPage.vitest.ts @@ -54,7 +54,15 @@ const STATE = { ], }; -/** The operator's own list, which is what the cards render from. */ +/** + * The operator's own list, which is what the cards render from. + * + * The key is the marker the profile reports, not the key: a config response + * never carries a stored secret, and a fixture that carries one tests a path + * that does not exist. + */ +const REDACTED = '__ASTRBOT_REDACTED__'; + const CONFIG = { btw: { cli_providers: [ @@ -62,7 +70,7 @@ const CONFIG = { id: 'gw', name: 'Gateway', base_url: 'https://gw.example', - api_key: 'sk-secret', + api_key: REDACTED, model: 'opus', note: 'primary', }, @@ -252,8 +260,8 @@ describe('CliConfigPage', () => { await wrapper.vm.$nextTick(); const keyInput = wrapper.find('.cli-config-page__form-api-key input') .element as HTMLInputElement; - // The API never sends a key back, so the field starts empty, and empty has - // to mean "unchanged" rather than "erase it". + // The profile reports a stored key as a marker, so the field starts empty + // and empty has to mean "unchanged" rather than "erase it". expect(keyInput.value).toBe(''); // Something has to change for there to be anything to save. @@ -266,11 +274,73 @@ describe('CliConfigPage', () => { await flushPromises(); const entry = savedProviders().find((item) => item.id === 'gw'); - expect(entry?.api_key).toBe('sk-secret'); + // The marker goes back exactly where it came from, which is what the + // profile resolves to the stored key. It is never copied to another entry: + // an id the profile has never seen has no key for the marker to name. + expect(entry?.api_key).toBe(REDACTED); expect(entry?.note).toBe('updated note'); wrapper.unmount(); }); + it('adds a provider scoped to the CLI whose section it was added from', async () => { + const wrapper = mountPage(); + await flushPromises(); + + // `openFormAndFill` adds from the Claude Code section, the first one. + await openFormAndFill(wrapper, { + id: 'mine', + base_url: 'https://mine.example', + api_key: 'sk-2', + }); + + // Scoped, not left open: an entry with no `cli` is shown under every CLI, + // so leaving it unset would put a Claude provider in the Codex section too. + expect(() => cardFor(wrapper, 'claude_code', 'mine')).not.toThrow(); + expect(() => cardFor(wrapper, 'codex', 'mine')).toThrow(); + + await wrapper.find('.cli-config-page__save').trigger('click'); + await flushPromises(); + + const added = savedProviders().find((entry) => entry.id === 'mine'); + expect(added?.cli).toBe('claude_code'); + wrapper.unmount(); + }); + + it('does not carry a stored key onto a duplicate', async () => { + const wrapper = mountPage(); + await flushPromises(); + + await cardFor(wrapper, 'claude_code', 'gw') + .find('.cli-config-page__duplicate') + .trigger('click'); + await wrapper.vm.$nextTick(); + await wrapper.find('.cli-config-page__save').trigger('click'); + await flushPromises(); + + const copy = savedProviders().find((entry) => entry.id === 'gw-copy'); + // The copy is metadata only. Posting the source's marker under a new id + // would store the marker itself, and the switch would write that string + // into the CLI's own file as if it were a key. + expect(copy?.api_key).toBeUndefined(); + expect(copy?.base_url).toBe('https://gw.example'); + wrapper.unmount(); + }); + + it('refuses an id another provider already uses, whichever CLI it is under', async () => { + const wrapper = mountPage(); + await flushPromises(); + + // `gw` is unscoped and so is listed under both CLIs, but the profile keys + // its list by id alone: a second `gw` would be dropped on the next load. + await openFormAndFill(wrapper, { + id: 'gw', + base_url: 'https://other.example', + }); + + expect(wrapper.find('.cli-config-page__form-error').exists()).toBe(true); + wrapper.unmount(); + }); + it('refuses a provider with no endpoint and no key', async () => { const wrapper = mountPage(); await flushPromises(); From 415db586e889d4766822b3560c52b931366acf0f Mon Sep 17 00:00:00 2001 From: YUZHEthefool <2804776511@qq.com> Date: Fri, 18 Sep 2026 16:55:39 +0800 Subject: [PATCH 4/7] fix(btw): refuse a CLI config file AstrBot cannot read `_read_json` fell back to an empty object for a file it could not parse, and its docstring said that meant the file was "treated as absent rather than replaced". The switch then replaced it: a backup of a settings.json holding JSONC comments -- or anything else the parser refuses -- only made the loss recoverable, and a JSON array was replaced by an object just as quietly. A file that exists and is not a JSON object is now an error the switch reports, and the backup is not taken, because nothing was going to change. The Codex section had the same shape of gap one file over. Stripping a section whose closing marker is missing is right, but applying a provider then wrote a complete section in front of the orphan, so the file kept the orphan for good and the next switch stripped only the block it had written. Reading already reported that file as unmanaged; writing now refuses it too, on the same grounds: where the section ends is not knowable from what is left. The credential file is read before the configuration file is written, so a refusal leaves the CLI switched in no respect rather than in half. AI-Generated: true Generated-At: 2026-09-18T08:54:00Z --- astrbot/core/agent/btw/cli_global_config.py | 107 +++++++++++++++----- tests/unit/test_btw_cli_global_config.py | 56 +++++++++- 2 files changed, 132 insertions(+), 31 deletions(-) diff --git a/astrbot/core/agent/btw/cli_global_config.py b/astrbot/core/agent/btw/cli_global_config.py index 2d01b5106a..69eb7f6ea4 100644 --- a/astrbot/core/agent/btw/cli_global_config.py +++ b/astrbot/core/agent/btw/cli_global_config.py @@ -35,8 +35,6 @@ from dataclasses import dataclass from pathlib import Path -from astrbot import logger - CODING_GLOBAL_AGENT_TYPES = ("claude_code", "codex") # What AstrBot writes into a file it does not own. @@ -172,17 +170,40 @@ def _backup_path(path: Path) -> Path: def _read_json(path: Path) -> dict: """Return a JSON object from ``path``, or an empty one. - A file that cannot be parsed is treated as absent rather than replaced: the - operator's own configuration is not this module's to discard. + For a reader, a file that cannot be parsed is absent: there is nothing to + report about it and nothing to change. A caller that is about to write + wants :func:`_read_json_object` instead -- for it the same fallback would + mean replacing the file, and the operator's own configuration is not this + module's to discard. + """ + try: + return _read_json_object(path) + except ValueError: + return {} + + +def _read_json_object(path: Path) -> dict: + """Return ``path`` as a JSON object, or an empty object when it is absent. + + A file that exists and cannot be read as a JSON object is an error rather + than an absence, because a write has nowhere to put the difference: it would + replace settings that are not ours with the handful of keys we do own. """ if not path.is_file(): return {} try: payload = json.loads(path.read_text(encoding="utf-8-sig")) - except OSError, ValueError: - logger.warning("%s is not valid JSON; leaving it alone.", path) - return {} - return payload if isinstance(payload, dict) else {} + except (OSError, ValueError) as exc: + raise ValueError( + f"{path} is not valid JSON. AstrBot will not replace it; fix or move " + f"it before switching a provider." + ) from exc + if not isinstance(payload, dict): + raise ValueError( + f"{path} does not hold a JSON object. AstrBot will not replace it; " + f"fix or move it before switching a provider." + ) + return payload def _atomic_write(path: Path, text: str, *, private: bool) -> None: @@ -254,17 +275,36 @@ def _managed_block(base_url: str, model: str, env_key: str) -> str: return "\n".join(lines) -def _strip_managed_block(text: str) -> str: - """Return ``text`` without AstrBot's section, keeping everything else.""" +def _managed_bounds(text: str) -> tuple[int, int] | None: + """Return where AstrBot's section starts and ends past the end marker.""" start = text.find(CODEX_MANAGED_BEGIN) if start == -1: - return text + return None end = text.find(CODEX_MANAGED_END, start) if end == -1: - # No closing marker: the file was edited by hand or truncated. Leave it - # alone rather than guess where the section was meant to end. + return None + return start, end + len(CODEX_MANAGED_END) + + +def _has_unclosed_block(text: str) -> bool: + """Whether an opening marker is left without its closing one. + + That happens when the file was edited by hand or truncated, and where the + section was meant to stop is not knowable from what is left. Both reading + and writing refuse it rather than guess: a write that guessed would add a + second section in front of the orphan and then, next time, strip only its + own, leaving the file growing a block at a time. + """ + start = text.find(CODEX_MANAGED_BEGIN) + return start != -1 and text.find(CODEX_MANAGED_END, start) == -1 + + +def _strip_managed_block(text: str) -> str: + """Return ``text`` without AstrBot's section, keeping everything else.""" + bounds = _managed_bounds(text) + if bounds is None: return text - end += len(CODEX_MANAGED_END) + start, end = bounds while end < len(text) and text[end] == "\n": end += 1 return text[:start] + text[end:] @@ -303,10 +343,9 @@ def read_state(cli: str) -> ManagedFile: base_url = "" model = "" env_key = "" - start = text.find(CODEX_MANAGED_BEGIN) - end = text.find(CODEX_MANAGED_END, start) if start != -1 else -1 - if start != -1 and end != -1: - for line in text[start:end].splitlines(): + bounds = _managed_bounds(text) + if bounds is not None: + for line in text[bounds[0] : bounds[1]].splitlines(): key, _, value = line.partition("=") value = value.strip().strip('"') if key.strip() == "base_url": @@ -319,7 +358,7 @@ def read_state(cli: str) -> ManagedFile: return ManagedFile( path=path, exists=path.is_file(), - managed=start != -1 and end != -1, + managed=bounds is not None, base_url=base_url, model=model, has_credential=bool(auth.get(env_key)) if env_key else False, @@ -351,10 +390,14 @@ def apply_provider(cli: str, provider: Mapping) -> ManagedFile: ) path = target_path(cli) - _back_up_once(path) if cli == "claude_code": - payload = _read_json(path) + # Read before backing up: a file that is refused needs no copy taken. + # `_read_json_object` refuses a file that exists and is not a JSON + # object, which is what keeps the fallback to `{}` from becoming a + # replacement of everything in it. + payload = _read_json_object(path) + _back_up_once(path) env = payload.get("env") env = dict(env) if isinstance(env, Mapping) else {} env["ANTHROPIC_BASE_URL"] = base_url @@ -374,10 +417,22 @@ def apply_provider(cli: str, provider: Mapping) -> ManagedFile: ) return read_state(cli) - env_key = credential_env_name(provider_id) existing = ( path.read_text(encoding="utf-8", errors="replace") if path.is_file() else "" ) + if _has_unclosed_block(existing): + raise ValueError( + f"{path} opens AstrBot's section with {CODEX_MANAGED_BEGIN!r} and " + f"never closes it, so where that section ends cannot be known. " + f"Close or remove it before switching a provider." + ) + # Both files are read before either is written, so a refusal here leaves the + # CLI's configuration as it was rather than switched in part. + auth_path = codex_home() / CODEX_AUTH_FILE + _read_json_object(auth_path) + + env_key = credential_env_name(provider_id) + _back_up_once(path) block = _managed_block(base_url, model, env_key if api_key else "") rest = _strip_managed_block(existing) _atomic_write(path, f"{block}\n" + (f"\n{rest}" if rest else ""), private=False) @@ -396,7 +451,7 @@ def _apply_codex_credential(env_key: str, api_key: str) -> None: if not api_key and not auth_path.is_file(): return _back_up_once(auth_path) - auth = _read_json(auth_path) + auth = _read_json_object(auth_path) if api_key: auth[env_key] = api_key else: @@ -440,7 +495,7 @@ def remove_provider(cli: str, provider_id: str = "") -> ManagedFile: return read_state(cli) if cli == "claude_code": - payload = _read_json(path) + payload = _read_json_object(path) env = payload.get("env") if isinstance(env, Mapping): env = dict(env) @@ -475,7 +530,7 @@ def _drop_credentials_for(provider_id: str) -> None: auth_path = codex_home() / CODEX_AUTH_FILE if not auth_path.is_file(): return - auth = _read_json(auth_path) + auth = _read_json_object(auth_path) key = credential_env_name(provider_id) if key not in auth: return @@ -497,7 +552,7 @@ def _drop_stored_credentials() -> None: auth_path = codex_home() / CODEX_AUTH_FILE if not auth_path.is_file(): return - auth = _read_json(auth_path) + auth = _read_json_object(auth_path) stored = [key for key in auth if key.upper().startswith(_CODEX_KEY_PREFIX)] if not stored: return diff --git a/tests/unit/test_btw_cli_global_config.py b/tests/unit/test_btw_cli_global_config.py index d19e07889d..c00067b0ee 100644 --- a/tests/unit/test_btw_cli_global_config.py +++ b/tests/unit/test_btw_cli_global_config.py @@ -170,15 +170,61 @@ def test_a_truncated_section_is_left_alone(homes): assert state.managed is False -def test_an_unparseable_json_file_is_not_replaced_with_astrbots(homes): +def test_a_truncated_section_refuses_the_write_rather_than_doubling_it(homes): + path = cg.target_path("codex") + path.parent.mkdir(parents=True) + original = f'{cg.CODEX_MANAGED_BEGIN}\nbase_url = "https://x.example"\n[user]\n' + path.write_text(original, encoding="utf-8") + + # Leaving the orphan alone is not enough on its own: prepending a complete + # section in front of it would keep the orphan for good, and the next + # rewrite would strip only the section it wrote. + with pytest.raises(ValueError): + cg.apply_provider("codex", PROVIDER) + + assert path.read_text(encoding="utf-8") == original + assert not path.with_name(path.name + cg.BACKUP_SUFFIX).exists() + + +def test_an_unparseable_json_file_is_left_alone_rather_than_replaced(homes): path = cg.target_path("claude_code") path.parent.mkdir(parents=True) path.write_text("{ this is not json", encoding="utf-8") - # A backup is taken, so the damaged file is recoverable... - cg.apply_provider("claude_code", {**PROVIDER, "api_key": ""}) - backup = path.with_name(path.name + cg.BACKUP_SUFFIX) - assert backup.read_text(encoding="utf-8") == "{ this is not json" + # The file holds settings that are not AstrBot's, and failing to read it is + # not a reason to discard them: a backup would only make the loss + # recoverable, so the switch is refused before anything is written. + with pytest.raises(ValueError): + cg.apply_provider("claude_code", {**PROVIDER, "api_key": ""}) + + assert path.read_text(encoding="utf-8") == "{ this is not json" + assert not path.with_name(path.name + cg.BACKUP_SUFFIX).exists() + + +def test_a_json_array_is_not_replaced_by_an_object(homes): + path = cg.target_path("claude_code") + path.parent.mkdir(parents=True) + path.write_text('["not", "an", "object"]', encoding="utf-8") + + with pytest.raises(ValueError): + cg.apply_provider("claude_code", {**PROVIDER, "api_key": ""}) + + assert path.read_text(encoding="utf-8") == '["not", "an", "object"]' + + +def test_a_broken_codex_auth_file_is_refused_before_the_config_is_written(homes): + config = cg.target_path("codex") + config.parent.mkdir(parents=True) + auth = cg.codex_home() / cg.CODEX_AUTH_FILE + auth.write_text("{not json", encoding="utf-8") + + # Running the switch in two steps would leave the config written and the + # credential not; both files are read before either is written. + with pytest.raises(ValueError): + cg.apply_provider("codex", PROVIDER) + + assert not config.exists() + assert auth.read_text(encoding="utf-8") == "{not json" def test_removing_restores_what_the_user_had(homes): From 494cfc76a3440e61f378596db946debc4b6d8a38 Mon Sep 17 00:00:00 2001 From: YUZHEthefool <2804776511@qq.com> Date: Fri, 18 Sep 2026 16:55:40 +0800 Subject: [PATCH 5/7] chore(btw): drop the process tree rewrite this branch does not need The module already imports `ctypes` at module level, guards `WinDLL` behind a `sys.platform` check, and reads `get_last_error` through `getattr`, so importing the names directly and guarding the lookup again changed nothing -- and the second `import ctypes`, inside `_last_error`, is a redundant import the linter and CodeQL both flag. It arrived with the delegation work in the base branch and has nothing to do with switching a CLI's provider. AI-Generated: true Generated-At: 2026-09-18T08:54:30Z --- astrbot/core/utils/process_tree.py | 75 ++++++++++++------------------ 1 file changed, 30 insertions(+), 45 deletions(-) diff --git a/astrbot/core/utils/process_tree.py b/astrbot/core/utils/process_tree.py index 2a933f9c50..1bd9e07bb6 100644 --- a/astrbot/core/utils/process_tree.py +++ b/astrbot/core/utils/process_tree.py @@ -29,18 +29,7 @@ import sys import threading import time -from ctypes import ( - POINTER, - Structure, - byref, - c_int, - c_longlong, - c_size_t, - c_ulonglong, - c_void_p, - sizeof, - wintypes, -) +from ctypes import wintypes from typing import Any from astrbot import logger @@ -72,7 +61,7 @@ _JOB_TERMINATE_EXIT_CODE = 1 -class _ThreadEntry32(Structure): +class _ThreadEntry32(ctypes.Structure): _fields_ = ( ("dwSize", wintypes.DWORD), ("cntUsage", wintypes.DWORD), @@ -84,23 +73,23 @@ class _ThreadEntry32(Structure): ) -class _BasicLimitInformation(Structure): +class _BasicLimitInformation(ctypes.Structure): _fields_ = ( - ("PerProcessUserTimeLimit", c_longlong), - ("PerJobUserTimeLimit", c_longlong), + ("PerProcessUserTimeLimit", ctypes.c_longlong), + ("PerJobUserTimeLimit", ctypes.c_longlong), ("LimitFlags", wintypes.DWORD), - ("MinimumWorkingSetSize", c_size_t), - ("MaximumWorkingSetSize", c_size_t), + ("MinimumWorkingSetSize", ctypes.c_size_t), + ("MaximumWorkingSetSize", ctypes.c_size_t), ("ActiveProcessLimit", wintypes.DWORD), - ("Affinity", c_size_t), + ("Affinity", ctypes.c_size_t), ("PriorityClass", wintypes.DWORD), ("SchedulingClass", wintypes.DWORD), ) -class _IoCounters(Structure): +class _IoCounters(ctypes.Structure): _fields_ = tuple( - (name, c_ulonglong) + (name, ctypes.c_ulonglong) for name in ( "ReadOperationCount", "WriteOperationCount", @@ -112,14 +101,14 @@ class _IoCounters(Structure): ) -class _ExtendedLimitInformation(Structure): +class _ExtendedLimitInformation(ctypes.Structure): _fields_ = ( ("BasicLimitInformation", _BasicLimitInformation), ("IoInfo", _IoCounters), - ("ProcessMemoryLimit", c_size_t), - ("JobMemoryLimit", c_size_t), - ("PeakProcessMemoryUsed", c_size_t), - ("PeakJobMemoryUsed", c_size_t), + ("ProcessMemoryLimit", ctypes.c_size_t), + ("JobMemoryLimit", ctypes.c_size_t), + ("PeakProcessMemoryUsed", ctypes.c_size_t), + ("PeakJobMemoryUsed", ctypes.c_size_t), ) @@ -127,8 +116,7 @@ def _kernel32() -> Any: """Return the Windows kernel library, or ``None`` off Windows.""" if sys.platform != "win32": return None - windll = getattr(ctypes, "WinDLL", None) - return windll("kernel32", use_last_error=True) if windll else None + return ctypes.WinDLL("kernel32", use_last_error=True) def _last_error() -> int: @@ -136,11 +124,8 @@ def _last_error() -> int: ``ctypes.get_last_error`` exists only on Windows and only when the library that failed was loaded with ``use_last_error``, so it is looked up rather - than referenced: this module is imported on POSIX as well, where the name - does not exist at all. + than referenced: this module is imported on POSIX as well. """ - import ctypes - getter = getattr(ctypes, "get_last_error", None) return int(getter()) if getter is not None else 0 @@ -150,12 +135,12 @@ def _last_error() -> int: # wrong one fails here rather than as a misread handle at kill time. if _KERNEL32 is not None: # pragma: no cover - Windows only _KERNEL32.CreateJobObjectW.restype = wintypes.HANDLE - _KERNEL32.CreateJobObjectW.argtypes = (c_void_p, wintypes.LPCWSTR) + _KERNEL32.CreateJobObjectW.argtypes = (ctypes.c_void_p, wintypes.LPCWSTR) _KERNEL32.SetInformationJobObject.restype = wintypes.BOOL _KERNEL32.SetInformationJobObject.argtypes = ( wintypes.HANDLE, - c_int, - c_void_p, + ctypes.c_int, + ctypes.c_void_p, wintypes.DWORD, ) _KERNEL32.OpenProcess.restype = wintypes.HANDLE @@ -168,14 +153,14 @@ def _last_error() -> int: _KERNEL32.IsProcessInJob.argtypes = ( wintypes.HANDLE, wintypes.HANDLE, - POINTER(c_int), + ctypes.POINTER(ctypes.c_int), ) _KERNEL32.CreateToolhelp32Snapshot.restype = wintypes.HANDLE _KERNEL32.CreateToolhelp32Snapshot.argtypes = (wintypes.DWORD, wintypes.DWORD) _KERNEL32.Thread32First.restype = wintypes.BOOL - _KERNEL32.Thread32First.argtypes = (wintypes.HANDLE, c_void_p) + _KERNEL32.Thread32First.argtypes = (wintypes.HANDLE, ctypes.c_void_p) _KERNEL32.Thread32Next.restype = wintypes.BOOL - _KERNEL32.Thread32Next.argtypes = (wintypes.HANDLE, c_void_p) + _KERNEL32.Thread32Next.argtypes = (wintypes.HANDLE, ctypes.c_void_p) _KERNEL32.OpenThread.restype = wintypes.HANDLE _KERNEL32.OpenThread.argtypes = (wintypes.DWORD, wintypes.BOOL, wintypes.DWORD) _KERNEL32.ResumeThread.restype = wintypes.DWORD @@ -214,8 +199,8 @@ def create(cls) -> ProcessTree: if not _KERNEL32.SetInformationJobObject( job, _JOB_OBJECT_EXTENDED_LIMIT_INFORMATION, - byref(limits), - sizeof(limits), + ctypes.byref(limits), + ctypes.sizeof(limits), ): logger.debug("Could not configure the job object; closing it.") _KERNEL32.CloseHandle(job) @@ -505,8 +490,8 @@ def _wait_until_in_job(handle: int, job: int) -> bool: """ deadline = time.monotonic() + _JOB_OBJECT_ASSIGN_TIMEOUT_MS / 1000 while True: - in_job = c_int() - if _KERNEL32.IsProcessInJob(handle, job, byref(in_job)): + in_job = ctypes.c_int() + if _KERNEL32.IsProcessInJob(handle, job, ctypes.byref(in_job)): if in_job.value: return True elif _last_error() != _ERROR_INSUFFICIENT_BUFFER: @@ -531,8 +516,8 @@ def _resume(pid: int) -> None: return try: entry = _ThreadEntry32() - entry.dwSize = sizeof(entry) - found = _KERNEL32.Thread32First(snapshot, byref(entry)) + entry.dwSize = ctypes.sizeof(entry) + found = _KERNEL32.Thread32First(snapshot, ctypes.byref(entry)) while found: if entry.th32OwnerProcessID == pid: handle = _KERNEL32.OpenThread( @@ -546,6 +531,6 @@ def _resume(pid: int) -> None: ) finally: _KERNEL32.CloseHandle(handle) - found = _KERNEL32.Thread32Next(snapshot, byref(entry)) + found = _KERNEL32.Thread32Next(snapshot, ctypes.byref(entry)) finally: _KERNEL32.CloseHandle(snapshot) From 137baeb31d63596919242aff79c1b236bd79dea2 Mon Sep 17 00:00:00 2001 From: YUZHEthefool <2804776511@qq.com> Date: Fri, 18 Sep 2026 16:55:41 +0800 Subject: [PATCH 6/7] docs: document the coding CLI provider switch The new page had no entry in the user guide and the settings it edits had none in the developer guide, which is where the page's own documentation link points. The developer guide gains what `btw.cli_providers` holds, that a switch is the one write AstrBot makes outside its data directory, what is written into each CLI's own file, and which files are refused rather than replaced. The user guide gains the entry so an operator can find the page, together with the two things it is easy to get wrong: the switch rewrites what the CLI reads by hand, and it asks for a step-up. AI-Generated: true Generated-At: 2026-09-18T08:55:00Z --- docs/en/dev/astrbot-config.md | 10 ++++++++++ docs/en/use/webui.md | 2 ++ docs/zh/dev/astrbot-config.md | 10 ++++++++++ docs/zh/use/webui.md | 2 ++ 4 files changed, 24 insertions(+) diff --git a/docs/en/dev/astrbot-config.md b/docs/en/dev/astrbot-config.md index 93c1a9957b..b80b14aa39 100644 --- a/docs/en/dev/astrbot-config.md +++ b/docs/en/dev/astrbot-config.md @@ -259,6 +259,16 @@ Each agent's `providers` is a list of provider presets, and `active_provider` se When a task finishes, `btw.work_loop.report_via_conversation` (default `true`) hands the result to the conversation loop, which composes one report: the agent's answer first, then the completion status and the artifact paths. Streamed chunks are unaffected; only the final result carries the report, and one run carries it exactly once. Turning the setting off delivers results from the work loop directly. +## Switching a coding CLI's own global configuration + +`btw.cli_providers` is the provider list edited at **More Features → CLI Global Config** (`/cli-config`). It is ordinary configuration: the entries are saved with the profile, and so is `api_key`, like any other provider credential. Each entry carries `id`, `name`, an optional `cli` (`claude_code` or `codex`; empty means either CLI may use it, while an entry added in the Dashboard always names the section it came from), `base_url`, `model`, `note`, and `api_key`. The `id` is unique across the whole list. + +A delegated task is not affected by a switch made here: a run loads a configuration layer of its own and does not read these files. What is switched is the CLI's own configuration on this host, which is what the sessions you start by hand read. + +This is the one place AstrBot writes outside its own data directory. The target file is backed up once before the first write (`.astrbot-backup`, which "take back" restores), the write is atomic (`mkstemp` + `fsync` + `os.replace` + a directory fsync), a file holding a credential is `0o600`, and a response reports whether a key is stored and never its value. Claude Code is written through the `env` block of `~/.claude/settings.json` (`ANTHROPIC_BASE_URL`, `ANTHROPIC_MODEL`, `ANTHROPIC_AUTH_TOKEN`), merged key by key with everything else left as it was. The standard library reads TOML but cannot write it, and rewriting a file we cannot parse faithfully would drop the user's comments, so Codex's keys go in a comment-delimited section at the top of `~/.codex/config.toml` (TOML requires top-level keys to precede every table) with the rest left byte for byte as it was; the credential goes in `auth.json`. + +Two files are refused rather than replaced: a `settings.json` that exists and cannot be read as a JSON object (JSONC comments, an array), and a Codex section that opens without closing -- where it was meant to end is not knowable, and a guess would leave the file one block longer on every switch. The state route requires `platform.read`; switching and taking the configuration back require the high-risk `coding_cli.config.write`, and therefore a step-up. + ## WebUI and authentication Important `dashboard` defaults: diff --git a/docs/en/use/webui.md b/docs/en/use/webui.md index f65ababc04..81dae0edd0 100644 --- a/docs/en/use/webui.md +++ b/docs/en/use/webui.md @@ -25,6 +25,8 @@ Legacy log, trace, conversation, and statistics URLs still redirect to the match The BTW dual-loop settings moved out of the AI panel on the configuration page to **More Features → BTW Dual Loop** (`/btw`). The page loads and saves whichever profile it is pointed at, and holds what it held before: both loops and their models, the work loop's read-only boundary, the Computer Use runtime, the task folder root and result reporting, and the coding-agent list. +**More Features → CLI Global Config** (`/cli-config`) is a new entry: it keeps the provider list for Claude Code and Codex and switches one of them to be that CLI's own default on this host. A switch rewrites the CLI's own configuration file (backed up once, and "take back" restores it), so it asks for a step-up; a delegated task loads a layer of its own and is not affected. + ## Accessing the Admin Panel After starting AstrBot, the local machine can open the admin panel at `http://localhost:6185`. diff --git a/docs/zh/dev/astrbot-config.md b/docs/zh/dev/astrbot-config.md index e69d752d46..edda428e1c 100644 --- a/docs/zh/dev/astrbot-config.md +++ b/docs/zh/dev/astrbot-config.md @@ -261,6 +261,16 @@ Alkaid [长期记忆](../use/long-term-memory) 当前没有对应的启停配置 任务完成后,`btw.work_loop.report_via_conversation`(默认 `true`)让工作循环把结果交给对话循环合成一条汇报:代理的回答在前,随后是完成状态与产物路径。流式结果的中间分片不受影响,只有最终结果带上汇报,且同一次运行只追加一次。关闭此项后结果由工作循环直接投递。 +## BTW 编码 CLI 的全局配置切换 + +`btw.cli_providers` 是 **更多功能 → CLI 全局配置**(`/cli-config`)编辑的 provider 列表。它是普通配置:条目随配置档保存,`api_key` 也存在配置档里,与其他 provider 凭据一样。每个条目包含 `id`、`name`、可选的 `cli`(`claude_code` 或 `codex`;留空表示两个 CLI 都可用,界面上新增的条目总会带上所在分区)、`base_url`、`model`、`note` 和 `api_key`;`id` 在整份列表内唯一。 + +委派任务不受这里的切换影响:一次运行加载自己那份配置层,不读这些文件。这里切换的是该 CLI 在本机的配置,也就是你手动开会话时用的配置。 + +这是 AstrBot 唯一一处写进自己数据目录之外的地方。目标文件在第一次写入前备份一次(`.astrbot-backup`,由“收回”还原),写入是原子的(`mkstemp` + `fsync` + `os.replace` + 目录 fsync),持有凭据的文件权限为 `0o600`,响应只报告是否存有密钥、从不返回其值。Claude Code 走 `~/.claude/settings.json` 的 `env`(`ANTHROPIC_BASE_URL`、`ANTHROPIC_MODEL`、`ANTHROPIC_AUTH_TOKEN`),逐键合并、其余内容原样保留。Codex 的 TOML 标准库能读不能写,改写一个解析不了的文件会丢掉用户的注释,因此 AstrBot 的键写进文件顶部一段注释分隔的区块(TOML 要求顶层键排在所有表之前),其余部分逐字节保留,凭据写进 `auth.json`。 + +两类文件会被拒绝而不是被覆盖:存在但读不成 JSON 对象的 `settings.json`(例如带注释的 JSONC 或数组),以及有起始标记却没有结束标记的 Codex 区块——后者的边界无从得知,猜错会让文件每切换一次就多出一段。状态路由要求 `platform.read`;切换与收回要求高风险动作 `coding_cli.config.write`,因此需要 step-up。 + ## WebUI 与认证 `dashboard` 的关键默认值: diff --git a/docs/zh/use/webui.md b/docs/zh/use/webui.md index ed3abe1099..68c43ac01a 100644 --- a/docs/zh/use/webui.md +++ b/docs/zh/use/webui.md @@ -25,6 +25,8 @@ AstrBot 管理面板具有管理插件、查看日志、可视化配置、查看 BTW 双循环的设置从配置文件页的 AI 面板移到了 `更多功能 → BTW 双循环`(`/btw`)。页面按配置文件加载和保存,内容不变:两个循环的开关与模型、工作循环的只读边界、Computer Use 运行时、委派任务的目录与结果汇报,以及编码代理列表。 +`更多功能 → CLI 全局配置`(`/cli-config`)是新增入口:维护 Claude Code 与 Codex 的 provider 列表,并把某个 provider 切换成该 CLI 在本机的默认配置。切换会改写该 CLI 自己的配置文件(会先备份,可“收回”),因此需要 step-up;委派任务读取的是自己那份配置层,不受影响。 + ## 管理面板的访问 当启动 AstrBot 之后,本机可以通过 `http://localhost:6185` 访问管理面板。 From 051cb0a4915d28e5d151441d7ec779eb829d8da6 Mon Sep 17 00:00:00 2001 From: YUZHEthefool <2804776511@qq.com> Date: Fri, 18 Sep 2026 17:33:05 +0800 Subject: [PATCH 7/7] test(btw): read the written key back by name, not by substring CodeQL reads `"https://gw.example" in settings` as an attempt to sanitize a URL by substring and flags it as incomplete, which is fair: the check would pass on a file that merely mentions the endpoint somewhere. The switch writes named fields, so the test reads those fields and compares them, which says what it meant and stops matching by accident. The explicit import of the `asgi_app` fixture is redundant -- the harness exports it with everything else -- and CodeQL counts it as unused. AI-Generated: true Generated-At: 2026-09-18T09:30:33Z --- .../dashboard/test_fastapi_v1_coding_cli.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/tests/unit/dashboard/test_fastapi_v1_coding_cli.py b/tests/unit/dashboard/test_fastapi_v1_coding_cli.py index 4a846448e8..95f24c452a 100644 --- a/tests/unit/dashboard/test_fastapi_v1_coding_cli.py +++ b/tests/unit/dashboard/test_fastapi_v1_coding_cli.py @@ -7,16 +7,17 @@ from __future__ import annotations +import json from types import SimpleNamespace import pytest import pytest_asyncio from astrbot.core.auth.models import HIGH_RISK_ACTIONS + +# The harness exports its fixtures too, `asgi_app` among them, which this file +# builds on to install the authorizer the routes are checked against. from tests.unit.dashboard.fastapi_v1_support import * # noqa: F403 -from tests.unit.dashboard.fastapi_v1_support import ( - asgi_app, # noqa: F401 - the fixture this file reuses -) PROVIDERS = [ { @@ -140,9 +141,11 @@ async def test_a_switch_with_a_step_up_writes_the_cli_own_file( ) assert response.status_code == 200 - settings = (cli_homes / "claude" / "settings.json").read_text(encoding="utf-8") - assert "https://gw.example" in settings - assert "sk-secret" in settings + settings = json.loads( + (cli_homes / "claude" / "settings.json").read_text(encoding="utf-8") + ) + assert settings["env"]["ANTHROPIC_BASE_URL"] == PROVIDERS[0]["base_url"] + assert settings["env"]["ANTHROPIC_AUTH_TOKEN"] == PROVIDERS[0]["api_key"] # The write that replaced the file can be undone, and nothing else about # the response names the key it just wrote. - assert "sk-secret" not in response.text + assert PROVIDERS[0]["api_key"] not in response.text