feat: reorder properties in various interfaces for improved consistency and readability
This commit is contained in:
3
backend/.gitignore
vendored
3
backend/.gitignore
vendored
@@ -7,3 +7,6 @@ __pycache__/
|
||||
# Generated on demand from uv.lock (single source of truth is pyproject.toml + uv.lock).
|
||||
requirements.txt
|
||||
requirements-dev.txt
|
||||
|
||||
# Generated for orval input (avoid needing a running backend/DB).
|
||||
openapi.json
|
||||
|
||||
@@ -227,12 +227,14 @@ async def create_task_comment(
|
||||
|
||||
@router.get("/boards/{board_id}/memory", response_model=DefaultLimitOffsetPage[BoardMemoryRead])
|
||||
async def list_board_memory(
|
||||
is_chat: bool | None = Query(default=None),
|
||||
board: Board = Depends(get_board_or_404),
|
||||
session: AsyncSession = Depends(get_session),
|
||||
agent_ctx: AgentAuthContext = Depends(get_agent_auth_context),
|
||||
) -> DefaultLimitOffsetPage[BoardMemoryRead]:
|
||||
_guard_board_access(agent_ctx, board)
|
||||
return await board_memory_api.list_board_memory(
|
||||
is_chat=is_chat,
|
||||
board=board,
|
||||
session=session,
|
||||
actor=_actor(agent_ctx),
|
||||
|
||||
@@ -5,6 +5,7 @@ import re
|
||||
from uuid import uuid4
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, status
|
||||
from pydantic import ValidationError
|
||||
from sqlmodel import col, select
|
||||
from sqlmodel.ext.asyncio.session import AsyncSession
|
||||
|
||||
@@ -25,8 +26,10 @@ from app.schemas.board_onboarding import (
|
||||
BoardOnboardingAgentComplete,
|
||||
BoardOnboardingAgentUpdate,
|
||||
BoardOnboardingConfirm,
|
||||
BoardOnboardingLeadAgentDraft,
|
||||
BoardOnboardingRead,
|
||||
BoardOnboardingStart,
|
||||
BoardOnboardingUserProfile,
|
||||
)
|
||||
from app.schemas.boards import BoardRead
|
||||
from app.services.agent_provisioning import DEFAULT_HEARTBEAT_CONFIG, provision_agent
|
||||
@@ -65,6 +68,9 @@ async def _ensure_lead_agent(
|
||||
gateway: Gateway,
|
||||
config: GatewayClientConfig,
|
||||
auth: AuthContext,
|
||||
*,
|
||||
agent_name: str | None = None,
|
||||
identity_profile: dict[str, str] | None = None,
|
||||
) -> Agent:
|
||||
existing = (
|
||||
await session.exec(
|
||||
@@ -74,24 +80,31 @@ async def _ensure_lead_agent(
|
||||
)
|
||||
).first()
|
||||
if existing:
|
||||
if existing.name != _lead_agent_name(board):
|
||||
existing.name = _lead_agent_name(board)
|
||||
desired_name = agent_name or _lead_agent_name(board)
|
||||
if existing.name != desired_name:
|
||||
existing.name = desired_name
|
||||
session.add(existing)
|
||||
await session.commit()
|
||||
await session.refresh(existing)
|
||||
return existing
|
||||
|
||||
merged_identity_profile = {
|
||||
"role": "Board Lead",
|
||||
"communication_style": "direct, concise, practical",
|
||||
"emoji": ":gear:",
|
||||
}
|
||||
if identity_profile:
|
||||
merged_identity_profile.update(
|
||||
{key: value.strip() for key, value in identity_profile.items() if value.strip()}
|
||||
)
|
||||
|
||||
agent = Agent(
|
||||
name=_lead_agent_name(board),
|
||||
name=agent_name or _lead_agent_name(board),
|
||||
status="provisioning",
|
||||
board_id=board.id,
|
||||
is_board_lead=True,
|
||||
heartbeat_config=DEFAULT_HEARTBEAT_CONFIG.copy(),
|
||||
identity_profile={
|
||||
"role": "Board Lead",
|
||||
"communication_style": "direct, concise, practical",
|
||||
"emoji": ":gear:",
|
||||
},
|
||||
identity_profile=merged_identity_profile,
|
||||
)
|
||||
raw_token = generate_agent_token()
|
||||
agent.agent_token_hash = hash_agent_token(raw_token)
|
||||
@@ -162,7 +175,11 @@ async def start_onboarding(
|
||||
prompt = (
|
||||
"BOARD ONBOARDING REQUEST\n\n"
|
||||
f"Board Name: {board.name}\n"
|
||||
"You are the main agent. Ask the user 3-6 focused questions to clarify their goal.\n"
|
||||
"You are the main agent. Ask the user 6-10 focused questions total:\n"
|
||||
"- 3-6 questions to clarify the board goal.\n"
|
||||
"- 1 question to choose a unique name for the board lead agent (first-name style).\n"
|
||||
"- 2-4 questions to capture the user's preferences for how the board lead should work\n"
|
||||
" (communication style, autonomy, update cadence, and output formatting).\n"
|
||||
"Do NOT respond in OpenClaw chat.\n"
|
||||
"All onboarding responses MUST be sent to Mission Control via API.\n"
|
||||
f"Mission Control base URL: {base_url}\n"
|
||||
@@ -178,13 +195,19 @@ async def start_onboarding(
|
||||
f'curl -s -X POST "{base_url}/api/v1/agent/boards/{board.id}/onboarding" '
|
||||
'-H "X-Agent-Token: $AUTH_TOKEN" '
|
||||
'-H "Content-Type: application/json" '
|
||||
'-d \'{"status":"complete","board_type":"goal","objective":"...","success_metrics":{...},"target_date":"YYYY-MM-DD"}\'\n'
|
||||
'-d \'{"status":"complete","board_type":"goal","objective":"...","success_metrics":{"metric":"...","target":"..."},"target_date":"YYYY-MM-DD","user_profile":{"preferred_name":"...","pronouns":"...","timezone":"...","notes":"...","context":"..."},"lead_agent":{"name":"Ava","identity_profile":{"role":"Board Lead","communication_style":"direct, concise, practical","emoji":":gear:"},"autonomy_level":"balanced","verbosity":"concise","output_format":"bullets","update_cadence":"daily","custom_instructions":"..."}}\'\n'
|
||||
"ENUMS:\n"
|
||||
"- board_type: goal | general\n"
|
||||
"- lead_agent.autonomy_level: ask_first | balanced | autonomous\n"
|
||||
"- lead_agent.verbosity: concise | balanced | detailed\n"
|
||||
"- lead_agent.output_format: bullets | mixed | narrative\n"
|
||||
"- lead_agent.update_cadence: asap | hourly | daily | weekly\n"
|
||||
"QUESTION FORMAT (one question per response, no arrays, no markdown, no extra text):\n"
|
||||
'{"question":"...","options":[{"id":"1","label":"..."},{"id":"2","label":"..."}]}\n'
|
||||
"Do NOT wrap questions in a list. Do NOT add commentary.\n"
|
||||
"When you have enough info, return JSON ONLY (via API):\n"
|
||||
'{"status":"complete","board_type":"goal"|"general","objective":"...",'
|
||||
'"success_metrics":{...},"target_date":"YYYY-MM-DD"}.'
|
||||
"When you have enough info, send one final response with status=complete.\n"
|
||||
"The completion payload must include board_type. If board_type=goal, include objective + success_metrics.\n"
|
||||
"Also include user_profile + lead_agent to configure the board lead's working style.\n"
|
||||
)
|
||||
|
||||
try:
|
||||
@@ -337,10 +360,71 @@ async def confirm_onboarding(
|
||||
onboarding.status = "confirmed"
|
||||
onboarding.updated_at = utcnow()
|
||||
|
||||
user_profile: BoardOnboardingUserProfile | None = None
|
||||
lead_agent: BoardOnboardingLeadAgentDraft | None = None
|
||||
if isinstance(onboarding.draft_goal, dict):
|
||||
raw_profile = onboarding.draft_goal.get("user_profile")
|
||||
if raw_profile is not None:
|
||||
try:
|
||||
user_profile = BoardOnboardingUserProfile.model_validate(raw_profile)
|
||||
except ValidationError:
|
||||
user_profile = None
|
||||
raw_lead = onboarding.draft_goal.get("lead_agent")
|
||||
if raw_lead is not None:
|
||||
try:
|
||||
lead_agent = BoardOnboardingLeadAgentDraft.model_validate(raw_lead)
|
||||
except ValidationError:
|
||||
lead_agent = None
|
||||
|
||||
if auth.user and user_profile:
|
||||
changed = False
|
||||
if user_profile.preferred_name is not None:
|
||||
auth.user.preferred_name = user_profile.preferred_name
|
||||
changed = True
|
||||
if user_profile.pronouns is not None:
|
||||
auth.user.pronouns = user_profile.pronouns
|
||||
changed = True
|
||||
if user_profile.timezone is not None:
|
||||
auth.user.timezone = user_profile.timezone
|
||||
changed = True
|
||||
if user_profile.notes is not None:
|
||||
auth.user.notes = user_profile.notes
|
||||
changed = True
|
||||
if user_profile.context is not None:
|
||||
auth.user.context = user_profile.context
|
||||
changed = True
|
||||
if changed:
|
||||
session.add(auth.user)
|
||||
|
||||
lead_identity_profile: dict[str, str] = {}
|
||||
lead_name: str | None = None
|
||||
if lead_agent:
|
||||
lead_name = lead_agent.name
|
||||
if lead_agent.identity_profile:
|
||||
lead_identity_profile.update(lead_agent.identity_profile)
|
||||
if lead_agent.autonomy_level:
|
||||
lead_identity_profile["autonomy_level"] = lead_agent.autonomy_level
|
||||
if lead_agent.verbosity:
|
||||
lead_identity_profile["verbosity"] = lead_agent.verbosity
|
||||
if lead_agent.output_format:
|
||||
lead_identity_profile["output_format"] = lead_agent.output_format
|
||||
if lead_agent.update_cadence:
|
||||
lead_identity_profile["update_cadence"] = lead_agent.update_cadence
|
||||
if lead_agent.custom_instructions:
|
||||
lead_identity_profile["custom_instructions"] = lead_agent.custom_instructions
|
||||
|
||||
gateway, config = await _gateway_config(session, board)
|
||||
session.add(board)
|
||||
session.add(onboarding)
|
||||
await session.commit()
|
||||
await session.refresh(board)
|
||||
await _ensure_lead_agent(session, board, gateway, config, auth)
|
||||
await _ensure_lead_agent(
|
||||
session,
|
||||
board,
|
||||
gateway,
|
||||
config,
|
||||
auth,
|
||||
agent_name=lead_name,
|
||||
identity_profile=lead_identity_profile or None,
|
||||
)
|
||||
return board
|
||||
|
||||
37
backend/app/core/durations.py
Normal file
37
backend/app/core/durations.py
Normal file
@@ -0,0 +1,37 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import re
|
||||
|
||||
_DURATION_RE = re.compile(r"^(?P<num>[1-9]\\d*)\\s*(?P<unit>[smhdw])$", flags=re.IGNORECASE)
|
||||
|
||||
_MULTIPLIERS: dict[str, int] = {
|
||||
"s": 1,
|
||||
"m": 60,
|
||||
"h": 60 * 60,
|
||||
"d": 60 * 60 * 24,
|
||||
"w": 60 * 60 * 24 * 7,
|
||||
}
|
||||
|
||||
|
||||
def normalize_every(value: str) -> str:
|
||||
normalized = value.strip().lower().replace(" ", "")
|
||||
if not normalized:
|
||||
raise ValueError("schedule is required")
|
||||
return normalized
|
||||
|
||||
|
||||
def parse_every_to_seconds(value: str) -> int:
|
||||
normalized = normalize_every(value)
|
||||
match = _DURATION_RE.match(normalized)
|
||||
if not match:
|
||||
raise ValueError('Invalid schedule. Expected format like "10m", "1h", "2d", "1w".')
|
||||
num = int(match.group("num"))
|
||||
unit = match.group("unit").lower()
|
||||
seconds = num * _MULTIPLIERS[unit]
|
||||
if seconds <= 0:
|
||||
raise ValueError("Schedule must be greater than 0.")
|
||||
# Prevent accidental absurd schedules (e.g. 999999999d).
|
||||
if seconds > 60 * 60 * 24 * 365 * 10:
|
||||
raise ValueError("Schedule is too large (max 10 years).")
|
||||
return seconds
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime
|
||||
from typing import Literal, Self
|
||||
from typing import Any, Literal, Self
|
||||
from uuid import UUID
|
||||
|
||||
from pydantic import Field, model_validator
|
||||
from pydantic import Field, field_validator, model_validator
|
||||
from sqlmodel import SQLModel
|
||||
|
||||
from app.schemas.common import NonEmptyStr
|
||||
@@ -43,8 +43,87 @@ class BoardOnboardingAgentQuestion(SQLModel):
|
||||
options: list[BoardOnboardingQuestionOption] = Field(min_length=1)
|
||||
|
||||
|
||||
def _normalize_optional_text(value: Any) -> Any:
|
||||
if value is None:
|
||||
return None
|
||||
if isinstance(value, str):
|
||||
text = value.strip()
|
||||
return text or None
|
||||
return value
|
||||
|
||||
|
||||
class BoardOnboardingUserProfile(SQLModel):
|
||||
preferred_name: str | None = None
|
||||
pronouns: str | None = None
|
||||
timezone: str | None = None
|
||||
notes: str | None = None
|
||||
context: str | None = None
|
||||
|
||||
@field_validator(
|
||||
"preferred_name",
|
||||
"pronouns",
|
||||
"timezone",
|
||||
"notes",
|
||||
"context",
|
||||
mode="before",
|
||||
)
|
||||
@classmethod
|
||||
def normalize_text(cls, value: Any) -> Any:
|
||||
return _normalize_optional_text(value)
|
||||
|
||||
|
||||
LeadAgentAutonomyLevel = Literal["ask_first", "balanced", "autonomous"]
|
||||
LeadAgentVerbosity = Literal["concise", "balanced", "detailed"]
|
||||
LeadAgentOutputFormat = Literal["bullets", "mixed", "narrative"]
|
||||
LeadAgentUpdateCadence = Literal["asap", "hourly", "daily", "weekly"]
|
||||
|
||||
|
||||
class BoardOnboardingLeadAgentDraft(SQLModel):
|
||||
name: NonEmptyStr | None = None
|
||||
# role, communication_style, emoji are expected keys.
|
||||
identity_profile: dict[str, str] | None = None
|
||||
autonomy_level: LeadAgentAutonomyLevel | None = None
|
||||
verbosity: LeadAgentVerbosity | None = None
|
||||
output_format: LeadAgentOutputFormat | None = None
|
||||
update_cadence: LeadAgentUpdateCadence | None = None
|
||||
custom_instructions: str | None = None
|
||||
|
||||
@field_validator(
|
||||
"autonomy_level",
|
||||
"verbosity",
|
||||
"output_format",
|
||||
"update_cadence",
|
||||
"custom_instructions",
|
||||
mode="before",
|
||||
)
|
||||
@classmethod
|
||||
def normalize_text_fields(cls, value: Any) -> Any:
|
||||
return _normalize_optional_text(value)
|
||||
|
||||
@field_validator("identity_profile", mode="before")
|
||||
@classmethod
|
||||
def normalize_identity_profile(cls, value: Any) -> Any:
|
||||
if value is None:
|
||||
return None
|
||||
if not isinstance(value, dict):
|
||||
return value
|
||||
normalized: dict[str, str] = {}
|
||||
for raw_key, raw_val in value.items():
|
||||
if raw_val is None:
|
||||
continue
|
||||
key = str(raw_key).strip()
|
||||
if not key:
|
||||
continue
|
||||
val = str(raw_val).strip()
|
||||
if val:
|
||||
normalized[key] = val
|
||||
return normalized or None
|
||||
|
||||
|
||||
class BoardOnboardingAgentComplete(BoardOnboardingConfirm):
|
||||
status: Literal["complete"]
|
||||
user_profile: BoardOnboardingUserProfile | None = None
|
||||
lead_agent: BoardOnboardingLeadAgentDraft | None = None
|
||||
|
||||
|
||||
BoardOnboardingAgentUpdate = BoardOnboardingAgentComplete | BoardOnboardingAgentQuestion
|
||||
@@ -56,6 +135,6 @@ class BoardOnboardingRead(SQLModel):
|
||||
session_key: str
|
||||
status: str
|
||||
messages: list[dict[str, object]] | None = None
|
||||
draft_goal: dict[str, object] | None = None
|
||||
draft_goal: BoardOnboardingAgentComplete | None = None
|
||||
created_at: datetime
|
||||
updated_at: datetime
|
||||
|
||||
@@ -29,6 +29,14 @@ IDENTITY_PROFILE_FIELDS = {
|
||||
"emoji": "identity_emoji",
|
||||
}
|
||||
|
||||
EXTRA_IDENTITY_PROFILE_FIELDS = {
|
||||
"autonomy_level": "identity_autonomy_level",
|
||||
"verbosity": "identity_verbosity",
|
||||
"output_format": "identity_output_format",
|
||||
"update_cadence": "identity_update_cadence",
|
||||
"custom_instructions": "identity_custom_instructions",
|
||||
}
|
||||
|
||||
DEFAULT_GATEWAY_FILES = frozenset(
|
||||
{
|
||||
"AGENTS.md",
|
||||
@@ -85,7 +93,8 @@ def _heartbeat_config(agent: Agent) -> dict[str, Any]:
|
||||
def _template_env() -> Environment:
|
||||
return Environment(
|
||||
loader=FileSystemLoader(_templates_root()),
|
||||
autoescape=select_autoescape(default=True),
|
||||
# Render markdown verbatim (HTML escaping makes it harder for agents to read).
|
||||
autoescape=select_autoescape(default=False),
|
||||
undefined=StrictUndefined,
|
||||
keep_trailing_newline=True,
|
||||
)
|
||||
@@ -95,12 +104,15 @@ def _heartbeat_template_name(agent: Agent) -> str:
|
||||
return HEARTBEAT_LEAD_TEMPLATE if agent.is_board_lead else HEARTBEAT_AGENT_TEMPLATE
|
||||
|
||||
|
||||
def _workspace_path(agent_name: str, workspace_root: str) -> str:
|
||||
def _workspace_path(agent: Agent, workspace_root: str) -> str:
|
||||
if not workspace_root:
|
||||
raise ValueError("gateway_workspace_root is required")
|
||||
root = workspace_root
|
||||
root = root.rstrip("/")
|
||||
return f"{root}/workspace-{_slugify(agent_name)}"
|
||||
root = workspace_root.rstrip("/")
|
||||
# Use agent key derived from session key when possible. This prevents collisions for
|
||||
# lead agents (session key includes board id) even if multiple boards share the same
|
||||
# display name (e.g. "Lead Agent").
|
||||
key = _agent_key(agent)
|
||||
return f"{root}/workspace-{_slugify(key)}"
|
||||
|
||||
|
||||
def _build_context(
|
||||
@@ -116,7 +128,7 @@ def _build_context(
|
||||
raise ValueError("gateway_main_session_key is required")
|
||||
agent_id = str(agent.id)
|
||||
workspace_root = gateway.workspace_root
|
||||
workspace_path = _workspace_path(agent.name, workspace_root)
|
||||
workspace_path = _workspace_path(agent, workspace_root)
|
||||
session_key = agent.openclaw_session_id or ""
|
||||
base_url = settings.base_url or "REPLACE_WITH_BASE_URL"
|
||||
main_session_key = gateway.main_session_key
|
||||
@@ -140,6 +152,10 @@ def _build_context(
|
||||
context_key: normalized_identity.get(field, DEFAULT_IDENTITY_PROFILE[field])
|
||||
for field, context_key in IDENTITY_PROFILE_FIELDS.items()
|
||||
}
|
||||
extra_identity_context = {
|
||||
context_key: normalized_identity.get(field, "")
|
||||
for field, context_key in EXTRA_IDENTITY_PROFILE_FIELDS.items()
|
||||
}
|
||||
preferred_name = (user.preferred_name or "") if user else ""
|
||||
if preferred_name:
|
||||
preferred_name = preferred_name.strip().split()[0]
|
||||
@@ -167,6 +183,7 @@ def _build_context(
|
||||
"user_notes": (user.notes or "") if user else "",
|
||||
"user_context": (user.context or "") if user else "",
|
||||
**identity_context,
|
||||
**extra_identity_context,
|
||||
}
|
||||
|
||||
|
||||
@@ -197,6 +214,10 @@ def _build_main_context(
|
||||
context_key: normalized_identity.get(field, DEFAULT_IDENTITY_PROFILE[field])
|
||||
for field, context_key in IDENTITY_PROFILE_FIELDS.items()
|
||||
}
|
||||
extra_identity_context = {
|
||||
context_key: normalized_identity.get(field, "")
|
||||
for field, context_key in EXTRA_IDENTITY_PROFILE_FIELDS.items()
|
||||
}
|
||||
preferred_name = (user.preferred_name or "") if user else ""
|
||||
if preferred_name:
|
||||
preferred_name = preferred_name.strip().split()[0]
|
||||
@@ -215,6 +236,7 @@ def _build_main_context(
|
||||
"user_notes": (user.notes or "") if user else "",
|
||||
"user_context": (user.context or "") if user else "",
|
||||
**identity_context,
|
||||
**extra_identity_context,
|
||||
}
|
||||
|
||||
|
||||
@@ -457,7 +479,7 @@ async def provision_agent(
|
||||
await ensure_session(session_key, config=client_config, label=agent.name)
|
||||
|
||||
agent_id = _agent_key(agent)
|
||||
workspace_path = _workspace_path(agent.name, gateway.workspace_root)
|
||||
workspace_path = _workspace_path(agent, gateway.workspace_root)
|
||||
heartbeat = _heartbeat_config(agent)
|
||||
await _patch_gateway_agent_list(agent_id, workspace_path, heartbeat, client_config)
|
||||
|
||||
@@ -564,5 +586,5 @@ async def cleanup_agent(
|
||||
|
||||
workspace_path = entry.get("workspace") if entry else None
|
||||
if not workspace_path:
|
||||
workspace_path = _workspace_path(agent.name, gateway.workspace_root)
|
||||
workspace_path = _workspace_path(agent, gateway.workspace_root)
|
||||
return workspace_path
|
||||
|
||||
22
backend/scripts/export_openapi.py
Normal file
22
backend/scripts/export_openapi.py
Normal file
@@ -0,0 +1,22 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
import sys
|
||||
|
||||
BACKEND_ROOT = Path(__file__).resolve().parents[1]
|
||||
sys.path.insert(0, str(BACKEND_ROOT))
|
||||
|
||||
from app.main import app # noqa: E402
|
||||
|
||||
|
||||
def main() -> None:
|
||||
# Importing the FastAPI app does not run lifespan hooks, so this does not require a DB.
|
||||
out_path = BACKEND_ROOT / "openapi.json"
|
||||
payload = app.openapi()
|
||||
out_path.write_text(json.dumps(payload, indent=2, sort_keys=True), encoding="utf-8")
|
||||
print(str(out_path))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -3,7 +3,8 @@ import { defineConfig } from "orval";
|
||||
export default defineConfig({
|
||||
api: {
|
||||
input: {
|
||||
target: "http://127.0.0.1:8000/openapi.json",
|
||||
target:
|
||||
process.env.ORVAL_INPUT ?? "http://127.0.0.1:8000/openapi.json",
|
||||
},
|
||||
output: {
|
||||
mode: "tags-split",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -362,6 +362,133 @@ export const useCreateAgentApiV1AgentsPost = <
|
||||
queryClient,
|
||||
);
|
||||
};
|
||||
/**
|
||||
* @summary Heartbeat Or Create Agent
|
||||
*/
|
||||
export type heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponse200 = {
|
||||
data: AgentRead;
|
||||
status: 200;
|
||||
};
|
||||
|
||||
export type heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponse422 = {
|
||||
data: HTTPValidationError;
|
||||
status: 422;
|
||||
};
|
||||
|
||||
export type heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponseSuccess =
|
||||
heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponse200 & {
|
||||
headers: Headers;
|
||||
};
|
||||
export type heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponseError =
|
||||
heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponse422 & {
|
||||
headers: Headers;
|
||||
};
|
||||
|
||||
export type heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponse =
|
||||
| heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponseSuccess
|
||||
| heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponseError;
|
||||
|
||||
export const getHeartbeatOrCreateAgentApiV1AgentsHeartbeatPostUrl = () => {
|
||||
return `/api/v1/agents/heartbeat`;
|
||||
};
|
||||
|
||||
export const heartbeatOrCreateAgentApiV1AgentsHeartbeatPost = async (
|
||||
agentHeartbeatCreate: AgentHeartbeatCreate,
|
||||
options?: RequestInit,
|
||||
): Promise<heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponse> => {
|
||||
return customFetch<heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponse>(
|
||||
getHeartbeatOrCreateAgentApiV1AgentsHeartbeatPostUrl(),
|
||||
{
|
||||
...options,
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json", ...options?.headers },
|
||||
body: JSON.stringify(agentHeartbeatCreate),
|
||||
},
|
||||
);
|
||||
};
|
||||
|
||||
export const getHeartbeatOrCreateAgentApiV1AgentsHeartbeatPostMutationOptions =
|
||||
<TError = HTTPValidationError, TContext = unknown>(options?: {
|
||||
mutation?: UseMutationOptions<
|
||||
Awaited<
|
||||
ReturnType<typeof heartbeatOrCreateAgentApiV1AgentsHeartbeatPost>
|
||||
>,
|
||||
TError,
|
||||
{ data: AgentHeartbeatCreate },
|
||||
TContext
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
}): UseMutationOptions<
|
||||
Awaited<ReturnType<typeof heartbeatOrCreateAgentApiV1AgentsHeartbeatPost>>,
|
||||
TError,
|
||||
{ data: AgentHeartbeatCreate },
|
||||
TContext
|
||||
> => {
|
||||
const mutationKey = ["heartbeatOrCreateAgentApiV1AgentsHeartbeatPost"];
|
||||
const { mutation: mutationOptions, request: requestOptions } = options
|
||||
? options.mutation &&
|
||||
"mutationKey" in options.mutation &&
|
||||
options.mutation.mutationKey
|
||||
? options
|
||||
: { ...options, mutation: { ...options.mutation, mutationKey } }
|
||||
: { mutation: { mutationKey }, request: undefined };
|
||||
|
||||
const mutationFn: MutationFunction<
|
||||
Awaited<
|
||||
ReturnType<typeof heartbeatOrCreateAgentApiV1AgentsHeartbeatPost>
|
||||
>,
|
||||
{ data: AgentHeartbeatCreate }
|
||||
> = (props) => {
|
||||
const { data } = props ?? {};
|
||||
|
||||
return heartbeatOrCreateAgentApiV1AgentsHeartbeatPost(
|
||||
data,
|
||||
requestOptions,
|
||||
);
|
||||
};
|
||||
|
||||
return { mutationFn, ...mutationOptions };
|
||||
};
|
||||
|
||||
export type HeartbeatOrCreateAgentApiV1AgentsHeartbeatPostMutationResult =
|
||||
NonNullable<
|
||||
Awaited<ReturnType<typeof heartbeatOrCreateAgentApiV1AgentsHeartbeatPost>>
|
||||
>;
|
||||
export type HeartbeatOrCreateAgentApiV1AgentsHeartbeatPostMutationBody =
|
||||
AgentHeartbeatCreate;
|
||||
export type HeartbeatOrCreateAgentApiV1AgentsHeartbeatPostMutationError =
|
||||
HTTPValidationError;
|
||||
|
||||
/**
|
||||
* @summary Heartbeat Or Create Agent
|
||||
*/
|
||||
export const useHeartbeatOrCreateAgentApiV1AgentsHeartbeatPost = <
|
||||
TError = HTTPValidationError,
|
||||
TContext = unknown,
|
||||
>(
|
||||
options?: {
|
||||
mutation?: UseMutationOptions<
|
||||
Awaited<
|
||||
ReturnType<typeof heartbeatOrCreateAgentApiV1AgentsHeartbeatPost>
|
||||
>,
|
||||
TError,
|
||||
{ data: AgentHeartbeatCreate },
|
||||
TContext
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
},
|
||||
queryClient?: QueryClient,
|
||||
): UseMutationResult<
|
||||
Awaited<ReturnType<typeof heartbeatOrCreateAgentApiV1AgentsHeartbeatPost>>,
|
||||
TError,
|
||||
{ data: AgentHeartbeatCreate },
|
||||
TContext
|
||||
> => {
|
||||
return useMutation(
|
||||
getHeartbeatOrCreateAgentApiV1AgentsHeartbeatPostMutationOptions(options),
|
||||
queryClient,
|
||||
);
|
||||
};
|
||||
/**
|
||||
* @summary Stream Agents
|
||||
*/
|
||||
@@ -573,6 +700,122 @@ export function useStreamAgentsApiV1AgentsStreamGet<
|
||||
return { ...query, queryKey: queryOptions.queryKey };
|
||||
}
|
||||
|
||||
/**
|
||||
* @summary Delete Agent
|
||||
*/
|
||||
export type deleteAgentApiV1AgentsAgentIdDeleteResponse200 = {
|
||||
data: OkResponse;
|
||||
status: 200;
|
||||
};
|
||||
|
||||
export type deleteAgentApiV1AgentsAgentIdDeleteResponse422 = {
|
||||
data: HTTPValidationError;
|
||||
status: 422;
|
||||
};
|
||||
|
||||
export type deleteAgentApiV1AgentsAgentIdDeleteResponseSuccess =
|
||||
deleteAgentApiV1AgentsAgentIdDeleteResponse200 & {
|
||||
headers: Headers;
|
||||
};
|
||||
export type deleteAgentApiV1AgentsAgentIdDeleteResponseError =
|
||||
deleteAgentApiV1AgentsAgentIdDeleteResponse422 & {
|
||||
headers: Headers;
|
||||
};
|
||||
|
||||
export type deleteAgentApiV1AgentsAgentIdDeleteResponse =
|
||||
| deleteAgentApiV1AgentsAgentIdDeleteResponseSuccess
|
||||
| deleteAgentApiV1AgentsAgentIdDeleteResponseError;
|
||||
|
||||
export const getDeleteAgentApiV1AgentsAgentIdDeleteUrl = (agentId: string) => {
|
||||
return `/api/v1/agents/${agentId}`;
|
||||
};
|
||||
|
||||
export const deleteAgentApiV1AgentsAgentIdDelete = async (
|
||||
agentId: string,
|
||||
options?: RequestInit,
|
||||
): Promise<deleteAgentApiV1AgentsAgentIdDeleteResponse> => {
|
||||
return customFetch<deleteAgentApiV1AgentsAgentIdDeleteResponse>(
|
||||
getDeleteAgentApiV1AgentsAgentIdDeleteUrl(agentId),
|
||||
{
|
||||
...options,
|
||||
method: "DELETE",
|
||||
},
|
||||
);
|
||||
};
|
||||
|
||||
export const getDeleteAgentApiV1AgentsAgentIdDeleteMutationOptions = <
|
||||
TError = HTTPValidationError,
|
||||
TContext = unknown,
|
||||
>(options?: {
|
||||
mutation?: UseMutationOptions<
|
||||
Awaited<ReturnType<typeof deleteAgentApiV1AgentsAgentIdDelete>>,
|
||||
TError,
|
||||
{ agentId: string },
|
||||
TContext
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
}): UseMutationOptions<
|
||||
Awaited<ReturnType<typeof deleteAgentApiV1AgentsAgentIdDelete>>,
|
||||
TError,
|
||||
{ agentId: string },
|
||||
TContext
|
||||
> => {
|
||||
const mutationKey = ["deleteAgentApiV1AgentsAgentIdDelete"];
|
||||
const { mutation: mutationOptions, request: requestOptions } = options
|
||||
? options.mutation &&
|
||||
"mutationKey" in options.mutation &&
|
||||
options.mutation.mutationKey
|
||||
? options
|
||||
: { ...options, mutation: { ...options.mutation, mutationKey } }
|
||||
: { mutation: { mutationKey }, request: undefined };
|
||||
|
||||
const mutationFn: MutationFunction<
|
||||
Awaited<ReturnType<typeof deleteAgentApiV1AgentsAgentIdDelete>>,
|
||||
{ agentId: string }
|
||||
> = (props) => {
|
||||
const { agentId } = props ?? {};
|
||||
|
||||
return deleteAgentApiV1AgentsAgentIdDelete(agentId, requestOptions);
|
||||
};
|
||||
|
||||
return { mutationFn, ...mutationOptions };
|
||||
};
|
||||
|
||||
export type DeleteAgentApiV1AgentsAgentIdDeleteMutationResult = NonNullable<
|
||||
Awaited<ReturnType<typeof deleteAgentApiV1AgentsAgentIdDelete>>
|
||||
>;
|
||||
|
||||
export type DeleteAgentApiV1AgentsAgentIdDeleteMutationError =
|
||||
HTTPValidationError;
|
||||
|
||||
/**
|
||||
* @summary Delete Agent
|
||||
*/
|
||||
export const useDeleteAgentApiV1AgentsAgentIdDelete = <
|
||||
TError = HTTPValidationError,
|
||||
TContext = unknown,
|
||||
>(
|
||||
options?: {
|
||||
mutation?: UseMutationOptions<
|
||||
Awaited<ReturnType<typeof deleteAgentApiV1AgentsAgentIdDelete>>,
|
||||
TError,
|
||||
{ agentId: string },
|
||||
TContext
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
},
|
||||
queryClient?: QueryClient,
|
||||
): UseMutationResult<
|
||||
Awaited<ReturnType<typeof deleteAgentApiV1AgentsAgentIdDelete>>,
|
||||
TError,
|
||||
{ agentId: string },
|
||||
TContext
|
||||
> => {
|
||||
return useMutation(
|
||||
getDeleteAgentApiV1AgentsAgentIdDeleteMutationOptions(options),
|
||||
queryClient,
|
||||
);
|
||||
};
|
||||
/**
|
||||
* @summary Get Agent
|
||||
*/
|
||||
@@ -932,122 +1175,6 @@ export const useUpdateAgentApiV1AgentsAgentIdPatch = <
|
||||
queryClient,
|
||||
);
|
||||
};
|
||||
/**
|
||||
* @summary Delete Agent
|
||||
*/
|
||||
export type deleteAgentApiV1AgentsAgentIdDeleteResponse200 = {
|
||||
data: OkResponse;
|
||||
status: 200;
|
||||
};
|
||||
|
||||
export type deleteAgentApiV1AgentsAgentIdDeleteResponse422 = {
|
||||
data: HTTPValidationError;
|
||||
status: 422;
|
||||
};
|
||||
|
||||
export type deleteAgentApiV1AgentsAgentIdDeleteResponseSuccess =
|
||||
deleteAgentApiV1AgentsAgentIdDeleteResponse200 & {
|
||||
headers: Headers;
|
||||
};
|
||||
export type deleteAgentApiV1AgentsAgentIdDeleteResponseError =
|
||||
deleteAgentApiV1AgentsAgentIdDeleteResponse422 & {
|
||||
headers: Headers;
|
||||
};
|
||||
|
||||
export type deleteAgentApiV1AgentsAgentIdDeleteResponse =
|
||||
| deleteAgentApiV1AgentsAgentIdDeleteResponseSuccess
|
||||
| deleteAgentApiV1AgentsAgentIdDeleteResponseError;
|
||||
|
||||
export const getDeleteAgentApiV1AgentsAgentIdDeleteUrl = (agentId: string) => {
|
||||
return `/api/v1/agents/${agentId}`;
|
||||
};
|
||||
|
||||
export const deleteAgentApiV1AgentsAgentIdDelete = async (
|
||||
agentId: string,
|
||||
options?: RequestInit,
|
||||
): Promise<deleteAgentApiV1AgentsAgentIdDeleteResponse> => {
|
||||
return customFetch<deleteAgentApiV1AgentsAgentIdDeleteResponse>(
|
||||
getDeleteAgentApiV1AgentsAgentIdDeleteUrl(agentId),
|
||||
{
|
||||
...options,
|
||||
method: "DELETE",
|
||||
},
|
||||
);
|
||||
};
|
||||
|
||||
export const getDeleteAgentApiV1AgentsAgentIdDeleteMutationOptions = <
|
||||
TError = HTTPValidationError,
|
||||
TContext = unknown,
|
||||
>(options?: {
|
||||
mutation?: UseMutationOptions<
|
||||
Awaited<ReturnType<typeof deleteAgentApiV1AgentsAgentIdDelete>>,
|
||||
TError,
|
||||
{ agentId: string },
|
||||
TContext
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
}): UseMutationOptions<
|
||||
Awaited<ReturnType<typeof deleteAgentApiV1AgentsAgentIdDelete>>,
|
||||
TError,
|
||||
{ agentId: string },
|
||||
TContext
|
||||
> => {
|
||||
const mutationKey = ["deleteAgentApiV1AgentsAgentIdDelete"];
|
||||
const { mutation: mutationOptions, request: requestOptions } = options
|
||||
? options.mutation &&
|
||||
"mutationKey" in options.mutation &&
|
||||
options.mutation.mutationKey
|
||||
? options
|
||||
: { ...options, mutation: { ...options.mutation, mutationKey } }
|
||||
: { mutation: { mutationKey }, request: undefined };
|
||||
|
||||
const mutationFn: MutationFunction<
|
||||
Awaited<ReturnType<typeof deleteAgentApiV1AgentsAgentIdDelete>>,
|
||||
{ agentId: string }
|
||||
> = (props) => {
|
||||
const { agentId } = props ?? {};
|
||||
|
||||
return deleteAgentApiV1AgentsAgentIdDelete(agentId, requestOptions);
|
||||
};
|
||||
|
||||
return { mutationFn, ...mutationOptions };
|
||||
};
|
||||
|
||||
export type DeleteAgentApiV1AgentsAgentIdDeleteMutationResult = NonNullable<
|
||||
Awaited<ReturnType<typeof deleteAgentApiV1AgentsAgentIdDelete>>
|
||||
>;
|
||||
|
||||
export type DeleteAgentApiV1AgentsAgentIdDeleteMutationError =
|
||||
HTTPValidationError;
|
||||
|
||||
/**
|
||||
* @summary Delete Agent
|
||||
*/
|
||||
export const useDeleteAgentApiV1AgentsAgentIdDelete = <
|
||||
TError = HTTPValidationError,
|
||||
TContext = unknown,
|
||||
>(
|
||||
options?: {
|
||||
mutation?: UseMutationOptions<
|
||||
Awaited<ReturnType<typeof deleteAgentApiV1AgentsAgentIdDelete>>,
|
||||
TError,
|
||||
{ agentId: string },
|
||||
TContext
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
},
|
||||
queryClient?: QueryClient,
|
||||
): UseMutationResult<
|
||||
Awaited<ReturnType<typeof deleteAgentApiV1AgentsAgentIdDelete>>,
|
||||
TError,
|
||||
{ agentId: string },
|
||||
TContext
|
||||
> => {
|
||||
return useMutation(
|
||||
getDeleteAgentApiV1AgentsAgentIdDeleteMutationOptions(options),
|
||||
queryClient,
|
||||
);
|
||||
};
|
||||
/**
|
||||
* @summary Heartbeat Agent
|
||||
*/
|
||||
@@ -1175,130 +1302,3 @@ export const useHeartbeatAgentApiV1AgentsAgentIdHeartbeatPost = <
|
||||
queryClient,
|
||||
);
|
||||
};
|
||||
/**
|
||||
* @summary Heartbeat Or Create Agent
|
||||
*/
|
||||
export type heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponse200 = {
|
||||
data: AgentRead;
|
||||
status: 200;
|
||||
};
|
||||
|
||||
export type heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponse422 = {
|
||||
data: HTTPValidationError;
|
||||
status: 422;
|
||||
};
|
||||
|
||||
export type heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponseSuccess =
|
||||
heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponse200 & {
|
||||
headers: Headers;
|
||||
};
|
||||
export type heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponseError =
|
||||
heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponse422 & {
|
||||
headers: Headers;
|
||||
};
|
||||
|
||||
export type heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponse =
|
||||
| heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponseSuccess
|
||||
| heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponseError;
|
||||
|
||||
export const getHeartbeatOrCreateAgentApiV1AgentsHeartbeatPostUrl = () => {
|
||||
return `/api/v1/agents/heartbeat`;
|
||||
};
|
||||
|
||||
export const heartbeatOrCreateAgentApiV1AgentsHeartbeatPost = async (
|
||||
agentHeartbeatCreate: AgentHeartbeatCreate,
|
||||
options?: RequestInit,
|
||||
): Promise<heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponse> => {
|
||||
return customFetch<heartbeatOrCreateAgentApiV1AgentsHeartbeatPostResponse>(
|
||||
getHeartbeatOrCreateAgentApiV1AgentsHeartbeatPostUrl(),
|
||||
{
|
||||
...options,
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json", ...options?.headers },
|
||||
body: JSON.stringify(agentHeartbeatCreate),
|
||||
},
|
||||
);
|
||||
};
|
||||
|
||||
export const getHeartbeatOrCreateAgentApiV1AgentsHeartbeatPostMutationOptions =
|
||||
<TError = HTTPValidationError, TContext = unknown>(options?: {
|
||||
mutation?: UseMutationOptions<
|
||||
Awaited<
|
||||
ReturnType<typeof heartbeatOrCreateAgentApiV1AgentsHeartbeatPost>
|
||||
>,
|
||||
TError,
|
||||
{ data: AgentHeartbeatCreate },
|
||||
TContext
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
}): UseMutationOptions<
|
||||
Awaited<ReturnType<typeof heartbeatOrCreateAgentApiV1AgentsHeartbeatPost>>,
|
||||
TError,
|
||||
{ data: AgentHeartbeatCreate },
|
||||
TContext
|
||||
> => {
|
||||
const mutationKey = ["heartbeatOrCreateAgentApiV1AgentsHeartbeatPost"];
|
||||
const { mutation: mutationOptions, request: requestOptions } = options
|
||||
? options.mutation &&
|
||||
"mutationKey" in options.mutation &&
|
||||
options.mutation.mutationKey
|
||||
? options
|
||||
: { ...options, mutation: { ...options.mutation, mutationKey } }
|
||||
: { mutation: { mutationKey }, request: undefined };
|
||||
|
||||
const mutationFn: MutationFunction<
|
||||
Awaited<
|
||||
ReturnType<typeof heartbeatOrCreateAgentApiV1AgentsHeartbeatPost>
|
||||
>,
|
||||
{ data: AgentHeartbeatCreate }
|
||||
> = (props) => {
|
||||
const { data } = props ?? {};
|
||||
|
||||
return heartbeatOrCreateAgentApiV1AgentsHeartbeatPost(
|
||||
data,
|
||||
requestOptions,
|
||||
);
|
||||
};
|
||||
|
||||
return { mutationFn, ...mutationOptions };
|
||||
};
|
||||
|
||||
export type HeartbeatOrCreateAgentApiV1AgentsHeartbeatPostMutationResult =
|
||||
NonNullable<
|
||||
Awaited<ReturnType<typeof heartbeatOrCreateAgentApiV1AgentsHeartbeatPost>>
|
||||
>;
|
||||
export type HeartbeatOrCreateAgentApiV1AgentsHeartbeatPostMutationBody =
|
||||
AgentHeartbeatCreate;
|
||||
export type HeartbeatOrCreateAgentApiV1AgentsHeartbeatPostMutationError =
|
||||
HTTPValidationError;
|
||||
|
||||
/**
|
||||
* @summary Heartbeat Or Create Agent
|
||||
*/
|
||||
export const useHeartbeatOrCreateAgentApiV1AgentsHeartbeatPost = <
|
||||
TError = HTTPValidationError,
|
||||
TContext = unknown,
|
||||
>(
|
||||
options?: {
|
||||
mutation?: UseMutationOptions<
|
||||
Awaited<
|
||||
ReturnType<typeof heartbeatOrCreateAgentApiV1AgentsHeartbeatPost>
|
||||
>,
|
||||
TError,
|
||||
{ data: AgentHeartbeatCreate },
|
||||
TContext
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
},
|
||||
queryClient?: QueryClient,
|
||||
): UseMutationResult<
|
||||
Awaited<ReturnType<typeof heartbeatOrCreateAgentApiV1AgentsHeartbeatPost>>,
|
||||
TError,
|
||||
{ data: AgentHeartbeatCreate },
|
||||
TContext
|
||||
> => {
|
||||
return useMutation(
|
||||
getHeartbeatOrCreateAgentApiV1AgentsHeartbeatPostMutationOptions(options),
|
||||
queryClient,
|
||||
);
|
||||
};
|
||||
|
||||
@@ -273,296 +273,6 @@ export function useGetOnboardingApiV1BoardsBoardIdOnboardingGet<
|
||||
return { ...query, queryKey: queryOptions.queryKey };
|
||||
}
|
||||
|
||||
/**
|
||||
* @summary Start Onboarding
|
||||
*/
|
||||
export type startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponse200 = {
|
||||
data: BoardOnboardingRead;
|
||||
status: 200;
|
||||
};
|
||||
|
||||
export type startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponse422 = {
|
||||
data: HTTPValidationError;
|
||||
status: 422;
|
||||
};
|
||||
|
||||
export type startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponseSuccess =
|
||||
startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponse200 & {
|
||||
headers: Headers;
|
||||
};
|
||||
export type startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponseError =
|
||||
startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponse422 & {
|
||||
headers: Headers;
|
||||
};
|
||||
|
||||
export type startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponse =
|
||||
| startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponseSuccess
|
||||
| startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponseError;
|
||||
|
||||
export const getStartOnboardingApiV1BoardsBoardIdOnboardingStartPostUrl = (
|
||||
boardId: string,
|
||||
) => {
|
||||
return `/api/v1/boards/${boardId}/onboarding/start`;
|
||||
};
|
||||
|
||||
export const startOnboardingApiV1BoardsBoardIdOnboardingStartPost = async (
|
||||
boardId: string,
|
||||
boardOnboardingStart: BoardOnboardingStart,
|
||||
options?: RequestInit,
|
||||
): Promise<startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponse> => {
|
||||
return customFetch<startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponse>(
|
||||
getStartOnboardingApiV1BoardsBoardIdOnboardingStartPostUrl(boardId),
|
||||
{
|
||||
...options,
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json", ...options?.headers },
|
||||
body: JSON.stringify(boardOnboardingStart),
|
||||
},
|
||||
);
|
||||
};
|
||||
|
||||
export const getStartOnboardingApiV1BoardsBoardIdOnboardingStartPostMutationOptions =
|
||||
<TError = HTTPValidationError, TContext = unknown>(options?: {
|
||||
mutation?: UseMutationOptions<
|
||||
Awaited<
|
||||
ReturnType<typeof startOnboardingApiV1BoardsBoardIdOnboardingStartPost>
|
||||
>,
|
||||
TError,
|
||||
{ boardId: string; data: BoardOnboardingStart },
|
||||
TContext
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
}): UseMutationOptions<
|
||||
Awaited<
|
||||
ReturnType<typeof startOnboardingApiV1BoardsBoardIdOnboardingStartPost>
|
||||
>,
|
||||
TError,
|
||||
{ boardId: string; data: BoardOnboardingStart },
|
||||
TContext
|
||||
> => {
|
||||
const mutationKey = [
|
||||
"startOnboardingApiV1BoardsBoardIdOnboardingStartPost",
|
||||
];
|
||||
const { mutation: mutationOptions, request: requestOptions } = options
|
||||
? options.mutation &&
|
||||
"mutationKey" in options.mutation &&
|
||||
options.mutation.mutationKey
|
||||
? options
|
||||
: { ...options, mutation: { ...options.mutation, mutationKey } }
|
||||
: { mutation: { mutationKey }, request: undefined };
|
||||
|
||||
const mutationFn: MutationFunction<
|
||||
Awaited<
|
||||
ReturnType<typeof startOnboardingApiV1BoardsBoardIdOnboardingStartPost>
|
||||
>,
|
||||
{ boardId: string; data: BoardOnboardingStart }
|
||||
> = (props) => {
|
||||
const { boardId, data } = props ?? {};
|
||||
|
||||
return startOnboardingApiV1BoardsBoardIdOnboardingStartPost(
|
||||
boardId,
|
||||
data,
|
||||
requestOptions,
|
||||
);
|
||||
};
|
||||
|
||||
return { mutationFn, ...mutationOptions };
|
||||
};
|
||||
|
||||
export type StartOnboardingApiV1BoardsBoardIdOnboardingStartPostMutationResult =
|
||||
NonNullable<
|
||||
Awaited<
|
||||
ReturnType<typeof startOnboardingApiV1BoardsBoardIdOnboardingStartPost>
|
||||
>
|
||||
>;
|
||||
export type StartOnboardingApiV1BoardsBoardIdOnboardingStartPostMutationBody =
|
||||
BoardOnboardingStart;
|
||||
export type StartOnboardingApiV1BoardsBoardIdOnboardingStartPostMutationError =
|
||||
HTTPValidationError;
|
||||
|
||||
/**
|
||||
* @summary Start Onboarding
|
||||
*/
|
||||
export const useStartOnboardingApiV1BoardsBoardIdOnboardingStartPost = <
|
||||
TError = HTTPValidationError,
|
||||
TContext = unknown,
|
||||
>(
|
||||
options?: {
|
||||
mutation?: UseMutationOptions<
|
||||
Awaited<
|
||||
ReturnType<typeof startOnboardingApiV1BoardsBoardIdOnboardingStartPost>
|
||||
>,
|
||||
TError,
|
||||
{ boardId: string; data: BoardOnboardingStart },
|
||||
TContext
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
},
|
||||
queryClient?: QueryClient,
|
||||
): UseMutationResult<
|
||||
Awaited<
|
||||
ReturnType<typeof startOnboardingApiV1BoardsBoardIdOnboardingStartPost>
|
||||
>,
|
||||
TError,
|
||||
{ boardId: string; data: BoardOnboardingStart },
|
||||
TContext
|
||||
> => {
|
||||
return useMutation(
|
||||
getStartOnboardingApiV1BoardsBoardIdOnboardingStartPostMutationOptions(
|
||||
options,
|
||||
),
|
||||
queryClient,
|
||||
);
|
||||
};
|
||||
/**
|
||||
* @summary Answer Onboarding
|
||||
*/
|
||||
export type answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponse200 =
|
||||
{
|
||||
data: BoardOnboardingRead;
|
||||
status: 200;
|
||||
};
|
||||
|
||||
export type answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponse422 =
|
||||
{
|
||||
data: HTTPValidationError;
|
||||
status: 422;
|
||||
};
|
||||
|
||||
export type answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponseSuccess =
|
||||
answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponse200 & {
|
||||
headers: Headers;
|
||||
};
|
||||
export type answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponseError =
|
||||
answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponse422 & {
|
||||
headers: Headers;
|
||||
};
|
||||
|
||||
export type answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponse =
|
||||
| answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponseSuccess
|
||||
| answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponseError;
|
||||
|
||||
export const getAnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostUrl = (
|
||||
boardId: string,
|
||||
) => {
|
||||
return `/api/v1/boards/${boardId}/onboarding/answer`;
|
||||
};
|
||||
|
||||
export const answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost = async (
|
||||
boardId: string,
|
||||
boardOnboardingAnswer: BoardOnboardingAnswer,
|
||||
options?: RequestInit,
|
||||
): Promise<answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponse> => {
|
||||
return customFetch<answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponse>(
|
||||
getAnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostUrl(boardId),
|
||||
{
|
||||
...options,
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json", ...options?.headers },
|
||||
body: JSON.stringify(boardOnboardingAnswer),
|
||||
},
|
||||
);
|
||||
};
|
||||
|
||||
export const getAnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostMutationOptions =
|
||||
<TError = HTTPValidationError, TContext = unknown>(options?: {
|
||||
mutation?: UseMutationOptions<
|
||||
Awaited<
|
||||
ReturnType<
|
||||
typeof answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost
|
||||
>
|
||||
>,
|
||||
TError,
|
||||
{ boardId: string; data: BoardOnboardingAnswer },
|
||||
TContext
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
}): UseMutationOptions<
|
||||
Awaited<
|
||||
ReturnType<typeof answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost>
|
||||
>,
|
||||
TError,
|
||||
{ boardId: string; data: BoardOnboardingAnswer },
|
||||
TContext
|
||||
> => {
|
||||
const mutationKey = [
|
||||
"answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost",
|
||||
];
|
||||
const { mutation: mutationOptions, request: requestOptions } = options
|
||||
? options.mutation &&
|
||||
"mutationKey" in options.mutation &&
|
||||
options.mutation.mutationKey
|
||||
? options
|
||||
: { ...options, mutation: { ...options.mutation, mutationKey } }
|
||||
: { mutation: { mutationKey }, request: undefined };
|
||||
|
||||
const mutationFn: MutationFunction<
|
||||
Awaited<
|
||||
ReturnType<
|
||||
typeof answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost
|
||||
>
|
||||
>,
|
||||
{ boardId: string; data: BoardOnboardingAnswer }
|
||||
> = (props) => {
|
||||
const { boardId, data } = props ?? {};
|
||||
|
||||
return answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost(
|
||||
boardId,
|
||||
data,
|
||||
requestOptions,
|
||||
);
|
||||
};
|
||||
|
||||
return { mutationFn, ...mutationOptions };
|
||||
};
|
||||
|
||||
export type AnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostMutationResult =
|
||||
NonNullable<
|
||||
Awaited<
|
||||
ReturnType<typeof answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost>
|
||||
>
|
||||
>;
|
||||
export type AnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostMutationBody =
|
||||
BoardOnboardingAnswer;
|
||||
export type AnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostMutationError =
|
||||
HTTPValidationError;
|
||||
|
||||
/**
|
||||
* @summary Answer Onboarding
|
||||
*/
|
||||
export const useAnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost = <
|
||||
TError = HTTPValidationError,
|
||||
TContext = unknown,
|
||||
>(
|
||||
options?: {
|
||||
mutation?: UseMutationOptions<
|
||||
Awaited<
|
||||
ReturnType<
|
||||
typeof answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost
|
||||
>
|
||||
>,
|
||||
TError,
|
||||
{ boardId: string; data: BoardOnboardingAnswer },
|
||||
TContext
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
},
|
||||
queryClient?: QueryClient,
|
||||
): UseMutationResult<
|
||||
Awaited<
|
||||
ReturnType<typeof answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost>
|
||||
>,
|
||||
TError,
|
||||
{ boardId: string; data: BoardOnboardingAnswer },
|
||||
TContext
|
||||
> => {
|
||||
return useMutation(
|
||||
getAnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostMutationOptions(
|
||||
options,
|
||||
),
|
||||
queryClient,
|
||||
);
|
||||
};
|
||||
/**
|
||||
* @summary Agent Onboarding Update
|
||||
*/
|
||||
@@ -737,6 +447,155 @@ export const useAgentOnboardingUpdateApiV1BoardsBoardIdOnboardingAgentPost = <
|
||||
queryClient,
|
||||
);
|
||||
};
|
||||
/**
|
||||
* @summary Answer Onboarding
|
||||
*/
|
||||
export type answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponse200 =
|
||||
{
|
||||
data: BoardOnboardingRead;
|
||||
status: 200;
|
||||
};
|
||||
|
||||
export type answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponse422 =
|
||||
{
|
||||
data: HTTPValidationError;
|
||||
status: 422;
|
||||
};
|
||||
|
||||
export type answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponseSuccess =
|
||||
answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponse200 & {
|
||||
headers: Headers;
|
||||
};
|
||||
export type answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponseError =
|
||||
answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponse422 & {
|
||||
headers: Headers;
|
||||
};
|
||||
|
||||
export type answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponse =
|
||||
| answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponseSuccess
|
||||
| answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponseError;
|
||||
|
||||
export const getAnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostUrl = (
|
||||
boardId: string,
|
||||
) => {
|
||||
return `/api/v1/boards/${boardId}/onboarding/answer`;
|
||||
};
|
||||
|
||||
export const answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost = async (
|
||||
boardId: string,
|
||||
boardOnboardingAnswer: BoardOnboardingAnswer,
|
||||
options?: RequestInit,
|
||||
): Promise<answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponse> => {
|
||||
return customFetch<answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostResponse>(
|
||||
getAnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostUrl(boardId),
|
||||
{
|
||||
...options,
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json", ...options?.headers },
|
||||
body: JSON.stringify(boardOnboardingAnswer),
|
||||
},
|
||||
);
|
||||
};
|
||||
|
||||
export const getAnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostMutationOptions =
|
||||
<TError = HTTPValidationError, TContext = unknown>(options?: {
|
||||
mutation?: UseMutationOptions<
|
||||
Awaited<
|
||||
ReturnType<
|
||||
typeof answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost
|
||||
>
|
||||
>,
|
||||
TError,
|
||||
{ boardId: string; data: BoardOnboardingAnswer },
|
||||
TContext
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
}): UseMutationOptions<
|
||||
Awaited<
|
||||
ReturnType<typeof answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost>
|
||||
>,
|
||||
TError,
|
||||
{ boardId: string; data: BoardOnboardingAnswer },
|
||||
TContext
|
||||
> => {
|
||||
const mutationKey = [
|
||||
"answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost",
|
||||
];
|
||||
const { mutation: mutationOptions, request: requestOptions } = options
|
||||
? options.mutation &&
|
||||
"mutationKey" in options.mutation &&
|
||||
options.mutation.mutationKey
|
||||
? options
|
||||
: { ...options, mutation: { ...options.mutation, mutationKey } }
|
||||
: { mutation: { mutationKey }, request: undefined };
|
||||
|
||||
const mutationFn: MutationFunction<
|
||||
Awaited<
|
||||
ReturnType<
|
||||
typeof answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost
|
||||
>
|
||||
>,
|
||||
{ boardId: string; data: BoardOnboardingAnswer }
|
||||
> = (props) => {
|
||||
const { boardId, data } = props ?? {};
|
||||
|
||||
return answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost(
|
||||
boardId,
|
||||
data,
|
||||
requestOptions,
|
||||
);
|
||||
};
|
||||
|
||||
return { mutationFn, ...mutationOptions };
|
||||
};
|
||||
|
||||
export type AnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostMutationResult =
|
||||
NonNullable<
|
||||
Awaited<
|
||||
ReturnType<typeof answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost>
|
||||
>
|
||||
>;
|
||||
export type AnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostMutationBody =
|
||||
BoardOnboardingAnswer;
|
||||
export type AnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostMutationError =
|
||||
HTTPValidationError;
|
||||
|
||||
/**
|
||||
* @summary Answer Onboarding
|
||||
*/
|
||||
export const useAnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost = <
|
||||
TError = HTTPValidationError,
|
||||
TContext = unknown,
|
||||
>(
|
||||
options?: {
|
||||
mutation?: UseMutationOptions<
|
||||
Awaited<
|
||||
ReturnType<
|
||||
typeof answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost
|
||||
>
|
||||
>,
|
||||
TError,
|
||||
{ boardId: string; data: BoardOnboardingAnswer },
|
||||
TContext
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
},
|
||||
queryClient?: QueryClient,
|
||||
): UseMutationResult<
|
||||
Awaited<
|
||||
ReturnType<typeof answerOnboardingApiV1BoardsBoardIdOnboardingAnswerPost>
|
||||
>,
|
||||
TError,
|
||||
{ boardId: string; data: BoardOnboardingAnswer },
|
||||
TContext
|
||||
> => {
|
||||
return useMutation(
|
||||
getAnswerOnboardingApiV1BoardsBoardIdOnboardingAnswerPostMutationOptions(
|
||||
options,
|
||||
),
|
||||
queryClient,
|
||||
);
|
||||
};
|
||||
/**
|
||||
* @summary Confirm Onboarding
|
||||
*/
|
||||
@@ -890,3 +749,144 @@ export const useConfirmOnboardingApiV1BoardsBoardIdOnboardingConfirmPost = <
|
||||
queryClient,
|
||||
);
|
||||
};
|
||||
/**
|
||||
* @summary Start Onboarding
|
||||
*/
|
||||
export type startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponse200 = {
|
||||
data: BoardOnboardingRead;
|
||||
status: 200;
|
||||
};
|
||||
|
||||
export type startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponse422 = {
|
||||
data: HTTPValidationError;
|
||||
status: 422;
|
||||
};
|
||||
|
||||
export type startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponseSuccess =
|
||||
startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponse200 & {
|
||||
headers: Headers;
|
||||
};
|
||||
export type startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponseError =
|
||||
startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponse422 & {
|
||||
headers: Headers;
|
||||
};
|
||||
|
||||
export type startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponse =
|
||||
| startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponseSuccess
|
||||
| startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponseError;
|
||||
|
||||
export const getStartOnboardingApiV1BoardsBoardIdOnboardingStartPostUrl = (
|
||||
boardId: string,
|
||||
) => {
|
||||
return `/api/v1/boards/${boardId}/onboarding/start`;
|
||||
};
|
||||
|
||||
export const startOnboardingApiV1BoardsBoardIdOnboardingStartPost = async (
|
||||
boardId: string,
|
||||
boardOnboardingStart: BoardOnboardingStart,
|
||||
options?: RequestInit,
|
||||
): Promise<startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponse> => {
|
||||
return customFetch<startOnboardingApiV1BoardsBoardIdOnboardingStartPostResponse>(
|
||||
getStartOnboardingApiV1BoardsBoardIdOnboardingStartPostUrl(boardId),
|
||||
{
|
||||
...options,
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json", ...options?.headers },
|
||||
body: JSON.stringify(boardOnboardingStart),
|
||||
},
|
||||
);
|
||||
};
|
||||
|
||||
export const getStartOnboardingApiV1BoardsBoardIdOnboardingStartPostMutationOptions =
|
||||
<TError = HTTPValidationError, TContext = unknown>(options?: {
|
||||
mutation?: UseMutationOptions<
|
||||
Awaited<
|
||||
ReturnType<typeof startOnboardingApiV1BoardsBoardIdOnboardingStartPost>
|
||||
>,
|
||||
TError,
|
||||
{ boardId: string; data: BoardOnboardingStart },
|
||||
TContext
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
}): UseMutationOptions<
|
||||
Awaited<
|
||||
ReturnType<typeof startOnboardingApiV1BoardsBoardIdOnboardingStartPost>
|
||||
>,
|
||||
TError,
|
||||
{ boardId: string; data: BoardOnboardingStart },
|
||||
TContext
|
||||
> => {
|
||||
const mutationKey = [
|
||||
"startOnboardingApiV1BoardsBoardIdOnboardingStartPost",
|
||||
];
|
||||
const { mutation: mutationOptions, request: requestOptions } = options
|
||||
? options.mutation &&
|
||||
"mutationKey" in options.mutation &&
|
||||
options.mutation.mutationKey
|
||||
? options
|
||||
: { ...options, mutation: { ...options.mutation, mutationKey } }
|
||||
: { mutation: { mutationKey }, request: undefined };
|
||||
|
||||
const mutationFn: MutationFunction<
|
||||
Awaited<
|
||||
ReturnType<typeof startOnboardingApiV1BoardsBoardIdOnboardingStartPost>
|
||||
>,
|
||||
{ boardId: string; data: BoardOnboardingStart }
|
||||
> = (props) => {
|
||||
const { boardId, data } = props ?? {};
|
||||
|
||||
return startOnboardingApiV1BoardsBoardIdOnboardingStartPost(
|
||||
boardId,
|
||||
data,
|
||||
requestOptions,
|
||||
);
|
||||
};
|
||||
|
||||
return { mutationFn, ...mutationOptions };
|
||||
};
|
||||
|
||||
export type StartOnboardingApiV1BoardsBoardIdOnboardingStartPostMutationResult =
|
||||
NonNullable<
|
||||
Awaited<
|
||||
ReturnType<typeof startOnboardingApiV1BoardsBoardIdOnboardingStartPost>
|
||||
>
|
||||
>;
|
||||
export type StartOnboardingApiV1BoardsBoardIdOnboardingStartPostMutationBody =
|
||||
BoardOnboardingStart;
|
||||
export type StartOnboardingApiV1BoardsBoardIdOnboardingStartPostMutationError =
|
||||
HTTPValidationError;
|
||||
|
||||
/**
|
||||
* @summary Start Onboarding
|
||||
*/
|
||||
export const useStartOnboardingApiV1BoardsBoardIdOnboardingStartPost = <
|
||||
TError = HTTPValidationError,
|
||||
TContext = unknown,
|
||||
>(
|
||||
options?: {
|
||||
mutation?: UseMutationOptions<
|
||||
Awaited<
|
||||
ReturnType<typeof startOnboardingApiV1BoardsBoardIdOnboardingStartPost>
|
||||
>,
|
||||
TError,
|
||||
{ boardId: string; data: BoardOnboardingStart },
|
||||
TContext
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
},
|
||||
queryClient?: QueryClient,
|
||||
): UseMutationResult<
|
||||
Awaited<
|
||||
ReturnType<typeof startOnboardingApiV1BoardsBoardIdOnboardingStartPost>
|
||||
>,
|
||||
TError,
|
||||
{ boardId: string; data: BoardOnboardingStart },
|
||||
TContext
|
||||
> => {
|
||||
return useMutation(
|
||||
getStartOnboardingApiV1BoardsBoardIdOnboardingStartPostMutationOptions(
|
||||
options,
|
||||
),
|
||||
queryClient,
|
||||
);
|
||||
};
|
||||
|
||||
@@ -359,6 +359,122 @@ export const useCreateBoardApiV1BoardsPost = <
|
||||
queryClient,
|
||||
);
|
||||
};
|
||||
/**
|
||||
* @summary Delete Board
|
||||
*/
|
||||
export type deleteBoardApiV1BoardsBoardIdDeleteResponse200 = {
|
||||
data: OkResponse;
|
||||
status: 200;
|
||||
};
|
||||
|
||||
export type deleteBoardApiV1BoardsBoardIdDeleteResponse422 = {
|
||||
data: HTTPValidationError;
|
||||
status: 422;
|
||||
};
|
||||
|
||||
export type deleteBoardApiV1BoardsBoardIdDeleteResponseSuccess =
|
||||
deleteBoardApiV1BoardsBoardIdDeleteResponse200 & {
|
||||
headers: Headers;
|
||||
};
|
||||
export type deleteBoardApiV1BoardsBoardIdDeleteResponseError =
|
||||
deleteBoardApiV1BoardsBoardIdDeleteResponse422 & {
|
||||
headers: Headers;
|
||||
};
|
||||
|
||||
export type deleteBoardApiV1BoardsBoardIdDeleteResponse =
|
||||
| deleteBoardApiV1BoardsBoardIdDeleteResponseSuccess
|
||||
| deleteBoardApiV1BoardsBoardIdDeleteResponseError;
|
||||
|
||||
export const getDeleteBoardApiV1BoardsBoardIdDeleteUrl = (boardId: string) => {
|
||||
return `/api/v1/boards/${boardId}`;
|
||||
};
|
||||
|
||||
export const deleteBoardApiV1BoardsBoardIdDelete = async (
|
||||
boardId: string,
|
||||
options?: RequestInit,
|
||||
): Promise<deleteBoardApiV1BoardsBoardIdDeleteResponse> => {
|
||||
return customFetch<deleteBoardApiV1BoardsBoardIdDeleteResponse>(
|
||||
getDeleteBoardApiV1BoardsBoardIdDeleteUrl(boardId),
|
||||
{
|
||||
...options,
|
||||
method: "DELETE",
|
||||
},
|
||||
);
|
||||
};
|
||||
|
||||
export const getDeleteBoardApiV1BoardsBoardIdDeleteMutationOptions = <
|
||||
TError = HTTPValidationError,
|
||||
TContext = unknown,
|
||||
>(options?: {
|
||||
mutation?: UseMutationOptions<
|
||||
Awaited<ReturnType<typeof deleteBoardApiV1BoardsBoardIdDelete>>,
|
||||
TError,
|
||||
{ boardId: string },
|
||||
TContext
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
}): UseMutationOptions<
|
||||
Awaited<ReturnType<typeof deleteBoardApiV1BoardsBoardIdDelete>>,
|
||||
TError,
|
||||
{ boardId: string },
|
||||
TContext
|
||||
> => {
|
||||
const mutationKey = ["deleteBoardApiV1BoardsBoardIdDelete"];
|
||||
const { mutation: mutationOptions, request: requestOptions } = options
|
||||
? options.mutation &&
|
||||
"mutationKey" in options.mutation &&
|
||||
options.mutation.mutationKey
|
||||
? options
|
||||
: { ...options, mutation: { ...options.mutation, mutationKey } }
|
||||
: { mutation: { mutationKey }, request: undefined };
|
||||
|
||||
const mutationFn: MutationFunction<
|
||||
Awaited<ReturnType<typeof deleteBoardApiV1BoardsBoardIdDelete>>,
|
||||
{ boardId: string }
|
||||
> = (props) => {
|
||||
const { boardId } = props ?? {};
|
||||
|
||||
return deleteBoardApiV1BoardsBoardIdDelete(boardId, requestOptions);
|
||||
};
|
||||
|
||||
return { mutationFn, ...mutationOptions };
|
||||
};
|
||||
|
||||
export type DeleteBoardApiV1BoardsBoardIdDeleteMutationResult = NonNullable<
|
||||
Awaited<ReturnType<typeof deleteBoardApiV1BoardsBoardIdDelete>>
|
||||
>;
|
||||
|
||||
export type DeleteBoardApiV1BoardsBoardIdDeleteMutationError =
|
||||
HTTPValidationError;
|
||||
|
||||
/**
|
||||
* @summary Delete Board
|
||||
*/
|
||||
export const useDeleteBoardApiV1BoardsBoardIdDelete = <
|
||||
TError = HTTPValidationError,
|
||||
TContext = unknown,
|
||||
>(
|
||||
options?: {
|
||||
mutation?: UseMutationOptions<
|
||||
Awaited<ReturnType<typeof deleteBoardApiV1BoardsBoardIdDelete>>,
|
||||
TError,
|
||||
{ boardId: string },
|
||||
TContext
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
},
|
||||
queryClient?: QueryClient,
|
||||
): UseMutationResult<
|
||||
Awaited<ReturnType<typeof deleteBoardApiV1BoardsBoardIdDelete>>,
|
||||
TError,
|
||||
{ boardId: string },
|
||||
TContext
|
||||
> => {
|
||||
return useMutation(
|
||||
getDeleteBoardApiV1BoardsBoardIdDeleteMutationOptions(options),
|
||||
queryClient,
|
||||
);
|
||||
};
|
||||
/**
|
||||
* @summary Get Board
|
||||
*/
|
||||
@@ -677,122 +793,6 @@ export const useUpdateBoardApiV1BoardsBoardIdPatch = <
|
||||
queryClient,
|
||||
);
|
||||
};
|
||||
/**
|
||||
* @summary Delete Board
|
||||
*/
|
||||
export type deleteBoardApiV1BoardsBoardIdDeleteResponse200 = {
|
||||
data: OkResponse;
|
||||
status: 200;
|
||||
};
|
||||
|
||||
export type deleteBoardApiV1BoardsBoardIdDeleteResponse422 = {
|
||||
data: HTTPValidationError;
|
||||
status: 422;
|
||||
};
|
||||
|
||||
export type deleteBoardApiV1BoardsBoardIdDeleteResponseSuccess =
|
||||
deleteBoardApiV1BoardsBoardIdDeleteResponse200 & {
|
||||
headers: Headers;
|
||||
};
|
||||
export type deleteBoardApiV1BoardsBoardIdDeleteResponseError =
|
||||
deleteBoardApiV1BoardsBoardIdDeleteResponse422 & {
|
||||
headers: Headers;
|
||||
};
|
||||
|
||||
export type deleteBoardApiV1BoardsBoardIdDeleteResponse =
|
||||
| deleteBoardApiV1BoardsBoardIdDeleteResponseSuccess
|
||||
| deleteBoardApiV1BoardsBoardIdDeleteResponseError;
|
||||
|
||||
export const getDeleteBoardApiV1BoardsBoardIdDeleteUrl = (boardId: string) => {
|
||||
return `/api/v1/boards/${boardId}`;
|
||||
};
|
||||
|
||||
export const deleteBoardApiV1BoardsBoardIdDelete = async (
|
||||
boardId: string,
|
||||
options?: RequestInit,
|
||||
): Promise<deleteBoardApiV1BoardsBoardIdDeleteResponse> => {
|
||||
return customFetch<deleteBoardApiV1BoardsBoardIdDeleteResponse>(
|
||||
getDeleteBoardApiV1BoardsBoardIdDeleteUrl(boardId),
|
||||
{
|
||||
...options,
|
||||
method: "DELETE",
|
||||
},
|
||||
);
|
||||
};
|
||||
|
||||
export const getDeleteBoardApiV1BoardsBoardIdDeleteMutationOptions = <
|
||||
TError = HTTPValidationError,
|
||||
TContext = unknown,
|
||||
>(options?: {
|
||||
mutation?: UseMutationOptions<
|
||||
Awaited<ReturnType<typeof deleteBoardApiV1BoardsBoardIdDelete>>,
|
||||
TError,
|
||||
{ boardId: string },
|
||||
TContext
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
}): UseMutationOptions<
|
||||
Awaited<ReturnType<typeof deleteBoardApiV1BoardsBoardIdDelete>>,
|
||||
TError,
|
||||
{ boardId: string },
|
||||
TContext
|
||||
> => {
|
||||
const mutationKey = ["deleteBoardApiV1BoardsBoardIdDelete"];
|
||||
const { mutation: mutationOptions, request: requestOptions } = options
|
||||
? options.mutation &&
|
||||
"mutationKey" in options.mutation &&
|
||||
options.mutation.mutationKey
|
||||
? options
|
||||
: { ...options, mutation: { ...options.mutation, mutationKey } }
|
||||
: { mutation: { mutationKey }, request: undefined };
|
||||
|
||||
const mutationFn: MutationFunction<
|
||||
Awaited<ReturnType<typeof deleteBoardApiV1BoardsBoardIdDelete>>,
|
||||
{ boardId: string }
|
||||
> = (props) => {
|
||||
const { boardId } = props ?? {};
|
||||
|
||||
return deleteBoardApiV1BoardsBoardIdDelete(boardId, requestOptions);
|
||||
};
|
||||
|
||||
return { mutationFn, ...mutationOptions };
|
||||
};
|
||||
|
||||
export type DeleteBoardApiV1BoardsBoardIdDeleteMutationResult = NonNullable<
|
||||
Awaited<ReturnType<typeof deleteBoardApiV1BoardsBoardIdDelete>>
|
||||
>;
|
||||
|
||||
export type DeleteBoardApiV1BoardsBoardIdDeleteMutationError =
|
||||
HTTPValidationError;
|
||||
|
||||
/**
|
||||
* @summary Delete Board
|
||||
*/
|
||||
export const useDeleteBoardApiV1BoardsBoardIdDelete = <
|
||||
TError = HTTPValidationError,
|
||||
TContext = unknown,
|
||||
>(
|
||||
options?: {
|
||||
mutation?: UseMutationOptions<
|
||||
Awaited<ReturnType<typeof deleteBoardApiV1BoardsBoardIdDelete>>,
|
||||
TError,
|
||||
{ boardId: string },
|
||||
TContext
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
},
|
||||
queryClient?: QueryClient,
|
||||
): UseMutationResult<
|
||||
Awaited<ReturnType<typeof deleteBoardApiV1BoardsBoardIdDelete>>,
|
||||
TError,
|
||||
{ boardId: string },
|
||||
TContext
|
||||
> => {
|
||||
return useMutation(
|
||||
getDeleteBoardApiV1BoardsBoardIdDeleteMutationOptions(options),
|
||||
queryClient,
|
||||
);
|
||||
};
|
||||
/**
|
||||
* @summary Get Board Snapshot
|
||||
*/
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -6,10 +6,10 @@
|
||||
*/
|
||||
|
||||
export interface ActivityEventRead {
|
||||
id: string;
|
||||
event_type: string;
|
||||
message: string | null;
|
||||
agent_id: string | null;
|
||||
task_id: string | null;
|
||||
created_at: string;
|
||||
event_type: string;
|
||||
id: string;
|
||||
message: string | null;
|
||||
task_id: string | null;
|
||||
}
|
||||
|
||||
@@ -9,11 +9,11 @@ import type { AgentCreateIdentityProfile } from "./agentCreateIdentityProfile";
|
||||
|
||||
export interface AgentCreate {
|
||||
board_id?: string | null;
|
||||
/** @minLength 1 */
|
||||
name: string;
|
||||
status?: string;
|
||||
heartbeat_config?: AgentCreateHeartbeatConfig;
|
||||
identity_profile?: AgentCreateIdentityProfile;
|
||||
identity_template?: string | null;
|
||||
/** @minLength 1 */
|
||||
name: string;
|
||||
soul_template?: string | null;
|
||||
status?: string;
|
||||
}
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
*/
|
||||
|
||||
export interface AgentHeartbeatCreate {
|
||||
status?: string | null;
|
||||
board_id?: string | null;
|
||||
/** @minLength 1 */
|
||||
name: string;
|
||||
board_id?: string | null;
|
||||
status?: string | null;
|
||||
}
|
||||
|
||||
@@ -9,18 +9,18 @@ import type { AgentReadIdentityProfile } from "./agentReadIdentityProfile";
|
||||
|
||||
export interface AgentRead {
|
||||
board_id?: string | null;
|
||||
/** @minLength 1 */
|
||||
name: string;
|
||||
status?: string;
|
||||
created_at: string;
|
||||
heartbeat_config?: AgentReadHeartbeatConfig;
|
||||
id: string;
|
||||
identity_profile?: AgentReadIdentityProfile;
|
||||
identity_template?: string | null;
|
||||
soul_template?: string | null;
|
||||
id: string;
|
||||
is_board_lead?: boolean;
|
||||
is_gateway_main?: boolean;
|
||||
openclaw_session_id?: string | null;
|
||||
last_seen_at: string | null;
|
||||
created_at: string;
|
||||
/** @minLength 1 */
|
||||
name: string;
|
||||
openclaw_session_id?: string | null;
|
||||
soul_template?: string | null;
|
||||
status?: string;
|
||||
updated_at: string;
|
||||
}
|
||||
|
||||
@@ -9,11 +9,11 @@ import type { AgentUpdateIdentityProfile } from "./agentUpdateIdentityProfile";
|
||||
|
||||
export interface AgentUpdate {
|
||||
board_id?: string | null;
|
||||
is_gateway_main?: boolean | null;
|
||||
name?: string | null;
|
||||
status?: string | null;
|
||||
heartbeat_config?: AgentUpdateHeartbeatConfig;
|
||||
identity_profile?: AgentUpdateIdentityProfile;
|
||||
identity_template?: string | null;
|
||||
is_gateway_main?: boolean | null;
|
||||
name?: string | null;
|
||||
soul_template?: string | null;
|
||||
status?: string | null;
|
||||
}
|
||||
|
||||
@@ -10,10 +10,10 @@ import type { ApprovalCreateStatus } from "./approvalCreateStatus";
|
||||
|
||||
export interface ApprovalCreate {
|
||||
action_type: string;
|
||||
task_id?: string | null;
|
||||
payload?: ApprovalCreatePayload;
|
||||
agent_id?: string | null;
|
||||
confidence: number;
|
||||
payload?: ApprovalCreatePayload;
|
||||
rubric_scores?: ApprovalCreateRubricScores;
|
||||
status?: ApprovalCreateStatus;
|
||||
agent_id?: string | null;
|
||||
task_id?: string | null;
|
||||
}
|
||||
|
||||
@@ -10,14 +10,14 @@ import type { ApprovalReadStatus } from "./approvalReadStatus";
|
||||
|
||||
export interface ApprovalRead {
|
||||
action_type: string;
|
||||
task_id?: string | null;
|
||||
payload?: ApprovalReadPayload;
|
||||
agent_id?: string | null;
|
||||
board_id: string;
|
||||
confidence: number;
|
||||
created_at: string;
|
||||
id: string;
|
||||
payload?: ApprovalReadPayload;
|
||||
resolved_at?: string | null;
|
||||
rubric_scores?: ApprovalReadRubricScores;
|
||||
status?: ApprovalReadStatus;
|
||||
id: string;
|
||||
board_id: string;
|
||||
agent_id?: string | null;
|
||||
created_at: string;
|
||||
resolved_at?: string | null;
|
||||
task_id?: string | null;
|
||||
}
|
||||
|
||||
@@ -7,13 +7,13 @@
|
||||
import type { BoardCreateSuccessMetrics } from "./boardCreateSuccessMetrics";
|
||||
|
||||
export interface BoardCreate {
|
||||
name: string;
|
||||
slug: string;
|
||||
gateway_id: string;
|
||||
board_type?: string;
|
||||
objective?: string | null;
|
||||
success_metrics?: BoardCreateSuccessMetrics;
|
||||
target_date?: string | null;
|
||||
gateway_id: string;
|
||||
goal_confirmed?: boolean;
|
||||
goal_source?: string | null;
|
||||
name: string;
|
||||
objective?: string | null;
|
||||
slug: string;
|
||||
success_metrics?: BoardCreateSuccessMetrics;
|
||||
target_date?: string | null;
|
||||
}
|
||||
|
||||
@@ -8,6 +8,6 @@
|
||||
export interface BoardMemoryCreate {
|
||||
/** @minLength 1 */
|
||||
content: string;
|
||||
tags?: string[] | null;
|
||||
source?: string | null;
|
||||
tags?: string[] | null;
|
||||
}
|
||||
|
||||
@@ -6,12 +6,11 @@
|
||||
*/
|
||||
|
||||
export interface BoardMemoryRead {
|
||||
/** @minLength 1 */
|
||||
content: string;
|
||||
tags?: string[] | null;
|
||||
source?: string | null;
|
||||
id: string;
|
||||
board_id: string;
|
||||
is_chat?: boolean;
|
||||
content: string;
|
||||
created_at: string;
|
||||
id: string;
|
||||
is_chat?: boolean;
|
||||
source?: string | null;
|
||||
tags?: string[] | null;
|
||||
}
|
||||
|
||||
@@ -5,11 +5,15 @@
|
||||
* OpenAPI spec version: 0.1.0
|
||||
*/
|
||||
import type { BoardOnboardingAgentCompleteSuccessMetrics } from "./boardOnboardingAgentCompleteSuccessMetrics";
|
||||
import type { BoardOnboardingLeadAgentDraft } from "./boardOnboardingLeadAgentDraft";
|
||||
import type { BoardOnboardingUserProfile } from "./boardOnboardingUserProfile";
|
||||
|
||||
export interface BoardOnboardingAgentComplete {
|
||||
board_type: string;
|
||||
lead_agent?: BoardOnboardingLeadAgentDraft | null;
|
||||
objective?: string | null;
|
||||
status: "complete";
|
||||
success_metrics?: BoardOnboardingAgentCompleteSuccessMetrics;
|
||||
target_date?: string | null;
|
||||
status: "complete";
|
||||
user_profile?: BoardOnboardingUserProfile | null;
|
||||
}
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
import type { BoardOnboardingQuestionOption } from "./boardOnboardingQuestionOption";
|
||||
|
||||
export interface BoardOnboardingAgentQuestion {
|
||||
/** @minLength 1 */
|
||||
question: string;
|
||||
/** @minItems 1 */
|
||||
options: BoardOnboardingQuestionOption[];
|
||||
/** @minLength 1 */
|
||||
question: string;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
/**
|
||||
* Generated by orval v8.2.0 🍺
|
||||
* Do not edit manually.
|
||||
* Mission Control API
|
||||
* OpenAPI spec version: 0.1.0
|
||||
*/
|
||||
import type { BoardOnboardingLeadAgentDraftIdentityProfile } from "./boardOnboardingLeadAgentDraftIdentityProfile";
|
||||
|
||||
export interface BoardOnboardingLeadAgentDraft {
|
||||
autonomy_level?: "ask_first" | "balanced" | "autonomous" | null;
|
||||
custom_instructions?: string | null;
|
||||
identity_profile?: BoardOnboardingLeadAgentDraftIdentityProfile;
|
||||
name?: string | null;
|
||||
output_format?: "bullets" | "mixed" | "narrative" | null;
|
||||
update_cadence?: "asap" | "hourly" | "daily" | "weekly" | null;
|
||||
verbosity?: "concise" | "balanced" | "detailed" | null;
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
/**
|
||||
* Generated by orval v8.2.0 🍺
|
||||
* Do not edit manually.
|
||||
* Mission Control API
|
||||
* OpenAPI spec version: 0.1.0
|
||||
*/
|
||||
|
||||
export type BoardOnboardingLeadAgentDraftIdentityProfile = {
|
||||
[key: string]: string;
|
||||
} | null;
|
||||
@@ -4,16 +4,16 @@
|
||||
* Mission Control API
|
||||
* OpenAPI spec version: 0.1.0
|
||||
*/
|
||||
import type { BoardOnboardingReadDraftGoal } from "./boardOnboardingReadDraftGoal";
|
||||
import type { BoardOnboardingAgentComplete } from "./boardOnboardingAgentComplete";
|
||||
import type { BoardOnboardingReadMessages } from "./boardOnboardingReadMessages";
|
||||
|
||||
export interface BoardOnboardingRead {
|
||||
id: string;
|
||||
board_id: string;
|
||||
created_at: string;
|
||||
draft_goal?: BoardOnboardingAgentComplete | null;
|
||||
id: string;
|
||||
messages?: BoardOnboardingReadMessages;
|
||||
session_key: string;
|
||||
status: string;
|
||||
messages?: BoardOnboardingReadMessages;
|
||||
draft_goal?: BoardOnboardingReadDraftGoal;
|
||||
created_at: string;
|
||||
updated_at: string;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
/**
|
||||
* Generated by orval v8.2.0 🍺
|
||||
* Do not edit manually.
|
||||
* Mission Control API
|
||||
* OpenAPI spec version: 0.1.0
|
||||
*/
|
||||
|
||||
export interface BoardOnboardingUserProfile {
|
||||
context?: string | null;
|
||||
notes?: string | null;
|
||||
preferred_name?: string | null;
|
||||
pronouns?: string | null;
|
||||
timezone?: string | null;
|
||||
}
|
||||
@@ -7,16 +7,16 @@
|
||||
import type { BoardReadSuccessMetrics } from "./boardReadSuccessMetrics";
|
||||
|
||||
export interface BoardRead {
|
||||
name: string;
|
||||
slug: string;
|
||||
gateway_id?: string | null;
|
||||
board_type?: string;
|
||||
objective?: string | null;
|
||||
success_metrics?: BoardReadSuccessMetrics;
|
||||
target_date?: string | null;
|
||||
created_at: string;
|
||||
gateway_id?: string | null;
|
||||
goal_confirmed?: boolean;
|
||||
goal_source?: string | null;
|
||||
id: string;
|
||||
created_at: string;
|
||||
name: string;
|
||||
objective?: string | null;
|
||||
slug: string;
|
||||
success_metrics?: BoardReadSuccessMetrics;
|
||||
target_date?: string | null;
|
||||
updated_at: string;
|
||||
}
|
||||
|
||||
@@ -11,10 +11,10 @@ import type { BoardRead } from "./boardRead";
|
||||
import type { TaskCardRead } from "./taskCardRead";
|
||||
|
||||
export interface BoardSnapshot {
|
||||
board: BoardRead;
|
||||
tasks: TaskCardRead[];
|
||||
agents: AgentRead[];
|
||||
approvals: ApprovalRead[];
|
||||
board: BoardRead;
|
||||
chat_messages: BoardMemoryRead[];
|
||||
pending_approvals_count?: number;
|
||||
tasks: TaskCardRead[];
|
||||
}
|
||||
|
||||
@@ -7,13 +7,13 @@
|
||||
import type { BoardUpdateSuccessMetrics } from "./boardUpdateSuccessMetrics";
|
||||
|
||||
export interface BoardUpdate {
|
||||
name?: string | null;
|
||||
slug?: string | null;
|
||||
gateway_id?: string | null;
|
||||
board_type?: string | null;
|
||||
objective?: string | null;
|
||||
success_metrics?: BoardUpdateSuccessMetrics;
|
||||
target_date?: string | null;
|
||||
gateway_id?: string | null;
|
||||
goal_confirmed?: boolean | null;
|
||||
goal_source?: string | null;
|
||||
name?: string | null;
|
||||
objective?: string | null;
|
||||
slug?: string | null;
|
||||
success_metrics?: BoardUpdateSuccessMetrics;
|
||||
target_date?: string | null;
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
|
||||
export interface DashboardKpis {
|
||||
active_agents: number;
|
||||
tasks_in_progress: number;
|
||||
error_rate_pct: number;
|
||||
median_cycle_time_hours_7d: number | null;
|
||||
tasks_in_progress: number;
|
||||
}
|
||||
|
||||
@@ -10,11 +10,11 @@ import type { DashboardSeriesSet } from "./dashboardSeriesSet";
|
||||
import type { DashboardWipSeriesSet } from "./dashboardWipSeriesSet";
|
||||
|
||||
export interface DashboardMetrics {
|
||||
range: DashboardMetricsRange;
|
||||
generated_at: string;
|
||||
kpis: DashboardKpis;
|
||||
throughput: DashboardSeriesSet;
|
||||
cycle_time: DashboardSeriesSet;
|
||||
error_rate: DashboardSeriesSet;
|
||||
generated_at: string;
|
||||
kpis: DashboardKpis;
|
||||
range: DashboardMetricsRange;
|
||||
throughput: DashboardSeriesSet;
|
||||
wip: DashboardWipSeriesSet;
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ import type { DashboardRangeSeriesRange } from "./dashboardRangeSeriesRange";
|
||||
import type { DashboardSeriesPoint } from "./dashboardSeriesPoint";
|
||||
|
||||
export interface DashboardRangeSeries {
|
||||
range: DashboardRangeSeriesRange;
|
||||
bucket: DashboardRangeSeriesBucket;
|
||||
points: DashboardSeriesPoint[];
|
||||
range: DashboardRangeSeriesRange;
|
||||
}
|
||||
|
||||
@@ -7,6 +7,6 @@
|
||||
import type { DashboardRangeSeries } from "./dashboardRangeSeries";
|
||||
|
||||
export interface DashboardSeriesSet {
|
||||
primary: DashboardRangeSeries;
|
||||
comparison: DashboardRangeSeries;
|
||||
primary: DashboardRangeSeries;
|
||||
}
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
*/
|
||||
|
||||
export interface DashboardWipPoint {
|
||||
period: string;
|
||||
inbox: number;
|
||||
in_progress: number;
|
||||
inbox: number;
|
||||
period: string;
|
||||
review: number;
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ import type { DashboardWipRangeSeriesBucket } from "./dashboardWipRangeSeriesBuc
|
||||
import type { DashboardWipRangeSeriesRange } from "./dashboardWipRangeSeriesRange";
|
||||
|
||||
export interface DashboardWipRangeSeries {
|
||||
range: DashboardWipRangeSeriesRange;
|
||||
bucket: DashboardWipRangeSeriesBucket;
|
||||
points: DashboardWipPoint[];
|
||||
range: DashboardWipRangeSeriesRange;
|
||||
}
|
||||
|
||||
@@ -7,6 +7,6 @@
|
||||
import type { DashboardWipRangeSeries } from "./dashboardWipRangeSeries";
|
||||
|
||||
export interface DashboardWipSeriesSet {
|
||||
primary: DashboardWipRangeSeries;
|
||||
comparison: DashboardWipRangeSeries;
|
||||
primary: DashboardWipRangeSeries;
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
*/
|
||||
|
||||
export interface GatewayCommandsResponse {
|
||||
protocol_version: number;
|
||||
methods: string[];
|
||||
events: string[];
|
||||
methods: string[];
|
||||
protocol_version: number;
|
||||
}
|
||||
|
||||
@@ -6,10 +6,10 @@
|
||||
*/
|
||||
|
||||
export interface GatewayCreate {
|
||||
name: string;
|
||||
url: string;
|
||||
main_session_key: string;
|
||||
workspace_root: string;
|
||||
name: string;
|
||||
skyll_enabled?: boolean;
|
||||
token?: string | null;
|
||||
url: string;
|
||||
workspace_root: string;
|
||||
}
|
||||
|
||||
@@ -6,13 +6,13 @@
|
||||
*/
|
||||
|
||||
export interface GatewayRead {
|
||||
name: string;
|
||||
url: string;
|
||||
main_session_key: string;
|
||||
workspace_root: string;
|
||||
skyll_enabled?: boolean;
|
||||
id: string;
|
||||
token?: string | null;
|
||||
created_at: string;
|
||||
id: string;
|
||||
main_session_key: string;
|
||||
name: string;
|
||||
skyll_enabled?: boolean;
|
||||
token?: string | null;
|
||||
updated_at: string;
|
||||
url: string;
|
||||
workspace_root: string;
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
*/
|
||||
|
||||
export interface GatewaySessionsResponse {
|
||||
sessions: unknown[];
|
||||
main_session_key?: string | null;
|
||||
main_session?: unknown | null;
|
||||
main_session_key?: string | null;
|
||||
sessions: unknown[];
|
||||
}
|
||||
|
||||
@@ -6,10 +6,10 @@
|
||||
*/
|
||||
|
||||
export interface GatewayUpdate {
|
||||
name?: string | null;
|
||||
url?: string | null;
|
||||
token?: string | null;
|
||||
main_session_key?: string | null;
|
||||
workspace_root?: string | null;
|
||||
name?: string | null;
|
||||
skyll_enabled?: boolean | null;
|
||||
token?: string | null;
|
||||
url?: string | null;
|
||||
workspace_root?: string | null;
|
||||
}
|
||||
|
||||
@@ -7,11 +7,11 @@
|
||||
|
||||
export interface GatewaysStatusResponse {
|
||||
connected: boolean;
|
||||
error?: string | null;
|
||||
gateway_url: string;
|
||||
sessions_count?: number | null;
|
||||
sessions?: unknown[] | null;
|
||||
main_session_key?: string | null;
|
||||
main_session?: unknown | null;
|
||||
main_session_error?: string | null;
|
||||
error?: string | null;
|
||||
main_session_key?: string | null;
|
||||
sessions?: unknown[] | null;
|
||||
sessions_count?: number | null;
|
||||
}
|
||||
|
||||
@@ -39,11 +39,14 @@ export * from "./boardOnboardingAgentQuestion";
|
||||
export * from "./boardOnboardingAnswer";
|
||||
export * from "./boardOnboardingConfirm";
|
||||
export * from "./boardOnboardingConfirmSuccessMetrics";
|
||||
export * from "./boardOnboardingLeadAgentDraft";
|
||||
export * from "./boardOnboardingLeadAgentDraftIdentityProfile";
|
||||
export * from "./boardOnboardingQuestionOption";
|
||||
export * from "./boardOnboardingRead";
|
||||
export * from "./boardOnboardingReadDraftGoal";
|
||||
export * from "./boardOnboardingReadMessages";
|
||||
export * from "./boardOnboardingStart";
|
||||
export * from "./boardOnboardingUserProfile";
|
||||
export * from "./boardRead";
|
||||
export * from "./boardReadSuccessMetrics";
|
||||
export * from "./boardSnapshot";
|
||||
|
||||
@@ -8,10 +8,10 @@ import type { ActivityEventRead } from "./activityEventRead";
|
||||
|
||||
export interface LimitOffsetPageTypeVarCustomizedActivityEventRead {
|
||||
items: ActivityEventRead[];
|
||||
/** @minimum 0 */
|
||||
total: number;
|
||||
/** @minimum 1 */
|
||||
limit: number;
|
||||
/** @minimum 0 */
|
||||
offset: number;
|
||||
/** @minimum 0 */
|
||||
total: number;
|
||||
}
|
||||
|
||||
@@ -8,10 +8,10 @@ import type { AgentRead } from "./agentRead";
|
||||
|
||||
export interface LimitOffsetPageTypeVarCustomizedAgentRead {
|
||||
items: AgentRead[];
|
||||
/** @minimum 0 */
|
||||
total: number;
|
||||
/** @minimum 1 */
|
||||
limit: number;
|
||||
/** @minimum 0 */
|
||||
offset: number;
|
||||
/** @minimum 0 */
|
||||
total: number;
|
||||
}
|
||||
|
||||
@@ -8,10 +8,10 @@ import type { ApprovalRead } from "./approvalRead";
|
||||
|
||||
export interface LimitOffsetPageTypeVarCustomizedApprovalRead {
|
||||
items: ApprovalRead[];
|
||||
/** @minimum 0 */
|
||||
total: number;
|
||||
/** @minimum 1 */
|
||||
limit: number;
|
||||
/** @minimum 0 */
|
||||
offset: number;
|
||||
/** @minimum 0 */
|
||||
total: number;
|
||||
}
|
||||
|
||||
@@ -8,10 +8,10 @@ import type { BoardMemoryRead } from "./boardMemoryRead";
|
||||
|
||||
export interface LimitOffsetPageTypeVarCustomizedBoardMemoryRead {
|
||||
items: BoardMemoryRead[];
|
||||
/** @minimum 0 */
|
||||
total: number;
|
||||
/** @minimum 1 */
|
||||
limit: number;
|
||||
/** @minimum 0 */
|
||||
offset: number;
|
||||
/** @minimum 0 */
|
||||
total: number;
|
||||
}
|
||||
|
||||
@@ -8,10 +8,10 @@ import type { BoardRead } from "./boardRead";
|
||||
|
||||
export interface LimitOffsetPageTypeVarCustomizedBoardRead {
|
||||
items: BoardRead[];
|
||||
/** @minimum 0 */
|
||||
total: number;
|
||||
/** @minimum 1 */
|
||||
limit: number;
|
||||
/** @minimum 0 */
|
||||
offset: number;
|
||||
/** @minimum 0 */
|
||||
total: number;
|
||||
}
|
||||
|
||||
@@ -8,10 +8,10 @@ import type { GatewayRead } from "./gatewayRead";
|
||||
|
||||
export interface LimitOffsetPageTypeVarCustomizedGatewayRead {
|
||||
items: GatewayRead[];
|
||||
/** @minimum 0 */
|
||||
total: number;
|
||||
/** @minimum 1 */
|
||||
limit: number;
|
||||
/** @minimum 0 */
|
||||
offset: number;
|
||||
/** @minimum 0 */
|
||||
total: number;
|
||||
}
|
||||
|
||||
@@ -8,10 +8,10 @@ import type { TaskCommentRead } from "./taskCommentRead";
|
||||
|
||||
export interface LimitOffsetPageTypeVarCustomizedTaskCommentRead {
|
||||
items: TaskCommentRead[];
|
||||
/** @minimum 0 */
|
||||
total: number;
|
||||
/** @minimum 1 */
|
||||
limit: number;
|
||||
/** @minimum 0 */
|
||||
offset: number;
|
||||
/** @minimum 0 */
|
||||
total: number;
|
||||
}
|
||||
|
||||
@@ -8,10 +8,10 @@ import type { TaskRead } from "./taskRead";
|
||||
|
||||
export interface LimitOffsetPageTypeVarCustomizedTaskRead {
|
||||
items: TaskRead[];
|
||||
/** @minimum 0 */
|
||||
total: number;
|
||||
/** @minimum 1 */
|
||||
limit: number;
|
||||
/** @minimum 0 */
|
||||
offset: number;
|
||||
/** @minimum 0 */
|
||||
total: number;
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
*/
|
||||
|
||||
export type ListBoardMemoryApiV1AgentBoardsBoardIdMemoryGetParams = {
|
||||
is_chat?: boolean | null;
|
||||
/**
|
||||
* @minimum 1
|
||||
* @maximum 200
|
||||
|
||||
@@ -7,19 +7,19 @@
|
||||
import type { TaskCardReadStatus } from "./taskCardReadStatus";
|
||||
|
||||
export interface TaskCardRead {
|
||||
title: string;
|
||||
description?: string | null;
|
||||
status?: TaskCardReadStatus;
|
||||
priority?: string;
|
||||
due_at?: string | null;
|
||||
assigned_agent_id?: string | null;
|
||||
id: string;
|
||||
board_id: string | null;
|
||||
created_by_user_id: string | null;
|
||||
in_progress_at: string | null;
|
||||
created_at: string;
|
||||
updated_at: string;
|
||||
assignee?: string | null;
|
||||
approvals_count?: number;
|
||||
approvals_pending_count?: number;
|
||||
assigned_agent_id?: string | null;
|
||||
assignee?: string | null;
|
||||
board_id: string | null;
|
||||
created_at: string;
|
||||
created_by_user_id: string | null;
|
||||
description?: string | null;
|
||||
due_at?: string | null;
|
||||
id: string;
|
||||
in_progress_at: string | null;
|
||||
priority?: string;
|
||||
status?: TaskCardReadStatus;
|
||||
title: string;
|
||||
updated_at: string;
|
||||
}
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
*/
|
||||
|
||||
export interface TaskCommentRead {
|
||||
agent_id: string | null;
|
||||
created_at: string;
|
||||
id: string;
|
||||
message: string | null;
|
||||
agent_id: string | null;
|
||||
task_id: string | null;
|
||||
created_at: string;
|
||||
}
|
||||
|
||||
@@ -7,11 +7,11 @@
|
||||
import type { TaskCreateStatus } from "./taskCreateStatus";
|
||||
|
||||
export interface TaskCreate {
|
||||
title: string;
|
||||
description?: string | null;
|
||||
status?: TaskCreateStatus;
|
||||
priority?: string;
|
||||
due_at?: string | null;
|
||||
assigned_agent_id?: string | null;
|
||||
created_by_user_id?: string | null;
|
||||
description?: string | null;
|
||||
due_at?: string | null;
|
||||
priority?: string;
|
||||
status?: TaskCreateStatus;
|
||||
title: string;
|
||||
}
|
||||
|
||||
@@ -7,16 +7,16 @@
|
||||
import type { TaskReadStatus } from "./taskReadStatus";
|
||||
|
||||
export interface TaskRead {
|
||||
title: string;
|
||||
description?: string | null;
|
||||
status?: TaskReadStatus;
|
||||
priority?: string;
|
||||
due_at?: string | null;
|
||||
assigned_agent_id?: string | null;
|
||||
id: string;
|
||||
board_id: string | null;
|
||||
created_by_user_id: string | null;
|
||||
in_progress_at: string | null;
|
||||
created_at: string;
|
||||
created_by_user_id: string | null;
|
||||
description?: string | null;
|
||||
due_at?: string | null;
|
||||
id: string;
|
||||
in_progress_at: string | null;
|
||||
priority?: string;
|
||||
status?: TaskReadStatus;
|
||||
title: string;
|
||||
updated_at: string;
|
||||
}
|
||||
|
||||
@@ -6,11 +6,11 @@
|
||||
*/
|
||||
|
||||
export interface TaskUpdate {
|
||||
title?: string | null;
|
||||
description?: string | null;
|
||||
status?: "inbox" | "in_progress" | "review" | "done" | null;
|
||||
priority?: string | null;
|
||||
due_at?: string | null;
|
||||
assigned_agent_id?: string | null;
|
||||
comment?: string | null;
|
||||
description?: string | null;
|
||||
due_at?: string | null;
|
||||
priority?: string | null;
|
||||
status?: "inbox" | "in_progress" | "review" | "done" | null;
|
||||
title?: string | null;
|
||||
}
|
||||
|
||||
@@ -7,13 +7,13 @@
|
||||
|
||||
export interface UserRead {
|
||||
clerk_user_id: string;
|
||||
context?: string | null;
|
||||
email?: string | null;
|
||||
id: string;
|
||||
is_super_admin: boolean;
|
||||
name?: string | null;
|
||||
notes?: string | null;
|
||||
preferred_name?: string | null;
|
||||
pronouns?: string | null;
|
||||
timezone?: string | null;
|
||||
notes?: string | null;
|
||||
context?: string | null;
|
||||
id: string;
|
||||
is_super_admin: boolean;
|
||||
}
|
||||
|
||||
@@ -6,10 +6,10 @@
|
||||
*/
|
||||
|
||||
export interface UserUpdate {
|
||||
context?: string | null;
|
||||
name?: string | null;
|
||||
notes?: string | null;
|
||||
preferred_name?: string | null;
|
||||
pronouns?: string | null;
|
||||
timezone?: string | null;
|
||||
notes?: string | null;
|
||||
context?: string | null;
|
||||
}
|
||||
|
||||
@@ -39,258 +39,6 @@ import { customFetch } from "../../mutator";
|
||||
|
||||
type SecondParameter<T extends (...args: never) => unknown> = Parameters<T>[1];
|
||||
|
||||
/**
|
||||
* @summary Stream Tasks
|
||||
*/
|
||||
export type streamTasksApiV1BoardsBoardIdTasksStreamGetResponse200 = {
|
||||
data: unknown;
|
||||
status: 200;
|
||||
};
|
||||
|
||||
export type streamTasksApiV1BoardsBoardIdTasksStreamGetResponse422 = {
|
||||
data: HTTPValidationError;
|
||||
status: 422;
|
||||
};
|
||||
|
||||
export type streamTasksApiV1BoardsBoardIdTasksStreamGetResponseSuccess =
|
||||
streamTasksApiV1BoardsBoardIdTasksStreamGetResponse200 & {
|
||||
headers: Headers;
|
||||
};
|
||||
export type streamTasksApiV1BoardsBoardIdTasksStreamGetResponseError =
|
||||
streamTasksApiV1BoardsBoardIdTasksStreamGetResponse422 & {
|
||||
headers: Headers;
|
||||
};
|
||||
|
||||
export type streamTasksApiV1BoardsBoardIdTasksStreamGetResponse =
|
||||
| streamTasksApiV1BoardsBoardIdTasksStreamGetResponseSuccess
|
||||
| streamTasksApiV1BoardsBoardIdTasksStreamGetResponseError;
|
||||
|
||||
export const getStreamTasksApiV1BoardsBoardIdTasksStreamGetUrl = (
|
||||
boardId: string,
|
||||
params?: StreamTasksApiV1BoardsBoardIdTasksStreamGetParams,
|
||||
) => {
|
||||
const normalizedParams = new URLSearchParams();
|
||||
|
||||
Object.entries(params || {}).forEach(([key, value]) => {
|
||||
if (value !== undefined) {
|
||||
normalizedParams.append(key, value === null ? "null" : value.toString());
|
||||
}
|
||||
});
|
||||
|
||||
const stringifiedParams = normalizedParams.toString();
|
||||
|
||||
return stringifiedParams.length > 0
|
||||
? `/api/v1/boards/${boardId}/tasks/stream?${stringifiedParams}`
|
||||
: `/api/v1/boards/${boardId}/tasks/stream`;
|
||||
};
|
||||
|
||||
export const streamTasksApiV1BoardsBoardIdTasksStreamGet = async (
|
||||
boardId: string,
|
||||
params?: StreamTasksApiV1BoardsBoardIdTasksStreamGetParams,
|
||||
options?: RequestInit,
|
||||
): Promise<streamTasksApiV1BoardsBoardIdTasksStreamGetResponse> => {
|
||||
return customFetch<streamTasksApiV1BoardsBoardIdTasksStreamGetResponse>(
|
||||
getStreamTasksApiV1BoardsBoardIdTasksStreamGetUrl(boardId, params),
|
||||
{
|
||||
...options,
|
||||
method: "GET",
|
||||
},
|
||||
);
|
||||
};
|
||||
|
||||
export const getStreamTasksApiV1BoardsBoardIdTasksStreamGetQueryKey = (
|
||||
boardId: string,
|
||||
params?: StreamTasksApiV1BoardsBoardIdTasksStreamGetParams,
|
||||
) => {
|
||||
return [
|
||||
`/api/v1/boards/${boardId}/tasks/stream`,
|
||||
...(params ? [params] : []),
|
||||
] as const;
|
||||
};
|
||||
|
||||
export const getStreamTasksApiV1BoardsBoardIdTasksStreamGetQueryOptions = <
|
||||
TData = Awaited<
|
||||
ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>
|
||||
>,
|
||||
TError = HTTPValidationError,
|
||||
>(
|
||||
boardId: string,
|
||||
params?: StreamTasksApiV1BoardsBoardIdTasksStreamGetParams,
|
||||
options?: {
|
||||
query?: Partial<
|
||||
UseQueryOptions<
|
||||
Awaited<ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>>,
|
||||
TError,
|
||||
TData
|
||||
>
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
},
|
||||
) => {
|
||||
const { query: queryOptions, request: requestOptions } = options ?? {};
|
||||
|
||||
const queryKey =
|
||||
queryOptions?.queryKey ??
|
||||
getStreamTasksApiV1BoardsBoardIdTasksStreamGetQueryKey(boardId, params);
|
||||
|
||||
const queryFn: QueryFunction<
|
||||
Awaited<ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>>
|
||||
> = ({ signal }) =>
|
||||
streamTasksApiV1BoardsBoardIdTasksStreamGet(boardId, params, {
|
||||
signal,
|
||||
...requestOptions,
|
||||
});
|
||||
|
||||
return {
|
||||
queryKey,
|
||||
queryFn,
|
||||
enabled: !!boardId,
|
||||
...queryOptions,
|
||||
} as UseQueryOptions<
|
||||
Awaited<ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>>,
|
||||
TError,
|
||||
TData
|
||||
> & { queryKey: DataTag<QueryKey, TData, TError> };
|
||||
};
|
||||
|
||||
export type StreamTasksApiV1BoardsBoardIdTasksStreamGetQueryResult =
|
||||
NonNullable<
|
||||
Awaited<ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>>
|
||||
>;
|
||||
export type StreamTasksApiV1BoardsBoardIdTasksStreamGetQueryError =
|
||||
HTTPValidationError;
|
||||
|
||||
export function useStreamTasksApiV1BoardsBoardIdTasksStreamGet<
|
||||
TData = Awaited<
|
||||
ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>
|
||||
>,
|
||||
TError = HTTPValidationError,
|
||||
>(
|
||||
boardId: string,
|
||||
params: undefined | StreamTasksApiV1BoardsBoardIdTasksStreamGetParams,
|
||||
options: {
|
||||
query: Partial<
|
||||
UseQueryOptions<
|
||||
Awaited<ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>>,
|
||||
TError,
|
||||
TData
|
||||
>
|
||||
> &
|
||||
Pick<
|
||||
DefinedInitialDataOptions<
|
||||
Awaited<
|
||||
ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>
|
||||
>,
|
||||
TError,
|
||||
Awaited<
|
||||
ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>
|
||||
>
|
||||
>,
|
||||
"initialData"
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
},
|
||||
queryClient?: QueryClient,
|
||||
): DefinedUseQueryResult<TData, TError> & {
|
||||
queryKey: DataTag<QueryKey, TData, TError>;
|
||||
};
|
||||
export function useStreamTasksApiV1BoardsBoardIdTasksStreamGet<
|
||||
TData = Awaited<
|
||||
ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>
|
||||
>,
|
||||
TError = HTTPValidationError,
|
||||
>(
|
||||
boardId: string,
|
||||
params?: StreamTasksApiV1BoardsBoardIdTasksStreamGetParams,
|
||||
options?: {
|
||||
query?: Partial<
|
||||
UseQueryOptions<
|
||||
Awaited<ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>>,
|
||||
TError,
|
||||
TData
|
||||
>
|
||||
> &
|
||||
Pick<
|
||||
UndefinedInitialDataOptions<
|
||||
Awaited<
|
||||
ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>
|
||||
>,
|
||||
TError,
|
||||
Awaited<
|
||||
ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>
|
||||
>
|
||||
>,
|
||||
"initialData"
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
},
|
||||
queryClient?: QueryClient,
|
||||
): UseQueryResult<TData, TError> & {
|
||||
queryKey: DataTag<QueryKey, TData, TError>;
|
||||
};
|
||||
export function useStreamTasksApiV1BoardsBoardIdTasksStreamGet<
|
||||
TData = Awaited<
|
||||
ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>
|
||||
>,
|
||||
TError = HTTPValidationError,
|
||||
>(
|
||||
boardId: string,
|
||||
params?: StreamTasksApiV1BoardsBoardIdTasksStreamGetParams,
|
||||
options?: {
|
||||
query?: Partial<
|
||||
UseQueryOptions<
|
||||
Awaited<ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>>,
|
||||
TError,
|
||||
TData
|
||||
>
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
},
|
||||
queryClient?: QueryClient,
|
||||
): UseQueryResult<TData, TError> & {
|
||||
queryKey: DataTag<QueryKey, TData, TError>;
|
||||
};
|
||||
/**
|
||||
* @summary Stream Tasks
|
||||
*/
|
||||
|
||||
export function useStreamTasksApiV1BoardsBoardIdTasksStreamGet<
|
||||
TData = Awaited<
|
||||
ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>
|
||||
>,
|
||||
TError = HTTPValidationError,
|
||||
>(
|
||||
boardId: string,
|
||||
params?: StreamTasksApiV1BoardsBoardIdTasksStreamGetParams,
|
||||
options?: {
|
||||
query?: Partial<
|
||||
UseQueryOptions<
|
||||
Awaited<ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>>,
|
||||
TError,
|
||||
TData
|
||||
>
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
},
|
||||
queryClient?: QueryClient,
|
||||
): UseQueryResult<TData, TError> & {
|
||||
queryKey: DataTag<QueryKey, TData, TError>;
|
||||
} {
|
||||
const queryOptions =
|
||||
getStreamTasksApiV1BoardsBoardIdTasksStreamGetQueryOptions(
|
||||
boardId,
|
||||
params,
|
||||
options,
|
||||
);
|
||||
|
||||
const query = useQuery(queryOptions, queryClient) as UseQueryResult<
|
||||
TData,
|
||||
TError
|
||||
> & { queryKey: DataTag<QueryKey, TData, TError> };
|
||||
|
||||
return { ...query, queryKey: queryOptions.queryKey };
|
||||
}
|
||||
|
||||
/**
|
||||
* @summary List Tasks
|
||||
*/
|
||||
@@ -643,6 +391,383 @@ export const useCreateTaskApiV1BoardsBoardIdTasksPost = <
|
||||
queryClient,
|
||||
);
|
||||
};
|
||||
/**
|
||||
* @summary Stream Tasks
|
||||
*/
|
||||
export type streamTasksApiV1BoardsBoardIdTasksStreamGetResponse200 = {
|
||||
data: unknown;
|
||||
status: 200;
|
||||
};
|
||||
|
||||
export type streamTasksApiV1BoardsBoardIdTasksStreamGetResponse422 = {
|
||||
data: HTTPValidationError;
|
||||
status: 422;
|
||||
};
|
||||
|
||||
export type streamTasksApiV1BoardsBoardIdTasksStreamGetResponseSuccess =
|
||||
streamTasksApiV1BoardsBoardIdTasksStreamGetResponse200 & {
|
||||
headers: Headers;
|
||||
};
|
||||
export type streamTasksApiV1BoardsBoardIdTasksStreamGetResponseError =
|
||||
streamTasksApiV1BoardsBoardIdTasksStreamGetResponse422 & {
|
||||
headers: Headers;
|
||||
};
|
||||
|
||||
export type streamTasksApiV1BoardsBoardIdTasksStreamGetResponse =
|
||||
| streamTasksApiV1BoardsBoardIdTasksStreamGetResponseSuccess
|
||||
| streamTasksApiV1BoardsBoardIdTasksStreamGetResponseError;
|
||||
|
||||
export const getStreamTasksApiV1BoardsBoardIdTasksStreamGetUrl = (
|
||||
boardId: string,
|
||||
params?: StreamTasksApiV1BoardsBoardIdTasksStreamGetParams,
|
||||
) => {
|
||||
const normalizedParams = new URLSearchParams();
|
||||
|
||||
Object.entries(params || {}).forEach(([key, value]) => {
|
||||
if (value !== undefined) {
|
||||
normalizedParams.append(key, value === null ? "null" : value.toString());
|
||||
}
|
||||
});
|
||||
|
||||
const stringifiedParams = normalizedParams.toString();
|
||||
|
||||
return stringifiedParams.length > 0
|
||||
? `/api/v1/boards/${boardId}/tasks/stream?${stringifiedParams}`
|
||||
: `/api/v1/boards/${boardId}/tasks/stream`;
|
||||
};
|
||||
|
||||
export const streamTasksApiV1BoardsBoardIdTasksStreamGet = async (
|
||||
boardId: string,
|
||||
params?: StreamTasksApiV1BoardsBoardIdTasksStreamGetParams,
|
||||
options?: RequestInit,
|
||||
): Promise<streamTasksApiV1BoardsBoardIdTasksStreamGetResponse> => {
|
||||
return customFetch<streamTasksApiV1BoardsBoardIdTasksStreamGetResponse>(
|
||||
getStreamTasksApiV1BoardsBoardIdTasksStreamGetUrl(boardId, params),
|
||||
{
|
||||
...options,
|
||||
method: "GET",
|
||||
},
|
||||
);
|
||||
};
|
||||
|
||||
export const getStreamTasksApiV1BoardsBoardIdTasksStreamGetQueryKey = (
|
||||
boardId: string,
|
||||
params?: StreamTasksApiV1BoardsBoardIdTasksStreamGetParams,
|
||||
) => {
|
||||
return [
|
||||
`/api/v1/boards/${boardId}/tasks/stream`,
|
||||
...(params ? [params] : []),
|
||||
] as const;
|
||||
};
|
||||
|
||||
export const getStreamTasksApiV1BoardsBoardIdTasksStreamGetQueryOptions = <
|
||||
TData = Awaited<
|
||||
ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>
|
||||
>,
|
||||
TError = HTTPValidationError,
|
||||
>(
|
||||
boardId: string,
|
||||
params?: StreamTasksApiV1BoardsBoardIdTasksStreamGetParams,
|
||||
options?: {
|
||||
query?: Partial<
|
||||
UseQueryOptions<
|
||||
Awaited<ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>>,
|
||||
TError,
|
||||
TData
|
||||
>
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
},
|
||||
) => {
|
||||
const { query: queryOptions, request: requestOptions } = options ?? {};
|
||||
|
||||
const queryKey =
|
||||
queryOptions?.queryKey ??
|
||||
getStreamTasksApiV1BoardsBoardIdTasksStreamGetQueryKey(boardId, params);
|
||||
|
||||
const queryFn: QueryFunction<
|
||||
Awaited<ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>>
|
||||
> = ({ signal }) =>
|
||||
streamTasksApiV1BoardsBoardIdTasksStreamGet(boardId, params, {
|
||||
signal,
|
||||
...requestOptions,
|
||||
});
|
||||
|
||||
return {
|
||||
queryKey,
|
||||
queryFn,
|
||||
enabled: !!boardId,
|
||||
...queryOptions,
|
||||
} as UseQueryOptions<
|
||||
Awaited<ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>>,
|
||||
TError,
|
||||
TData
|
||||
> & { queryKey: DataTag<QueryKey, TData, TError> };
|
||||
};
|
||||
|
||||
export type StreamTasksApiV1BoardsBoardIdTasksStreamGetQueryResult =
|
||||
NonNullable<
|
||||
Awaited<ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>>
|
||||
>;
|
||||
export type StreamTasksApiV1BoardsBoardIdTasksStreamGetQueryError =
|
||||
HTTPValidationError;
|
||||
|
||||
export function useStreamTasksApiV1BoardsBoardIdTasksStreamGet<
|
||||
TData = Awaited<
|
||||
ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>
|
||||
>,
|
||||
TError = HTTPValidationError,
|
||||
>(
|
||||
boardId: string,
|
||||
params: undefined | StreamTasksApiV1BoardsBoardIdTasksStreamGetParams,
|
||||
options: {
|
||||
query: Partial<
|
||||
UseQueryOptions<
|
||||
Awaited<ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>>,
|
||||
TError,
|
||||
TData
|
||||
>
|
||||
> &
|
||||
Pick<
|
||||
DefinedInitialDataOptions<
|
||||
Awaited<
|
||||
ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>
|
||||
>,
|
||||
TError,
|
||||
Awaited<
|
||||
ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>
|
||||
>
|
||||
>,
|
||||
"initialData"
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
},
|
||||
queryClient?: QueryClient,
|
||||
): DefinedUseQueryResult<TData, TError> & {
|
||||
queryKey: DataTag<QueryKey, TData, TError>;
|
||||
};
|
||||
export function useStreamTasksApiV1BoardsBoardIdTasksStreamGet<
|
||||
TData = Awaited<
|
||||
ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>
|
||||
>,
|
||||
TError = HTTPValidationError,
|
||||
>(
|
||||
boardId: string,
|
||||
params?: StreamTasksApiV1BoardsBoardIdTasksStreamGetParams,
|
||||
options?: {
|
||||
query?: Partial<
|
||||
UseQueryOptions<
|
||||
Awaited<ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>>,
|
||||
TError,
|
||||
TData
|
||||
>
|
||||
> &
|
||||
Pick<
|
||||
UndefinedInitialDataOptions<
|
||||
Awaited<
|
||||
ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>
|
||||
>,
|
||||
TError,
|
||||
Awaited<
|
||||
ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>
|
||||
>
|
||||
>,
|
||||
"initialData"
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
},
|
||||
queryClient?: QueryClient,
|
||||
): UseQueryResult<TData, TError> & {
|
||||
queryKey: DataTag<QueryKey, TData, TError>;
|
||||
};
|
||||
export function useStreamTasksApiV1BoardsBoardIdTasksStreamGet<
|
||||
TData = Awaited<
|
||||
ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>
|
||||
>,
|
||||
TError = HTTPValidationError,
|
||||
>(
|
||||
boardId: string,
|
||||
params?: StreamTasksApiV1BoardsBoardIdTasksStreamGetParams,
|
||||
options?: {
|
||||
query?: Partial<
|
||||
UseQueryOptions<
|
||||
Awaited<ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>>,
|
||||
TError,
|
||||
TData
|
||||
>
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
},
|
||||
queryClient?: QueryClient,
|
||||
): UseQueryResult<TData, TError> & {
|
||||
queryKey: DataTag<QueryKey, TData, TError>;
|
||||
};
|
||||
/**
|
||||
* @summary Stream Tasks
|
||||
*/
|
||||
|
||||
export function useStreamTasksApiV1BoardsBoardIdTasksStreamGet<
|
||||
TData = Awaited<
|
||||
ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>
|
||||
>,
|
||||
TError = HTTPValidationError,
|
||||
>(
|
||||
boardId: string,
|
||||
params?: StreamTasksApiV1BoardsBoardIdTasksStreamGetParams,
|
||||
options?: {
|
||||
query?: Partial<
|
||||
UseQueryOptions<
|
||||
Awaited<ReturnType<typeof streamTasksApiV1BoardsBoardIdTasksStreamGet>>,
|
||||
TError,
|
||||
TData
|
||||
>
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
},
|
||||
queryClient?: QueryClient,
|
||||
): UseQueryResult<TData, TError> & {
|
||||
queryKey: DataTag<QueryKey, TData, TError>;
|
||||
} {
|
||||
const queryOptions =
|
||||
getStreamTasksApiV1BoardsBoardIdTasksStreamGetQueryOptions(
|
||||
boardId,
|
||||
params,
|
||||
options,
|
||||
);
|
||||
|
||||
const query = useQuery(queryOptions, queryClient) as UseQueryResult<
|
||||
TData,
|
||||
TError
|
||||
> & { queryKey: DataTag<QueryKey, TData, TError> };
|
||||
|
||||
return { ...query, queryKey: queryOptions.queryKey };
|
||||
}
|
||||
|
||||
/**
|
||||
* @summary Delete Task
|
||||
*/
|
||||
export type deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponse200 = {
|
||||
data: OkResponse;
|
||||
status: 200;
|
||||
};
|
||||
|
||||
export type deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponse422 = {
|
||||
data: HTTPValidationError;
|
||||
status: 422;
|
||||
};
|
||||
|
||||
export type deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponseSuccess =
|
||||
deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponse200 & {
|
||||
headers: Headers;
|
||||
};
|
||||
export type deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponseError =
|
||||
deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponse422 & {
|
||||
headers: Headers;
|
||||
};
|
||||
|
||||
export type deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponse =
|
||||
| deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponseSuccess
|
||||
| deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponseError;
|
||||
|
||||
export const getDeleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteUrl = (
|
||||
boardId: string,
|
||||
taskId: string,
|
||||
) => {
|
||||
return `/api/v1/boards/${boardId}/tasks/${taskId}`;
|
||||
};
|
||||
|
||||
export const deleteTaskApiV1BoardsBoardIdTasksTaskIdDelete = async (
|
||||
boardId: string,
|
||||
taskId: string,
|
||||
options?: RequestInit,
|
||||
): Promise<deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponse> => {
|
||||
return customFetch<deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponse>(
|
||||
getDeleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteUrl(boardId, taskId),
|
||||
{
|
||||
...options,
|
||||
method: "DELETE",
|
||||
},
|
||||
);
|
||||
};
|
||||
|
||||
export const getDeleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteMutationOptions = <
|
||||
TError = HTTPValidationError,
|
||||
TContext = unknown,
|
||||
>(options?: {
|
||||
mutation?: UseMutationOptions<
|
||||
Awaited<ReturnType<typeof deleteTaskApiV1BoardsBoardIdTasksTaskIdDelete>>,
|
||||
TError,
|
||||
{ boardId: string; taskId: string },
|
||||
TContext
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
}): UseMutationOptions<
|
||||
Awaited<ReturnType<typeof deleteTaskApiV1BoardsBoardIdTasksTaskIdDelete>>,
|
||||
TError,
|
||||
{ boardId: string; taskId: string },
|
||||
TContext
|
||||
> => {
|
||||
const mutationKey = ["deleteTaskApiV1BoardsBoardIdTasksTaskIdDelete"];
|
||||
const { mutation: mutationOptions, request: requestOptions } = options
|
||||
? options.mutation &&
|
||||
"mutationKey" in options.mutation &&
|
||||
options.mutation.mutationKey
|
||||
? options
|
||||
: { ...options, mutation: { ...options.mutation, mutationKey } }
|
||||
: { mutation: { mutationKey }, request: undefined };
|
||||
|
||||
const mutationFn: MutationFunction<
|
||||
Awaited<ReturnType<typeof deleteTaskApiV1BoardsBoardIdTasksTaskIdDelete>>,
|
||||
{ boardId: string; taskId: string }
|
||||
> = (props) => {
|
||||
const { boardId, taskId } = props ?? {};
|
||||
|
||||
return deleteTaskApiV1BoardsBoardIdTasksTaskIdDelete(
|
||||
boardId,
|
||||
taskId,
|
||||
requestOptions,
|
||||
);
|
||||
};
|
||||
|
||||
return { mutationFn, ...mutationOptions };
|
||||
};
|
||||
|
||||
export type DeleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteMutationResult =
|
||||
NonNullable<
|
||||
Awaited<ReturnType<typeof deleteTaskApiV1BoardsBoardIdTasksTaskIdDelete>>
|
||||
>;
|
||||
|
||||
export type DeleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteMutationError =
|
||||
HTTPValidationError;
|
||||
|
||||
/**
|
||||
* @summary Delete Task
|
||||
*/
|
||||
export const useDeleteTaskApiV1BoardsBoardIdTasksTaskIdDelete = <
|
||||
TError = HTTPValidationError,
|
||||
TContext = unknown,
|
||||
>(
|
||||
options?: {
|
||||
mutation?: UseMutationOptions<
|
||||
Awaited<ReturnType<typeof deleteTaskApiV1BoardsBoardIdTasksTaskIdDelete>>,
|
||||
TError,
|
||||
{ boardId: string; taskId: string },
|
||||
TContext
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
},
|
||||
queryClient?: QueryClient,
|
||||
): UseMutationResult<
|
||||
Awaited<ReturnType<typeof deleteTaskApiV1BoardsBoardIdTasksTaskIdDelete>>,
|
||||
TError,
|
||||
{ boardId: string; taskId: string },
|
||||
TContext
|
||||
> => {
|
||||
return useMutation(
|
||||
getDeleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteMutationOptions(options),
|
||||
queryClient,
|
||||
);
|
||||
};
|
||||
/**
|
||||
* @summary Update Task
|
||||
*/
|
||||
@@ -773,131 +898,6 @@ export const useUpdateTaskApiV1BoardsBoardIdTasksTaskIdPatch = <
|
||||
queryClient,
|
||||
);
|
||||
};
|
||||
/**
|
||||
* @summary Delete Task
|
||||
*/
|
||||
export type deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponse200 = {
|
||||
data: OkResponse;
|
||||
status: 200;
|
||||
};
|
||||
|
||||
export type deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponse422 = {
|
||||
data: HTTPValidationError;
|
||||
status: 422;
|
||||
};
|
||||
|
||||
export type deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponseSuccess =
|
||||
deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponse200 & {
|
||||
headers: Headers;
|
||||
};
|
||||
export type deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponseError =
|
||||
deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponse422 & {
|
||||
headers: Headers;
|
||||
};
|
||||
|
||||
export type deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponse =
|
||||
| deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponseSuccess
|
||||
| deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponseError;
|
||||
|
||||
export const getDeleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteUrl = (
|
||||
boardId: string,
|
||||
taskId: string,
|
||||
) => {
|
||||
return `/api/v1/boards/${boardId}/tasks/${taskId}`;
|
||||
};
|
||||
|
||||
export const deleteTaskApiV1BoardsBoardIdTasksTaskIdDelete = async (
|
||||
boardId: string,
|
||||
taskId: string,
|
||||
options?: RequestInit,
|
||||
): Promise<deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponse> => {
|
||||
return customFetch<deleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteResponse>(
|
||||
getDeleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteUrl(boardId, taskId),
|
||||
{
|
||||
...options,
|
||||
method: "DELETE",
|
||||
},
|
||||
);
|
||||
};
|
||||
|
||||
export const getDeleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteMutationOptions = <
|
||||
TError = HTTPValidationError,
|
||||
TContext = unknown,
|
||||
>(options?: {
|
||||
mutation?: UseMutationOptions<
|
||||
Awaited<ReturnType<typeof deleteTaskApiV1BoardsBoardIdTasksTaskIdDelete>>,
|
||||
TError,
|
||||
{ boardId: string; taskId: string },
|
||||
TContext
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
}): UseMutationOptions<
|
||||
Awaited<ReturnType<typeof deleteTaskApiV1BoardsBoardIdTasksTaskIdDelete>>,
|
||||
TError,
|
||||
{ boardId: string; taskId: string },
|
||||
TContext
|
||||
> => {
|
||||
const mutationKey = ["deleteTaskApiV1BoardsBoardIdTasksTaskIdDelete"];
|
||||
const { mutation: mutationOptions, request: requestOptions } = options
|
||||
? options.mutation &&
|
||||
"mutationKey" in options.mutation &&
|
||||
options.mutation.mutationKey
|
||||
? options
|
||||
: { ...options, mutation: { ...options.mutation, mutationKey } }
|
||||
: { mutation: { mutationKey }, request: undefined };
|
||||
|
||||
const mutationFn: MutationFunction<
|
||||
Awaited<ReturnType<typeof deleteTaskApiV1BoardsBoardIdTasksTaskIdDelete>>,
|
||||
{ boardId: string; taskId: string }
|
||||
> = (props) => {
|
||||
const { boardId, taskId } = props ?? {};
|
||||
|
||||
return deleteTaskApiV1BoardsBoardIdTasksTaskIdDelete(
|
||||
boardId,
|
||||
taskId,
|
||||
requestOptions,
|
||||
);
|
||||
};
|
||||
|
||||
return { mutationFn, ...mutationOptions };
|
||||
};
|
||||
|
||||
export type DeleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteMutationResult =
|
||||
NonNullable<
|
||||
Awaited<ReturnType<typeof deleteTaskApiV1BoardsBoardIdTasksTaskIdDelete>>
|
||||
>;
|
||||
|
||||
export type DeleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteMutationError =
|
||||
HTTPValidationError;
|
||||
|
||||
/**
|
||||
* @summary Delete Task
|
||||
*/
|
||||
export const useDeleteTaskApiV1BoardsBoardIdTasksTaskIdDelete = <
|
||||
TError = HTTPValidationError,
|
||||
TContext = unknown,
|
||||
>(
|
||||
options?: {
|
||||
mutation?: UseMutationOptions<
|
||||
Awaited<ReturnType<typeof deleteTaskApiV1BoardsBoardIdTasksTaskIdDelete>>,
|
||||
TError,
|
||||
{ boardId: string; taskId: string },
|
||||
TContext
|
||||
>;
|
||||
request?: SecondParameter<typeof customFetch>;
|
||||
},
|
||||
queryClient?: QueryClient,
|
||||
): UseMutationResult<
|
||||
Awaited<ReturnType<typeof deleteTaskApiV1BoardsBoardIdTasksTaskIdDelete>>,
|
||||
TError,
|
||||
{ boardId: string; taskId: string },
|
||||
TContext
|
||||
> => {
|
||||
return useMutation(
|
||||
getDeleteTaskApiV1BoardsBoardIdTasksTaskIdDeleteMutationOptions(options),
|
||||
queryClient,
|
||||
);
|
||||
};
|
||||
/**
|
||||
* @summary List Task Comments
|
||||
*/
|
||||
|
||||
@@ -4,6 +4,7 @@ import { useEffect, useMemo, useState } from "react";
|
||||
import { useParams, useRouter, useSearchParams } from "next/navigation";
|
||||
|
||||
import { SignInButton, SignedIn, SignedOut, useAuth } from "@clerk/nextjs";
|
||||
import { X } from "lucide-react";
|
||||
|
||||
import { ApiError } from "@/api/mutator";
|
||||
import {
|
||||
@@ -20,7 +21,7 @@ import { BoardOnboardingChat } from "@/components/BoardOnboardingChat";
|
||||
import { DashboardSidebar } from "@/components/organisms/DashboardSidebar";
|
||||
import { DashboardShell } from "@/components/templates/DashboardShell";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { Dialog, DialogContent } from "@/components/ui/dialog";
|
||||
import { Dialog, DialogClose, DialogContent } from "@/components/ui/dialog";
|
||||
import { Input } from "@/components/ui/input";
|
||||
import {
|
||||
Select,
|
||||
@@ -395,7 +396,21 @@ export default function EditBoardPage() {
|
||||
</SignedIn>
|
||||
</DashboardShell>
|
||||
<Dialog open={isOnboardingOpen} onOpenChange={setIsOnboardingOpen}>
|
||||
<DialogContent aria-label="Board onboarding">
|
||||
<DialogContent
|
||||
aria-label="Board onboarding"
|
||||
className="relative"
|
||||
onPointerDownOutside={(event) => event.preventDefault()}
|
||||
onInteractOutside={(event) => event.preventDefault()}
|
||||
>
|
||||
<DialogClose asChild>
|
||||
<button
|
||||
type="button"
|
||||
className="absolute right-4 top-4 rounded-lg border border-slate-200 p-2 text-slate-500 transition hover:bg-slate-50"
|
||||
aria-label="Close onboarding"
|
||||
>
|
||||
<X className="h-4 w-4" />
|
||||
</button>
|
||||
</DialogClose>
|
||||
{boardId ? (
|
||||
<BoardOnboardingChat
|
||||
boardId={boardId}
|
||||
|
||||
@@ -1751,12 +1751,12 @@ export default function BoardDetailPage() {
|
||||
}}
|
||||
/>
|
||||
) : null}
|
||||
<aside
|
||||
className={cn(
|
||||
"fixed right-0 top-0 z-50 h-full w-[max(760px,45vw)] max-w-[99vw] transform bg-white shadow-2xl transition-transform",
|
||||
isDetailOpen ? "translate-x-0" : "translate-x-full",
|
||||
)}
|
||||
>
|
||||
<aside
|
||||
className={cn(
|
||||
"fixed right-0 top-0 z-50 h-full w-[max(760px,45vw)] max-w-[99vw] transform bg-white shadow-2xl transition-transform",
|
||||
isDetailOpen ? "transform-none" : "translate-x-full",
|
||||
)}
|
||||
>
|
||||
<div className="flex h-full flex-col">
|
||||
<div className="flex items-center justify-between border-b border-slate-200 px-6 py-4">
|
||||
<div>
|
||||
@@ -1963,26 +1963,26 @@ export default function BoardDetailPage() {
|
||||
<p className="text-sm text-slate-500">No comments yet.</p>
|
||||
) : (
|
||||
<div className="space-y-3">
|
||||
{orderedComments.map((comment) => (
|
||||
<div
|
||||
key={comment.id}
|
||||
className="rounded-xl border border-slate-200 bg-white p-3"
|
||||
>
|
||||
<>
|
||||
<div className="flex items-center justify-between text-xs text-slate-500">
|
||||
<span>
|
||||
{comment.agent_id
|
||||
{orderedComments.map((comment) => (
|
||||
<div
|
||||
key={comment.id}
|
||||
className="rounded-xl border border-slate-200 bg-white p-3 select-none"
|
||||
>
|
||||
<>
|
||||
<div className="flex items-center justify-between text-xs text-slate-500">
|
||||
<span>
|
||||
{comment.agent_id
|
||||
? assigneeById.get(comment.agent_id) ?? "Agent"
|
||||
: "Admin"}
|
||||
</span>
|
||||
<span>{formatCommentTimestamp(comment.created_at)}</span>
|
||||
</div>
|
||||
{comment.message?.trim() ? (
|
||||
<div className="mt-2 select-text cursor-text text-sm text-slate-900 break-words">
|
||||
<ReactMarkdown
|
||||
remarkPlugins={[remarkGfm, remarkBreaks]}
|
||||
components={{
|
||||
...MARKDOWN_TABLE_COMPONENTS,
|
||||
<span>{formatCommentTimestamp(comment.created_at)}</span>
|
||||
</div>
|
||||
{comment.message?.trim() ? (
|
||||
<div className="mt-2 select-text cursor-text text-sm leading-relaxed text-slate-900 break-words">
|
||||
<ReactMarkdown
|
||||
remarkPlugins={[remarkGfm, remarkBreaks]}
|
||||
components={{
|
||||
...MARKDOWN_TABLE_COMPONENTS,
|
||||
p: ({ node: _node, ...props }) => (
|
||||
<p
|
||||
className="text-sm text-slate-900 break-words"
|
||||
@@ -2025,12 +2025,12 @@ export default function BoardDetailPage() {
|
||||
</div>
|
||||
</aside>
|
||||
|
||||
<aside
|
||||
className={cn(
|
||||
"fixed right-0 top-0 z-50 h-full w-[560px] max-w-[96vw] transform border-l border-slate-200 bg-white shadow-2xl transition-transform",
|
||||
isChatOpen ? "translate-x-0" : "translate-x-full",
|
||||
)}
|
||||
>
|
||||
<aside
|
||||
className={cn(
|
||||
"fixed right-0 top-0 z-50 h-full w-[560px] max-w-[96vw] transform border-l border-slate-200 bg-white shadow-2xl transition-transform",
|
||||
isChatOpen ? "transform-none" : "translate-x-full",
|
||||
)}
|
||||
>
|
||||
<div className="flex h-full flex-col">
|
||||
<div className="flex items-center justify-between border-b border-slate-200 px-6 py-4">
|
||||
<div>
|
||||
@@ -2063,23 +2063,23 @@ export default function BoardDetailPage() {
|
||||
</p>
|
||||
) : (
|
||||
chatMessages.map((message) => (
|
||||
<div
|
||||
key={message.id}
|
||||
className="rounded-2xl border border-slate-200 bg-slate-50/60 p-4"
|
||||
>
|
||||
<div className="flex flex-wrap items-center justify-between gap-2">
|
||||
<p className="text-sm font-semibold text-slate-900">
|
||||
{message.source ?? "User"}
|
||||
<div
|
||||
key={message.id}
|
||||
className="rounded-2xl border border-slate-200 bg-slate-50/60 p-4 select-none"
|
||||
>
|
||||
<div className="flex flex-wrap items-center justify-between gap-2">
|
||||
<p className="text-sm font-semibold text-slate-900">
|
||||
{message.source ?? "User"}
|
||||
</p>
|
||||
<span className="text-xs text-slate-400">
|
||||
{formatTaskTimestamp(message.created_at)}
|
||||
</span>
|
||||
</div>
|
||||
<div className="mt-2 text-sm text-slate-900">
|
||||
<ReactMarkdown
|
||||
remarkPlugins={[remarkGfm]}
|
||||
components={{
|
||||
...MARKDOWN_TABLE_COMPONENTS,
|
||||
<div className="mt-2 select-text cursor-text text-sm leading-relaxed text-slate-900">
|
||||
<ReactMarkdown
|
||||
remarkPlugins={[remarkGfm]}
|
||||
components={{
|
||||
...MARKDOWN_TABLE_COMPONENTS,
|
||||
p: ({ node: _node, ...props }) => (
|
||||
<p className="mb-2 last:mb-0" {...props} />
|
||||
),
|
||||
@@ -2107,12 +2107,12 @@ export default function BoardDetailPage() {
|
||||
</div>
|
||||
</aside>
|
||||
|
||||
<aside
|
||||
className={cn(
|
||||
"fixed right-0 top-0 z-50 h-full w-[520px] max-w-[96vw] transform border-l border-slate-200 bg-white shadow-2xl transition-transform",
|
||||
isLiveFeedOpen ? "translate-x-0" : "translate-x-full",
|
||||
)}
|
||||
>
|
||||
<aside
|
||||
className={cn(
|
||||
"fixed right-0 top-0 z-50 h-full w-[520px] max-w-[96vw] transform border-l border-slate-200 bg-white shadow-2xl transition-transform",
|
||||
isLiveFeedOpen ? "transform-none" : "translate-x-full",
|
||||
)}
|
||||
>
|
||||
<div className="flex h-full flex-col">
|
||||
<div className="flex items-center justify-between border-b border-slate-200 px-6 py-4">
|
||||
<div>
|
||||
@@ -2140,13 +2140,13 @@ export default function BoardDetailPage() {
|
||||
) : (
|
||||
<div className="space-y-3">
|
||||
{orderedLiveFeed.map((comment) => (
|
||||
<div
|
||||
key={comment.id}
|
||||
className="rounded-xl border border-slate-200 bg-white p-3"
|
||||
>
|
||||
<div className="flex items-start justify-between gap-3 text-xs text-slate-500">
|
||||
<div className="min-w-0">
|
||||
<p className="truncate text-xs font-semibold text-slate-700">
|
||||
<div
|
||||
key={comment.id}
|
||||
className="rounded-xl border border-slate-200 bg-white p-3 select-none"
|
||||
>
|
||||
<div className="flex items-start justify-between gap-3 text-xs text-slate-500">
|
||||
<div className="min-w-0">
|
||||
<p className="truncate text-xs font-semibold text-slate-700">
|
||||
{comment.task_id
|
||||
? taskTitleById.get(comment.task_id) ?? "Task"
|
||||
: "Task"}
|
||||
@@ -2161,12 +2161,12 @@ export default function BoardDetailPage() {
|
||||
{formatCommentTimestamp(comment.created_at)}
|
||||
</span>
|
||||
</div>
|
||||
{comment.message?.trim() ? (
|
||||
<div className="mt-2 text-xs text-slate-900">
|
||||
<ReactMarkdown
|
||||
remarkPlugins={[remarkGfm]}
|
||||
components={{
|
||||
...MARKDOWN_TABLE_COMPONENTS,
|
||||
{comment.message?.trim() ? (
|
||||
<div className="mt-2 select-text cursor-text text-xs leading-relaxed text-slate-900">
|
||||
<ReactMarkdown
|
||||
remarkPlugins={[remarkGfm]}
|
||||
components={{
|
||||
...MARKDOWN_TABLE_COMPONENTS,
|
||||
p: ({ node: _node, ...props }) => (
|
||||
<p className="mb-2 last:mb-0" {...props} />
|
||||
),
|
||||
|
||||
@@ -17,19 +17,12 @@ import {
|
||||
startOnboardingApiV1BoardsBoardIdOnboardingStartPost,
|
||||
} from "@/api/generated/board-onboarding/board-onboarding";
|
||||
import type {
|
||||
BoardOnboardingAgentComplete,
|
||||
BoardOnboardingRead,
|
||||
BoardOnboardingReadDraftGoal,
|
||||
BoardOnboardingReadMessages,
|
||||
BoardRead,
|
||||
} from "@/api/generated/model";
|
||||
|
||||
type BoardDraft = {
|
||||
board_type?: string;
|
||||
objective?: string | null;
|
||||
success_metrics?: Record<string, unknown> | null;
|
||||
target_date?: string | null;
|
||||
};
|
||||
|
||||
type NormalizedMessage = {
|
||||
role: string;
|
||||
content: string;
|
||||
@@ -52,35 +45,6 @@ const normalizeMessages = (
|
||||
return items.length ? items : null;
|
||||
};
|
||||
|
||||
const normalizeDraftGoal = (value?: BoardOnboardingReadDraftGoal): BoardDraft | null => {
|
||||
if (!value || typeof value !== "object") return null;
|
||||
const raw = value as Record<string, unknown>;
|
||||
|
||||
const board_type = typeof raw.board_type === "string" ? raw.board_type : undefined;
|
||||
const objective =
|
||||
typeof raw.objective === "string" ? raw.objective : raw.objective === null ? null : undefined;
|
||||
const target_date =
|
||||
typeof raw.target_date === "string"
|
||||
? raw.target_date
|
||||
: raw.target_date === null
|
||||
? null
|
||||
: undefined;
|
||||
|
||||
let success_metrics: Record<string, unknown> | null = null;
|
||||
if (raw.success_metrics === null || raw.success_metrics === undefined) {
|
||||
success_metrics = null;
|
||||
} else if (typeof raw.success_metrics === "object") {
|
||||
success_metrics = raw.success_metrics as Record<string, unknown>;
|
||||
}
|
||||
|
||||
return {
|
||||
board_type,
|
||||
objective: objective ?? null,
|
||||
success_metrics,
|
||||
target_date: target_date ?? null,
|
||||
};
|
||||
};
|
||||
|
||||
type QuestionOption = { id: string; label: string };
|
||||
|
||||
type Question = {
|
||||
@@ -151,7 +115,7 @@ export function BoardOnboardingChat({
|
||||
[session?.messages],
|
||||
);
|
||||
const question = useMemo(() => parseQuestion(normalizedMessages), [normalizedMessages]);
|
||||
const draft = useMemo(() => normalizeDraftGoal(session?.draft_goal), [session?.draft_goal]);
|
||||
const draft: BoardOnboardingAgentComplete | null = session?.draft_goal ?? null;
|
||||
|
||||
useEffect(() => {
|
||||
setSelectedOptions([]);
|
||||
@@ -269,18 +233,90 @@ export function BoardOnboardingChat({
|
||||
<p className="text-sm text-slate-600">
|
||||
Review the lead agent draft and confirm.
|
||||
</p>
|
||||
<div className="rounded-lg border border-slate-200 bg-slate-50 p-3 text-sm">
|
||||
<p className="font-semibold text-slate-900">Objective</p>
|
||||
<p className="text-slate-700">{draft.objective || "—"}</p>
|
||||
<p className="mt-3 font-semibold text-slate-900">Success metrics</p>
|
||||
<pre className="mt-1 whitespace-pre-wrap text-xs text-slate-600">
|
||||
{JSON.stringify(draft.success_metrics ?? {}, null, 2)}
|
||||
</pre>
|
||||
<p className="mt-3 font-semibold text-slate-900">Target date</p>
|
||||
<p className="text-slate-700">{draft.target_date || "—"}</p>
|
||||
<p className="mt-3 font-semibold text-slate-900">Board type</p>
|
||||
<p className="text-slate-700">{draft.board_type || "goal"}</p>
|
||||
</div>
|
||||
<div className="rounded-lg border border-slate-200 bg-slate-50 p-3 text-sm">
|
||||
<p className="font-semibold text-slate-900">Objective</p>
|
||||
<p className="text-slate-700">{draft.objective || "—"}</p>
|
||||
<p className="mt-3 font-semibold text-slate-900">Success metrics</p>
|
||||
<pre className="mt-1 whitespace-pre-wrap text-xs text-slate-600">
|
||||
{JSON.stringify(draft.success_metrics ?? {}, null, 2)}
|
||||
</pre>
|
||||
<p className="mt-3 font-semibold text-slate-900">Target date</p>
|
||||
<p className="text-slate-700">{draft.target_date || "—"}</p>
|
||||
<p className="mt-3 font-semibold text-slate-900">Board type</p>
|
||||
<p className="text-slate-700">{draft.board_type || "goal"}</p>
|
||||
{draft.user_profile ? (
|
||||
<>
|
||||
<p className="mt-4 font-semibold text-slate-900">User profile</p>
|
||||
<p className="text-slate-700">
|
||||
<span className="font-medium text-slate-900">Preferred name:</span>{" "}
|
||||
{draft.user_profile.preferred_name || "—"}
|
||||
</p>
|
||||
<p className="text-slate-700">
|
||||
<span className="font-medium text-slate-900">Pronouns:</span>{" "}
|
||||
{draft.user_profile.pronouns || "—"}
|
||||
</p>
|
||||
<p className="text-slate-700">
|
||||
<span className="font-medium text-slate-900">Timezone:</span>{" "}
|
||||
{draft.user_profile.timezone || "—"}
|
||||
</p>
|
||||
</>
|
||||
) : null}
|
||||
{draft.lead_agent ? (
|
||||
<>
|
||||
<p className="mt-4 font-semibold text-slate-900">
|
||||
Lead agent preferences
|
||||
</p>
|
||||
<p className="text-slate-700">
|
||||
<span className="font-medium text-slate-900">Name:</span>{" "}
|
||||
{draft.lead_agent.name || "—"}
|
||||
</p>
|
||||
<p className="text-slate-700">
|
||||
<span className="font-medium text-slate-900">Role:</span>{" "}
|
||||
{draft.lead_agent.identity_profile?.role || "—"}
|
||||
</p>
|
||||
<p className="text-slate-700">
|
||||
<span className="font-medium text-slate-900">
|
||||
Communication:
|
||||
</span>{" "}
|
||||
{draft.lead_agent.identity_profile?.communication_style || "—"}
|
||||
</p>
|
||||
<p className="text-slate-700">
|
||||
<span className="font-medium text-slate-900">Emoji:</span>{" "}
|
||||
{draft.lead_agent.identity_profile?.emoji || "—"}
|
||||
</p>
|
||||
<p className="text-slate-700">
|
||||
<span className="font-medium text-slate-900">Autonomy:</span>{" "}
|
||||
{draft.lead_agent.autonomy_level || "—"}
|
||||
</p>
|
||||
<p className="text-slate-700">
|
||||
<span className="font-medium text-slate-900">Verbosity:</span>{" "}
|
||||
{draft.lead_agent.verbosity || "—"}
|
||||
</p>
|
||||
<p className="text-slate-700">
|
||||
<span className="font-medium text-slate-900">
|
||||
Output format:
|
||||
</span>{" "}
|
||||
{draft.lead_agent.output_format || "—"}
|
||||
</p>
|
||||
<p className="text-slate-700">
|
||||
<span className="font-medium text-slate-900">
|
||||
Update cadence:
|
||||
</span>{" "}
|
||||
{draft.lead_agent.update_cadence || "—"}
|
||||
</p>
|
||||
{draft.lead_agent.custom_instructions ? (
|
||||
<>
|
||||
<p className="mt-3 font-semibold text-slate-900">
|
||||
Custom instructions
|
||||
</p>
|
||||
<pre className="mt-1 whitespace-pre-wrap text-xs text-slate-600">
|
||||
{draft.lead_agent.custom_instructions}
|
||||
</pre>
|
||||
</>
|
||||
) : null}
|
||||
</>
|
||||
) : null}
|
||||
</div>
|
||||
<DialogFooter>
|
||||
<Button onClick={confirmGoal} disabled={loading}>
|
||||
Confirm goal
|
||||
|
||||
@@ -23,6 +23,7 @@ If any required input is missing, stop and request a provisioning update.
|
||||
- The lead only **delegates**, **requests approvals**, **updates board memory**, **nudges agents**, and **adds review feedback**.
|
||||
- All outputs must go to Mission Control via HTTP (never chat/web).
|
||||
- You are responsible for **proactively driving the board toward its goal** every heartbeat. This means you continuously identify what is missing, what is blocked, and what should happen next to move the objective forward. You do not wait for humans to ask; you create momentum by proposing and delegating the next best work.
|
||||
- **Never idle.** If there are no pending tasks (no inbox / in_progress / review items), you must create a concrete plan and populate the board with the next best tasks to achieve the goal.
|
||||
- You are responsible for **increasing collaboration among other agents**. Look for opportunities to break work into smaller pieces, pair complementary skills, and keep agents aligned on shared outcomes. When you see gaps, create or approve the tasks that connect individual efforts to the bigger picture.
|
||||
- When you leave review feedback, format it as clean markdown. Use headings/bullets/tables when helpful, but only when it improves clarity.
|
||||
- If your feedback is longer than 2 sentences, do **not** write a single paragraph. Use a short heading + bullets so each idea is on its own line.
|
||||
@@ -142,6 +143,51 @@ If any required input is missing, stop and request a provisioning update.
|
||||
|
||||
9) Post a brief status update in board memory (1-3 bullets).
|
||||
|
||||
## Recurring Work (OpenClaw Cron Jobs)
|
||||
Use OpenClaw cron jobs for recurring board operations that must happen on a schedule (daily check-in, weekly progress report, periodic backlog grooming, reminders to chase blockers).
|
||||
|
||||
Rules:
|
||||
- Cron jobs must be **board-scoped**. Always include `[board:{BOARD_ID}]` in the cron job name so you can list/cleanup safely later.
|
||||
- Default behavior is **non-delivery** (do not announce to external channels). Cron should nudge you to act, not spam humans.
|
||||
- Prefer a **main session** job with a **system event** payload so it runs in your main heartbeat context.
|
||||
- If a cron is no longer useful, remove it. Avoid accumulating stale schedules.
|
||||
|
||||
Common patterns (examples):
|
||||
|
||||
1) Daily 9am progress note (main session, no delivery):
|
||||
```bash
|
||||
openclaw cron add \
|
||||
--name "[board:${BOARD_ID}] Daily progress note" \
|
||||
--schedule "0 9 * * *" \
|
||||
--session main \
|
||||
--system-event "DAILY CHECK-IN: Review tasks/memory and write a 3-bullet progress note. If no pending tasks, create the next best tasks to advance the board goal."
|
||||
```
|
||||
|
||||
2) Weekly review (main session, wake immediately when due):
|
||||
```bash
|
||||
openclaw cron add \
|
||||
--name "[board:${BOARD_ID}] Weekly review" \
|
||||
--schedule "0 10 * * MON" \
|
||||
--session main \
|
||||
--wake now \
|
||||
--system-event "WEEKLY REVIEW: Summarize outcomes vs success metrics, identify top 3 risks, and delegate next week's highest-leverage tasks."
|
||||
```
|
||||
|
||||
3) One-shot reminder (delete after run):
|
||||
```bash
|
||||
openclaw cron add \
|
||||
--name "[board:${BOARD_ID}] One-shot reminder" \
|
||||
--at "YYYY-MM-DDTHH:MM:SSZ" \
|
||||
--delete-after-run \
|
||||
--session main \
|
||||
--system-event "REMINDER: Follow up on the pending blocker and delegate the next step."
|
||||
```
|
||||
|
||||
Maintenance:
|
||||
- To list jobs: `openclaw cron list`
|
||||
- To remove a job: `openclaw cron remove <job-id>`
|
||||
- When you add/update/remove a cron job, log it in board memory with tags: `["cron","lead"]`.
|
||||
|
||||
## Heartbeat checklist (run in order)
|
||||
1) Check in:
|
||||
```bash
|
||||
|
||||
@@ -31,6 +31,21 @@ Each session, you wake up fresh. These files _are_ your memory. Read them. Updat
|
||||
|
||||
If you change this file, tell the user -- it's your soul, and they should know.
|
||||
|
||||
{% if identity_autonomy_level or identity_verbosity or identity_output_format or identity_update_cadence or identity_custom_instructions %}
|
||||
## Operating Preferences (From Onboarding)
|
||||
|
||||
- Autonomy: {{ identity_autonomy_level or "—" }}
|
||||
- Verbosity: {{ identity_verbosity or "—" }}
|
||||
- Output format: {{ identity_output_format or "—" }}
|
||||
- Update cadence: {{ identity_update_cadence or "—" }}
|
||||
|
||||
{% if identity_custom_instructions %}
|
||||
### Custom instructions
|
||||
|
||||
{{ identity_custom_instructions }}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
---
|
||||
|
||||
_This file is yours to evolve. As you learn who you are, update it._
|
||||
|
||||
Reference in New Issue
Block a user